<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>e-jiwoo.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 28 Oct 2025 04:32:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. e-jiwoo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/e-jiwoo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[나 개발 안해]]></title>
            <link>https://velog.io/@e-jiwoo/%EB%82%98-%EA%B0%9C%EB%B0%9C-%EC%95%88%ED%95%B4</link>
            <guid>https://velog.io/@e-jiwoo/%EB%82%98-%EA%B0%9C%EB%B0%9C-%EC%95%88%ED%95%B4</guid>
            <pubDate>Tue, 28 Oct 2025 04:32:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/67c0e833-fe84-470c-8905-4b8e8760d74b/image.png" alt=""></p>
<p>..왜 없는 거냐 저기 밑줄에 링크뜨는 거 클릭하면 페이지 들어가지는데..</p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/95225c5a-f9d6-47ee-9e1c-4d40a2c1485b/image.png" alt=""></p>
<p>이건 그냥 뭐.. 작업 코드에 10까지 없어서 그런 거고</p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/656af504-9899-4c5f-bb2a-a5dbaf225f09/image.png" alt=""></p>
<p>또 안되네?!?!!!!
그래서 찾아보니 private 파일이라 찾을 수 없다고 뜬다네요</p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/937c19e0-0cd2-443b-ae9f-e7b6f2a3d5fc/image.png" alt=""></p>
<p>그래서 설정을 하다가 또 요로콤 에러를 받아주고</p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/998e98c4-b96c-4be3-a6a6-3e11cde3a43c/image.png" alt=""></p>
<p>허허헣ㅎㅎㅎ 이거는 이미 origin있어서 에러 뜨는 거라</p>
<pre><code>git remote rm origin</code></pre><p>해주면 해결되는 에러고</p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/1ec76d38-67d9-4cc0-9b2f-aee855bbed2e/image.png" alt=""></p>
<p>우엄윪ㅍㅍㅍ 내가 이 에러때문에 PAT를 몇 번을 지웠다가 새로 발급받고 있는 지 모르겠어요ㅡ,ㅜㅜ</p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/5853172c-1732-40e7-bca9-b7713bf8a07f/image.png" alt=""></p>
<p>,,,,, 타인의 레포에 내 개인 토큰쓰면 뜨는 에러라고 해서 토큰 classic말고 fine-grained 토큰으로 발급받아서 기능 허가도 다  read only에서 read and write로 해줬는데 왜이라너..</p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/1f078149-ce6d-416e-9228-4dbc7af29e03/image.png" alt=""></p>
<p>.. 나 안해 에러가 왜 계속 나는 거야야야ㅑㅑ PR올리고 push 하기가 이렇게 어려운 거였나 아니였던 것 같은데,,</p>
<p>그렇게 저 위에 뜨는 에러를 계속 맞이하고 구글링해보고 다시 새로운 에러를 맞이해본 결과..</p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/e6b23d8e-0387-4661-b417-84f2cc8451a6/image.png" alt=""></p>
<p>다양한 아이콘의 행렬을 볼 수 있게 되었어요~~ 와아ㅏ아 알록달록 예브따ㅏㅏㅠㅜㅠㅜㅠ!
(1학년때도 구글링 계속하다가 저거 만든 적이 있던 것 같은..)</p>
<h3 id="-깃허브-클론-토큰-인증-한-방-명령어-">[ 깃허브 클론 토큰 인증 한 방 명령어 ]</h3>
<pre><code>$ git clone https://&lt;user-id&gt;:&lt;token&gt;@github.com/anti1346/centos7.git</code></pre><p><img src="https://velog.velcdn.com/images/e-jiwoo/post/48586b1f-df9d-4eb6-aa1a-17ca5a2d3595/image.png" alt=""></p>
<h3 id="-이런-요상한-jdk없다는-에러가-뜰-때는-">[ 이런 요상한 jdk없다는 에러가 뜰 때는? ]</h3>
<pre><code>$./gradlew clean build</code></pre><p>하려는데 저 에러가 계속 떠서 java 환경 변수도 설정하고 깔고 지우기도 반복하고~ 버전도 계속 확인해봤는데 안 되는거임!!
그럴땐.. 
<a href="https://rebugs.tistory.com/654">https://rebugs.tistory.com/654</a>
이걸로 메모리 스왑해준 다음에</p>
<pre><code>$./gradlew clean build --no-daemon</code></pre><p>--no-daemon 사용해주면 조금 오래걸리긴 해도 됩니다~
근데 이제 프론트엔드랑 백엔드 https, http 두 가지 유형써서 에러난 거 고쳐야 함. 아으ㅠ류!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[실습생의 멘탈붕괴사건]]></title>
            <link>https://velog.io/@e-jiwoo/%EC%8B%A4%EC%8A%B5%EC%83%9D%EC%9D%98-%EB%A9%98%ED%83%88%EB%B6%95%EA%B4%B4%EC%82%AC%EA%B1%B4</link>
            <guid>https://velog.io/@e-jiwoo/%EC%8B%A4%EC%8A%B5%EC%83%9D%EC%9D%98-%EB%A9%98%ED%83%88%EB%B6%95%EA%B4%B4%EC%82%AC%EA%B1%B4</guid>
            <pubDate>Wed, 15 Oct 2025 01:25:31 GMT</pubDate>
            <description><![CDATA[<h4 id="ㄹㅈㄷ-배경화면-디자이너는-어렵너">[ㄹㅈㄷ 배경화면~~ 디자이너는 어렵너]</h4>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/23cdeeee-9874-480e-b442-8586df12b2f1/image.png" alt="">
첫 출근 때 대표님께 &quot;실습기간동안 홈페이지 만들면 되겠다!&quot;라고 들은 후, 첫 날부터 디자인을 시작하게 되었어요오오. 근데 중간중간 마우스패드, 현수막, 스티커와 같은 디자인 부탁도 들어와서 열심히 쿵따쿵따해보고 있엇습니다. (난 내가 업무로 일러스트 툴을 만져볼 줄은 몰랐지 허ㅓ허) </p>
<p>디자인 시안은 생각보다 빨리 나왔는데 색감이나 디테일한 부분의 수정이 오래걸려서 점점 통과가 간절해지다보니
저 당시의 파일명 -&gt; wpqkf.pdf, wpkqfwpqkf.pdf, wpkqfwpqkfwpkqfwpqkf.pdf..<del>~</del></p>
<h4 id="마역량-1등">[마역량 1등]</h4>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/103b0850-764e-445d-a7fb-03f32b533548/image.png" alt=""></p>
<p>친구가 1등이라고 알려주길래 바ㅏ로오 들어가서 인증샷 남겼는데 기분이 좋으네여~
(우리반이 성적 점수 일찍 넣어서 그렇다고 듣긴 했..(그래도 1등.. 행복했다))</p>
<h4 id="-개발하다가-배포-웹사이트-너무-많이-젒속해서-트래픽-초과햇다-당황핑">[ 개발하다가 배포 웹사이트 너무 많이 젒속해서 트래픽 초과햇다,, 당황핑]</h4>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/4cead796-6899-46cd-841b-40c538c6853d/image.png" alt=""></p>
<p>홈페이지 로컬에서 작업하다가 어느 정도 작업이 돼서 배포를 했는데 배포된 홈페이지를 많이 들어갔기도 하고 해외에서 접속량이 .. 많드라구여.. 그래서 터졌는데 저때가 5시 28분이여서 고냥 깃 정리랑 실습일지쓰다가 퇴근 엔딩했숨다1</p>
<h4 id="이정도면-엽떡이랑-뿌링클-먹어야한다">[이정도면 엽떡이랑 뿌링클 먹어야한다]</h4>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/cec2e067-4315-414c-9866-1c31ecd4526d/image.png" alt=""></p>
<p>진짜 회사 일하다가 스트레스를 갑자기(딱히 먼일이 있다기 보다는 연휴끝나고 월요일의 시작이 힘들었나보다) 확 받아서 입맛이 미쳐날뛰었다. 그래서 지피티랑 상의끝에 먹기로 결정. 근데 정규직 전환 소식을 들어서 그런지 퇴근 시간이 다되어가서 그런지 뭔가 양배추우 먹고 싶은 건강 입맛으로 돌아옴.. 싱기방기뿡뿡</p>
<h4 id="지식-한-스푼--깃허브는-100mb이상을-감당-못-한다">[지식 한 스푼 : 깃허브는 100MB이상을 감당 못 한다]</h4>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/072a3113-cad6-4806-9bab-8a77e9c96a22/image.png" alt=""></p>
<p>깃허브는 100MB이상의 파일을 감당 못하는 것도 모르고 mov를 포함한 여러 파일 push 하는 데 -f를 써도 안되길래 아 .. 망했다 갈아야하나라는 생각으로 보다가 뒤늦게 경고문구 계속 보면서 100MB이상 안된다는 걸 깨닫고 lfs를 사용해서 비디오 용량 분할 중..ㅜㅠㅜㅠ</p>
<p>돼서 다행이지만 정말 어제 퇴근 전부터 오늘 출근하고 1시간동안  코드 다 날라가는 줄 알고 멍.. 해있었다.. 그래도 머.. 방법 알앗잖아? 럭키비키~</p>
<h4 id="이거-외-않되ㅜㅠ">[이거 외 않되ㅜㅠ]</h4>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/74c30cd6-069e-4095-85a0-b9c790b3c13a/image.png" alt=""></p>
<p>아무리 style을 바꿔도 화면에 적용이 안되길래 내가 이렇게 멍청했던가; 하면서 글적하고 있었는데 진짜 멍청했었다..
웹을 고치면서 모바일 코드를 만지고 있으니깐 그랬었다........어어어엉머멍멍ㅁㅁ,,,,</p>
<h4 id="와-ㄹㅇ-큰일날-뻔">[와. ㄹㅇ 큰일날 뻔]</h4>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/759ccd8c-af75-407f-b035-be7762d85d23/image.png" alt=""></p>
<p>여러분 rebase가 뭔지 아시나요<del>? rebase란 바로 브랜치를 다른 브랜치의 최신 커밋으로 옮기는 작업인데요</del> 제가 develop의 커밋을 가져왔어야했는데 실수로 아무것도 merge되어 있지 않은 상태의 main을 쳐버렸지 뭐예요 ㅎㅎ 그래서 초기화 상태가 되었어.요. 허허허허ㅓㅎ 그저 push를 하고 싶었지만 오류가 나서 오류를 고치려 했을 뿐인 아이에게 초기화라는 이런 깜짝 이벤트를 주시다니 참^^ 재밌었네요^^
(내 소중한 커밋 그래프가 0이 되는 걸 보았어/.ㅜㅠ무)</p>
<pre><code>git rebase --abort</code></pre><p>여러분은 저같은 실수하지 마시고ㅜ 만약 하시게 된다면 위의 코드치면 취소됩니다!
오늘도 개발 화이팅~ 멘탈 화이팅~ 인생 화이팅~</p>
<p><strong>마무리리ㅣ이ㅣㅇ</strong>
7월 28일부터 시작한 실습 생활이 이제 일주일 조금 넘게 남게 되었다. 어떤 날은 개발잘 돼서 즐겁고 어떤 날은 출근하기 전부터 힘이 빠져있고 오락가락한 나날들을 보내왔는데 이렇게 실습때 있었던 일들을 정리해보니 힘들었어도 좋은 추억이고 뿌듯한 것 같다..ㅎ
열심히해서 돈 많이 벌고 싶다(네잎클로버)(네잎클로버)(네잎클로버) 하고 싶은 건 다 할 수 있는 어른이 될 거 야야야야갸갸갸 크하하하하</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[물류 통합 관리 ERP 시스템 개발일지] 트래일링 슬래시(/)]]></title>
            <link>https://velog.io/@e-jiwoo/%EB%AC%BC%EB%A5%98-%ED%86%B5%ED%95%A9-%EA%B4%80%EB%A6%AC-ERP-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80-%ED%8A%B8%EB%9E%98%EC%9D%BC%EB%A7%81-%EC%8A%AC%EB%9E%98%EC%8B%9C</link>
            <guid>https://velog.io/@e-jiwoo/%EB%AC%BC%EB%A5%98-%ED%86%B5%ED%95%A9-%EA%B4%80%EB%A6%AC-ERP-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80-%ED%8A%B8%EB%9E%98%EC%9D%BC%EB%A7%81-%EC%8A%AC%EB%9E%98%EC%8B%9C</guid>
            <pubDate>Sun, 25 May 2025 23:45:45 GMT</pubDate>
            <description><![CDATA[<h2 id="-문제-상황-">[ 문제 상황 ]</h2>
<p>Vue.js 프론트엔드에서 CORS 및 백엔드 주소 설정을 위해 vue.config.js에 프록시 설정을 사용하였다. 로그인과 회원가입 페이지에서는 백엔드 연동이 잘 되었으나, 데이터 차트 페이지에서는 프록시가 적용되지 않고 <a href="http://localhost:8080%EC%9C%BC%EB%A1%9C">http://localhost:8080으로</a> 요청이 전송되는 문제가 발생했다.
<img src="https://velog.velcdn.com/images/e-jiwoo/post/b00c4a03-ec5d-4406-a8af-4b6e0528d746/image.png" alt=""><img src="https://velog.velcdn.com/images/e-jiwoo/post/b124a0ca-4287-4a91-91b9-4c1227284e39/image.png" alt=""></p>
<h2 id="시도한-방법들">[시도한 방법들]</h2>
<h3 id="http-메서드-변경-">HTTP 메서드 변경 )</h3>
<p>로그인 및 회원가입 페이지는 POST 방식, 데이터 차트는 GET 방식이어서 이 차이 때문일 수 있다고 판단하였다.</p>
<p>데이터 차트에서의 방식을 GET을 POST로 변경했지만, 여전히 프록시가 적용되지 않았다.<img src="https://velog.velcdn.com/images/e-jiwoo/post/0ef3d12d-2681-45af-9bb3-b7a1f2b58bd6/image.png" alt=""></p>
<h3 id="이벤트-트리거-방식-통일-">이벤트 트리거 방식 통일 )</h3>
<p>로그인과 회원가입은 버튼을 눌렀을 시에 작동한다.
데이터 차트는 mounted를 사용하여 화면에 들어왔을 때 렌더링되도록 하여 이 또한 로그인과 회원가입 방식과 동일하게 버튼을 눌렀을 때 데이터를 가져오도록 바꿨지만, 프록시가 적용되지 않았다.</p>
<h3 id="url-경로-재확인-">URL 경로 재확인 )</h3>
<p>브라우저를 통해 직접 백엔드 URL(lares/api/control)에 접속해 보았고, 404가 발생하였다.
브라우저를 통해 접속하는 과정에서 에러가 떠서 주소를 확인해보니 control 뒤에 슬래시가 빠져있었다. 
그래서 경로에 슬래시(/)를 붙여 lares/api/control/로 접속하자 데이터가 정상적으로 출력되었다.
코드에서도 동일하게 슬래시를 붙여주자 200 OK 응답을 받을 수 있었고, 문제 해결되었다.
<img src="https://velog.velcdn.com/images/e-jiwoo/post/d5d6efe8-ec02-4efc-ad8a-e89d3c101d69/image.png" alt=""><img src="https://velog.velcdn.com/images/e-jiwoo/post/3032d876-fcae-4eff-96dc-50f2dcce1d2c/image.png" alt="">
<img src="https://velog.velcdn.com/images/e-jiwoo/post/b97a5a04-d28d-453f-9262-a2443dda6839/image.png" alt=""><img src="https://velog.velcdn.com/images/e-jiwoo/post/7c5c5238-ccfd-4d76-b25f-0b666e00d3da/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/0ada32cf-9613-4ced-849b-c07bd5e68210/image.png" alt=""></p>
<h2 id="-문제-발생-이유후기-">[ 문제 발생 이유&amp;후기 ]</h2>
<p>평소 브라우저의 홈페이지에서는 트레일링 슬레시가 자동으로 붙여지는 경우를 많이 보아서 존재 여부의 차이를 신경쓰지 않고 있었는데 이번 오류를 기점으로 트레일링 슬레시가 존재한다면 해당 리소스는 디렉토리이고 없다면 파일이기에 트레일링 슬래시의 존재여부에 따라 다른 URL이 된다는 사실을 알게 되었다.</p>
<p>슬래시 하나 때문에 이틀을 잡고 있었던 에러라 슬래시의 중요성에 대해 알아보자고 찾아보니
트레일링 슬래시가 주는 이점이</p>
<p><strong>슬래시가 없으면</strong> 해당 이름의 파일이 있는 지 확인하고 없으면 디렉토리까지 확인했다가 디렉토리가 있으면 그 안의 기본 파일(index.html)같은 거까지 확인하는 과정을 거치는데 </p>
<p>*<em>슬래시가 있으면 *</em>해당 이름의 파일을 확인하는 과정이 사라지고 바로 디렉토리 확인을 들어가기 때문에 과정이 줄어서 페이지 응답 속도가 더 빠르게 진행될 수 있다는 것도 알게되었다.</p>
<p>속도가 빠르면 좋은 거니깐.. 그리고 개발자 측면에서는 슬래시 하나만 붙이면 한 단계가 주는 건데.. 트레일링 슬래시를 써준 백엔드에게 감사인사를 전하고 앞으로 주소 확인을 잘하고 개발하쟝…</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[물류 통합 관리 ERP 시스템 개발일지] Vue와의 만남]]></title>
            <link>https://velog.io/@e-jiwoo/%EB%AC%BC%EB%A5%98-%ED%86%B5%ED%95%A9-%EA%B4%80%EB%A6%AC-ERP-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B0%9C%EB%B0%9C-%EC%9D%BC%EC%A7%80-Vue%EC%99%80%EC%9D%98-%EB%A7%8C%EB%82%A8</link>
            <guid>https://velog.io/@e-jiwoo/%EB%AC%BC%EB%A5%98-%ED%86%B5%ED%95%A9-%EA%B4%80%EB%A6%AC-ERP-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B0%9C%EB%B0%9C-%EC%9D%BC%EC%A7%80-Vue%EC%99%80%EC%9D%98-%EB%A7%8C%EB%82%A8</guid>
            <pubDate>Fri, 23 May 2025 01:25:10 GMT</pubDate>
            <description><![CDATA[<p>평소 React.js를 사용해왔지만, 취업을 앞두고 있는 지금, 내가 희망하는 IoT 회사와 유사한 프로젝트를 진행하기로 마음을 먹었다.
그래서 결정한 것이 물류 통합 관리 ERP 시스템으로, 해당 프로젝트는 배송 날짜에 맞춰 택배를 정렬시켜주는 하드웨어와 하드웨어의 연결 및 작동 화면을 보여주며, 택배들의 ERP 시스템을 보여주는 웹으로 구성되어 있다.</p>
<p>해당 프로젝트는 친구와 둘이서 진행하게 되었고, 역할로는 AI, 알고리즘, 디자인, 프론트, 백엔드, 하드웨어의 역할이 있는데 나는 그중에서 AI, 알고리즘, 프론트를 맡아 진행하게 되었다.</p>
<p>평소 프론트엔드에 관심이 있었기에 프론트로 참여한 프로젝트가 몇 되는데, 모두 React.js를 사용하여 진행해왔다.
하지만 이번 프로젝트에서는 회사의 스택에 기술을 맞추고 싶어 Vue.js를 선택해보게 되었다.</p>
<p>처음으로 마주한 Vue.js는 &quot;와, HTML인가?&quot; 싶었다.
Vue.js가 타 프레임워크보다 쉽다는 건 몇 번 들었는데, 직접 해보니 HTML로 코딩하던 시절이 떠올랐달까..</p>
<p>그렇게 호기롭게 시작한 Vue.js 개발에서 처음으로 마주한 오류는 다음과 같았다.
<img src="https://velog.velcdn.com/images/e-jiwoo/post/742ec310-cde1-4942-ad0f-7bb371429f95/image.png" alt="">
<strong>multi-word</strong> 에? 이게 뭔 에러인가 싶어서 찾아보니,
Vue에서 component명을 만들 때 반드시 단어의 조합(CmmMenu)으로 지어야 한다는 의미다.</p>
<p>이는 HTML 태그와 헷갈리지 않게 하려고 그렇게 설정해놨다고 한다.
그래서 Login.vue였던 파일명을 VueLogin.vue로 고치니 에러가 없어졌다.</p>
<p>그런데... 그냥 나는 파일이름 쓰고 싶다?면
vue.config.js에 들어가서</p>
<pre><code>const { defineConfig } = require(&quot;@vue/cli-service&quot;);
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false, //추가
});</code></pre><p>lintOnSave: false를 추가해주면 파일이름이 Login.vue라도 에러가 뜨지 않는다.</p>
<p>[참고한 자료]
<a href="https://developer-notes.tistory.com/26">https://developer-notes.tistory.com/26</a>
<a href="https://velog.io/@minseojo/Vue.js-Error-vuemulti-word-component-names">https://velog.io/@minseojo/Vue.js-Error-vuemulti-word-component-names</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[STACK이란?]]></title>
            <link>https://velog.io/@e-jiwoo/STACK</link>
            <guid>https://velog.io/@e-jiwoo/STACK</guid>
            <pubDate>Tue, 17 Dec 2024 07:44:16 GMT</pubDate>
            <description><![CDATA[<h1 id="stack"><strong>STACK</strong></h1>
<h2 id="스택의-개념">스택의 개념</h2>
<p>모든 자료의 삽입과 삭제가 한쪽 끝에서만 수행되는 제한적 개념의 선형 구조</p>
<p>LIFO(Last In First Out)인 자료구조로 먼저 들어가 요소가 나중에 나오게 된다</p>
<p>재귀함수를 호출할 때 호출 당한 함수가 끝난 뒤 호출을 한 함수가 끝나는 것과 같이 스택에 들어간 요소가 나오기 위해서는 그 이후에 삽입한 요소들이 모두 나와야 한다</p>
<ul>
<li><p>실생활에서의 스택의 예</p>
<ul>
<li>식당에 쌓여있는 접시 더미</li>
<li>책상에 쌓여있는 책</li>
<li>창고에 쌓여있는 상자</li>
</ul>
</li>
<li><p>스택의 활용</p>
<ul>
<li>자료의 출력 순서가 입력의 역순으로 이루어져야 할 때</li>
<li>undo기능을 구현할 때</li>
<li>함수 호출에서 복귀주소를 기억할 때</li>
<li>문서나 소스코드에서 괄호 닫기가 정상적으로 되었는지를 검사하는 프로그램</li>
</ul>
</li>
<li><p>스택 용어</p>
<ul>
<li>스택 상단(stack top): 스택에서 입출력이 이루어지는 부분</li>
<li>스택 하단(stack bottom): 스택의 바닥 부분</li>
<li>요소(element): 스택에 저장되는 것</li>
<li>공백 스택(empty stack): 요소가 하나도 없는 스택</li>
</ul>
</li>
<li><p>스택 연산</p>
<ul>
<li>isFull(s) : 스택의 원소 수가 size와 동일할 경우 return TRUE, 다를 경우 return FALSE</li>
<li>isEmpty(s) : 스택의 원소 수가 0일 경우 return TRUE, 0보다 클 경우 return FALSE</li>
<li>push(s, e) : isFull(s)을 실행하여 스택이 꽉 차있으면 에러를 발생시키고 빈 공간이 있을 경우 스택의 맨 위에 e 추가</li>
<li>pop(s) : isEmpty(s)를 실행하여 스택이 비어있으면 에러를 발생시키고 스택에 요소가 있으면 스택의 맨 위에 있는 요소를 제거하여 반환</li>
<li>peek(s) : isEmpty(s)를 실행하여 스택이 비어있으면 에러를 발생시키고 스택에 요소가 있으면 스택의 맨 위에 있는 요소를 제거하지 않고 반환</li>
</ul>
</li>
<li><p><strong>스택 코드</strong></p>
<pre><code class="language-python">  # Plus: 각 리스트 값에 1씩 더해준다
  # ex) 1 2 3 4 5 -&gt; 2 3 4 5 6
  # isReverse: 리스트를 거꾸로 바꿔준다
  # ex) 1 2 3 None None -&gt; None None 3 2 1
  # Reset: 리스트 안을 다 None로 초기화 시켜주고 top을 -1로 함
  # ex) 1 2 3 4 5 -&gt; None None None None None

  class Stack:
      def __init__(self, size):
          self.stack_size = size  # 리스트 용량
          self.stack_list = [None] * self.stack_size  # 리스트 이름
          self.top = -1  # 가장 최근에 삽입된 요소의 위치

      def isEmpty(self):  # top이 -1이면 비어있다고 판단
          if self.top == -1:
              return True
          else:
              return False

      def isFull(self):  # top이랑 stack_size가 같으면 가득 찼다고 판단
          if self.top == self.stack_size:
              return True
          else:
              return False

      def push(self, e):  # 요소 e를 스택의 맨 위에 추가
          if self.isFull() == True:
              print(&quot;배열이 가득 찼습니다&quot;)
              return 0
          self.top += 1
          self.stack_list[self.top] = e

      def pop(self):  # 스택의 맨 위에 있는 요소를 꺼내 반환
          if self.isEmpty() == True:
              print(&quot;배열이 텅 비었습니다&quot;)
              return 0
          tmp = self.stack_list[self.top]
          self.stack_list[self.top] = None
          self.top -= 1

          return tmp

      def peek(self):  # 스택의 맨 위에 있는 항목을 삭제하지 않고 반환
          return self.stack_list[self.top]

      def isReverse(self):  # 리스트를 거꾸로 바꿈
          self.stack_list.reverse()
          return 0

      def Reset(self):  # 리스트 안을 다 None로 초기화 시켜주고 top을 -1로 함
          if self.isEmpty() == True:
              print(&quot;배열이 텅 비었습니다&quot;)
              return 0
          for i in range(-1, self.stack_size):
              self.stack_list[i] = None
          self.top = -1

      def Plus(self):  # 각 리스트 값에 1씩 더함
          if self.isEmpty() == True:
              print(&quot;배열이 텅 비었습니다&quot;)
              return 0
          for i in range(self.top, -1, -1):
              self.stack_list[i] += 1

  stack = Stack(5)

  print(&quot;push 확인&quot;)
  stack.push(1)
  stack.push(2)
  stack.push(3)
  stack.push(4)
  stack.push(5)
  print(stack.pop())
  print(stack.stack_list)
  print(stack.peek())
  print(stack.stack_list)
  stack.Plus()
  print(stack.stack_list)
  stack.isReverse()
  print(stack.stack_list)

  stack.Reset()

  print(stack.stack_list)</code></pre>
</li>
<li><p><strong>중위표기 수식의 후위표기 변환</strong></p>
<h3 id="전위">전위</h3>
<p>  연산자를 먼저 표시하고 연산에 필요한 피연산자를 나중에 표기하는 방법</p>
<p>  ex) +ab</p>
<h3 id="중위">중위</h3>
<p>  연산자를 두 피연산자 사이에 표기하는 방법으로 가장 일반적으로 사용되는 표현 방법</p>
<p>  ex) a+b</p>
<h3 id="후위">후위</h3>
<p>  피연산자를 먼저 표시하고 연산자를 나중에 표시하는 방법</p>
<p>  ex) ab+</p>
<pre><code class="language-python">  &quot;&quot;&quot;
  전위: +ab
  중위: (a+b)/c
  후위: ab+
  &quot;&quot;&quot;
  &quot;&quot;&quot;
  중위를 후위로 바꿀 때 나올 수 있는 경우의 수 3가지
  1. a+b*c -&gt; abc*+
  연산자를 담을 스택을 만들어 놓고 output이라는 결과를 순서대로 넣어놓는 리스트를 만든다
  연산자는 stack에 넣고 피연산자는 output에 넣는다
  stack에 든 게 있는 지 확인하고 
  있다면
  stack에서 한 개씩 pop해서 output에 넣어서 출력
  2. a*b+c -&gt; ab*c+ 
  연산자를 담을 스택을 만들어 놓고 output이라는 결과를 순서대로 넣어놓는 리스트를 만든다
  연산자는 stack에 넣고 피연산자는 output에 넣는다
  stack에 넣을 연산자가 stack안에 들어있던 연산자랑 우선순위를 비교해서 stack에 있는 게 더 높은 우선순위가 있다면 
  다 pop해서 output결과 리스트에 넣고 넣을 연산자를 stack에 집어 넣는다
  다 분류했다면
  stack에서 한 개씩 pop해서 output에 넣어서 출력
  3. (a+b)*c -&gt;
  (를 stack에 집어넣는다
  )괄호를 넣을 차례일 때 (를 만날 때까지 그 위에 들어있는 연산자를 모두 pop해서 output리스트에 넣어준다
  다 분류했다면
  stack에서 한 개씩 pop해서 output에 넣어서 출력
  &quot;&quot;&quot;
  # 피연산자인가 연산자인가 / 연산자에서 ()인가 +인가 *인가
  &quot;&quot;&quot;
  def 우선순위
  if () return 0 
      + return 1
      * return 2
  &quot;&quot;&quot;

  # 스택 ADT

  # push(e) : 요소 e를 스택의 맨 위에 추가
  # pop() : 스택의 맨 위에 있는 요소를 꺼내 반환한다.
  # isEmpty() : 스택이 비어있는 true를 아니면 false를 반환한다.
  # isFull() : 스택이 가득 차 있으면 true를 아니면 false를 반환한다.
  # peek() : 스택의 맨 위에 있는 항목을 삭제하지 않고 반환한다.

  class Stack:
      stack_size = 100
      stack_list = [None] * stack_size
      top = -1

      def isEmpty(self):
          if self.top == -1:
              return True
          else:
              return False

      def isFull(self):
          if self.top == self.stack_size - 1:
              return True
          else:
              return False

      def push(self, e):
          if self.isFull() == True:
              print(&quot;배열이 가득 찼습니다&quot;)
              return 0

          self.top += 1
          self.stack_list[self.top] = e

      def pop(self):
          if self.isEmpty() == True:
              print(&quot;배열이 텅 비었습니다&quot;)
              return 0

          print(self.stack_list[self.top])
          r = self.stack_list[self.top]
          self.stack_list[self.top] = None
          self.top -= 1
          return r

      def peek(self):
          print(self.stack_list[self.top])

  # 연산자 우선순위 계산 함수
  def precedence(op):
      if op == &quot;(&quot; or op == &quot;)&quot;:
          return 0
      elif op == &quot;+&quot; or op == &quot;-&quot;:
          return 1
      elif op == &quot;*&quot; or op == &quot;/&quot;:
          return 2
      else:
          return -1

  # 중위 표기 -&gt; 후위표기로 바꾸는 함수
  def Infix2Postfix(expr):
      s = Stack()
      output = []

      for term in expr:
          if term in &quot;(&quot;:
              s.push(&quot;(&quot;)
          elif term in &quot;)&quot;:
              while not s.isEmpty():
                  op = s.pop()
                  if op == &quot;(&quot;:
                      break
                  else:
                      output.append(op)

          elif term in &quot;+-*/&quot;:
              while not s.isEmpty():
                  op = s.peek()
                  if precedence(op) &gt;= precedence(term):
                      output.append(op)
                      s.pop()
                  else:
                      break
              s.push(term)
          else:
              output.append(term)

      while not s.isEmpty():
          output.append(s.pop())

      return output

  &quot;&quot;&quot;
  stack = Stack()

  print(&quot;push 확인&quot;)
  stack.push(1)
  stack.push(2)
  stack.push(3)
  stack.push(4)
  stack.push(5)

  print(stack.stack_list)
  &quot;&quot;&quot;
  infix1 = input()
  infix1 = list(infix1)
  postfix1 = Infix2Postfix(infix1)
  print(postfix1)</code></pre>
</li>
</ul>
<h1 id="queue">QUEUE</h1>
<h2 id="큐의-개념">큐의 개념</h2>
<p>뒤에서 새로운 데이터가 추가되고 앞에서 데이터가 하나씩 삭제되는 구조</p>
<p>FIFO(First In First Out)인 자료구조로 먼저 들어가 요소가 먼저 나오게 된다</p>
<p>큐는 한쪽 끝에서 삽입 작업, 다른 쪽 끝에서 삭제 작업이 이루어진다</p>
<ul>
<li>실생활에서의 큐의 예<ul>
<li>줄을 서서 기다리는 것</li>
</ul>
</li>
<li>큐의 활용<ul>
<li>우선순위가 같은 작업 예약 (프린터의 인쇄 대기열)</li>
<li>은행 업무</li>
<li>콜센터 고객 대기시간</li>
<li>프로세스 관리</li>
<li>너비 우선 탐색(BFS) 구현</li>
<li>버퍼(buffer): 데이터를 주고 받을 때 각 주변장치들 사이에 존재하는 속도의 차이나 시간차이를 극복하기 위해 임시 기억장치로 사용</li>
<li>실시간 비디오 스트리밍(버퍼링 buffering)</li>
<li>현실 세계 시뮬레이션</li>
</ul>
</li>
<li>큐의 연산<ul>
<li>init(q) : 큐를 초기화</li>
<li>isEmpty(q) : size가 0이면 TRUE 반환, 0이 아니면 FALSE 반환</li>
<li>isFull(q) : size와 max_size가 같으면 TRUE 반환, 다르면 FALSE 반환</li>
<li>enqueue(q, e) : isFull이 TRUE면 에러 발생, FALSE면 q의 끝에 e 추가</li>
<li>dequeue(q) : isEmpty가 TRUE면 에러 발생, FALSE면 q의 맨 앞에 있는 요소 제거하여 반환</li>
<li>peek(q) : isEmpty가 TRUE면 에러 발생, FALSE면 q의 맨 앞에 있는 요소 제거하지 않고 반환</li>
</ul>
</li>
</ul>
<h2 id="선형-큐의-개념">선형 큐의 개념</h2>
<p>데이터가 증가되면 rear를 하나 증가하고 그 위치에 데이터가 저장되며 삭제할 때도 front를 하나  증가하고 front가 가리키는 위치에 있는 데이터를 삭제한다</p>
<ul>
<li><p>단점</p>
<ul>
<li>요소들의 불필요한 이동이 발생한다</li>
<li>큐의 앞 부분이 비더라도 자료를 추가할 수 없다(메모리 낭비)</li>
</ul>
</li>
<li><p><strong>선형 큐 코드</strong></p>
<pre><code class="language-python">  &quot;&quot;&quot;
  AllPrint(): None이 아닌 배열에 있는 수 모두 출력
  ex) [1, 2, 3, 4, None] -&gt; [1, 2, 3, 4]가 출력됨
  AllPrintReverse(): None이 아닌 배열에 있는 수 거꾸로 하여 모두 출력
  ex) [1, 2, 3, 4, None] -&gt; [4, 3, 2, 1]가 출력됨
  Reset(): 배열 초기화
  ex) 1, 2, 3, 4, None -&gt; None, None, None, None, None
  &quot;&quot;&quot;

  class Queue:
      def __init__(self, size):
          self.queue_size = size
          self.list = [None] * self.queue_size
          self.front = -1
          self.rear = -1

      def isFull(self):  # rear랑 크기-1이 같으면 가득 찼음
          return self.rear == self.queue_size - 1

      def isEmpty(self):  # front랑 rear가 같으면 비어있음
          return self.front == self.rear

      def enqueue(self, e):  # 요소 e를 큐의 맨 뒤에 추가
          if self.isFull():
              print(&quot;큐가 가득 찼습니다&quot;)
              return 0
          self.rear = self.rear + 1
          self.list[self.rear] = e

      def dequeue(self):  # 큐의 맨 앞에 있는 요소를 꺼내 반환
          if self.isEmpty():
              print(&quot;큐가 비어있습니다&quot;)
              return 0
          self.front = self.front + 1
          tmp = self.list[self.front]
          self.list[self.front] = None
          return tmp

      def peek(self):  # 큐의 맨앞에 있는 요소를 삭제하지 않고 반환
          if self.isEmpty():
              print(&quot;큐가 비어있습니다&quot;)
              return 0
          return self.list[self.front + 1]

      def AllPrint(self):  # 배열에 있는 수 모두 출력
          if self.isEmpty():
              print(&quot;큐가 비어있습니다&quot;)
              return 0
          tmp = [i for i in self.list if i is not None]
          print(tmp)

      def AllPrintReverse(self):  # 배열에 있는 수 거꾸로 하여 모두 출력
          if self.isEmpty():
              print(&quot;큐가 비어있습니다&quot;)
              return 0
          tmp = [i for i in self.list if i is not None]
          print(tmp[::-1])

      def Reset(self):  # 배열 초기화
          if self.isEmpty():
              print(&quot;큐가 비어있습니다&quot;)
              return 0
          for i in range(-1, self.queue_size):
              self.list[i] = None

          self.front = -1
          self.rear = -1

  queue = Queue(5)

  queue.enqueue(1)
  queue.enqueue(2)
  queue.enqueue(3)
  queue.enqueue(4)
  queue.enqueue(5)

  print(queue.list)
  print(queue.peek())
  queue.AllPrint()
  queue.AllPrintReverse()
  queue.Reset()
  print(queue.list)</code></pre>
</li>
</ul>
<h2 id="원형-큐의-개념">원형 큐의 개념</h2>
<p>기본 큐의 처음과 끝을 논리적으로 연결하여 오버플로가 발생하는 것을 보완한다</p>
<p>(front와 rear의 값이 배열의 끝인(MAX_QUEUE_SIZE-1)에 도달하면 다음에 증가되는 값은 0이 되도록 한다)</p>
<ul>
<li><p>문제</p>
<p>  full 상태와 empty 상태일 때 front와 rear 값이 같음</p>
<p>  → 이를 해결하기 위해 front와 rear 사이에 하나의 공백을 둠</p>
</li>
<li><p>상태</p>
<p>  포화 상태: (rear+1)%n == front</p>
<p>  공백 상태: front == rear</p>
</li>
<li><p><strong>원형 큐 코드</strong></p>
<pre><code class="language-python">  &quot;&quot;&quot;
  AllPrint(): None이 아닌 배열에 있는 수 모두 출력
  ex) [1, 2, 3, 4, None] -&gt; [1, 2, 3, 4]가 출력됨
  AllPrintReverse(): None이 아닌 배열에 있는 수 거꾸로 하여 모두 출력
  ex) [1, 2, 3, 4, None] -&gt; [4, 3, 2, 1]가 출력됨
  Reset(): 배열 초기화
  ex) 1, 2, 3, 4, None -&gt; None, None, None, None, None
  &quot;&quot;&quot;

  class Queue:
      def __init__(self, size):
          self.queue_size = size
          self.list = [None] * self.queue_size
          self.rear = 0
          self.front = 0

      def isEmpty(self):  # front랑 rear가 같으면 비어있음
          return self.front == self.rear

      def isFull(self):  # (rear+1)%5랑 front가 같으면 가득 차 있음
          return (self.rear + 1) % 5 == self.front

      def equence(self, e):  # 요소 e를 큐의 맨 뒤에 추가
          if self.isFull():
              print(&quot;큐가 가득 찼습니다&quot;)
              return 0
          self.rear = (self.rear + 1) % 5
          self.list[self.rear] = e

      def dequence(self):  # 큐의 맨 앞에 있는 요소를 꺼내 반환
          if self.isEmpty():
              print(&quot;큐가 비어있습니다&quot;)
              return 0
          self.front = (self.front + 1) % 5
          self.list[self.front] = None
          return self.list[self.front]

      def peek(self):  # 큐의 맨앞에 있는 요소를 삭제하지 않고 반환
          if self.isEmpty():
              print(&quot;큐가 비어있습니다&quot;)
          return self.list[(self.front + 1) % 5]

      def AllPrint(self):  # 배열에 있는 수 모두 출력
          if self.isEmpty():
              print(&quot;큐가 비어있습니다&quot;)
              return 0
          tmp = [i for i in self.list if i is not None]
          print(tmp)

      def AllPrintReverse(self):  # 배열에 있는 수 거꾸로 하여 모두 출력
          if self.isEmpty():
              print(&quot;큐가 비어있습니다&quot;)
              return 0
          tmp = [i for i in self.list if i is not None]
          print(tmp[::-1])

      def Reset(self):  # 배열 초기화
          if self.isEmpty():
              print(&quot;큐가 비어있습니다&quot;)
              return 0
          for i in range(-1, self.queue_size):
              self.list[i] = None
          self.front = 0
          self.rear = 0

  queue = Queue(5)

  print(&quot;push 확인&quot;)
  queue.equence(1)
  queue.equence(2)
  queue.equence(3)
  queue.equence(4)
  queue.dequence()
  print(queue.peek())
  queue.AllPrint()
  queue.AllPrintReverse()

  &quot;&quot;&quot; 오늘 수업에서 알게된 점
  큐에는 
  선형큐, 원형큐, 우선수위 큐 이렇게 세가지로 있다!
  &quot;&quot;&quot;</code></pre>
<p>  <img src="https://velog.velcdn.com/images/e-jiwoo/post/d447b697-52d2-426b-97af-7b1df8343ad9/image.png" alt=""></p>
</li>
</ul>
<h1 id="deque">DEQUE</h1>
<h2 id="덱의-개념">덱의 개념</h2>
<p>덱은 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료 구조</p>
<p>(여전히 중간에 삽입하거나 삭제하는 것은 허용하지 않는다)</p>
<p>큐와 스택을 합친 형태</p>
<ul>
<li><p>배열로도 구현이 가능하고, 연결 리스트로도 구현이 가능</p>
</li>
<li><p>데이터의 앞과 뒤에서만 삽입, 삭제, 접근이 이루어질 때 굉장히 빠르게 동작</p>
</li>
<li><p>회전</p>
<p>  전단 반시계방향 회전: (front1+capacity)%capacity</p>
<p>  후단 반시계방향 회전: (rear-1+capacity)%capacity</p>
</li>
<li><p>덱 연산</p>
<ul>
<li>create() : 덱 생성</li>
<li>init(dq) : 덱 초기화</li>
<li>isEmpty(dq) : 덱이 공백 상태인지 검사</li>
<li>isFull(dq) : 덱이 포화 상태인지 검사</li>
<li>AddFront(dq, e) : 덱의 앞에 요소 추가</li>
<li>AddRear(dq, e) : 덱의 뒤에 요소 추가</li>
<li>DeleteFront(dq) : 덱의 앞의 요소 반환 후 삭제</li>
<li>DeleteRear(dq) : 덱의 뒤의 요소 반환 후 삭제</li>
<li>GetFront(dq) : 덱의 앞의 요소 반환(삭제x)</li>
<li>GetRear(dq) : 덱의 뒤의 요소 반환(삭제x)</li>
</ul>
</li>
<li><p><strong>선형 덱 코드</strong></p>
<pre><code class="language-python">  class Deque:
      def __init__(self, Deque_size):
          self.Deque_size = Deque_size
          self.front = -1
          self.rear = self.Deque_size
          self.list = [None] * self.Deque_size

      def isEmpty(self): #rear랑 크기가 같고 front가 -1이면 비어있음
          return self.rear == self.Deque_size and self.front == -1

      def isFull(self): #front랑 크기-1이 같거나 rear가 0이면 가득 참
          return self.front == self.Deque_size - 1 or self.rear == 0

      def AddFront(self, e):  # 맨 앞(전단)에 새로운 요소 e를 추가
          if self.isFull():
              print(&quot;덱이 가득 차있습니다&quot;)
              return 0
          self.front += 1
          self.list[self.front] = e

      def DeleteFront(self):  # 맨 앞(전단)의 요소를 꺼내서 반환
          if self.isEmpty():
              print(&quot;덱이 비어있습니다&quot;)
              return 0
          tmp = self.list[self.front]
          self.list[self.front] = None
          self.front -= 1
          return tmp

      def GetFront(self):  # 맨 앞(전단)의 요소를 꺼내지 않고 반환
          return self.list[self.front]

      def AddRear(self, e):  # 맨 뒤(후단)에 새로운 요소e를 추가
          if self.isFull():
              print(&quot;덱이 가득 차있습니다&quot;)
              return 0
          self.rear -= 1
          self.list[self.rear] = e

      def DeleteRear(self):  # 맨 뒤(후단)의 요소를 꺼내서 반환
          if self.isEmpty():
              print(&quot;덱이 비어있습니다&quot;)
              return 0
          tmp = self.list[self.rear]
          self.list[self.rear] = None
          self.rear += 1
          return tmp

      def GetRear(self):  # 맨 뒤(후단)의 요소를 꺼내지 않고 반환
          return self.list[self.rear]

  deque = Deque(5)

  deque.AddFront(1)
  deque.AddFront(2)
  deque.AddRear(1)
  deque.AddRear(2)
  print(deque.list)</code></pre>
</li>
<li><p><strong>원형 덱 코드</strong></p>
<pre><code class="language-python">  class Deque:
      def __init__(self, Deque_size):
          self.Deque_size = Deque_size
          self.front = 0
          self.rear = 0
          self.list = [None] * Deque_size

      def isEmpty(self): #front랑 rear가 같으면 비어있음
          return self.front == self.rear

      def isFull(self): #front랑 (rear_1)%크기가 같으면 가득 참
          return self.front == (self.rear + 1) % self.Deque_size

      def Addfront(self, e):  # 맨 앞(전단)에 새로운 요소 e를 추가
          if self.isFull():
              print(&quot;덱이 가득 찼습니다&quot;)
              return 0
          self.list[self.front] = e
          self.front = (self.front - 1 + self.Deque_size) % self.Deque_size

      def Addrear(self, e):  # 맨 뒤(후단)에 새로운 요소e를 추가
          if self.isFull():
              print(&quot;덱이 가득 찼습니다&quot;)
              return 0
          self.rear = (self.rear + 1) % self.Deque_size
          self.list[self.rear] = e

      def Deletefront(self):  # 맨 앞(전단)의 요소를 꺼내서 반환
          if self.isEmpty():
              print(&quot;덱이 비어있습니다&quot;)
              return 0
          self.front = (self.front + 1) % self.Deque_size
          return self.list[self.front]

      def Deleterear(self):  # 맨 뒤(후단)의 요소를 꺼내서 반환
          if self.isEmpty():
              print(&quot;덱이 비어있습니다&quot;)
              return 0
          self.rear = (self.rear - 1 + self.Deque_size) % self.Deque_size
          return self.list[self.rear]

      def Getfront(self): # 맨 앞(전단)의 요소를 꺼내지 않고 반환
          if self.isEmpty():
              print(&quot;덱이 비어있습니다&quot;)
              return 0
          return self.list[(self.front + 1) % self.Deque_size]

      def Getrear(self): # 맨 뒤(후단)의 요소를 꺼내지 않고 반환
          if self.isEmpty():
              print(&quot;덱이 비어있습니다&quot;)
              return 0
          return self.list[self.rear]

  deque = Deque(5)
  deque.Addfront(1)
  deque.Addfront(2)
  deque.Addrear(2)
  print(deque.list)</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[시스템 프로그래밍 내용 정리(Part 4_개요/IP 주소와 포트 번호)]]></title>
            <link>https://velog.io/@e-jiwoo/fmfk</link>
            <guid>https://velog.io/@e-jiwoo/fmfk</guid>
            <pubDate>Tue, 10 Dec 2024 23:24:29 GMT</pubDate>
            <description><![CDATA[<h2 id="tcpip-프로토콜">TCP/IP 프로토콜</h2>
<ul>
<li><p>인터넷의 확산으로 산업 표준</p>
</li>
<li><p>개발 초기부터 유닉스 시스템에 통합되어 서비스를 제공하고 있으며 리눅스에서 기본적으로 제공</p>
</li>
<li><p>계층 구조: 5개 계층(4개 계층으로 구분하기도 함) </p>
<ul>
<li>응용 계층(application layer): 사용자에게 서비스를 제공하기 위한 계층(Telnet, FTP, HTTP, SMTP, DNS 등)</li>
<li>네트워크 계층(network layer): 인터넷 계층이라고도 하며 패킷이 전달되는 경로를 담당(IP, ICMP, ARP 등)</li>
<li>네트워크 접속 계층 / 하드웨어 계층: 물리적인 네트워크와의 연결을 담당(이더넷 카드, 랜 카드)</li>
<li>전송 계층(transport layer): 패킷의 전송을 담당하는 계층(TCP, UDP)</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/d5c10591-63d9-42ec-9c43-6899611cca6a/image.png" alt=""></p>
<h3 id="tcp와-ucp의-차이점">TCP와 UCP의 차이점</h3>
<table>
<thead>
<tr>
<th><center>TCP</center></th>
<th><center>UDP</center></th>
</tr>
</thead>
<tbody><tr>
<td>연결지향형</td>
<td>비연결형</td>
</tr>
<tr>
<td>신뢰성 보장</td>
<td>신뢰성을 보장 X</td>
</tr>
<tr>
<td>흐름 제어 기능 O</td>
<td>흐름 제어 기능 X</td>
</tr>
<tr>
<td>순서 보장</td>
<td>순서를 보장 X</td>
</tr>
</tbody></table>
<h2 id="ip-주소와-포트-번호">IP 주소와 포트 번호</h2>
<h3 id="포트-번호port-number">포트 번호(port number)</h3>
<ul>
<li>전송되어오는 데이터를 어느 프로세스가 수신해 서비스를 제공할 것인지를 알려줌</li>
<li>0~65535(2바이트 정수)</li>
<li>일반 프로그램: 1024~65535 사용</li>
</ul>
<h3 id="포트well-known">포트(well-known)</h3>
<ul>
<li>이미 지정되어 있는 포트 번호
( 인터넷에서 자주 사용하는 서비스는 포트 번호가 지정되어 있음 )</li>
<li>0~1023</li>
</ul>
<table>
<thead>
<tr>
<th><center>서비스</center></th>
<th><center>포트 번호</center></th>
</tr>
</thead>
<tbody><tr>
<td>Telent</td>
<td>23</td>
</tr>
<tr>
<td>FTP</td>
<td>21</td>
</tr>
<tr>
<td>HTTP</td>
<td>80</td>
</tr>
</tbody></table>
<h3 id="소켓-인터페이스">소켓 인터페이스</h3>
<ul>
<li>응용 계층에서 전송 계층의 기능을 사용할 수 있도록 제공하는 응용 프로그래밍 인터페이스(API)</li>
<li>응용 프로그램과 TCP 계층을 연결하는 역할</li>
<li>전송 계층이나 네트워크 게층이 복잡한 구조를 몰라도 쉽게 작성 가능
<img src="https://velog.velcdn.com/images/e-jiwoo/post/5889705e-509a-4102-8f03-c4caa20b97c2/image.png" alt=""></li>
</ul>
<h3 id="ip주소">IP주소</h3>
<ul>
<li>데이터가 전송될 목적지 호스트를 알려주는 역할</li>
<li>인터넷을 이용할 때 사용하는 주소</li>
<li>점(.)으로 구분된 32비트 숫자로 표시</li>
<li>네트워크 주소(인터넷 주소)라고도 함</li>
<li>A,B,C,D,E 클래스 중 A,B,C 클래스만 사용(D,E는 멀티캐스트용, 연구용으로 사용)</li>
</ul>
<h3 id="호스트명">호스트명</h3>
<ul>
<li>시스템에 부여된 이름</li>
<li>인터넷: &#39;호스트+도메인명&#39; 형태로 구성</li>
</ul>
<h3 id="호스트명과-ip-주소-변환">호스트명과 IP 주소 변환</h3>
<ul>
<li>/etc/hosts 파일 또는 DNS, NLS 등</li>
<li>/etc/nsswitch.conf 파일에 주소변환을 누가 할 것인 지정</li>
<li>DNS: 호스트명과 도메인명을 관리하는 시스템
NIS: 사용자와 호스트명과 같은 시스템 구성 데이터를 여러 곳에 제공해주는 서비스</li>
</ul>
<h4 id="호스트명과-주소-읽어오기">호스트명과 주소 읽어오기</h4>
<pre><code>#include &lt;netdb.h&gt;

struct hostnet *gethostent(void);
void sethostent(int stayopen);
void edhostent(void);</code></pre><p>stayopen: IP 주소 데이터베이스를 열어둘 것인지 여부를 나타내는 값</p>
<p>gethostent: 호스트명과 IP 주소를 읽어서 hostent 구조체에 저장하고 해당 주소를 리턴
sethostent: 데이터베이스의 현재 읽기 위치를 시작 부분으로 재설정
endhostent: 데이터 베이스를 닫음</p>
<h4 id="hostent-구조체">hostent 구조체</h4>
<pre><code>struct hostent{
    char *h_name;
    char **h_aliases;
    int h_addrtype;
    int h_length;
    char **h_addr_list;
};</code></pre><ul>
<li>h_name: 호스트명 저장</li>
<li>h_aliases: 호스트를 가리키는 다른 이름 저장</li>
<li>h_addrtype: 호스트 주소의 형식을 지정</li>
<li>h_length: 주소의 길이 저장</li>
<li>h_addr_list: 해당 호스트의 주소 목록 저장</li>
</ul>
<h4 id="호스트명으로-정보-검색-gethostbyname3">호스트명으로 정보 검색: gethostbyname(3)</h4>
<p>: 호스트명을 인자로 받아 데이터베이스에서 해당 항목을 검색해 hostent 구조체에 저장하고 그 주소를 리턴</p>
<pre><code>#include &lt;netdb.h&gt;

struct hostent *gethostbyname(const char *name);</code></pre><p>name: 검색하려는 호스트명</p>
<h4 id="ip-주소로-정보-검색-gethostbyaddr3">IP 주소로 정보 검색: gethostbyaddr(3)</h4>
<p>: IP주소를 인자로 받아 데이베이스에서 해당 항목을 검색해 hostent 구조체에 저장하고 그 주소를 리턴</p>
<pre><code>#include &lt;netdb.h&gt;
#include &lt;sys/socket.h&gt;

struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type);</code></pre><p>addr: 검색하려는 IP주소
len: addr 길이
type: IP주소 형식</p>
<h4 id="포트-정보-읽어오기-getservent3-setservent3-endservent3">포트 정보 읽어오기: getservent(3), setservent(3), endservent(3)</h4>
<pre><code>#include &lt;netdb.h&gt;

struct servent *getservent(void);
void setservent(inst stayopen);
void endservent(void);</code></pre><p>stayopen: 포트 정보 데이터베이스를 열어둘 것인지 여부를 나타내는 값</p>
<p>getservent: 포트 정보를 읽어서 servent 구조체에 저장하고 그 주소를 리턴
setservent: 데이터베이스의 현재 읽기 위치를 시작 부분으로 재설정
endservent: 데이터 베이스를 닫음</p>
<h4 id="servent-구조체">servent 구조체</h4>
<pre><code>struct serven{
    char *s_name;
    char **s_aliases;
    int s_port;
    char *s_proto;
};</code></pre><ul>
<li>s_name: 포트명을 저장</li>
<li>s_aliases: 해당 서비스를 가리키는 다른 이름들을 저장</li>
<li>s_port: 포트 번호를 저장</li>
<li>s_proto: 서비스에 사용하는 프로토콜의 종류를 나타냄</li>
</ul>
<h4 id="서비스명으로-정보-검색-getservbyname3">서비스명으로 정보 검색: getservbyname(3)</h4>
<p>: 포트명을 인자로 받아 데이터베이스에서 해당 항목을 검색해 servent 구조체에 저장하고 그 주소를 리턴</p>
<pre><code>#include &lt;netdb.h&gt;

struct servnet *getservbyname(const char *name, const chat *proto);</code></pre><p>name: 검색할 포트명
proto: &quot;tcp&quot; 또는 &quot;udp&quot;</p>
<h4 id="포트-번호로-정보-검색-getservbyport3">포트 번호로 정보 검색: getservbyport(3)</h4>
<p>: 포트 번호를 인자로 받아 데이터베이스에서 해당 항목을 검색해 servent 구조체에 저장하고 그 주소를 리턴</p>
<pre><code>#include &lt;netdb.h&gt;

struct servent *getservbyport(int port, const char *proto);</code></pre><p>port: 검색할 포트 번호
proto: &quot;tcp&quot; 또는 &quot;udp&quot;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 트렌드 코리아 2025 ] 키워드 정리 - Snake Sense]]></title>
            <link>https://velog.io/@e-jiwoo/%ED%8A%B8%EB%A0%8C%EB%93%9C-%EC%BD%94%EB%A6%AC%EC%95%84-2025-%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@e-jiwoo/%ED%8A%B8%EB%A0%8C%EB%93%9C-%EC%BD%94%EB%A6%AC%EC%95%84-2025-%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 08 Dec 2024 17:08:23 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>[ 트렌드 코리아 2025 - 김난도 ]</strong> 의 책을 읽고 2025년도 한국의 트렌드를 분석하며 정리한 내용입니다 🌟</p>
</blockquote>
<h2 id="다양한-취향-소비자">&quot;다양한 취향 소비자&quot;</h2>
<h3 id="옴니부어">옴니부어</h3>
<p><strong>고정관념</strong>이 사라지는 시대</p>
<p>자신만의 라이프스타일, 개성, 취향에 따른 소비</p>
<h2 id="아주-보통의-하루">&quot;아주 보통의 하루&quot;</h2>
<h3 id="아보하">아보하</h3>
<p>내일은 오늘 같기를 바라는 <strong>안온한 일상</strong></p>
<ul>
<li>무탈, 보통, 평범, 일상의 온라인 언급량 증가</li>
<li>남에게 과시하기보다 자신에게 집중하는 하루</li>
</ul>
<h2 id="내가-꾸미는-토핑">&quot;내가 꾸미는 토핑&quot;</h2>
<h3 id="토핑경제">토핑경제</h3>
<p>세상에 둘도 없는 <strong>나만의 것</strong></p>
<ul>
<li><strong>개성이 드러나는</strong> 자신만의 소비</li>
<li>기업과 제품은 기본적 가치에 충실, <strong>제품의 완성은 소비자</strong></li>
</ul>
<h2 id="ai-얼굴-표정-기술">&quot;AI 얼굴, 표정 기술&quot;</h2>
<h3 id="페이스테크">페이스테크</h3>
<p>생성형 AI 만능의 시대</p>
<p>사용자마다 <strong>각자의 얼굴을 만들어주는</strong> 기술 </p>
<ul>
<li>기계에 인간의표정을 입혀 생동감과 친밀감을 높임</li>
<li>상대방(소비자)의 얼굴과 표정을 읽어 상태 파악</li>
<li>표정 만들기: 이모지, 버튜버, 뷰티 산업</li>
</ul>
<h2 id="작고-귀엽고-순수함의-힘">&quot;작고 귀엽고 순수함의 힘”</h2>
<h3 id="무해력">무해력</h3>
<p><strong>작고 귀엽고 순수한 것들</strong></p>
<ul>
<li>스스로를 ‘긁힌 세대’라 부르는 젊음이들은 해가 없는 대상을 찾음</li>
<li>작고 조그만 것, 서투른 것 선호</li>
</ul>
<h2 id="한국적인-것-확장">&quot;한국적인 것 확장&quot;</h2>
<h3 id="그라데이션-k">그라데이션 K</h3>
<p>다문화 국가</p>
<p><strong>세계화와 로컬화</strong>가 서로 빠르게 섞이면서 그라데이션이 진행 중</p>
<h2 id="체험-경험-요구">&quot;체험, 경험 요구&quot;</h2>
<h3 id="물성매력">물성매력</h3>
<p>보고, 만지고, 느끼고</p>
<p>체화된 물성으로 <strong>경험</strong>하고자 하며, 그 기억을 오래 간직한다</p>
<ul>
<li>소비자 체험의 중요성</li>
<li>콘텐츠, 브랜드, 기술, 조직 문화의 물성화</li>
</ul>
<h2 id="기후변화-반응-태도">&quot;기후변화 반응 태도&quot;</h2>
<h3 id="기후감수성">기후감수성</h3>
<p><strong>기후 문제 해결</strong>을 위해 적극적으로 실천하는 방향의 삶으로 변화</p>
<ul>
<li>폭염관련 상품의 등장</li>
<li>기후문제와 날씨에 따른 다양한 기업의 이벤트 등장</li>
</ul>
<h2 id="상생의-진화-동반성장">&quot;상생의 진화, 동반성장 &quot;</h2>
<h3 id="공진화-전략">공진화 전략</h3>
<p>다른 산업과의 긴밀한 연계를 통해 <strong>공동 성장을 도모</strong></p>
<p>1단계: 폐쇄적 자족 시스템</p>
<p>2단계: 제한된 파트너쉽</p>
<p>3단계: 개방적 협력망</p>
<p>4단계: 공진화 생태계</p>
<h2 id="자기계발-하나-레벨-업">&quot;자기계발 하나 레벨 업&quot;</h2>
<h3 id="원포인트업">원포인트업</h3>
<p>롤모델을 삼는 것을 대신하여 <strong>자기가 잘할 수 있는 일</strong>을 찾아 실천하며 성취감을 느끼고, 도달 가능한 목표를 세워 실천</p>
<ul>
<li>성공의 기준은 이제 천차만별, 자기계발은 이제 <strong>나의 답</strong>을 찾는 과정</li>
<li>실천 가능한 한 가지에 집중, 작더라도 도달 가능한 목표</li>
<li>일상의 노력을 기록하고 공유, 과시용이 아닌 같은 목표를 가진 사람과 서로 응원하고 격려</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 트렌드 코리아 2024 ]를 읽고.. -Dragon Eyes]]></title>
            <link>https://velog.io/@e-jiwoo/%ED%8A%B8%EB%A0%8C%EB%93%9C-%EC%BD%94%EB%A6%AC%EC%95%84-2024-%EB%A5%BC-%EC%9D%BD%EA%B3%A0..-Dragon-Eyes</link>
            <guid>https://velog.io/@e-jiwoo/%ED%8A%B8%EB%A0%8C%EB%93%9C-%EC%BD%94%EB%A6%AC%EC%95%84-2024-%EB%A5%BC-%EC%9D%BD%EA%B3%A0..-Dragon-Eyes</guid>
            <pubDate>Fri, 13 Sep 2024 05:59:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>[ 트렌드 코리아 2024 - 김난도 ] 의 책을 읽고 2024년도 한국의 트렌드를 분석하며 정리한 내용입니다 🌟</p>
</blockquote>
<h2 id="dont-waste-a-single-second">&quot;Don&#39;t waste a single second&quot;</h2>
<h3 id="분초사회effiecient-society">분초사회(Effiecient Society)</h3>
<p><strong>시간의 가성비</strong>의 중요도 향상</p>
<h2 id="rise-of-homo-promptus">&quot;Rise of &#39;Homo promptus&#39;&quot;</h2>
<h3 id="호모-프롬포트homo-promptus">호모 프롬포트(Homo Promptus)</h3>
<p>AI 기술이 아무리 뛰어나도, 결국 <strong>화룡점정의 역량</strong>은 사색과 해석력을 겸비한 <strong>인간만의 것</strong></p>
<h2 id="aspiring-to-be-a-hexagonal-human">&quot;Aspiring to be a hexagonal human&quot;</h2>
<h3 id="육각형-인간hexagonal-human">육각형 인간(Hexagonal Human)</h3>
<p>외모, 학력, 자산, 직업, 집안, 성격 등등 모든 것에서 하<strong>나도 빠짐이 없는 사람</strong>을 지향
-&gt; 어차피 닿을 수 없는 목표, 포기를 즐기자라는 마인드로 사회를 사는 젊은이들의 활력이자 절망이면서 하나의 놀이</p>
<h2 id="getting-the-price-right">&quot;Getting the price right&quot;</h2>
<h3 id="버라이어티-가격-전략variavle-pricing">버라이어티 가격 전략(Variavle Pricing)</h3>
<p>최저가보다는 <strong>최적가</strong>의 중요도 향상</p>
<h2 id="on-dopamine-farming">&quot;On dopamine farming&quot;</h2>
<h3 id="도파밍dopaming">도파밍(Dopaming)</h3>
<p>도파민(Dopamine)+파밍(Farming)을 결합한 단어
-&gt; 즐거움을 줄 수 있는 <strong>도파민이 분출되는 행동이라면</strong> 무엇이든 시도해보고 수집해보려는 노력</p>
<h2 id="not-like-old-daddies">&quot;Not like old daddies&quot;</h2>
<h3 id="요즘남편-없던아빠millennial-hubbies">요즘남편 없던아빠(Millennial Hubbies)</h3>
<p>가사 노동, 육아, 그리고 <strong>가족 관계의 균형점 이동</strong>
-&gt; 권위적 가장에서 평등한 동반자로 역할이 바뀌어가고 있음</p>
<h2 id="expanding-yout-horizons">&quot;Expanding yout horizons&quot;</h2>
<h3 id="스핀오프-프로젝트spin-off-projects">스핀오프 프로젝트(Spin-Off Projects)</h3>
<p>비교적 저예산과 유동적인 전략으로 새로운 비지니스를 시도해보는 <strong>스핀오프가 산업 전반으로 확산되는 추세</strong></p>
<h2 id="you-choose-ill-follow">&quot;You choose, I&#39;ll follow&quot;</h2>
<h3 id="디토소비ditto-consumption">디토소비(Ditto Consumption)</h3>
<p>자신의 가치관과 취향을 오롯이 반영하는 사람, 콘텐츠, 유통 채널의 <strong>선택을 따라 구매 의사를 결정</strong>
-&gt; 고민의 시간 절약, 실패의 두려움 감소를 위한 손쉬운 방편으로 뜨고 있음</p>
<h2 id="elasticity-liquidpolitan">&quot;Elasticity liquidpolitan&quot;</h2>
<h3 id="리퀴드-폴리탄elasticity-liquidpolitan">리퀴드 폴리탄(Elasticity Liquidpolitan)</h3>
<p>액체(Liquid)+도시(Metropolitan)을 결합한 단어
-&gt; 고정된 공간이 아니라 유연하게 변화하는 도시</p>
<h2 id="supporting-one-another">&quot;Supporting one another&quot;</h2>
<h3 id="돌봄경제care-based-economy">돌봄경제(Care-based Economy)</h3>
<p>타인이 건강하게 살아갈 수 있도록 도움을 주는 행위가 경제-산업 분야에 확장</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[react-native svg]]></title>
            <link>https://velog.io/@e-jiwoo/react-native-svg</link>
            <guid>https://velog.io/@e-jiwoo/react-native-svg</guid>
            <pubDate>Mon, 06 May 2024 17:07:05 GMT</pubDate>
            <description><![CDATA[<p>한 프로젝트에서 앱을 맡게 되어 react-native를 공부하게 되었다
개발을 하면서 모르는 게 생길 때마다 검색을 해가며 공부하는 방식을 선택하였고 그렇게 바로 개발을 시작하게 되었다</p>
<p>프로젝트의 첫 페이지에는 이모지가 들어가있었다
나는 리액트에서 했던 것처럼</p>
<pre><code>import emoji from &quot;./src/assets/emoji.svg&quot;

&lt;Image source={emoji}/&gt;</code></pre><p>와 같이 코드를 작성한 후 저장하고 화면을 보았다 엄.. 아무것도 보이지 않았다
새로고침의 문제인가 싶어서 밑에 텍스트 코드를 작성한 후 실행시켜보니 텍스트는 잘 보였다
흠..
그 다음으로는 svg파일이였던 사진을 png파일로 바꿔 실행시켜보았다
오 화면에 떴다..!</p>
<p>그런데 여기서 의문하나가 들었다
&#39; 그럼 react-native에서는 svg가 사용이 안되는 건가? &#39;
그래서 구글링을 해보니 react-native에서 svg파일을 사용하려면 <a href="https://github.com/software-mansion/react-native-svg">react-native-라이브러리</a>를 사용해야 한다고 한다..!</p>
<p>다음에는 또 무슨 문제로 이렇게 글을 쓸지 궁금한데 생각보다 빨리 글을 쓰게 될 것 같다..^-^;; 문제 생기고 해결하면 또 적어야쥥~ 다들 개발 화이팅✨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA['리액트로 웹앱 만들기 with 타입스크립트' 책 리뷰]]></title>
            <link>https://velog.io/@e-jiwoo/%EB%A6%AC%EC%95%A1%ED%8A%B8%EB%A1%9C-%EC%9B%B9%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%B1%85-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@e-jiwoo/%EB%A6%AC%EC%95%A1%ED%8A%B8%EB%A1%9C-%EC%9B%B9%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-with-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%B1%85-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Tue, 09 Apr 2024 10:28:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/749b6bae-738f-4138-b1e4-4b00d2239760/image.png" alt=""></p>
<blockquote>
<p>👏 <em>이지스퍼블리싱 서평단을 통해 책을 받게 되어 이렇게 리뷰를 해보게 되었습니다!</em></p>
</blockquote>
<h3 id="안녕하세요">안녕하세요!!</h3>
<p>리액트 개발자라면 이렇게 해야 인정받는다! 안녕하세요 오늘은 <strong>&#39;리액트로 웹앱 만들기 with 타입스크립트&#39;</strong> 책 리뷰를 해보려고 합니다</p>
<h3 id="서평단으로-신청한-이유는">서평단으로 신청한 이유는?</h3>
<p>저는 부산소프트웨어마이스터고🏫에서 재학 중인 학생입니다 1학년 때 자바스크립트를 사용하여 리액트를 이용해왔었습니다 그런데 시간이 지날수록 타입스크립트가 점점 뜨더라고요..🤔 그래서 타입스크립트에 관심을 가지다가 이번에 이지스퍼블리싱에서 이 책의 서평단을 모집하여 리뷰를 할 수 있는 좋은 기회를 주셔서 참여할 수 있게 되었습니다!</p>
<h3 id="책-리뷰">책 리뷰</h3>
<p>리액트의 개발 과정과 원리, 스타일링, 컴포넌트와 훅, 상태관리, 라우터와 같이 리액트로 개발하기 위해 기본적으로 알아야 할 지식들을 15차시로 나눠서 설명해주고 있습니다! 저는 이전에 자바스크립트로 개발을 해본 사람으로서 책의 목차만 보았을 때 &quot;오 입문용으로 이 책 괜찮겠는 걸?&quot;이라는 생각이 바로 들더라고요ㅎㅎ 그런데 정말로 책 내용까지 확인해보았을 때 이미지로도 나와있고 코드와 그에 대한 설명 또한 입문자의 시선에서 보았을 때 이해하기 쉽게 나와있어서 입문용으로 좋겠다고 생각이 드네요</p>
<h3 id="소감">소감</h3>
<p>저는 감사드리게도 이지스퍼블리싱의 서평단으로 참여하여 이렇게 책을 받아보게 되었고 이 책을 보며 개발을 할 수 있게 되었는데 만약 자신이 처음으로 리액트를 이용하여 개발을 할 때 타입스크립트를 사용하고자 한다..!라고 하시는 분들이 책을 찾고 계신다면 이 책을 추천드릴 것 같습니다! 그럼 모두 개발 화이팅😆</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter란]]></title>
            <link>https://velog.io/@e-jiwoo/Flutter%EB%9E%80-evxlei1t</link>
            <guid>https://velog.io/@e-jiwoo/Flutter%EB%9E%80-evxlei1t</guid>
            <pubDate>Sat, 06 Apr 2024 13:11:51 GMT</pubDate>
            <description><![CDATA[<h3 id="flutter에-대해">Flutter에 대해</h3>
<ul>
<li>모두 위젯으로 이루어져 있다(작은 텍스트나 버튼 혹은 큰 레이아웃 등등)</li>
<li>Container : 자식 위젯들을 커스터마이징할 수 있는 위젯 클래스<pre><code>        -&gt; 여백, 간격, 테두리, 배경색을 추가하고 싶을 때 사용</code></pre></li>
<li>위젯 생성, 컨트롤을 하기 위해서는 StatelessWidget, StatefulWideget, State 이 세가지를 알아야 한다(Flutter 문법 벨로그 참고)</li>
<li>네이티브단에서 일일히 상태를 지정할 필요 없이 머트리얼 디자인 또는 쿠퍼티노 디자인에 맞는 UI를 다 제공(이를 사용하면 간편하고 쉽게 위젯으로 만들어 사용하기 때문에 개인 앱 제작과 작은 외주 프로젝트용으로 flutter가 편리하다)</li>
<li>화면 전환을 위해 라우터를 사용하고 Navigator라는 클래스를 이용</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[ Flutter 문법]]></title>
            <link>https://velog.io/@e-jiwoo/Flutter-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@e-jiwoo/Flutter-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Sat, 06 Apr 2024 12:56:14 GMT</pubDate>
            <description><![CDATA[<h3 id="위젯">위젯</h3>
<p>: 모든 시각적 요소(버튼, 텍스트, 이미지)
-&gt; 계층구조
-&gt; 효율적인 통신을 위해 상태 관리 패턴인 Provider, Riverpod, Bloc 등 사용 가능</p>
<ul>
<li><p>Center() : 부모위젯을 기준으로 자식위젯을 가운데 정렬</p>
</li>
<li><p>Container() : 내부의 정 가운데 자식위젯을 위치</p>
</li>
<li><p>StatelessWidget
: 상태가 고정일 때 사용(앱의 로고나 정적 텍스트)</p>
</li>
<li><blockquote>
<p>Text, Image, Container, Row, Column, ListView 등 클래스 포함
Object: 모든 플러터 객체의 기본 클래스
Diagnosticable: 진단 정보를 제공하기 위한 추상 클래스
DiagnosticableTree: 진단 정보를 트리 구조로 제공하기 위한 추상 클래스
Widget: 플러터의 위젯을 나타내기 위한 추상 클래스
Text: 주어진 텍스트를 화면에 표시</p>
</blockquote>
</li>
<li><p>StatefulWidget
: 상태가 변하고 UI 바뀜이 필요할 때 사용</p>
</li>
<li><blockquote>
<p>TextButton, IconButton, Checkbox, Radio, TextFormField, DropdownButton 등 클래스 포함
MaterialButton: 머티리얼 디자인 스타일을 가지는 버튼 위젯을 나타냄
(TextButton은 MaterialButton의 하위 클래스)
TextButton: 텍스트를 보여주고 사용자 입력에 반응하는 버튼 위젯
(일반적으로 눌렀을 때 어떤 작업을 수행하기 위해 사용)</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SSR과 CSR이란?]]></title>
            <link>https://velog.io/@e-jiwoo/SSR%EA%B3%BC-CSR%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@e-jiwoo/SSR%EA%B3%BC-CSR%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Thu, 18 Jan 2024 14:58:58 GMT</pubDate>
            <description><![CDATA[<h1 id="-csr--client-side-rendering-">[ CSR ( Client Side Rendering) ]</h1>
<p>서버에서 전체 페이지(빈 페이지)를 최초 렌더링하고 사용자가 요청할 때마다 클라이언트 내(브라우저)에서 렌더링 하는 기법</p>
<h2 id="초기-화면-동작과정">초기 화면 동작과정</h2>
<ol>
<li>사용자가 홈페이지를 접속한 경우(최초 접속) 클라이언트는 이를 확인하고 서버로 요청한다</li>
<li>서버는 빈 페이지를 클라이언트에게 전달한다</li>
<li>전달받은 클라이언트에서 해당 화면을 그려주고 스크립트를 다운로드하여 최종적인 화면을 사용자에게 보여준다</li>
<li>사용자가 다음 액션을 수행하는 경우 클라이언트 내에서 페이지를 요청하고 수행한다</li>
</ol>
<h2 id="장점">장점</h2>
<h3 id="빠른-속도">빠른 속도</h3>
<p>브라우저 내에서 페이지를 이동하기에 상대적으로 페이지 간 이동 시 속도가 빠르며 필요한 내용과 수정된 데이터에 대해서만 교체를 하기에 속도가 빠름</p>
<h3 id="사용자-친화적">사용자 친화적</h3>
<p>새로고침이 없으므로 화면 깜빡임이 발생하지 않아서 사용자에게 친화적임</p>
<h3 id="짧은-공백기간">짧은 공백기간</h3>
<p>TTV와 TTI의 공백기간이 짧다</p>
<ul>
<li>TTV(Time To View): 사용자가 웹브라우저에서 내용을 볼 수 있는 시점</li>
<li>TTI(Time To Interact): 사용자가 웹브라우저에서 인터랙션할 수 있는 시점</li>
</ul>
<h2 id="단점">단점</h2>
<ul>
<li>초기 페이지 렌더링 속도가 느림
(빈 페이지를 출력하고 스크립트의 링크에 따라 다운을 받기 때문이다)</li>
<li>검색엔진 최적화에 불리함
(초기 페이지를 빈 페이지로 우선 보여주기 때문이다)</li>
</ul>
<h3 id="프레임워크">프레임워크</h3>
<p>React</p>
<hr>
<h1 id="-ssr-sever-side-rendering-">[ SSR (Sever Side Rendering) ]</h1>
<p>서버에서 페이지를 그려 클라이언트(브라우저)로 보낸 후 화면에 표시하는 기법</p>
<h2 id="초기-화면-동작과정-1">초기 화면 동작과정</h2>
<ol>
<li>사용자가 브라우저에서 요청을 한다(최초 홈페이지 접속)</li>
<li>클라이언트에서는 이를 확인하고 서버로 요청을 한다</li>
<li>서버에서 데이터를 포함한 미리 구성된 정적 파일을 클라이언트에게 전달한다
4, 전달받은 클라이언트에서 스크립트가 수행하여 최종적인 화면을 브라우저에 그려 사용자에게 보여준다</li>
</ol>
<h2 id="사용-목적">사용 목적</h2>
<h3 id="검색-엔진-최적화-seo">검색 엔진 최적화 (SEO)</h3>
<p>검색 사이트(ex 구글, 네이버)에서 검색했을 때 결과가 사용자에게 많이 노출될 수 있도록 최적화하는 기법</p>
<h3 id="빠른-페이지-렌더링">빠른 페이지 렌더링</h3>
<p>빈 HTML 페이지를 받아 브라우저에서 그리지 않고 미리 그려서 브라우저로 보내주기 때문에 페이지를 그리는 시간이 단축됨</p>
<h3 id="통합-유지보수-모델">통합 유지보수 모델</h3>
<p>전체 앱을 개발하기 위해 동일한 언어와 선언적 컴포넌트 지향의 유지보수 모델을 사용할 수 있음</p>
<h2 id="단점-1">단점</h2>
<ul>
<li>프로젝트의 복잡도</li>
<li>CSR에 비해 서버 부하가 큼
(CSR 서비스보다 서버가 할 일이 많고 바빠서 트래픽이 많이 몰릴 경우 응답이 느려지거나, 메모리가 한도를 초과해 서버가 동작을 멈추게 될 수도 있다)</li>
<li>불필요한 인터넷 대역폭이 소모될 수 있음</li>
<li>페이지 요청마다 페이지 새로고침이 발생</li>
</ul>
<h3 id="프레임워크-1">프레임워크</h3>
<p>Next.js / Vue.js</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[<a>와 <Link>의 차이점]]></title>
            <link>https://velog.io/@e-jiwoo/a%EC%99%80-Link%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@e-jiwoo/a%EC%99%80-Link%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Fri, 12 Jan 2024 14:03:19 GMT</pubDate>
            <description><![CDATA[<h2 id="a-태그">a 태그</h2>
<ul>
<li>href 특성을 통해서 웹 사이트 내에서 다른 페이지, 같은 페이지 내의 특정 위치, 그 외 다른 웹 사이트 URL로 연결할 수 있는 하이퍼링크를 만든다</li>
<li>href로 지정한 주소로 이동을 하기 때문에 새로고침이 일어난다</li>
</ul>
<h2 id="link-컴포넌트">Link 컴포넌트</h2>
<ul>
<li>React에서 사용하는 a 태그라고 말할 수 있다</li>
<li>주소로 이동하여 전체를 새로고침 하는 것이 아니라 필요한 부분만 재 랜더링 하도록 하는 컴포넌트이다</li>
<li>to를 이용하여 이동한다</li>
</ul>
<h2 id="a-태그-vs-link-컴포넌트">a 태그 vs Link 컴포넌트</h2>
<p>가장 큰 차이점은 a태그의 href로 이동하면 상태 값을 읽고 Link 컴포넌트보다 속도가 저하된다는 것이다
반면, Link 컴포넌트는 브라우저의 주소만 바꾸고 페이지 자체를 새로고침하지는 않는다</p>
<h4 id="결론--react에서는-a-태그보다는-link-컴포넌트를-사용하는-것이-좋다ㅏㅏ">결론 : React에서는 a 태그보다는 Link 컴포넌트를 사용하는 것이 좋다ㅏㅏ</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[AI의 일자리 역습... 기술 대전환기 실직사태 대비해야]]></title>
            <link>https://velog.io/@e-jiwoo/AI%EC%9D%98-%EC%9D%BC%EC%9E%90%EB%A6%AC-%EC%97%AD%EC%8A%B5...-%EA%B8%B0%EC%88%A0-%EB%8C%80%EC%A0%84%ED%99%98%EA%B8%B0-%EC%8B%A4%EC%A7%81%EC%82%AC%ED%83%9C-%EB%8C%80%EB%B9%84%ED%95%B4%EC%95%BC</link>
            <guid>https://velog.io/@e-jiwoo/AI%EC%9D%98-%EC%9D%BC%EC%9E%90%EB%A6%AC-%EC%97%AD%EC%8A%B5...-%EA%B8%B0%EC%88%A0-%EB%8C%80%EC%A0%84%ED%99%98%EA%B8%B0-%EC%8B%A4%EC%A7%81%EC%82%AC%ED%83%9C-%EB%8C%80%EB%B9%84%ED%95%B4%EC%95%BC</guid>
            <pubDate>Fri, 29 Dec 2023 01:26:25 GMT</pubDate>
            <description><![CDATA[<h1 id="📰-뉴스">📰 뉴스</h1>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/51e912ad-2501-47e3-8bf5-e4a2f4e4f989/image.png" alt=""></p>
<h1 id="🌟-감상평">🌟 감상평</h1>
<p>현재 AI의 발전이 점점 빨라지고 늘어나고 있다. 인공지능은 약인공지능, 강인공지능, 초인공지능으로 나눌 수 있는데 gpt 5에 강인공지능이 적용될 것이며 이제 머지않아 강인공지능의 시대가 올 것이라는 것을 들은 적이 있다. 강인공지능이란 인공지능을 인간의 지식과 동일하게 구현하고자 하는 기술이다. 강인공지능의 시대가 올 것이다라는 말과 위의 기사를 통해 아무래도 소프트웨어 쪽의 직업을 희망하고 있는 나로서는 생활 속에 AI가 사용되기 시작하며 편리함이 올 것이다와 같은 긍정적인 시선보다는 점점 AI가 발전해 나가고 AI가 사람의 기술을 띄어 넘게 되는 순간이 온다면 점점 사람의 직업은 사라지게 될 것이고 그로 인해 실직을 하는 사람들이 많아질 것이다와 같은 부정적인 시선으로 바라보았다. 그러다 보니 이러한 소식과 AI의 발전은 나에게 두려움의 존재로 다가오게 되었고 듣고 두려워하기만 하는 것이 아닌 최악의 상황을 먼저 바라보고 대비를 하는 자세를 가져야겠다고 생각이 들었다. 내가 생각하는 최악의 상황이란 AI가 인간과 유사한 마음이나 감정 따위를 지니고 행동하게 되는 순간 즉, 초인공지능 시대가 최악의 상황이라고 생각한다. 만약에 초인공지능의 시대가 찾아오게 된다면 일자리의 실직 위험을 걱정하는 것과 더해 인간의 권리에 대해서도 걱정을 해야하게 될 상황이 올 것이다. 이를 대비하기 위해서는 소프트웨어에 대해 공부하는 입장에서 AI라는 기술과 AI라는 것에 대하여 자세히 알고 이가 어떤 원리로 작동이 되는 지, 인간과 AI가 공존하며 인간의 편리를 증가시킬 수 있게 하기 위해서는 어떤 기술을 어느 선까지 개발을 해야 하는지에 대해 많이 공부하고 고민해 봐야한다고 생각한다.
나는 많은 소프트웨어의 분야 중에서 AI라는 분야에 대해 관심을 가지고 있다. 나의 고등학생 기간 동안의 목표로는 AI 분야에 대해 학교에서 배우는 것 외에도 공부를 하며 기술을 늘려가고 공부한 AI 기술을 학교에서 배우게 되는 하드웨어와 소프트웨어적 기술에 넣어 개발을 해나가는 것이다. AI라는 분야에 대해 관심이 있는 만큼 AI의 현재 상황과 AI의 개발로 인해 일어나게 될 일들에 대해 그 누구보다도 관심을 가지며 해결방안을 생각해나가야 한다고 생각한다. 아직 최악의 상황이 오지 않은 현재에 집중하여 최악의 상황에 올 피해를 최대한 줄이기 위해 노력하며 미래에는 현재보다 인간의 편리가 증가하여 더욱 발전된 환경으로 만들어 나가야겠다고 생각하게 되었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AI 활용 기업 2020년 2.5% -> 올해 28%]]></title>
            <link>https://velog.io/@e-jiwoo/AI-%ED%99%9C%EC%9A%A9-%EA%B8%B0%EC%97%85-2020%EB%85%84-2.5-%EC%98%AC%ED%95%B4-28</link>
            <guid>https://velog.io/@e-jiwoo/AI-%ED%99%9C%EC%9A%A9-%EA%B8%B0%EC%97%85-2020%EB%85%84-2.5-%EC%98%AC%ED%95%B4-28</guid>
            <pubDate>Fri, 29 Dec 2023 01:02:54 GMT</pubDate>
            <description><![CDATA[<h1 id="📰-뉴스">📰 뉴스</h1>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/7b52a85e-68bd-4416-974e-0f4e8677840e/image.png" alt=""></p>
<h1 id="🌟-감상평">🌟 감상평</h1>
<p>AI가 점점 발전해나가고 있다는 사실은 발전해 나가는 gpt, gpt의 사용자 증가와 gpt 이외에도 뤼튼과 같은 여러 AI 기술을 사용한 웹, 앱 증가를 통하여 간접적으로 알고 있었다. 그런데 매일 경제의 위의 뉴스를 통해 수치와 AI의 기술이 기업에 많이 사용되고 있다는 것에 대해 직접적으로 알게 되었다. 또한 3년이라는 시간 동안에 AI 활용 기업이 25.5%나 증가하여 2020년 조사 당시의 응답률보다 11배 넘게 증가한 수치라는 사실이 나의 생각보다 수치가 차이가 많이 나서 굉장히 흥미로웠고 신기하였다. 
현재 나는 부산소프트웨어마이스터고등학교라는 소프트웨어 중심의 고등학교에 재학 중인 학생이다. 그래서 위와 같은 뉴스의 정보가 굉장히 나에게 와닿았다. 고등학교에 들어온 후 초반에 인공지능이라는 분야에 관심이 갔는데 위의 뉴스를 통하여 AI를 활용하는 기업의 비율이 점점 늘어나고 있는 것 같아 더욱 인공지능이라는 분야에 관심이 갔다. 
그런데 아쉽게도 우리 고등학교가 소프트웨어 중심의 교육을 다루고 있긴 하지만 인공지능이라는 분야에 대해서는 자세히 다루지 않는다고 알고 있다. 우리 학교의 2학년 선배님 중에서 인공지능에 관심을 가지고 스스로 공부를 하여 동아리 프로젝트에 AI를 활용하신 분들이 있다는 것을 알고 있고 또한  최근 학교에서 열린 전공 동아리 결과 발표회 때 인공지능을 활용한 동아리가 앞에서 말했던 동아리 외에도 하나의 동아리가 AI를 활용하여 프로젝트를 제작하여 총 AI를 활용하여 프로젝트를 만든 동아리 2팀을 보았었다. 학교에서 인공지능이라는 분야에 대해 자세히 다루지 않았어도 각자 스스로 공부하여 프로젝트를 제작할 시 학교에서 배운 소프트웨어 기술에 AI 기술을 활용하는 선배님들을 보고 나 또한 인공지능 분야에 관심이 있으니 학교에서 자세히 다루지 않더라도 따로 관심을 지속적으로 가지고 공부하여 공부한 지식을 학교에서 배운 지식에 더하여 프로젝트를 제작할 수 있는 학생이 되는 것을 목표로 2학년을 보내야겠다고 다짐하였고 목표를 이루기 위해 노력할 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[7-1 다양한 보조기억장치]]></title>
            <link>https://velog.io/@e-jiwoo/7-1-%EB%8B%A4%EC%96%91%ED%95%9C-%EB%B3%B4%EC%A1%B0%EA%B8%B0%EC%96%B5%EC%9E%A5%EC%B9%98</link>
            <guid>https://velog.io/@e-jiwoo/7-1-%EB%8B%A4%EC%96%91%ED%95%9C-%EB%B3%B4%EC%A1%B0%EA%B8%B0%EC%96%B5%EC%9E%A5%EC%B9%98</guid>
            <pubDate>Fri, 01 Dec 2023 14:53:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="혼자-공부하는-컴퓨터구조--7-1-다양한-보조기억장치">혼자 공부하는 컴퓨터구조 &lt; 7-1 다양한 보조기억장치 &gt;</h3>
</blockquote>
<h1 id="🌟-보조기억장치">🌟 보조기억장치</h1>
<p>흔히 사용하는 USB 메모리, SD 카드, SSD와 같은 저장 장치</p>
<p>대표적인 보조기억장치 : 하드 디스크, 플래시 메모리</p>
<h2 id="💾-하드-디스크">💾 하드 디스크</h2>
<p>자기적인 방식으로 저장하는 보조기억장치
( 자기 디스크의 일종으로 지칭하기도 한다 )</p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/e3f2fbfc-06c9-479a-99ab-b7c721027140/image.png" alt=""></p>
<h3 id="-하드-디스크-구성-요소-">[ 하드 디스크 구성 요소 ]</h3>
<ul>
<li>플래터
하드 디스크에서 실질적으로 데이터가 저장되는 구성 요소</li>
<li><blockquote>
<p>회전하면서 도로 위를 이동하는 자동차의 바퀴에 해당하는 플래터는 회전하면서 데이터를 저장하는 역할</p>
</blockquote>
</li>
<li>스핀들
플래터를 회전시키는 구성 요소
( 단위 : RPM )</li>
<li><blockquote>
<p>자동차의 축과 같이 스핀들은 플래터를 중심으로 회전시키는 역할</p>
</blockquote>
</li>
<li>헤드
플래터를 대상으로 데이터를 읽고 쓰는 구성 요소</li>
<li><blockquote>
<p>자동차 엔진이 도로의 표면을 읽고, 필요에 따라 가속하거나 감속하는 것처럼 헤드는 플래터를 데이터를 읽고 쓰는 역할</p>
</blockquote>
</li>
<li>디스크 암
헤드를 이동시키는 구성 요소</li>
<li><blockquote>
<p>자동차의 방향을 제어하는 조향 장치처럼 디스크 암은 헤드를 정확한 위치로 이동시켜 특정 부분의 데이터에 액세스할 수 있도록 함</p>
</blockquote>
</li>
</ul>
<h3 id="-데이터-저장-">[ 데이터 저장 ]</h3>
<p>트랙과 섹터라는 단위로 데이터를 저장
<img src="https://velog.velcdn.com/images/e-jiwoo/post/7914213b-a43b-4064-8268-f0ea3cc7a793/image.png" alt="">
트랙 : 큰 동그라미
섹터 : 트랙을 작게 나눈 하나하나 단위
-&gt; 정확한 크기는 하드 디스크에 따라 차이가 있지만 일반적으로 512바이트 정도의 크기를 가지고 있다 
-&gt; 하나 이상의 섹터를 묶어 블록이라고 표현하기도 한다 
실린더 : 여러 겹의 플래터 상에서 같은 트랙이 위치한 곳을 모아 연결한 논리적 단위
-&gt; 연속된 정보는 보통 한 실린더에 기록된다</p>
<h3 id="-저장된-데이터에-접근하는-과정-">[ 저장된 데이터에 접근하는 과정 ]</h3>
<ul>
<li>탐색 시간
: 접근하려는 데이터가 저장된 트랙까지 헤드를 이동시키는 시간</li>
<li>회전 지연
: 헤드가 있는 곳으로 플래터를 회전시키는 시간</li>
<li>전송 시간
: 하드 디스크와 컴퓨터 간에 데이터를 전송하는 시간</li>
</ul>
<h3 id="-프로그래머가-꼭-알아야-할-컴퓨터-시간들의-일부-발췌">+ &#39;프로그래머가 꼭 알아야 할 컴퓨터 시간들&#39;의 일부 발췌</h3>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/2021281a-eace-400f-9f9c-e9d59bb6adb3/image.png" alt=""></p>
<p>-&gt; 많은 시간이 걸린다
-&gt; 시간들이 별것 아닌 것 같아도 성능에 큰 영향을 끼친다</p>
<hr>
<h2 id="🔦-플래시-메모리">🔦 플래시 메모리</h2>
<p>전기적으로 데이터를 읽고 쓸 수 잇는 반도체 기반의 저장 장치</p>
<h3 id="-단위-알아보기-">[ 단위 알아보기 ]</h3>
<ul>
<li>셀
플래시 메모리에서 데이터를 저장하는 가장 작은 단위</li>
<li>페이지
셀들이 모여 만들어진 단위</li>
<li>블록
페이지가 모여 만들어진 단위</li>
<li>플레인
블록이 모여 만들어진 단위</li>
<li>다이
플레인이 모여 만들어진 단위</li>
</ul>
<p>( 읽기와 쓰기는 페이지 단위로, 삭제는 블록 단위로 이루어진다 )
<img src="https://velog.velcdn.com/images/e-jiwoo/post/45e5c1dd-4404-409b-9ace-ba2c45c8049d/image.png" alt=""></p>
<h3 id="-플래시-메모리-종류-">[ 플래시 메모리 종류 ]</h3>
<p>하나의 셀에 몇 비트를 저장할 수 있느냐에 따라 플래시 메모리 종류가 나뉜다</p>
<h4 id="slc-타입">SLC 타입</h4>
<ul>
<li>한 셀에 1비트를 저장할 수 있는 플래시 메모리</li>
<li>MLC나 TLC 타입에 비해 비트의 빠른 입출력이 가능하다</li>
<li>용량 대비 가격이 높다</li>
<li>보통 기업에서 데이터를 읽고 쓰기가 매우 많이 반복되며 고성능의 빠른 저장 장치가 필요한 경우에 사용한다</li>
</ul>
<h4 id="mlc-타입">MLC 타입</h4>
<ul>
<li>한 셀에 2비트를 저장할 수 있는 플래시 메모리</li>
<li>SLC 타입보다 대용화하기 유리하며 용량 대비 가격이 저렴하다</li>
<li>시중에서 사용되는 많은 플래시 메모리 저장 장치들이 MLC타입(혹은 후술할 TLC타입)으로 만들어진다</li>
</ul>
<h4 id="tlc-타입">TLC 타입</h4>
<ul>
<li>한 셀에 3비트를 저장할 수 있는 플래시 메모리</li>
<li>대용량화 하기가 유리하다</li>
<li>일반적으로 수명과 속도가 떨어지지만 용량 대비 가격이 저렴하다</li>
</ul>
<h4 id="qlc-타입">QLC 타입</h4>
<ul>
<li>한 셀이 4비트를 저장할 수 있는 플래시 메모리</li>
</ul>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/ae4f6626-4d65-4b77-9e5d-67b0820f0375/image.png" alt=""></p>
<h3 id="-페이지-상태-">[ 페이지 상태 ]</h3>
<ul>
<li>Free 상태
어떠한 데이터도 저장하고 있지 않아 새로운 데이터를 저장할 수 있는 상태</li>
<li>Vaild 상태
이미 유효한 데이터를 저장하고 있는 상태</li>
<li>Invaild 상태
쓰레기값이라 부르는 유효하지 않는 데이터를 저장하고 있는 상태</li>
</ul>
<p>( 플래시 메모리는 하드 디스크와는 달리 덮어쓰기가 불가능하여 Vaild 상태인 페이지에는 새 데이터를 저장할 수 없다 )</p>
<h3 id="-가비지-컬렉션-">[ 가비지 컬렉션 ]</h3>
<p>플래시 메모리는 쓰레기값을 정리하기 위해 가비지 컬렉션 기능을 사용한다</p>
<p>-&gt; 유효한 페이지들만을 새로운 블록으로 복사하고 기존의 블록을 삭제하는 기능</p>
<p><img src="https://velog.velcdn.com/images/e-jiwoo/post/562fb78e-a557-498d-9578-4a63ef4391e7/image.png" alt=""></p>
<p>출처: 혼자공부하는컴퓨터구조+운영체제</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HOOK]]></title>
            <link>https://velog.io/@e-jiwoo/HOOK</link>
            <guid>https://velog.io/@e-jiwoo/HOOK</guid>
            <pubDate>Thu, 14 Sep 2023 10:07:53 GMT</pubDate>
            <description><![CDATA[<p>Hook : 로직에 기반을 둔 작은 메서드 들로 컴포넌트의 기능을 나눌 수 있다
useState : 컴포넌트의 state를 간편하게 생성하고 업데이트를 시킬 수 있게 해주는 도구 (state를 관리할 때에 필요한 함수)</p>
<ul>
<li><p>react에서 useState를 import 받아야 한다</p>
<pre><code>import { useState } from &#39;react&#39;;</code></pre></li>
<li><p>변수 선언 / state의 생성과 동시에 가져야 할 초기값을 useState함수의 인자로 넣어주면 state와 setState라는 두가지 요소를 배열 형태로 리턴</p>
<pre><code>const [state, setstate] = useState(초기값);</code></pre></li>
<li><p>변수 재선언 / state의 값을 변경하려면 setState 함수를 불러서 인자에 변경될 값을 넣으면 된다</p>
<pre><code>setState(1); // state의 값을 1로 변경</code></pre></li>
</ul>
<p>-setState함수를 이용해서 state의 값을 변경하면 해당 컴포넌트는 화면에 다시 렌더링 되어서 state가 변경될 때마다 화면이 업데이트된다</p>
<p>useEffect : react component가 렌더링 될 때마다 특정 작업(side effect : component가 렌더링 된 이후에 비동기로 처리되어야 하는 부수적인 효과)을 실행할 수 있도록 한다</p>
<p>-state 변수만 변하는 것을 감지해서 렌더링 되도록 설정 해줄 수 있다</p>
<ul>
<li>componentDidMount / 컴포넌트를 만들고, 첫 렌더링을 다 마친 후 실행</li>
<li>componentDidUpdate / 리렌더링을 완료한 후 실행 (render()가 업데이트될 때마다 실행)</li>
<li>componentWillUnMount / 컴포넌트를 DOM에서 제거할 때 실행</li>
</ul>
<p>-</p>
<pre><code>useEffect(function, deps)</code></pre><p>function:실행하고자 하는 함수
deps: 배열 형태. function을 실행시킬 조건(deps에 특정값을 넣게 되면 컴포넌트가 mount될 때, 지정한 값이 업데이트될 때 useEffect를 실행)
-useEffect 함수 불러오기</p>
<pre><code>import React, { useEffect } from &quot;react&quot;;</code></pre><ul>
<li>한번만 실행<pre><code>useEffect(() =&gt; {
  document.title = `You clicked ${count} times`;
}, []);</code></pre>useEffect(함수, []) 이렇게 빈칸을 넣어놓으면 첫 렌더링 후 한 번만 렌더링 하도록 만들 수 있다</li>
</ul>
<p>useRef : 원하는 DOM 혹은 컴포넌트에 접근 가능하게 해주는 시스템</p>
<ul>
<li><pre><code>import { useRef } from &#39;react&#39;;</code></pre></li>
<li><p>useRef는 current를 통해 값에 접근할 수 있다</p>
</li>
<li><p>컴포넌트의 참조값이 변경되어도 리랜더링 되지 않는다</p>
</li>
<li><p>useRef 참조값이 존재하는 컴포넌트를 useState를 활용하여 리랜더링 시켜도 값은 초기화되지 않고 유지된다</p>
</li>
<li><p>DOM에 직접 접근하기 위해서는 접근하고자 하는 태그에 ref를 사용하면 된다</p>
</li>
<li><p>DOM에 직접 접근해 스타일 및 className을 조작하여 css를 변경하거나 value값을 추출하는 등의 작업을 진행할 수 있다</p>
</li>
<li><p>video 등의 미디어 요소에도 활용할 수 있다
(비디오 플레이어의 영상 경로를 변경하여 영상의 내용이 바뀌도록 활용할 수 있다)</p>
</li>
<li><p>보통 페이지 스크롤 등에 사용</p>
</li>
</ul>
<p>useLayoutEffect :  useEffect와 동일하지만, 모든 DOM 변경 후에 동기적으로 발생 ( DOM을 조작하는 코드가 존재하더라도, 사용자는 깜빡임을 보지 않는다) (useLayoutEffect 내에서 스케줄된 업데이트는 브라우저가 Paint하기 전에 동기적으로 실행(Flush)된다)</p>
<ul>
<li>useEffect와 useLayoutEffect의 차이는 Browser paints screen 전후로 실행되는 순서라고 볼 수도 있겠습니다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[scss]]></title>
            <link>https://velog.io/@e-jiwoo/scss</link>
            <guid>https://velog.io/@e-jiwoo/scss</guid>
            <pubDate>Thu, 17 Aug 2023 10:27:45 GMT</pubDate>
            <description><![CDATA[<h2 id="css의-한계">css의 한계</h2>
<ul>
<li>css는 선택자(selector)를 만드는 관점에서 볼 때 불필요한 부모 요소 선택자를 매번 적어야 한다</li>
<li>규모가 큰 프로젝트의 경우 자동화하기 어렵고 모든 것을 수정으로 변경해야 한다<h2 id="장점">장점</h2>
중첩, 변수 선언, 연산자 등 많은 장점을 가지고 있다</li>
</ul>
<h2 id="동적으로-css-관리">동적으로 CSS 관리</h2>
<p>프로그래밍 언어에서 사용하는 조건문, 반복문을 통해서 동적으로 CSS 관리가 가능하다</p>
<h2 id="변수">변수</h2>
<p>변수를 지정해 놓고 바로 사용이 가능 </p>
<ul>
<li>프로젝트 내에 정해놓은 컬러를 사용함에 있어 오차를 줄여주고, 사용하는 개발자 입장에서 효율적으로 개발이 가능</li>
<li>디자인 컨셉 변경과 같이 대대적으로 변경할 때에도, 변수 선언 부만 수정하면 되니 유지보수성이 뛰어나다<pre><code>$color: #ed5b46;
$borderRadius: 5px;
</code></pre></li>
</ul>
<p>div {</p>
<pre><code>background-color: $color;
border-radius: $borderRadius;</code></pre><p>}</p>
<pre><code>
## 중첩
셀렉터, 속성을 중첩시키거나 상위 요소를 참조하는 것이 가능하다</code></pre><p>label {</p>
<pre><code>  padding: 3% 0px;
  width: 100%;
  cursor: pointer;
  color: $colorPoint;

  &amp;:hover {
    color: white;
    background-color: $color;
  }</code></pre><p>}</p>
<pre><code>복잡한 구조의 HTML에서는 각각 요소들에 맞는 디자인을 추가하기 위해 id, class, className 등 태그마다 선언을 해줘야 하는 번거로움이 있으나, 셀렉터 중복 기능의 특성인 하위 항목에 적용되는 부분을 잘 이해하면 HTML 태그 자체에서 속성 값을 줄일 수 있으므로, HTML 코드의 가독성 또한 상승한다

## import
디폴트 디자인이 가능하고, 한쪽에서 선언해둔 컬러 코드나 폰트를 가져다가 다른 scss파일에서 사용하기가 용이하다
-&gt; 그에 따라 유지보수를 효과적으로 할 수 있다</code></pre><p>// common.scss</p>
<p>// colors
$color1: #ed5b46;
$color2: #f26671;
$color3: #f28585;
$color4: #feac97;</p>
<p>// Size Section
$borderRadius: 5px;</p>
<p>// default Tags
button {
  cursor: pointer;
  color: $color1;
  background-color: $color2;
  border-radius: $borderRadius;
  border: 0px;</p>
<p>  &amp;:hover {
    color: $color2;
    background-color: $color1;
  }
}</p>
<p>div {
  padding: 5px;
  border-radius: $borderRadius;
  border: $color3 1px solid;
}</p>
<pre><code></code></pre><p>// style.scss</p>
<p>@import &quot;common.scss&quot;;</p>
<p>.login_box {
  height: 100%;
  width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;</p>
<p>  div {
    border: 0px;
  }</p>
<p>  .box {
    background-color: $color4;
    width: 700px;
    height: 400px;
    padding: 10px;
    display: flex;
    justify-content: space-between;
  }
}</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[styled-components]]></title>
            <link>https://velog.io/@e-jiwoo/styled-components</link>
            <guid>https://velog.io/@e-jiwoo/styled-components</guid>
            <pubDate>Thu, 17 Aug 2023 10:17:01 GMT</pubDate>
            <description><![CDATA[<h3 id="styled-components">Styled-components</h3>
<ul>
<li>컴포넌트 기반으로 CSS를 작성할 수 있게 도와주는 라이브러리</li>
<li>CSS in JS 기술로, JS내에 CSS를 작성하는 라이브러리</li>
<li>className 기반</li>
<li>CSS파이링 아닌 JS로 작성된 컴포넌트에 바로 삽입하는 스타일 기법</li>
<li>클래스명을 해시값으로 자동 생성, 클래스명 오염 방지</li>
<li>자바스크립트의 동적인 값들을 온전하게 사용이 가능</li>
<li>변수에 따라서 스타일을 바꿀 수 있는 장점을 가짐</li>
<li>연산자(&amp;&amp;, || 등)를 이용해서 스타일을 적용 가능</li>
<li>자주 사용하는 css를 관리하기 위해 css props를 사용</li>
<li>GlobalStyle과 ThemeProvider를 사용하여 전역으로 사용할 요소들을 쉽게 정의 가능 <pre><code>import {createGloabalStyle} from &#39;styled-components&#39;;
import reset from &#39;styled-reset&#39;;
</code></pre></li>
</ul>
<p>const GlobalStyle = createGlobalStyle`
    ${reset}</p>
<pre><code>// 전역 스타일</code></pre><p>`;</p>
<p>export default GloabalStyle;</p>
<p>```</p>
<ul>
<li>코드 가독성을 위해 컴포넌트를 먼저 선언하고 하단에 작성</li>
<li>Template Literal을 사용하여 작성하며, const 컴포넌트명 = styled.태그명으로 이루어져 있음 (스타일 상속: const 컴포넌트명 = styled(스타일컴포넌트명))</li>
</ul>
<h3 id="사용이유">사용이유</h3>
<p>컴포넌트가 많을 경우</p>
<ol>
<li>class 중복으로 생성</li>
<li>다른 컴포넌트에 원하지 않는 스타일이 적용</li>
<li>css파일이 너무 길어져서 수정이 어려움</li>
</ol>
<p>-&gt; 컴포넌트 제작시 라이브러리를 이용하여 js파일에서 스타일을 바로 입힘(컴포넌트마다 고유한 클래스를 가짐)</p>
<h3 id="장점">장점</h3>
<ul>
<li>Scss라이브러리 설치 없이 Scss 문법 사용 가능</li>
<li>자유로운 CSS 커스텀 컴포넌트 생성</li>
<li>컴포넌트의 props를 참조할 수 있으며, props의 값에 따라 스타일을 다르게 코딩 가능</li>
<li>className을 스스로 생성하기에 className의 중복이나 오타로 인한 버그를 줄여준다</li>
<li>모든 스타일 속성이 특정 컴포넌트와 연결되어 있기에 컴포넌트를 더 이상 사용하지 않아 삭제할 경우 이에 대한 스타일 속성도 함께 삭제된다</li>
<li>className을 일일이 수동으로 관리할 필요 없이 React의 props나 전역 속성을 기반으로 컴포넌트에 스타일 속성을 부여하기 때문에 간단하고 직관적이다</li>
<li>컴포넌트에 스타일을 상속하는 속성을 찾아 다른 CSS 파일들을 검색하지 않아도 되기 때문에 코드의 크기가 커지더라도 유지보수가 어렵지 않다</li>
<li>개별 컴포넌트마다 기존의 CSS를 이용하여 스타일 속성을 정의하면 될 뿐이다</li>
<li>화면에 컴포넌트가 렌더링 되었는지 추적해 컴포넌트에 대한 스타일을 자동 삽입 -&gt; 코드를 적절히 분배해 놓으면 최소한의 코드만으로 화면을 띄움</li>
</ul>
<h3 id="scss와의-차이점">scss와의 차이점</h3>
<ul>
<li>SCSS: css in css 문법으로 js 파일과는 분리 / styled-componenets: css in js 방식으로 컴포넌트가 렌더링 될 때만 해당 스타일 정보를 읽음</li>
<li>SCSS: 어떤 컴포넌트의 상태값이 변하더라도 반응하기 쉽지않다<pre><code>  브라우저에 보이지 않은 컴포넌트까지 읽기 때문에 불필요한 컴파          일 과정이 추가된다</code></pre></li>
<li>styled-components: 동적인 이벤트가 많은 사이트라면 컴포넌트가 자주 렌더링 될 때 그만큼 스타일 정보도 다시 읽어와야한다 / SCSS: 이미 html문서에 읽혀져 있는 상태이기 때문에 처음에는 스타일 정보를 가져오는 양이 많더라도 그 후 추가적인 렌더링은 상대적으로 적을 것이다</li>
</ul>
<p>{ 렌더링 속도가 빨라야 하는 인터랙티브한 프로젝트라면 CSS in CSS
개발의 효율성이 중요하고 컴포넌트 위주의 프로젝트라면 CSS in JS }</p>
<h4 id="css-in-css">css in css</h4>
<ul>
<li>CSS Module, CSS 전처리기(Sass, Less 등)</li>
<li>별도의 자바스크립트 전환이 필요 없어 빠른 속도<h4 id="css-in-js">css in js</h4>
</li>
<li>자바스크립트와 CSS 사이의 변수를 공유할 수 있음</li>
<li>현재 사용 중인 스타일만 DOM에 포함시킬 수 있음</li>
<li>별도의 라이브러리 설치가 필요하여 번들 크기 증가</li>
<li>CSS in CSS에 비해 느림(JS-&gt;CSS로의 변환 필요)</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>