<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jae_honey.log</title>
        <link>https://velog.io/</link>
        <description>할 수 있다!!!</description>
        <lastBuildDate>Wed, 10 May 2023 09:03:05 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jae_honey.log</title>
            <url>https://velog.velcdn.com/images/jae_honey/profile/8fddb7a7-5116-4e6b-9cb4-01729b959a53/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jae_honey.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jae_honey" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[파이널 프로젝트 회고]]></title>
            <link>https://velog.io/@jae_honey/%ED%8C%8C%EC%9D%B4%EB%84%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@jae_honey/%ED%8C%8C%EC%9D%B4%EB%84%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Wed, 10 May 2023 09:03:05 GMT</pubDate>
            <description><![CDATA[<p>조금 늦었지만 파이널 프로젝트 회고를 작성해보려한다.</p>
<h2 id="1-프로젝트-설명">1. 프로젝트 설명</h2>
<p>더샤아니의 고투게더 반응형 웹페이지 리뉴얼, 시니어를 대상으로 한 여행 패키지 상품 검색 및 추천 서비스로 FrontEnd, BackEnd, UX/UI 협업 프로젝트이다. </p>
<p>주된 기능으로는 로그인, 회원가입, 상품검색, 상품추천, 상품예약, 찜(위시리스트), 후기 등이 있다. 나는 회원가입, 로그인, 아이디, 비밀번호 찾기, 내 정보 수정, 예약 내역 조회 및 취소, 찜(위시리스트) 목록 조회, 추가, 삭제 부분을 맡았다. </p>
<p>주요 기술 스택으로는 React, TypeScript, React-Query, Recoil, Styled-components를 사용했다. </p>
<p><a href="https://github.com/7-lin/Final_Project_FE" target="_blank">깃헙 링크</a>
<a href="https://7lin.notion.site/7lin-Front-End-014757d518c64dba8e3349dfaa7ddf2d" target="_blank">노션 링크</a></p>
<h2 id="2-진행-과정">2. 진행 과정</h2>
<h3 id="기획-단계">기획 단계</h3>
<ul>
<li><p>이번 파이널 프로젝트는 프론트엔드 4명, 백엔드 3명, UX/UI 3명 총 10명이 한팀으로 진행되었다. 어쩌다보니 미니 프로젝트에 이어 이번에도 나는 프론트엔드 팀장 역할을 맡게 되었다. 이번에는 프론트엔드, 백엔드 뿐만이 아니라 UX/UI도 함께 진행을 했는데 협업과 소통에 있어 깊은 난항이 예상되었다. </p>
</li>
<li><p>10명이 모두 모인 첫 회의에서는 기획을 열심히 했다. 기존에 있던 사이트를 리뉴얼하는 프로젝트였기 때문에 더 나은 사이트를 만들기 위해서 서로 여러가지 아이디어를 생각했다. 그 과정에서 기존 사이트에는 없는 국내여행을 도입하자는 의견이 주 목표로 채택되었다.</p>
</li>
<li><p>이번 프로젝트는 미니 프로젝트와는 다르게 UX/UI가 있었기 때문에 프론트 측에서 디자인을 담당할 필요가 없어서 편했다. 그런데 UX/UI팀의 작업 속도가 좀 느려서 개발 기간이 부족해지는 이슈가 있었다. 그리고 디자인도 기존 사이트와 너무 비슷했던 점이 조금 아쉬웠다.</p>
</li>
<li><p>이번 프로젝트에서는 내가 미니 프로젝트에서 사용해보지 않은 기술 및 라이브러리를 사용해보고 싶었다. 그래서 react-query(서버 데이터)와 recoil(클라이언트 데이터)을 사용해보자고 어필했다. 그리고 미니 프로젝트에서 매우 만족한 typescript를 사용하기로 했다.</p>
</li>
</ul>
<h3 id="개발-단계">개발 단계</h3>
<ul>
<li>Keep (프로젝트에서 만족했고, 앞으로의 업무에서 지속하고 싶은 부분)</li>
<li>Problem (프로젝트에서 부정적인 요소로 작용했거나 아쉬웠던 점)</li>
<li>Try (Problem에 대한 해결 방식으로 혹은 개인적으로 다음 프로젝트에서 시도해볼 점)</li>
</ul>
<ol>
<li><p>Keep</p>
<ul>
<li>Typescript를 사용함으로써 목적에 맞지 않는 타입의 변수나 함수들에서 에러를 발생시켜 버그를 사전에 차단할 수 있던 점이 이번에도 마음에 들었다.</li>
<li>react-query로 서버 데이터를 더 쉽게 관리할 수 있었던 것 같다.</li>
<li>react-query의 훅들을 활용하여 커스텀 훅을 만든 경험이 좋았다고 생각한다,</li>
<li>react-hook-form과 yup을 사용하여 유효성 검사를 더 쉽게 할 수 있었다.</li>
<li>PrivateRoute로 인증(로그인)을 해야만 접근 가능한 페이지를 구분해준 것이 좋았다.</li>
<li>refresh-token을 백엔드에서 Http-Only로 쿠키에 담아서 전달해주고 그것을 가지고 서로 소통하는 방식인데 이 부분이 잘 동작하지 않아서 백엔드분과 함께 문제를 해결해 나간 점이 좋았다.</li>
</ul>
</li>
<li><p>Problem</p>
<ul>
<li><p>react-query 관련 문제점 및 아쉬운 점</p>
<ul>
<li>처음 사용해본 탓인지 관련 코드를 엉성하게 짠 느낌이 있다</li>
<li>Suspense를 활용하여 로딩을 추가했으면 더 좋았을 것 같다.</li>
<li>서버 데이터와 클라이언트 데이터를 분리하기 위해 react-query를 사용한건데 서버로부터 받아온 유저 정보를 Recoil 전연 변수로 설정해버렸다.</li>
</ul>
</li>
<li><p>인증 관련 문제점 및 아쉬운 점</p>
<ul>
<li>로그인 방식으로 JWT 방식을 사용했는데 refresh token이 로직이 제데로 작동하는지 잘 모르겠다.(로그인이 계속 유지가 되긴 하는데 흠...)</li>
<li>소셜 로그인(Oauth)이 계획에 있었는데 하지 못한 점이 아쉽다. 인가 코드를 받는 것까지는 했는데 그 다음 서버로 인가코드를 전달 후의 로직을 백엔드 측에서 완성하지 못한 듯 하다. </li>
</ul>
</li>
<li><p>협업에서의 아쉬움</p>
<ul>
<li>팀장으로써 팀원들의 개발 의지를 끌어올리지 못한 점이 아쉽다.</li>
<li>UX/UI와의 소통이 원할하지 못한 점이 아쉽다.</li>
</ul>
</li>
</ul>
</li>
<li><p>Try</p>
<ul>
<li>서버 데이터와 클라이언트 데이터를 확실하게 분리하기.</li>
<li>react-query 더 자세히 공부해서 잘 적용하기.</li>
<li>소셜 로그인(Oauth) 성공하기.</li>
<li>Next.js 공부하고 사용해보기.</li>
</ul>
</li>
</ol>
<h2 id="3-느낀점">3. 느낀점</h2>
<ul>
<li><p><strong>프로젝트를 진행하면서 힘들었던 점은? 혹은 어려웠던 점은?</strong></p>
<ul>
<li>다소 익숙하지 않았던 react-query를 사용하느라 어려웠지만 결과적으로 새로운 기술을 익힐 수 있어서 좋았다</li>
<li>처음으로 FE, BE, UX/UI 3개의 분야가 한팀으로 협업을 해보았는데 소통이 얼마나 어려운 일인지 알게 되었다.</li>
<li>기획 기간이 길어짐에 따른 짧아진 개발 기간 때문에 프로젝트의 완성도가 높지 않은 점이 아쉽다.</li>
<li>UX/UI와의 소통이 원할하지 못했던 점이 아쉽다.</li>
<li>디자인이 기존 사이트와 너무 비슷하다.<br/><br/></li>
</ul>
</li>
<li><p><strong>팀에서 좋았던 점/ 아쉬웠던 점</strong><br/><br/></p>
<p>  ❤️ <strong>좋았던 점</strong></p>
<ul>
<li>프론트 팀원의 대부분이 오프라인으로 참여하여 빠르고 정확한 소통이 가능했다.</li>
<li>프론트와 백엔드간의 소통이 원활해서 좋았다.</li>
<li>코드 리뷰를 하면서 팀원들의 코드로 배울점이 많았다.</li>
<li>자신이 맡은 부분이 아니더라도 서로 정보 공유를 통해 전체적인 이해도를 높이고자 했던 부분이 좋았다.</li>
<li>적절한 역할 분담과 서로 부족한 부분은 도와주고 할 수 있었던 협력 과정이 좋았다.<br/><br/></li>
</ul>
</li>
</ul>
<p>  😓 <strong>아쉬웠던 점</strong></p>
<pre><code>- 문서화에 많이 신경 쓰지 못한점이 아쉽다.
- 프론트팀의 의견을 좀 더 강하게 어필하지 못한 점이 아쉽다.
- 코드의 유지 보수 측면에서 많이 아쉽다.&lt;br/&gt;&lt;br/&gt;</code></pre><ul>
<li><p><strong>나 스스로 잘했다고 생각한 포인트가 있는지? 아쉬움은 없는지?</strong></p>
<ul>
<li>2번째 팀장 역할이었는데 처음보다는 잘한 것 같다.</li>
<li>이번 프로젝트에서 react=query를 사용해본 점이 좋았다.</li>
<li>소셜로그인을 완성하지 못한게 아쉽다.</li>
<li>내가 맡은 부분을 넘어서 다른 팀원의 몫까지 나서서 한 점이 좋았다.</li>
</ul>
<p><br/><br/></p>
</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 파이널 프로젝트 회고를 작성해보았다. 처음으로 FE, BE, UX/UI 3개의 분야가 한팀으로 협업을 해보았는데 소통이 얼마나 어려운 일인지 알게 되었다. 나름 협업을 잘하는 편이라고 스스로 생각했었는데 그래도 쉽지 않았다. 팀원 모두 열심히 해줘서 고마웠다. 그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[미니프로젝트 회고]]></title>
            <link>https://velog.io/@jae_honey/%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@jae_honey/%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Tue, 09 May 2023 18:05:06 GMT</pubDate>
            <description><![CDATA[<p>조금 늦었지만 미니프로젝트 회고를 작성해보려한다.</p>
<h2 id="1-프로젝트-설명">1. 프로젝트 설명</h2>
<p>금융상품 중 카드를 상품으로 다루고, 추천해주는 서비스로 FrontEnd와 BackEnd 협업 프로젝트이다. </p>
<p>주된 기능으로는 로그인, 회원가입, 나의 카드(신청한 카드), 검색, 카드 추천, 관심상품이 있다. 나는 카드 추천, 카드 검색, 초기세팅, 헤더, 관심상품 부분을 맡았다. </p>
<p>주요 기술 스택으로는 React, TypeScript, Redux, Styled-components를 사용했다. </p>
<p><a href="https://github.com/card-monkey/card-monkey-FE" target="_blank">깃헙 링크</a>
<a href="https://cold-clave-816.notion.site/Card-Monkey-c4e2864f655e4e49948d748514ffc7ee" target="_blank">노션 링크</a></p>
<h2 id="2-진행-과정">2. 진행 과정</h2>
<h3 id="기획-단계">기획 단계</h3>
<ul>
<li><p>이번 미니 프로젝트는 프론트엔드 4명, 백엔드 4명 총 8명이 한팀으로 진행되었다. 나는 프론트엔드 팀장 역할을 맡게 되었다.(부담감 Up!!) 아무래도 처음 팀 프로젝트를 하는거다 보니 긴장을 좀 했던 것 같다. </p>
</li>
<li><p>8명이 모두 모인 첫 회의에서는 기획을 열심히 했다. 결국에는 카드를 회원에게 추천하는 서비스를 만들자는 의견이 다수결로 채택되었다. </p>
</li>
<li><p>UX/UI가 없기 때문에 디자인은 프론트 측에서 담당했다. 와이어 프레임을 만들어서 기능에 대해 상세하게 이야기를 나누었고 덕분에 개발 단계에서도 큰 차질 없이 진행된 것 같다. 그리고 최종 디자인 같은 경우 우리 팀의 예능 담당 ㅈㅅ님이 열심히 작업해주셨다.</p>
</li>
<li><p>사용할 기술 스택을 정하는 과정에서 의견이 갈렸었다. Typescript 사용 여부였는데 내가 팀장 권한으로 사용하자고 강력히 어필했다. 언젠가는 반드시 사용해야 할 텐데 이번에 미리 연습하자는 취지였다. Redux 또한 대부분 잘 모르는 상태였는데 같은 취지로 사용하기로 했다.</p>
</li>
</ul>
<h3 id="개발-단계">개발 단계</h3>
<ul>
<li>Keep (프로젝트에서 만족했고, 앞으로의 업무에서 지속하고 싶은 부분)</li>
<li>Problem (프로젝트에서 부정적인 요소로 작용했거나 아쉬웠던 점)</li>
<li>Try (Problem에 대한 해결 방식으로 혹은 개인적으로 다음 프로젝트에서 시도해볼 점)</li>
</ul>
<ol>
<li><p>Keep</p>
<ul>
<li>Typescript를 사용함으로써 목적에 맞지 않는 타입의 변수나 함수들에서 에러를 발생시켜 버그를 사전에 차단할 수 있던 점이 정말 마음에 들었다.</li>
<li>모르는 부분이 생겼을 때는 혼자 해결할 수도 있지만 팀원들과 같이 해결 방법을 찾는 과정이 좋았다.</li>
<li>함께 작업을 진행하면서, 같은 주제에 대해 서로 어떻게 다른 생각을 하는지 확인해보며 사고의 확장을 경험할 수 있던 점이 좋았다..</li>
</ul>
</li>
<li><p>Problem</p>
<ul>
<li><p>검색부분 구현에 대한 문제점 및 아쉬운 점</p>
<ul>
<li>검색을 하면 키워드에 대한 모든 검색결과가 한꺼번에 넘어온다. 즉 서버에서 페이지 처리가 되지 않았다.</li>
<li>프론트 쪽에서도 페이지네이션을 하지 않은 점이 아쉽다(원래는 무한 스크롤 계획...)</li>
<li>검색 페이지에서 검색 된 상품을 클릭하여 상세 페이지로 이동 후 뒤로가기를 하여 돌아오면 다시 검색을 해서 리렌더링 되는 문제가 있다.</li>
</ul>
</li>
<li><p>인증 관련 문제점 및 아쉬운 점</p>
<ul>
<li>로그인 방식으로 JWT 방식을 사용했는데 refresh token을 구현하지 않은 점이 아쉽다.</li>
<li>로그인하지 않은 상태에서 로그인을 해야만 볼 수 있는 페이지로 이동을 못하게 하는 로직이 바람직하지 못하다. (useEffect로 렌더링이 일어날때 마다 토큰이 필요한 api를 날려서 오류가 발생하면 로그인으로 이동...)</li>
</ul>
</li>
<li><p>협업에서의 아쉬움</p>
<ul>
<li>공통으로 활용할 수 있는 컴포넌트 혹은 함수들을 따로 빼내지 못한게 조금 아쉽다.</li>
<li>팀장의 역할을 좀 더 잘할 수 있었지 않았을까에 대한 아쉬움이 조금 있다.</li>
</ul>
</li>
</ul>
</li>
<li><p>Try</p>
<ul>
<li>이번에 하지 못한 페이지네이션을 도전!!</li>
<li>인증 관련 마지막 문제의 개선 방법으로 PrivateRoute로 인증(로그인)을 해야만 접근 가능한 페이지를 감싸주는 방법 해보기.(PrivateRoute 내부 로직이 중요!!)</li>
<li>다음에는 redux 대신 다른 전역 상태 관리 라이브러리를 사용해보기.(recoil, mobx 등)</li>
<li>다음에는 react-query 같은 서버 상태 관리(data fetching) 라이브러리를 사용해보기. (검색 부분 마지막 문제를 쉽게 해결 가능하지 않을까?)</li>
</ul>
</li>
</ol>
<h2 id="3-느낀점">3. 느낀점</h2>
<ul>
<li><p><strong>프로젝트를 진행하면서 힘들었던 점은? 혹은 어려웠던 점은?</strong></p>
<ul>
<li>다소 익숙하지 않았던 redux toolkit, typescript를 사용하느라  어려웠지만 결과적으로 새로운 기술을 익힐 수 있어서 좋았다</li>
<li>개발이 다 끝나 보니 생각보다 프로젝트 크기가 작아서 아쉬웠다.<br/><br/></li>
</ul>
</li>
<li><p><strong>팀에서 좋았던 점/ 아쉬웠던 점</strong><br/><br/></p>
<p>  ❤️ <strong>좋았던 점</strong></p>
<ul>
<li>팀원의 대부분이 오프라인으로 참여하여 빠르고 정확한 소통이 가능했다.</li>
<li>와이어프레임을 그려보는 과정이 있어서 기능에 대해 상세하게 이야기 나눌 수 있었고 덕분에 개발 단계에서도 큰 차질 없이 진행된 것 같다.</li>
<li>프론트와 백엔드간의 소통이 원활해서 좋았다.</li>
<li>타입스크립트를 이번 기회에 익힐 수 있어서 좋았다.</li>
<li>팀원들의 코드로 배울점이 많았다.</li>
<li>자신이 맡은 부분이 아니더라도 서로 정보 공유를 통해 전체적인 이해도를 높이고자 했던 부분이 좋았다.</li>
<li>적절한 역할 분담과 서로 부족한 부분은 도와주고 할 수 있었던 협력 과정이 좋았다.<br/><br/></li>
</ul>
</li>
</ul>
<p>  😓 <strong>아쉬웠던 점</strong></p>
<pre><code>- 문서화에 많이 신경 쓰지 못한점이 아쉽다.
- 코드 리뷰를 제대로 하지 않고 머지를 많이 한 점이 아쉽다.
- 좀 더 많은 기능을 넣지 못한 아쉬움이 있다.
- 코드의 유지 보수 측면애서 많이 아쉽다.&lt;br/&gt;&lt;br/&gt;</code></pre><ul>
<li><p><strong>나 스스로 잘했다고 생각한 포인트가 있는지? 아쉬움은 없는지?</strong></p>
<ul>
<li>팀장 역할을 처음 해보았는데 좋은 경험이었다.</li>
<li>이번 프로젝트에서 redux toolkit 을 처음 사용해 보았는데 사용법을 어느 정도 잘 이해한 것 같다 .</li>
<li>프로젝트 초기 세팅을 처음 해보았는데 좋은 경험이었다.</li>
<li>인증 관련 부분에 대한 공부가 필요하다고 느꼈다.</li>
<li>코드를 너무 더럽게 짠 것 같다.</li>
<li>다음 프로젝트에서는 react-query 혹은 rtk-query를 사용해보면 더 좋을 것 같다.    </li>
</ul>
<p><br/><br/></p>
</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 미니 프로젝트 회고를 작성해보았다. 백엔드까지 같이 한팀으로 진행한 첫 협업 프로젝트였다. 부족한 점도 많았지만 개인적으로 소통이 잘되었다는 점에서 매우 만족스러운 프로젝트였다. 팀원 모두 열심히 해줘서 고마웠다. 다음에는 파이널 프로젝트 회고로 찾아오겠다. 그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[미니 프로젝트 시작...]]></title>
            <link>https://velog.io/@jae_honey/%EB%AF%B8%EB%8B%88-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@jae_honey/%EB%AF%B8%EB%8B%88-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Fri, 10 Feb 2023 08:20:15 GMT</pubDate>
            <description><![CDATA[<p>어제부터 본격적으로 미니프로젝트를 시작했다.
많은 어려움이 예상된다.
일단 초기설정과 대략적인 UI는 만들었다.
기간이 2 ~ 3주 정도 되는데 좋은 결과물이 나왔으면 좋겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] Context API]]></title>
            <link>https://velog.io/@jae_honey/React-Context-API</link>
            <guid>https://velog.io/@jae_honey/React-Context-API</guid>
            <pubDate>Fri, 03 Feb 2023 04:02:49 GMT</pubDate>
            <description><![CDATA[<p>이번 포스트는 React의 Context API에 대해서 작성해보려고 한다.</p>
<h2 id="1-context-api란">1. Context API란?</h2>
<p> Context-API는 컴포넌트 트리에서 속성을 전달하지 않고 필요한 데이터를 컴포넌트에 전달하는 방법을 제공하는 API다.</p>
<p>기존에는 부모 컴포넌트에서 상태와 상태를 변경하는 함수를 만들고 속성으로 자식 컴포넌트에게 전달했지만 컴포넌트 트리가 복잡해지면 끝단의 컴포넌트가 필요한 데이터를 부모에서부터 끝까지 내려주는 것이 불편하다.</p>
<p>Context-API는 Provider를 이용해 공유하는 데이터(value)를 제공하고 데이터를 필요로 하는 컴포넌트는 useContext 훅을 이용해 데이터에 접근 가능하다. (속성을 이용한 전달을 반복하지 않아도 됨)</p>
<h2 id="2-context-api-사용-단계">2. Context-API 사용 단계</h2>
<ol>
<li><p>Context 객체가 관리할 데이터(value) 타입 정의</p>
<pre><code class="language-ts">export type TodoListContextValueType = {
  state: {
    // 상태 타입 정의
  };
  actions: {
    // 상태 변경 함수 타입 정의
  };
};</code></pre>
<p>데이터의 타입을 정의할 때는 상태뿐만 아니라 상태를 변경하는 함수까지 포함하며 정의한 타입은 useContext 훅을 이용해 자식 컴포넌트가 데이터에 접근할 때도 사용하므로 export 해두어야 한다.</p>
</li>
<li><p>React.createContext() 함수를 이용해 Context 객체를 생성</p>
<pre><code class="language-ts">const TodoContext = React.createContext&lt;TodoListContextValueType | null&gt;(
  null
);
// or
const TodoContext = React.createContext&lt;TodoListContextValueType&gt;(
  {} as TodoListContextValueType
);</code></pre>
<p>미리 정의한 데이터(value)의 타입 또는 null을 허용하도록 제네릭으로 지정하여 createContext 함수를 호출하고 Context 객체를 생성한다.</p>
<p>null을 하용하는 이유는 Context를 생성할 때 null로 초기화하기 때문이며
null을 사용하지 않고 두 번째 처럼도 사용 가능하다.</p>
</li>
</ol>
<ol start="3">
<li><p>상태와 상태 변경 함수를 관리할 Provider 컴포넌트를 작성</p>
<pre><code class="language-ts">type Props = {
  children: JSX.Element | JSX.Element[];
};

export const TodoProvider = ({ children }: Props) =&gt; {
  // 상태와 상태 변경 함수 작성

  const value: TodoListContextValueType = {
    state: {
      // 상태
    },
    actions: {
      // 상태 변경 함수
    },
  };
  return (
    &lt;TodoContext.Provider value={value}&gt;{children}&lt;/TodoContext.Provider&gt;
  );
};</code></pre>
<p>상태와 상태 변경 함수를 작성하기 위해 앱에서 사용할 Provider 컴포넌트를 작성한다.</p>
<p>Provider 컴포넌트에는 상태와 상태 변경 함수를 1.에서 정의한 데이터의 타입에 맞게 객체로 구성한 뒤, Context 객체의 Provider로 렌더링하도록 작성한다.</p>
<p>Context 객체의 Provider에 데이터(value)를 value 속성으로 전달한다.</p>
</li>
</ol>
<ol start="4">
<li><p>데이터(value)를 필요로 하는 컴포넌트에서 사용하기 위해 Provider 컴포넌트로 감씨줌</p>
<pre><code class="language-ts">ReactDOM.createRoot(document.getElementById(&quot;root&quot;) as HTMLElement).render(
  &lt;TodoProvider&gt;
    &lt;App /&gt;
  &lt;/TodoProvider&gt;
);</code></pre>
<p>이렇게 해주면 <App />과 <App />의 하위 컴포넌트에서 useContext 훅을 이용해 데이터(value) 사용 가능하다.</p>
<p>3.에서 {children}은 TodoProvider를 위 코드처럼 렌더링할 때 <App /> 컴포넌트와 같은 자식 컴포넌트에 해당한다.</p>
</li>
<li><p>자식 컴포넌트에서는 useContext 훅을 이용해 데이터 객체(value)를 받아서 상태와 상태 변경 함수를 이용</p>
<pre><code class="language-ts">const value = useContext(TodoContext);
// or
const { state, actions } = useContext(TodoContext);</code></pre>
<p>2.에서 null을 허용하는 첫 번째 방법으로 Context 객체를 생성헀으면 위 코드에서 첫 번째 방법을 사용한다.(두 번째는 사용불가)</p>
<p>2.에서 두번 째 방법으로 Context 객체를 생성헀으면 위 코드에서 첫 번째 방법도 가능하지만 두번 째 방법처럼 객체의 구조분해할당을 이용해 바로 속성 사용 가능하다.</p>
</li>
</ol>
<br/>

<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 React의 Context-API 대해서 알아보았다.
그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] React Hooks : useRef()]]></title>
            <link>https://velog.io/@jae_honey/React-React-Hooks-useRef</link>
            <guid>https://velog.io/@jae_honey/React-React-Hooks-useRef</guid>
            <pubDate>Fri, 27 Jan 2023 05:18:35 GMT</pubDate>
            <description><![CDATA[<p>이번 포스트는 React의 Hook 중 하나인 useRef에 대해서 작성해보려고 한다.</p>
<h2 id="1-useref란">1. useRef란?</h2>
<ul>
<li>useRef는 변수 관리 또는 DOM요소에 접근하기 위해 사용되는 React Hook이다. 여기서 Ref는 reference, 즉 참조를 뜻한다.</li>
<li>바닐라 자바스크립트를 사용 할 때, 우리가 특정 DOM 을 선택하기 위해서 querySelector 등의 함수를 사용한다. React를 사용하는 프로젝트에서도 가끔씩 DOM 을 직접 선택해야 하는 상황이 필요하다. 그럴 때 useRef라는 React Hook을 사용한다.</li>
</ul>
<h2 id="2-변수-관리">2. 변수 관리</h2>
<p>!codesandbox[useref-byeonsu-gwanri-me6zix?fontsize=14&amp;hidenavigation=1&amp;theme=light]
위 코드에는 useState를 사용해 값을 저장한 stateCount, useRef를 사용해 값을 저장한 refCount, 변수를 통해 값을 저장한 varCount가 있다.</p>
<p>버튼을 누르면 각각의 값이 올라가고 콘솔창에 출력이 된다. 확인해보면 ref up을 아무리 눌러도 콘솔창에만 출력되고 화면에 렌더링이 되지 않는것을 확인할 수 있다.</p>
<p>하지만 state up 버튼을 누르면 화면이 렌더링되면서 올려놨던 refCount값도 화면에 출력되게 된다. 그 이유는 useRef로 관리하는 값은 state와는 다르게 변해도 화면이 다시 렌더링되지 않기 때문이다. 하지만 값은 기억하고 있다는 특징이 있다. 즉 다시 렌더링 되어도 초기값으로 돌아가지 않는다.</p>
<p>var 같은 경우 var up 버튼을 통해 변수값을 아무리 높혀도 state up 버튼을 통해 렌더링을 하면, 컴포넌트 내부에 있는 let varCount = 0; 이 계속 실행되기에 값이 초기화된다.</p>
<h2 id="3-dom요소-선택">3. DOM요소 선택</h2>
<p>!codesandbox[useref-dom-yoso-seontaeg-or37ob?fontsize=14&amp;hidenavigation=1&amp;theme=light]
위 코드에서는 input 요소를 ref 속성을 이용하여 선택해 놓았다. 그리고 focus버튼을 클릭하면 input 요소로 접근해서 focus를 하도록 했다. focus버튼을 누르면 input 창에 focus되는 것을 확인할 수 있다.</p>
<p>focus 버튼을 누르고 콘솔창에 useRef를 통해 선택된 DOM 요소를 확인할 수 있다.</p>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 React의 Hook 중 하나인 useRef 대해서 알아보았다. 다음 포스트에서는 React의 또 다른 Hook 중 하나인 useContext에 대해서 알아보자.
그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Youtube 클론코딩(팀플)]]></title>
            <link>https://velog.io/@jae_honey/Youtube-%ED%81%B4%EB%A1%A0%EC%BD%94%EB%94%A9%ED%8C%80%ED%94%8C</link>
            <guid>https://velog.io/@jae_honey/Youtube-%ED%81%B4%EB%A1%A0%EC%BD%94%EB%94%A9%ED%8C%80%ED%94%8C</guid>
            <pubDate>Fri, 20 Jan 2023 07:37:57 GMT</pubDate>
            <description><![CDATA[<p>이번 주 월요일부터 오늘까지 팀원 4명과 함께 유튜브 api를 사용하여 유튜브 클론 코딩 토이 프로젝트를 진행했다. 팀원분들이 다 너무 잘하고 착하셔서 분위기가 정말 좋았다. 특히 가장 고생하시는 우리 석지 팀장님ㅠㅠ. </p>
<p>여러가지 어려운 점이 있었다.</p>
<ul>
<li>일단 가장 짜증 났던 점은 유튜브 api가 호출 횟수 제한이 걸려있던 점이다. 그래서 dummy data를 사용하였다.</li>
<li>타입지정에도 어려움을 겪었다. 타입 에러가 정말 많이 발생했다. </li>
<li>반응형으로 제작하는 것도 생각보다 어려웠다.</li>
<li>마지막으로 merge conflict가 좀 발생했었는데 이 때 처리하는게 좀 번거로웠다.</li>
</ul>
<p>다음 주에는 부족한 부분을 좀 더 보완할 예정이다. 잘 마무리 되었으면 좋겠다.
그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] React Hooks : useEffect()]]></title>
            <link>https://velog.io/@jae_honey/React-useEffect</link>
            <guid>https://velog.io/@jae_honey/React-useEffect</guid>
            <pubDate>Fri, 13 Jan 2023 05:40:58 GMT</pubDate>
            <description><![CDATA[<p>이번 포스트는 React의 Hook 중 하나인 useEffect에 대해서 작성해보려고 한다.</p>
<h2 id="1-useeffect란">1. useEffect란?</h2>
<ul>
<li>useEffect는 React의 Hook 중 하나로 컴포넌트가 렌더링 될 때 특정 작업을 실행할 수 있도록 하는 Hook이다.</li>
<li>컴포넌트가 처음 렌더링 될 때 한 번, 특정 값이 변경될 때 마다, 컴포넌트가 제거될 때 이렇게 크게 3가지 경우로 나눌 수 있다.</li>
<li><code>useEffect(() =&gt; {}, [])</code> 의 형식이다. 첫 번째 인자는 특정 작업을 수행하는 콜백 함수이고 두 번째 인자는 의존성 배열이다. 이 의존성 배열에 어떤 값이 들어가는지에 따라서 useEffect가 호출되는 상황이 달라진다.</li>
</ul>
<h2 id="2-최초-렌더링시에만-실행">2. 최초 렌더링시에만 실행</h2>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/81e75fb2-3944-4dd8-adc5-8dc8f2c86a52/image.PNG" alt=""></p>
<ul>
<li>버튼을 클릭하면 수가 증감하는 counter 예제이다. </li>
<li>의존성 배열에 아무 값도 넣지 않으면 컴포넌트가 최초 렌더링 될 때 딱 한번 useEffect 안의 콜백 함수가 실행된다.
<img src="https://velog.velcdn.com/images/jae_honey/post/13e9b5b0-35f3-4269-9672-0f06fe87f83a/image.PNG" alt=""></li>
<li>결과를 보면 최초에 한 번 log를 찍고 그 이후에는 state값을 바꾸어도 동작하지 않는다.</li>
</ul>
<h2 id="3-특정-값이-변경될-때에만-실행">3. 특정 값이 변경될 때에만 실행</h2>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/15e83b56-5082-46e6-8603-9adf98d6aa64/image.PNG" alt=""></p>
<ul>
<li>이번에는 input을 하나 추가하고 의존성 배열에 num 변수를 넣었다. 의존성 배열에 들어가 있는 변수가 변경되면 useEffect안의 콜백 함수가 실행된다. 따라서 num이 변경되면 log가 찍힌다. </li>
<li>input의 value값이 변경될 때에는 console.log가 동작하지 않지만, num의 값이 변경될 때에는 log가 찍히는 것을 볼 수 있다.</li>
<li>만약 의존성 배열 안에 value를 추가하면 num 혹은 value가 변경되면 log가 찍힐 것이다.</li>
</ul>
<h2 id="4-컴포넌트가-제거될-때-실행">4. 컴포넌트가 제거될 때 실행</h2>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/c25eb577-fdfc-43d4-8cd8-6c04c8764ec7/image.PNG" alt=""></p>
<ul>
<li>App.js를 살짝 변경했다. countRenderd의 상태에 따라서 Counter 컴포넌트를 렌더 할지 말지 결정한다. 처음에는 보이지만 버튼을 클릭하면 사라질 것이다.
<img src="https://velog.velcdn.com/images/jae_honey/post/71c904f3-26bd-4813-bd2d-086d47ca71f8/image.PNG" alt=""></li>
<li>Counter.js에서의 useEffect이다. 콜백 함수 안에 return으로 함수를 넣을 수 있는데 이것을 clean-up 함수라고 한다. 컴포넌트가 사라질 때 실행된다.
<img src="https://velog.velcdn.com/images/jae_honey/post/292c4004-0ea9-4cb0-8f11-f14ad4815b03/image.PNG" alt=""></li>
<li>결과를 보면 처음 렌더링 될 때 log를 찍고 버튼을 눌러 컴포넌트가 사라지면 return 안의 log가 찍히는 것을 볼 수 있다.</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 React의 Hook 중 하나인 useEffect 대해서 알아보았다. 다음 포스트에서는 React의 또 다른 Hook 중 하나인 useRef에 대해서 알아보자.
그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] useState를 통한 동적인 값 관리]]></title>
            <link>https://velog.io/@jae_honey/React-useState%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%8F%99%EC%A0%81%EC%9D%B8-%EA%B0%92-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@jae_honey/React-useState%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%8F%99%EC%A0%81%EC%9D%B8-%EA%B0%92-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Fri, 06 Jan 2023 05:36:47 GMT</pubDate>
            <description><![CDATA[<p>이번 포스트는 React의 Hook 중 하나인 useState에 대해서 작성해보려고 한다.</p>
<h2 id="1-state란">1. state란?</h2>
<ul>
<li>state는 컴포넌트 내에서 지속적으로 변경이 일어나는 값을 관리하기 위해 사용한다.
개발자가 의도한 동작에 의해 변할 수도 있고 사용자의 입력에 따라 새로운 값으로 변경될 수도 있다.</li>
<li>state 값이 변경되고 재 렌더링이 필요한 경우에 React가 자동으로 계산하여 변경된 부분을 렌더링 한다.</li>
</ul>
<h2 id="2-usestate란">2. useState란?</h2>
<ul>
<li>리액트 16.8 이전 버전에서는 함수형 컴포넌트에서는 상태를 관리할 수 없었지만, 리액트 16.8 에서 Hooks 라는 기능이 도입되면서 함수형 컴포넌트에서도 상태를 관리할 수 있게 되었다. 이 때 사용되는 Hook이 useState이다. 위에서 말한 state를 만들거나 관리해주는 Hook이다.</li>
</ul>
<h2 id="3-counter-예제">3. Counter 예제</h2>
<ul>
<li><p>+버튼을 클릭하면 숫자가 증가하고 -버튼을 클릭하면 감소하는 예제이다.
<img src="https://velog.velcdn.com/images/jae_honey/post/3732d0fd-5be6-497e-a54b-ca4b900cc55d/image.png" alt=""></p>
</li>
<li><p>Counter.js 안의 내용이고 App.js에서 사용되는 중이다. 처음에는 state를 사용하지 않고 일반 변수를 사용해 보았다. 화면에는 우측의 UI가 보여진다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/106e0b46-3085-48ff-b28a-e8f4c6046874/image.PNG" alt=""></p>
<ul>
<li>증가 혹은 감소 버튼을 클릭하면 변수의 값은 바뀌는 것을 콘솔을 보면 확인할 수 있다. 하지만 UI상에서 변하지 않았다. 그 이유는 숫자가 state가 아닌 일반 변수여서 그렇다. state의 경우 값이 변경되면 화면을 다시 렌더링하지만 일반 변수는 변경되어도 화면을 다시 렌더링하지 않기 때문이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/28a43c4c-08c3-4679-ba14-bd714790b2f8/image.PNG" alt=""></p>
<ul>
<li>이번에는 state를 사용해보았다. <code>num</code>은 상태관리를 할 변수, <code>setNum</code>은 <code>num</code>의 값을 변경할 때 사용된다. 그리고 useState의 괄호 안의 값(0)은 num의 초기값이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/a4bc5438-f9d9-4d4b-bdb9-c8a3df9cd926/image.PNG" alt=""></p>
<ul>
<li>결과를 보면 화면에서 잘 변하는 것을 볼 수 있다. 한가지 이상한 것은 콘솔을 보면 num의 이전 값들이 찍히는 것이다. 그 이유는 useState가 비동기적으로 동작하기 때문이다. 그렇기 때문에 먼저 콘솔에 찍히고 그 다음에 증감을 하는 것이다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/07d058d7-6895-4321-b185-627f6cf239fa/image.PNG" alt=""></p>
<ul>
<li>useState의 비동기적 작동을 볼 수 있는 코드이다. 코드를 보면 증감이 2씩 될거라고 생각했으나 1씩 되었다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/89b0b084-0fc1-441f-bea0-71b52f1223a4/image.PNG" alt=""></p>
<ul>
<li>이번에는 아예 증감이 일어나지 않았다. 그 이유는 공식 문서에 나와있다. 
<code>다음 리렌더링 시에 useState를 통해 반환받은첫 번째 값은 항상 갱신된 최신 state가 됩니다.</code></li>
<li>위의 코드를 해석해 보면 num+1이 실행되고 num+0가 실행된다. 여기서 num값은 둘다 동일한 값이다. 가장 최신 state를 렌더링 한다고 했으므로 1증가와 0증가 중에 가장 최신인 증가를  하게 된 것이다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/9fd2acf8-d1f1-400f-bed6-bc952716c244/image.PNG" alt=""></p>
<ul>
<li>state의 변경시마다 렌더링을 하고 싶다면 위 코드처럼 함수형 업데이트를 사용해주면 된다. </li>
<li>함수형 업데이트 방식은 setState를 줄 때 위 코드처럼 어떠한 값을 바로 주는 것이 아니라 함수를 통해서 전달하는 방식이다. 이렇게 하면 2씩 증가한 것을 볼 수 있다. </li>
<li>정확히 말하면 1이 증가 후 렌더링, 한번 더 1 증가 후 렌더링, 이렇게 2번 렌더링 했지만 동작이 매우 빠르기에 우리 눈에 2가 증가한 것 처럼 보이는 것이다.</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 React의 Hook 중 하나인 useState 대해서 알아보았다. 다음 포스트에서는 React의 또 다른 Hook 중 하나인 useEffect에 대해서 알아보자. 
그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 컴포넌트의 props]]></title>
            <link>https://velog.io/@jae_honey/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-props</link>
            <guid>https://velog.io/@jae_honey/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-props</guid>
            <pubDate>Fri, 30 Dec 2022 05:36:42 GMT</pubDate>
            <description><![CDATA[<p>이번 포스트는 저번 포스트에 이어서 React 컴포넌트의 props에 대해서 작성해보려고 한다.</p>
<h2 id="1-props란">1. props란?</h2>
<ul>
<li>props 는 properties 의 줄임말이다. 우리가 어떠한 값을 컴포넌트에게 전달해줘야 할 때, props 를 사용한다.</li>
</ul>
<h2 id="2-props-사용법">2. props 사용법</h2>
<p>지난 포스트에서 상자를 만들었을 때 상자안의 내용이 동일했었다. 이를 다르게 하려면 props를 시용하면 된다.
<img src="https://velog.velcdn.com/images/jae_honey/post/ca18788b-4eec-4e90-8087-de7a2351d34c/image.PNG" alt=""></p>
<ul>
<li>먼저 Box 컴포넌트에 전달해주고 싶은 값을 위와 같이 코드를 작성하면 된다. 전달해줄 것은 name, age, id, hobby 이렇게 4가지다. 보면 각각의 Box 컴포넌트에 다른 값들을 전달하고 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/c3791d09-57a2-475c-95f2-2d8f7941d8fb/image.PNG" alt=""></p>
<ul>
<li>Box 컴포넌트에서는 위와 같이 코드를 작성하면 된다. props(변수 이름은 아무거나 가능)라는 변수로 모든 전달 받은 값들을 가져오고 객체를 사용할 때처럼 <code>props.???</code>로 사용하면 된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/6793c57b-aedb-440f-a050-2329b92586a2/image.PNG" alt=""></p>
<ul>
<li>또 다른 방법으로는 위와 같이 객체의 구조분해할당을 사용하는 방법이다. 개인적으로는 이 방법이 더 괜찮은 것 같다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/ea5d5c31-b6af-4a17-a8ea-2999f66e87e6/image.PNG" alt=""></p>
<ul>
<li>결과를 보면 위와 같이 박스마다 전달받은 다른 값들로 내부의 내용이 채워져 있는 것을 볼 수 있다.</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 React 컴포넌트의 props에 대해서 알아보았다. 다음 포스트에서는 리액트의 useState를 통해 동적인 값(state)을 관리하는 법에 대해서 알아보자. 
그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 컴포넌트란?]]></title>
            <link>https://velog.io/@jae_honey/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80</link>
            <guid>https://velog.io/@jae_honey/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80</guid>
            <pubDate>Fri, 23 Dec 2022 06:49:21 GMT</pubDate>
            <description><![CDATA[<p>이번 포스트는 React의 컴포넌트에 대해서 작성해보려고 한다. </p>
<h2 id="1-컴포넌트란">1. 컴포넌트란?</h2>
<ul>
<li>리액트로 만들어진 앱을 이루는 최소한의 단위이다.</li>
<li>컴포넌트는 재사용을 할 수있다.</li>
<li>컴포넌트는 데이터(props)를 입력받아 View(state) 상태에 따라 DOM Node를 출력하는 함수이다.</li>
<li>컴포넌트 이름은 항상 대문자로 시작한다. </li>
</ul>
<h2 id="2-컴포넌트를-쓰는-이유">2. 컴포넌트를 쓰는 이유</h2>
<ul>
<li><p>재사용 및 유지보수가 편리하다는 점이 가장 큰 이유다.
<img src="https://velog.velcdn.com/images/jae_honey/post/35fd277f-006f-4d96-b687-47f53dea5d4b/image.PNG" alt=""><img src="https://velog.velcdn.com/images/jae_honey/post/1f260e2b-18f5-4534-b179-ff65dbb5af11/image.PNG" alt=""></p>
</li>
<li><p>다음과 같이 하나의 박스가 있다. 그런데 만약 여러개의 박스가 필요하다고 한다면 다음과 같이 코드를 작성할 수 있다.
<img src="https://velog.velcdn.com/images/jae_honey/post/1677104b-7baf-437e-9937-b2c845f12230/image.PNG" alt=""><img src="https://velog.velcdn.com/images/jae_honey/post/da6aed2d-96a7-4ff4-bf36-034f9f327032/image.PNG" alt=""></p>
</li>
<li><p>같은 코드가 중복되는 것을 볼 수 있다. 중복되는 코드는 함수화 하듯이 이런 경우에는 컴포넌트화 하면 되다.
<img src="https://velog.velcdn.com/images/jae_honey/post/06c7e9ea-0b77-4486-b31d-46be71732227/image.PNG" alt=""><img src="https://velog.velcdn.com/images/jae_honey/post/7ea55837-31ff-4fd4-b877-6b100a933a4e/image.PNG" alt=""></p>
</li>
<li><p>Box.js 라는 파일을 만들어 중복되는 부분을 넣어준다. 그리고 App.js에서 import 후 위와 같이 사용하면 된다. 코드가 깔끔해진 것을 볼 수 있다.</p>
</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 React를 컴포넌트에 대해서 알아보았다. 지금은 아직 박스안의 내용이 동일하다. 내부의 내용을 박스마다 다르게 하고 싶으면 어떻게 해야 할까? 바로 props 기능을 사용하면 된다. 다음 포스트에서는 리액트 컴포넌트의 props에 대해서 알아보자. 그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Angular vs React vs Vue]]></title>
            <link>https://velog.io/@jae_honey/Angular-vs-React-vs-Vue</link>
            <guid>https://velog.io/@jae_honey/Angular-vs-React-vs-Vue</guid>
            <pubDate>Fri, 16 Dec 2022 07:36:53 GMT</pubDate>
            <description><![CDATA[<p>프론트엔드의 프레임워크 및 라이브러리로는 대표적으로 Angular, React, 그리고 Vue가 있다. 이들의 차이점은 각각 무엇이며 그 차이점은 무엇일지에 대해 알아보자.
참고로 Vue와 Angular는 프레임워크인 반면 React는 라이브러리이다.</p>
<h2 id="1-angular">1. Angular</h2>
<p>Angular는 구글에서 만든 타입스크립트 기반의 웹 어플리케이션 오픈소스 프레임워크이다. Angular는 가장 다루기 어렵고 가장 많은 것을 만들 수 있는 프레임워크이다.
프로젝트의 생성부터 테스팅, 빌드와 배포까지 모든 기능을 제공한다. Angular는 유니크한 템플릿 문법이 정해져 있기에 자유도는 떨어지는 반면 모두가 그 문법에 맞추며 또한 타입스크립트 기반이기에 유지 관리에 용이하다. 마찬가지로 컴포넌트 기반이며, 많은 기능을 제공하는 만큼 프레임워크 자체가 무겁기에 초기 로딩속도는 느리지만 페이지간 전환 속도는 빠른 편이다.</p>
<h2 id="2-react">2. React</h2>
<p>React는 Facebook에서 만든 자바스크립트 UI 라이브러리이다. 특징으로는 라이브러리이기에 유연성이 좋으며, native를 통해 웹 뿐만아니라 앱 개발로도 확장할 수 있다. 또한 Virtual DOM을 활용하여 성능을 높였으며 create-react-app 등의 커맨드라인 인터페이스(CLI)가 많아 접근성이 좋고 편리하다는 강점이 있다. 중요한 점은 금일 기준 위의 3가지 중 가장 인기가 많기 때문에 방대한 커뮤니티를 통해 정보를 얻고 활용하기 쉽다.</p>
<p>React는 Vue, Angular와 달리 JSX라는 Javascript에 XML을 확장한 문법을 사용한다. 그렇기 때문에 자바스크립트에서 HTML과 유사한 형태로 코드를 작성할 수 있어서 코드가 직관적이고 가독성이 좋다. 작성한 코드는 웹팩(Webpack)과 바벨(Babel)을 통해 브라우저에 맞게 코드를 변환한다. 리액트는 컴포넌트라는 개념이 등장한다. 컴포넌트는 자바스크립트 함수와 유사한, UI를 이루는 작은 단위라고 생각하면 된다. 이렇게 캡슐화된 컴포넌트는 복잡한 어플리케이션에서의 재사용성을 높여준다. 이처럼 유명하고 편리한 React지만 로딩시간이 길다는 단점이 있다.</p>
<h2 id="3-vue">3. Vue</h2>
<p>Vue는 Evan You라는 개발자가 독립적으로 만든, UI를 위한 자바스크립트 프레임워크이다. 마찬가지로 Virtual DOM을 이용하였고, 컴포넌트를 사용한다. 그 외 많은 부분에서도 React와 매우 유사하다. 차이점이 있다면 더 가볍다. 각 기술의 전반적인 학습량을 기준으로 한다면 Vue가 가장 익히기 쉽다. Vue 제작자 인터뷰에서도 React와 Angular에서 쓸만한 기능들만 따서 만들었다고 한다. </p>
<p>Vue의 핵심은 간단한 템플릿 구문을 활용해 선언적으로 DOM에 데이터를 렌더링하는 것이다. 이게 어떻게 활용되느냐 하면 스크립트가 HTML과 데이터를 주고받을 때, 데이터가 DOM과 연결되어 있기에 하드코딩으로 직접적으로 상호작용할 필요없이 반응형으로 변경값을 업데이트할 수 있다. Vue는 기업에서 만든것이 아니기에 유지관리 측면에서 부족할 수 있다.</p>
<p>또한 위의 NPM trends 순위에서 볼 수 있듯이 React에 비해선 상대적으로 마이너하다. 커뮤니티가 작다는 것은 이제 막 공부를 시작하려는 분들에겐 생각보다 큰 단점이 될 수 있다.</p>
<h2 id="4-어떤-기술-스택을-익히면-좋을까">4. 어떤 기술 스택을 익히면 좋을까?</h2>
<ul>
<li>기존 앱에서 보수 및 확장이 필요하거나 빠르게 크로스플랫폼 앱개발까지 필요할 때 - React</li>
<li>가벼운 서비스를 개발할 때, 개발을 잘 모르지만 빠르게 성과를 내야할 때 - Vue</li>
<li>규모가 큰 기업에서, 많은 기능을 구현해야 하고 확장성이 높은 어플리케이션을 개발할 때 - Angular</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 프론틑엔드의 대표적인 프레임워크 및 라이브러리인 Angular, React, 그리고 Vue에 대해서 가볍게 알아보았다. 상황에 맞는 기술을 알맞게 사용하면 좋을 것 같다. 그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React 시작하기(CRA)]]></title>
            <link>https://velog.io/@jae_honey/React-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0CRA</link>
            <guid>https://velog.io/@jae_honey/React-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0CRA</guid>
            <pubDate>Fri, 09 Dec 2022 07:06:16 GMT</pubDate>
            <description><![CDATA[<p>이번 포스트는 React를 시작하는 법에 대해서 작성해보려고 한다. </p>
<h2 id="1-nodejs">1. Node.js</h2>
<ul>
<li>먼저 Node.js를 설치해야 한다. <a href="https://nodejs.org/ko/">다운로드</a></li>
</ul>
<h2 id="2-create-react-app">2. create-react-app</h2>
<ul>
<li>VSCode를 열고 터미널에 <code>npx create-react-app &quot;파일 이름&quot;</code> 입력!!</li>
</ul>
<h2 id="3-npm-start">3. npm start</h2>
<ul>
<li>설치가 완료되면 해당 파일로 들어간 후 터미널에 <code>npm start</code> 입력!!
그러면 localhost:3000에 리액트 프로젝트가 실행된 화면을 볼 수 있다.</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 React를 시작하는 법에 대해서 알아보았다. 다음 포스트에서는 리액트 컴포넌트에 대해서 알아보자. 그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SPA vs MPA]]></title>
            <link>https://velog.io/@jae_honey/SPA-vs-MPA</link>
            <guid>https://velog.io/@jae_honey/SPA-vs-MPA</guid>
            <pubDate>Thu, 01 Dec 2022 08:06:39 GMT</pubDate>
            <description><![CDATA[<p>이번 포스트는 SPA와 MPA에 대해서 작성해보려고 한다. 각각 무엇인지 그리고 어떤 장단점이 있는지 한번 알아보자</p>
<h2 id="1-mpa">1. MPA</h2>
<ul>
<li><p>MPA(Multi Page Application)는 여러 개의 페이지로 구성된 애플리케이션을 의미한다. MPA는 새로운 페이지를 요청할 때마다 정적 리소스가 다운로드 되고 전체 페이지를 다시 렌더링한다. 이 때 화면이 깜빡거리게 되는 것이 큰 특징이다.</p>
</li>
<li><p>장점</p>
<ol>
<li><p>SEO(Search Engine Optimization, 검색 엔진 최적화)에 유리하다.
  MPA는 완성된 형태의 HTML파일을 서버로부터 전달받는다.
  따라서 검색 엔진이 페이지를 크롤링하기에 적합하다.</p>
</li>
<li><p>서버에서 이미 렌더링해 가져오기 때문에 첫 로딩 매우 짧다.</p>
</li>
</ol>
</li>
<li><p>단점</p>
<ol>
<li>매 페이지 요청마다 새로고침이 발생하며 화면 깜빡임이 있다.
새로운 페이지를 요청할 때마다 전체 페이지를 다시 렌더링하기 때문이다.</li>
<li>페이지 이동시 불필요한 템플릿도 중복해서 로딩함으로 성능 측면에서 좋지 못하다.  </li>
</ol>
</li>
</ul>
<h2 id="2-spa">2. SPA</h2>
<ul>
<li><p>SPA(Single Page Application)는 한 개의 페이지로 구성된 애플리케이션을 의미한다.  SPA는 웹 에플리케이션에 필요한 모든 정적 리소스를 최초 한 번에 다운로드하며 그 이후 새로운 페이지 요청이 있을 때 페이지 갱신에 필요한 데이터만 전달 받아서 페이지를 갱신한다. Angular, React, Vue 등 프론트엔드 기술들이 나오면서 크게 유행하고 있다.</p>
</li>
<li><p>장점</p>
<ol>
<li><p>전체 페이지를 업데이트 할 필요가 없기 때문에 빠르고 깜빡임이 없다. 따라서 자      연스러운 사용자 경험을 줄 수 있다.</p>
</li>
<li><p>전체가 아닌 필요한 리소스만 부분적으로 다시 렌더링 하기 때문에 성능적인 측면     에서 좋다.</p>
</li>
<li><p>컴포넌트별 개발이 용이하기 때문에 유지보수 측면에서 유리하다. </p>
</li>
</ol>
</li>
<li><p>단점</p>
<ol>
<li>모든 정적 리소스를 최초 한 번에 다운로드 받기 때문에 초기 구동 속도가 느리     다.</li>
<li>SEO(Search Engine Optimization, 검색 엔진 최적화)가 어렵다.</li>
</ol>
</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 SPA와 MPA에 대해서 알아보았다. 프로젝트의 성격에 맞게 SPA와 MPA 중 어떤 것을 사용할지 각자의 장단점을 고려하여 정하면 될 것 같다.
그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] 호이스팅(hoisting)]]></title>
            <link>https://velog.io/@jae_honey/JS-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85hoisting</link>
            <guid>https://velog.io/@jae_honey/JS-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85hoisting</guid>
            <pubDate>Thu, 24 Nov 2022 08:02:08 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트에는 호이스팅이라는 신기한 현상이 존재한다. 이번 포스트에서는 이 호이스팅에 대해 알아보자.</p>
<h2 id="1-호이스팅이란">1. 호이스팅이란?</h2>
<p>호이스팅이란 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미한다. var로 선언한 변수의 경우 호이스팅 시 undefined로 변수를 초기하는 반면 let과 const로 선언한 변수의 경우 호이스팅 시 변수를 초기화하지 않는다. 
let과 const는 호이스팅이 발생하지 않는다고 알고 있는 사람들도 있는데 그것은 사실이 아니다. let과 const 또한 var과 같이 호이스팅이 발생한다. 다만 undefined로 초기화를 하지 않는 것이다.
호이스팅을 설명할 땐 주로 변수의 선언과 초기화를 분리한 후 선언만 코드의 최상단으로 옮기는 것으로 말한다. 따라서 변수를 정의하는 코드보다 사용하는 코드가 앞서 등장할 수 있다.</p>
<h2 id="2-호이스팅-예제">2. 호이스팅 예제</h2>
<pre><code class="language-js">console.log(num); // 호이스팅한 var 선언으로 인해 undefined 출력
var num; // 선언
num = 3; // 초기화</code></pre>
<ul>
<li>위 코드를 보면 var를 사용한 num 변수가 선언부에서 호이스팅이 된다. 따라서 선언 전에 num을 콘솔에 출력하면 undefined가 출력된다. 다만 호이스팅은 선언만 해당하기 때문에 초기화 부분은 의미가 없다.</li>
</ul>
<pre><code class="language-js">console.log(num); // ReferenceError
num = 3; // 초기화</code></pre>
<ul>
<li>위 코드에서는 선언 없이 초기화만 존재한다. 따라서 호이스팅이 없고 ReferenceError 에러가 발생한다.</li>
</ul>
<pre><code class="language-js">console.log(num); // ReferenceError
let num; // 선언
num = 3; // 초기화</code></pre>
<ul>
<li>위 코드를 보면 let를 사용한 num 변수가 선언부에서 호이스팅이 된다. 다만 let은 호이스팅이 되지만 초기화는 하지 않으므로 ReferenceError가 발생한다. const 또한 마찬가지다.</li>
</ul>
<pre><code class="language-js">console.log(sum(3, 7));  // 10

function sum(a, b) {
  return a + b 
}</code></pre>
<ul>
<li>위 코드에서는 함수 호출이 함수 자체보다 앞서지만 잘 동작한다. function 키워드를 사용하여 함수를 선언하면 가능하다.</li>
</ul>
<pre><code class="language-js">console.log(sum(3, 7));  // ReferenceError

const sum = (a, b) =&gt; {
  return a + b 
}</code></pre>
<ul>
<li>위 코드에서는 ReferenceError 가 발생한다. 그 이유는 함수를 선언할 때 function 키워드가 아니라 const를 사용했기 때문이다. 잘 알아두자.</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 자바스크립트의 호이스팅에 대해서 알아보았다. 상황에 맞게 호이스팅 현상을 이용하면 더 편하게 코드를 작성할 수 있을 것 같다.
그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] Map Object (맵 객체)]]></title>
            <link>https://velog.io/@jae_honey/JS-Map-Object-%EB%A7%B5-%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@jae_honey/JS-Map-Object-%EB%A7%B5-%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Thu, 17 Nov 2022 11:22:21 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트의 객체(Object) 자료형은 개발을 하면서 많이 쓰인다. 값을 키와 값으로 묶어 저장하고 조회하는 기능이 유용하고 필요하기 때문이다. 이번 포스트에서는 자바스크립트 객체를 좀 더 발전시킨 ES6 문법인 Map Object (맵 객체)에 대해 알아보자.</p>
<h2 id="1-삽입">1. 삽입</h2>
<pre><code class="language-js">// set으로 삽입
let eric = new Map();
eric.set(&#39;id&#39;, 0);
eric.set(&#39;name&#39;, &#39;eric&#39;);
eric.set(&#39;age&#39;, 25);
console.log(simba);      // {&#39;id&#39; =&gt; 0 &#39;name&#39; =&gt; &#39;eric&#39;, &#39;age&#39; =&gt; 25}

// 2차원 배열로 넘겨주기
let simba = new Map([
  [&#39;id&#39;, 1],
  [&#39;name&#39;, &#39;simba&#39;],
  [&#39;age&#39;, 10],
]);
console.log(simba);      // {&#39;id&#39; =&gt; 1, &#39;name&#39; =&gt; &#39;simba&#39;, &#39;age&#39; =&gt; 10}</code></pre>
<p>Map 객체는 set 메소드를 사용하여 키와 값을 삽입한다. 또 다른 방법으로는 Map 객체를 생성할때 2차원 배열을 이용해서 키와 값을 삽입할 수 있다.</p>
<h2 id="2-조회">2. 조회</h2>
<pre><code class="language-js">let simba = new Map([
  [&#39;id&#39;, 1],
  [&#39;name&#39;, &#39;simba&#39;],
  [&#39;age&#39;, 10],
]);
// get으로 조회
console.log(simba.get(&#39;name&#39;));  // &quot;simba&quot;
console.log(simba.get(&#39;age&#39;));  // 10
console.log(simba.get(&#39;weight&#39;));  // undefined</code></pre>
<p>Map 객체는 get 메소드를 사용하여 값을 조회한다. 인수로 키를 주면 그에 해당하는 값을 반환한다. 만약 키가 존재하지 않으면 undefined를 반환한다.</p>
<h2 id="3-삭제">3. 삭제</h2>
<pre><code class="language-js">let simba = new Map([
  [&#39;id&#39;, 1],
  [&#39;name&#39;, &#39;simba&#39;],
  [&#39;age&#39;, 10],
]);
// delete로 삭제
simba.delete(&#39;age&#39;);  
console.log(simba); // {&#39;id&#39; =&gt; 1, &#39;name&#39; =&gt; &#39;simba&#39;}

// clear로 맵 안의 key,value 전부 삭제
simba.clear(); 
console.log(simba);   // {}</code></pre>
<p>Map 객체는 delete 메소드를 사용하여 키와 값을 삭제한다. 인수로 키를 주면 그에 해당하는 키와 값을 삭제한다. 삭제를 성공하면 true를 , 실패하면 false를 반환한다.</p>
<p>추가로 clear 메소드는 Map 객체 안의 있는 모든 키와 값들을 삭제한다.</p>
<h2 id="4-일반-객체와의-차이">4. 일반 객체와의 차이</h2>
<p>Map 객체와 일반 객체의 가장 큰 차이점은 Map 객체의 경우 문자열 아닌 값도 키로 사용 가능하다는 점이다. 일반 객체에서는 문자열(String) 혹은 심볼(Symbol)만 키로 사용할 수 있지만 Map 객체에서는 숫자, 함수, 객체를 포함한 모든 자료형이 키로 쓰일 수 있다.</p>
<pre><code class="language-js">let obj = {
  1 : &#39;one&#39;,
  2 : &#39;two&#39;,
  3 : &#39;three&#39;
}

let map = new Map([
  [1, &#39;one&#39;],
  [2, &#39;two&#39;],
  [3, &#39;three&#39;],
])

console.log(obj.1) // unexpected number 에러
console.log(obj[&#39;1&#39;]) // &#39;one&#39;
console.log(map.get(1)) // &#39;one&#39;</code></pre>
<h2 id="5-순회">5. 순회</h2>
<pre><code class="language-js">let simba = new Map([
  [&#39;id&#39;, 1],
  [&#39;name&#39;, &#39;simba&#39;],
  [&#39;age&#39;, 10],
]);

console.log(simba.entries());
// MapIterator { [&#39;id&#39;, 1],[&#39;name&#39;, &#39;simba&#39;],[&#39;age&#39;, 10]}

for (const [key, value] of simba) {
  console.log(key, value);
}   /*
      &#39;id&#39; 1
      &#39;name&#39; &#39;simba&#39;
      &#39;age&#39; 10
    */</code></pre>
<p>Map 객체는 for of 문을 통해 순회가 가능하다. 순회는 Map Iterator의 형태로 이루어지며  Map Iterator 는 키-값을 쌍으로 묶은 배열이다. entries 메소드를 사용하면 Map Iterator를 볼 수 있다.</p>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 자바스크립트의 Map Object (맵 객체)에  대해서 알아보았다. 객체 안의 값들을 자주 사용된다고 한다. 필요한 상황에 맞게 객체와 Map 객체를 사용해야겠다. 
그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] 배열 정렬하기 sort()]]></title>
            <link>https://velog.io/@jae_honey/JS-%EB%B0%B0%EC%97%B4-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-sort</link>
            <guid>https://velog.io/@jae_honey/JS-%EB%B0%B0%EC%97%B4-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-sort</guid>
            <pubDate>Thu, 10 Nov 2022 07:20:18 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트에는 배열의 요소들을 정렬시켜주는 내장함수인 sort()가 존재한다.
이번 포스트에서는 sort() 함수의 사용법에 대해 알아보자.</p>
<h2 id="1-sort">1. sort()</h2>
<pre><code class="language-javascript">arr.sort([compareFunction])</code></pre>
<p>compareFunction 은 정렬 순서를 정의하는 함수이다. 이 것을 생략하면, 배열의 요소들은 문자열로 취급되어, 유니코드 값(사전 순) 순서대로 정렬된다. 여기서 주의할 점은 원본 배열이 정렬된다는 것이다.</p>
<pre><code class="language-javascript">let arr1 = [&quot;b&quot;, &quot;a&quot;, &quot;d&quot;, &quot;c&quot;]
let arr2 = [5, 1, 2, 10, 3]
arr1.sort()
arr2.sort()
console.log(arr1)  // [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]
console.log(arr2)  // [1, 10, 2, 3, 5]</code></pre>
<h2 id="2-오름차순-내림차순-정렬">2. 오름차순, 내림차순 정렬</h2>
<p>compareFunction을 사용하면 숫자를 오름차순 정렬 가능하다. 이 함수는 두 개의 배열 요소를 파라미터로 입력 받는다. a, b 두개의 요소를 파라미터로 입력받을 경우 반환값이 0보다 작을 경우 a가 b보다 앞에 오도록 정렬하고 0보다 클 경우 b가 a보다 앞에 오도록 정렬한다. 0을 반환하면 a와 b의 순서를 변경하지 않는다.</p>
<pre><code class="language-javascript">let arr = [5, 1, 2, 10, 3]
arr.sort((a, b) =&gt; a - b)  // 오름차순 정렬
console.log(arr)  // [1, 2, 3, 5, 10]

arr.sort((a, b) =&gt; b - a)  // 내림차순 정렬
console.log(arr)  // [10, 5, 3, 2, 1]</code></pre>
<h2 id="3-객체-정렬">3. 객체 정렬</h2>
<p>compareFunction을 사용하여 객체의 속성 중 하나의 값을 기준으로 정렬 할 수 있다.</p>
<pre><code class="language-javascript">let items = [
  { name: &#39;Eric&#39;, age: 15 },
  { name: &#39;Sam&#39;, age: 30 },
  { name: &#39;Harry&#39;, age: 25 },
  { name: &#39;James&#39;, age: 10 },
];
items.sort((a, b) =&gt; a.age - b.age)   // 나이를 기준으로 오름차순 정렬

items.sort((a, b) =&gt; {       // 이름을 기준으로 오름차순 정렬
  let nameA = a.name.toUpperCase(); // 대소문자 구분 안하기
  let nameB = b.name.toUpperCase(); // 대소문자 구분 안하기
  if (nameA &lt; nameB) {
    return -1;
  } else if (nameA &gt; nameB) {
    return 1;
  } else{
    return 0;
  }
})</code></pre>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 자바스크립트의 배열의 요소들을 정렬시켜주는 내장함수인 sort()에  대해서 알아보았다. 배열을 정렬할 상황이 많을텐데 그 때마다 유용하게 잘 사용해야겠다. 그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] 문자열 내장함수]]></title>
            <link>https://velog.io/@jae_honey/JS-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@jae_honey/JS-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 03 Nov 2022 05:14:40 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트에는 문자열을 다룰 수 있게 만들어 주는 내장함수들이 존재한다.
이번 포스트에서는 문자열의 내장함수들 중 많이 쓰이는 것들을 알아보자.</p>
<h2 id="1-indexof">1. indexOf</h2>
<p>indexOf 는 인수로 전달받은 문자열을 검색하여 첫 번째 인덱스를 반환한다. 찾지 못하면 -1를 반환한다.</p>
<pre><code class="language-javascript">const str = &quot;Hello World World Hello&quot;

console.log(str.indexOf(&quot;W&quot;)) // 6
console.log(str.indexOf(&quot;Hello&quot;)) // 0
console.log(str.indexOf(&quot;hi&quot;)) // -1</code></pre>
<h2 id="2-includes">2. includes</h2>
<p>includes 는 인수로 전달받은 문자열이 포함되어 있는지 확인하여 true, false 를 반환한다.</p>
<pre><code class="language-javascript">const str = &quot;Hello World&quot;

console.log(str.indexOf(&quot;Hello&quot;)) // true
console.log(str.indexOf(&quot;hi&quot;)) // false</code></pre>
<h2 id="3-substring">3. substring</h2>
<p>substring(begin, end) 은 begin 인덱스 위치부터 end인덱스 바로 앞 문자
까지의 부분문자열을 반환한다. end가 없으면 begin 인덱스 위치부터 마지막 문자까지의 부분문자열을 반환한다.</p>
<pre><code class="language-javascript">const str = &quot;Hello World&quot;

console.log(str.substring(3, 7)) // lo W 
console.log(str.substring(3)) // lo World</code></pre>
<h2 id="4-replace-replaceall">4. replace, replaceAll</h2>
<p>replace(s1, s2) 는 문자열에서 s1문자열을 찾아 s2문자열로 교체한 문자열을 반환한다. s1 문자열이 여러개면 첫번째 s1만 s2로 교체한다. 반면에 replaceAll(s1, s2) 는 모든 s1 문자열을 s2로 교체한다.</p>
<pre><code class="language-javascript">const str = &quot;Hello World Hello World&quot;

console.log(str.replace(&quot;World&quot;, &quot;Jaeheon&quot;)) // Hello Jaeheon Hello World
console.log(str.replaceAll(&quot;World&quot;, &quot;Jaeheon&quot;)) // Hello Jaeheon Hello Jaeheon</code></pre>
<h2 id="5-split">5. split</h2>
<p>split(str) 은 str을 기준으로 문자열을 분리한 후 분리된 문자열
을 원소로 갖는 배열을 반환한다.</p>
<pre><code class="language-javascript">const str1 = &quot;hello&quot;
const str2 = &quot;cat/dog/horse&quot;

console.log(str1.split(&quot;&quot;)) // [&quot;h&quot;, &quot;e&quot;, &quot;l&quot;, &quot;l&quot;, &quot;o&quot;] 
console.log(str2.split(&quot;/&quot;)) // [&quot;cat&quot;, &quot;dog&quot;, &quot;horse&quot;]</code></pre>
<h2 id="6-concat">6. concat</h2>
<p>concat 은 두 개의 문자열을 서로 붙여주는 함수이다.</p>
<pre><code class="language-javascript">const str1 = &quot;Hello&quot;
const str2 = &quot;World&quot;

console.log(str1.concat(str2))  // HelloWorld
console.log(str1.concat(&quot; &quot;, str2)) // Hello World</code></pre>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 자바스크립트의 문자열 내장함수에 대해서 알아보았다. 문자열을 다룰 일이 많을텐데 그 때마다 유용하게 잘 사용해야겠다. 그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] 배열 내장함수]]></title>
            <link>https://velog.io/@jae_honey/JS-%EB%B0%B0%EC%97%B4-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@jae_honey/JS-%EB%B0%B0%EC%97%B4-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98</guid>
            <pubDate>Fri, 28 Oct 2022 04:54:37 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트에는 배열을 좀 더 쉽게 다룰 수 있게 만들어 주는 내장함수들이 존재한다.
이번 포스트에서는 배열의 내장함수들 중 많이 쓰이는 것들을 알아보자.</p>
<h2 id="1-foreach">1. forEach</h2>
<pre><code class="language-javascript">const animals = [&quot;cat&quot;, &quot;dog&quot;, &quot;tiger&quot;, &quot;lion&quot;, &quot;horse&quot;]

for (let i = 0; i &lt; animals.length; i++) {
  console.log(animals[i])
}</code></pre>
<p>배열 안에 있는 모든 원소들을 출력해야 할 때 보통 for 문을 사용하여 다음과 같이 구현 할 수 있다. 하지만 forEach를 사용하면 좀 더 간단하게 만들 수 있다.</p>
<pre><code class="language-javascript">const animals = [&quot;cat&quot;, &quot;dog&quot;, &quot;tiger&quot;, &quot;lion&quot;]

animals.forEach((animal, idx) =&gt; {
  console.log(animal, idx) // &quot;cat&quot; 0 &quot;dog&quot; 2 &quot;tiger&quot; 3, &quot;lion&quot; 4
})</code></pre>
<p>forEach 내부에는, 각 원소에 대하여 처리하고 싶은 코드를 함수로 넣어준다. 이 함수의 매개변수 animal는 배열의 각각의 원소를 가르키게 된다. 이 콜백함수의 첫 번째 매개변수는 배열의 각각의 원소를 의미하고 두 번째 매개변수는 각 원소의 index(0,1,2,3)를 의미한다.</p>
<h2 id="2-map">2. map</h2>
<p>map 은 배열 안의 각 원소를 변환 할 때 사용 된다, 이 과정에서 새로운 배열이 만들어지며 원본배열은 변화가 없다. </p>
<pre><code class="language-javascript">const numbers = [1, 2, 3, 4, 5]
const double = numbers.map((n) =&gt; 2*n)

console.log(double)   //  [2, 4, 6, 8, 10]
console.log(numbers)  //  [1, 2, 3, 4, 5]</code></pre>
<h2 id="3-indexof-includes">3. indexOf, includes</h2>
<p>indexOf 는 원하는 항목이 몇번째 index인지 찾아주는 함수이다. 원하는 항목이 배열 내에 없으면 -1을 반환한다.</p>
<pre><code class="language-javascript">const animals = [&quot;cat&quot;, &quot;dog&quot;, &quot;tiger&quot;, &quot;lion&quot;]

const indexDog = animals.indexOf(&#39;dog&#39;)   
const indexLion = animals.indexOf(&#39;lion&#39;) 
const indexLion = animals.indexOf(&#39;cow&#39;)

console.log(indexDog)   // 1
console.log(indexLion)  // 3
console.log(indexCow)   // -1</code></pre>
<p>includes 는 배열이 특정 요소를 포함하고 있는지 판별한다. 포함하고 있으면 true 없으면 false를 반환한다.</p>
<pre><code class="language-javascript">const animals = [&quot;cat&quot;, &quot;dog&quot;, &quot;tiger&quot;, &quot;lion&quot;]

console.log(animals.includes(&quot;cat&quot;))   // true
console.log(animals.includes(&quot;cow&quot;))   // false</code></pre>
<h2 id="4-filter">4. filter</h2>
<p>filter 함수는 배열에서 특정 조건을 만족하는 값들만 따로 추출하여 새로운 배열을 만든다. </p>
<pre><code class="language-javascript">const numbers = [1, 2, 3, 4, 5, 6]
const evenNum = numbers.filter((n) =&gt; n % 2 === 0)

console.log(double)   //  [2, 4, 6]</code></pre>
<p>위 코드르 보면 filter 함수의 콜백함수에 n이 짝수인 경우만 통과하도록 조건을 걸었고 그 조건에 만족하는 2, 4, 6만 반환된다.</p>
<h2 id="5-slice">5. slice</h2>
<p>slice 는 배열을 잘라낼 때 사용한다. slice 에는 두 개의 파라미터를 넣게 되는데 첫번째 파라미터는 어디서부터 자를지, 그리고 두번째 파라미터는 어디까지 자를지 를 의미한다. 추가로 기존의 배열은 건들이지 않는다.</p>
<pre><code class="language-javascript">const numbers = [1, 2, 3, 4, 5, 6]
const sliced = numbers.slice(0, 3) // index 0부터 시작해서 3전까지

console.log(sliced) // [1, 2, 3]
console.log(numbers) // [1, 2, 3, 4, 5, 6]
</code></pre>
<h2 id="6-splice">6. splice</h2>
<p>splice 는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경한다.</p>
<pre><code class="language-javascript">const months = [&#39;Jan&#39;, &#39;March&#39;, &#39;April&#39;, &#39;June&#39;]

months.splice(1, 0, &#39;Feb&#39;)  // index 1에 Feb 추가
console.log(months)  // [&quot;Jan&quot;, &quot;Feb&quot;, &quot;March&quot;, &quot;April&quot;, &quot;June&quot;]

months.splice(4, 1, &#39;May&#39;)  // index 4에서 요소 하나를 지우고 그 자리에 May 추가
console.log(months)  // [&quot;Jan&quot;, &quot;Feb&quot;, &quot;March&quot;, &quot;April&quot;, &quot;May&quot;]
</code></pre>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 자바스크립트의 배열 내장함수에 대해서 알아보았다. 배열을 다룰 일이 많을텐데 그 때마다 유용하게 잘 사용해야겠다. 그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] 커밋 메세지 컨벤션 (AngularJS commit message conventions)]]></title>
            <link>https://velog.io/@jae_honey/Git-%EC%BB%A4%EB%B0%8B-%EB%A9%94%EC%84%B8%EC%A7%80-%EC%BB%A8%EB%B2%A4%EC%85%98-AngularJS-commit-message-conventions</link>
            <guid>https://velog.io/@jae_honey/Git-%EC%BB%A4%EB%B0%8B-%EB%A9%94%EC%84%B8%EC%A7%80-%EC%BB%A8%EB%B2%A4%EC%85%98-AngularJS-commit-message-conventions</guid>
            <pubDate>Thu, 20 Oct 2022 06:13:01 GMT</pubDate>
            <description><![CDATA[<h2 id="commit-message-convention">Commit Message Convention</h2>
<p>Commit Message Convention은 커밋 메시지의 규칙을 정해두는 것이다. 팀 단위로 협업을 할 때 유용하게 사용되며 커밋 히스토리를 읽는것 만으로도 변경사항을 이해할 수 있도록 commit message를 남기는 것이다.</p>
<p>그 중에서 가장 많이 쓰이는 AngularJS 의 커밋 메세지 컨벤션에 대해서 알아보자.</p>
<h2 id="1-commit-message-기본-구조">1. Commit Message 기본 구조</h2>
<p>커밋 메시지는 빈 줄로 구분된 세 부분 &#39;제목/본문/꼬리말&#39;로 구성된다. 이 때 커밋 메시지의 제목만 필수이며 본문과 꼬리말은 선택적 입력이다.</p>
<pre><code>  type(scope): subject

  body

  footer</code></pre><h2 id="2-type">2. Type</h2>
<ul>
<li>feat : 새로운 기능 추가</li>
<li>fix : 버그 수정</li>
<li>docs : 문서 관련</li>
<li>style : 스타일 변경 (포매팅 수정, 들여쓰기 추가, …)</li>
<li>refactor : 코드 리팩토링</li>
<li>test : 테스트 관련 코드</li>
<li>build : 빌드 관련 파일 수정</li>
<li>ci : CI 설정 파일 수정</li>
<li>perf : 성능 개선</li>
</ul>
<h2 id="3-scope">3. Scope</h2>
<ul>
<li>커밋 변화가 일어난 곳의 법위를 특정하며 생략 가능하다. </li>
<li>$location, $browser, $compile, $rootScope, ngHref, ngClick, ngView, 등이 들어갈 수 있다.</li>
</ul>
<h2 id="4-subject">4. Subject</h2>
<ul>
<li>변경사항에 대한 간단한 설명을 적는다.</li>
<li>명령문, 현재시제로 작성한다.</li>
<li>첫글자를 대문자로 시작하지 않으며 문장 끝에 마침표(.)를 붙이지 않는다. </li>
</ul>
<h2 id="5-body">5. Body</h2>
<ul>
<li>의무는 아니며 현재시제로 작성하기를 권장한다.</li>
<li>변경한 이유와 변경전과의 차이점을 설명한다</li>
</ul>
<h2 id="6-footer">6. Footer</h2>
<ul>
<li>선택사항이므로 의무적으로 작성할 필요는 없다.</li>
<li>Issue tracker id를 작성할때 사용된다.</li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 Commit Message Convention, 그 중에서도 AngularJS commit message conventions에 대해서 알아보았다. 커밋 메세지를 규칙성 없이 원하는대로 작성했었는데 이제부터는 AngularJS의 커밋 컨벤션을 적용해야겠다. 그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git 완전 정복 2탄]]></title>
            <link>https://velog.io/@jae_honey/Git-%EC%99%84%EC%A0%84-%EC%A0%95%EB%B3%B5-2%ED%83%84</link>
            <guid>https://velog.io/@jae_honey/Git-%EC%99%84%EC%A0%84-%EC%A0%95%EB%B3%B5-2%ED%83%84</guid>
            <pubDate>Wed, 12 Oct 2022 08:29:41 GMT</pubDate>
            <description><![CDATA[<p>저번 포스트에서는 기본적인 git과 github 사용법 대해서 알아보았다. 이번 포스트에서는 저번 포스트에 이어서 branch에 대해서 알아보자. </p>
<h2 id="1-branch란">1. Branch란?</h2>
<p>A, B, C 3명의 개발자가 있고 이들은 같은 소스코드를 공유한다고 헤보자. 그리고 각각 a, b, c라는 다른 작업을 수행해야한다고 해보자. 이처럼 같은 소스코드에서 서로 다른 작업을 하게 되면 서로 다른 버전의 코드가 만들어 질 수 밖에 없다.</p>
<p>이러한 상황에서 여러 개발자들이 동시에 다양한 작업을 할 수 있게 만들어 주는 기능이이 &#39;branch&#39;다. 각자 독립적인 작업 영역에서 자신의 작업을 하면 된다. 이렇게 분리된 작업 영역에서 만들어진 다른 버전의 코드들은 나중에 원래 버전과 비교해서 하나의 새로운 버전으로 만들어 낼 수 있다.</p>
<p>결론적으로 branch란?
Branch란 독립적으로 어떤 작업을 수행하기 위한 작업공간이다. 각각의 branch는 서로에게 영향을 주지 않기 때문에, 여러 작업을 동시에 진행할 수 있고 나중에 합칠 수도 있다.</p>
<h2 id="2-branch-만들기-전환">2. Branch 만들기, 전환</h2>
<ul>
<li>그러면 branch를 만들어보자<pre><code class="language-bash">git branch &quot;브랜치 이름&quot;    // branch 생성
git branch      // 현재 내가 있는 branch 확인
git branch -a   // 현재 내가 있는 branch와 만들어진 모든 branch 확인</code></pre>
<img src="https://velog.velcdn.com/images/jae_honey/post/2e9f578d-feb2-44a7-80f0-405bf6d81b10/image.PNG" alt=""></li>
<li>branch-practice라는 branch를 만들었고 branch 목록을 보면 잘 만들어진 것을 볼 수 있다.</li>
<li>그러면 branch를 전환해보자</li>
</ul>
<pre><code class="language-bash">git checkout &quot;브랜치 이름&quot;  // 브랜치 이름으로 branch 전환</code></pre>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/44143a90-9cc0-4dcf-b926-46da60756ac5/image.PNG" alt=""></p>
<ul>
<li>branch가 main에서 branch-practice로 바뀐 것을 볼 수 있다.</li>
</ul>
<h2 id="3-branch-원격저장소에-올리기">3. Branch 원격저장소에 올리기</h2>
<ul>
<li>원격저장소에 올리기 전에 내용을 바꿔보자.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/3b4e994c-6db7-4df9-83da-d2ff82c567af/image.PNG" alt=""></p>
<ul>
<li>hello.txt 파일을 만들었고 안에 HelloWorld라고 작성했다.</li>
<li>이러면 main과 버전이 달라졌다.</li>
<li>달라진 버전을 원격저장소에 올려보자. 그전에 add, commit은 까먹지 말고 해주자.<pre><code class="language-bash">git push origin &quot;브랜치 이름&quot;   // branch를 원격저장소로 push</code></pre>
</li>
<li>해당 명령어 입력 후 원격저장소로 가보자.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/1ded7ab6-84db-46f7-9b57-b359905499be/image.PNG" alt=""></p>
<ul>
<li>빨간부분을 눌러보면 브랜치 목록들을 볼 수 있다. 눌러보면 branch-practice 브랜치가 생겼을 것이다.</li>
<li>눌러서 들어가면 main과는 다른, hello.txt가 있는 버전의 branch를 볼 수 있다.</li>
</ul>
<h2 id="4-branch-merge병합">4. Branch merge(병합)</h2>
<ul>
<li>이번에는 main과 branch-practice를 병합해보자.</li>
<li>일단 먼저 main으로 이동하자.(<code>git checkout main</code>)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jae_honey/post/d5797c19-31a2-4b6f-81e9-c365af198dbc/image.PNG" alt=""></p>
<ul>
<li>보다시피 main에는 hello.txt가 없는 것을 볼 수 있다.</li>
<li>main에도 아까 작성했던 hello.txt를 가져와보자.<pre><code class="language-bash">git merge &quot;브랜치 이름&quot;    // 현재 있는 branch에 브랜치 이름 branch 병합</code></pre>
<img src="https://velog.velcdn.com/images/jae_honey/post/b88d9979-4de4-44d3-8811-740b56289dd9/image.PNG" alt=""></li>
<li>병합 후 main에도 hello.txt가 생겼고 내용도 HelloWorld로 잘 병합 된것을 볼 수 있다.</li>
<li>병합된 main은 local저장소이므로 원격저장소에는 아직 변경사항이 적용되지 않았다. 병합된 main을 원격저장소에도 적용시키려면 main에 push를 해주면 된다.
<br><br></li>
</ul>
<h1 id="마치며">마치며</h1>
<p>이번 포스트에서는 독립적인 작업 공간을 만들어주는 git의 branch에 대해서 알아보았다. 다음 Git 완전정복 3탄에서는 또 다른 병합 방법인 Pull Request와 Merge Conflict(병합충돌)에 대해서 알아보자. 그럼 안녕!! (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧</p>
]]></description>
        </item>
    </channel>
</rss>