<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>brill_be.log</title>
        <link>https://velog.io/</link>
        <description>슬로우 스타터</description>
        <lastBuildDate>Wed, 06 Dec 2023 07:02:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>brill_be.log</title>
            <url>https://images.velog.io/images/brill_be/profile/4b9027a3-3628-4a88-bf4f-abf9e4003777/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. brill_be.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/brill_be" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[데이터 저잦ㅇ형식]]></title>
            <link>https://velog.io/@brill_be/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A6%E3%85%87%ED%98%95%EC%8B%9D</link>
            <guid>https://velog.io/@brill_be/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A6%E3%85%87%ED%98%95%EC%8B%9D</guid>
            <pubDate>Wed, 06 Dec 2023 07:02:39 GMT</pubDate>
            <description><![CDATA[<div><a href="http://www.naver.com">링크도 저장</a></div>]]></description>
        </item>
        <item>
            <title><![CDATA[[5주차 회고내용]]]></title>
            <link>https://velog.io/@brill_be/5%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%82%B4%EC%9A%A9</link>
            <guid>https://velog.io/@brill_be/5%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%82%B4%EC%9A%A9</guid>
            <pubDate>Sun, 28 Aug 2022 15:05:28 GMT</pubDate>
            <description><![CDATA[<p>마지막 프로젝트!
tripbitoz : grid를 적극적으로 사용해봄. 통신 모듈 짜보고 싶었는데 대신 localstorage모듈을 짜보았다. 후반부에 발생한 에러를 해결하고, infiniteScroll를 react-query의 useInfiniteQuery를 이용해 구현해 봄. 스켈레톤 UI도 구현해 봄.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[4주차 회고내용]]]></title>
            <link>https://velog.io/@brill_be/4%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%82%B4%EC%9A%A9</link>
            <guid>https://velog.io/@brill_be/4%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%82%B4%EC%9A%A9</guid>
            <pubDate>Sun, 28 Aug 2022 15:04:44 GMT</pubDate>
            <description><![CDATA[<ul>
<li>8dmin : 쉬운 쪽 맡아서 시간이 많았음. react-hook-form 사용해봄. dirty, dirtyField를 이용한 버튼 활성화 로직 짬. 다른 팀원들의 코드를 좀 더 깔끔히 보고 리뷰를 해볼 것. 어떤 로직인지 이해하고, 코드 스타일은 어떤지 피드백 해줄 것. 웹앱을 만들 때 onTouch 이벤트고려(앱에서는 마우스 이벤트가 없으니). 주소 찾기 모달 만들어 볼 것. react-hook-form 적용기 정리! 웹팩, 바벨, TS를 이용한 바닥부터 직접하는 보일러플레잍팅 경험. 다시 제대로 한 번 해보고 포스팅 할 것.</li>
<li>8gall : 그냥 딱 봤을 때 어? 이거 쉽겠는데? 하고 만만히 보고 내 파트만 생각하고 짠 게 패착. 다른 컴포넌트와 어떻게 동작할지를 좀 얘기를 해봤어야 할 것 같음. 한 페이지에서 조립해야하는 컴포넌트 여러개를 각자 맡아서 했을 떄 했을 때 A→B로  . 서로 컴포넌트에서 스테이트를 관리하고, 데이터를 합칠지를 우선 논의하고 해야할 것 같음.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[3주차 회고내용]]]></title>
            <link>https://velog.io/@brill_be/3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%82%B4%EC%9A%A9</link>
            <guid>https://velog.io/@brill_be/3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%82%B4%EC%9A%A9</guid>
            <pubDate>Sun, 28 Aug 2022 15:04:17 GMT</pubDate>
            <description><![CDATA[<p>3-1프로젝트 : 8oogle
3-2프로젝트 : 8dmin
쉬운 쪽 맡아서 시간이 많았음. react-hook-form 사용해봄. dirty, dirtyField를 이용한 버튼 활성화 로직 짬. 다른 팀원들의 코드를 좀 더 깔끔히 보고 리뷰를 해볼 것. 어떤 로직인지 이해하고, 코드 스타일은 어떤지 피드백 해줄 것. 웹앱을 만들 때 onTouch 이벤트고려(앱에서는 마우스 이벤트가 없으니). 주소 찾기 모달 만들어 볼 것. react-hook-form 적용기 정리! 웹팩, 바벨, TS를 이용한 바닥부터 직접하는 보일러플레이팅 경험. 다시 제대로 한 번 해보고 포스팅 할 것.</p>
<p>제안한 것&gt;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2주차 회고내용]]]></title>
            <link>https://velog.io/@brill_be/2%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%82%B4%EC%9A%A9</link>
            <guid>https://velog.io/@brill_be/2%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%82%B4%EC%9A%A9</guid>
            <pubDate>Sun, 28 Aug 2022 15:02:56 GMT</pubDate>
            <description><![CDATA[<p>2-1프로젝트 : 8flix
StyledProvider를 이용한 테마 적용. 통신 모듈(예외 처리, 오류 처리, react-query  따라서 만들어본것.) 인피니트 스크롤
급하게 하느라 힘듦.
2-2프로젝트 : 8oogle
reduce를 활용한 데이터 가공, 폼을 직접 구현(밸리데이션 포함). 얼마나 까다로운 지 알았고, react-hook-form 도입할 이유가 생김. string필드에 점찍는 거 해봤는데 다른 팀보니까 keyboardDown이벤트 이용해서도 하는 것 같음. typescript 도입</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기능적 요구사항 정리]]></title>
            <link>https://velog.io/@brill_be/%EA%B8%B0%EB%8A%A5%EC%A0%81-%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@brill_be/%EA%B8%B0%EB%8A%A5%EC%A0%81-%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 13 Aug 2022 18:43:25 GMT</pubDate>
            <description><![CDATA[<h2 id="기능적-요구사항-정리">기능적 요구사항 정리</h2>
<h2 id="회원">회원</h2>
<ul>
<li>OAuth로 링크 가능 (google/kakao/github)<ul>
<li>회원가입시 아래 정보 입력<ul>
<li>닉네임</li>
<li>아이디(id</li>
<li>비밀번호</li>
</ul>
</li>
<li>닉네임과 아이디는 사용자가 입력을 마쳤다고 판단할 때 서버를 통해 체크한다.</li>
</ul>
</li>
<li>프로필<ul>
<li>비번 바꾸기</li>
<li>프로필 사진 바꾸기 (로컬 파일로만)</li>
<li>소셜 계정 연동 추가</li>
<li>탈퇴하기</li>
</ul>
</li>
</ul>
<h2 id="문제">문제</h2>
<ul>
<li>문제 등록/수정/삭제<ul>
<li>제목</li>
<li>문제등급</li>
<li>시간 제한/ 메모리 제한</li>
<li>문제 설명(전체적인 거)</li>
<li>입력 설명</li>
<li>출력 설명</li>
<li>예제 입력/출력(테스트케이스 여러개일 수 있으므로 배열로)</li>
<li>tag(어떤 문제 유형인지)</li>
<li>실제 입력 데이터 및 출력 데이터(테스트 케이스)</li>
<li>제출 횟수/정답 횟수/맞힌 사람/정답률</li>
</ul>
</li>
<li>문제 채점 ( c/c++/python2/python3/java)<ul>
<li>실행하기 버튼 → 단순 코드 실행해서 실행 결과 보여주는거<ul>
<li>Judger의 실행 결과 + 채점 결과를 응답해줌 (예제 데이터로만 채점)</li>
</ul>
</li>
<li>제출하기 → 진짜로 제출<ul>
<li>Judger의 채점 결과만 응답 (실제 채점 데이터로 채점)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="채점-현황">채점 현황</h2>
<ul>
<li>본인꺼는 항상 뜨고 타인꺼는 채점결과 페이지에서만 표기<ul>
<li>STOMP subscribe 사용</li>
</ul>
</li>
</ul>
<h2 id="제출-이력">제출 이력</h2>
<ul>
<li>저장 데이터<ul>
<li>제출 번호</li>
<li>시도 수</li>
<li>언어</li>
<li>제출 시간</li>
<li>채점 결과 (메모리, 시간, 결과)</li>
<li>코드 길이</li>
</ul>
</li>
<li>모든 채점 제출 이력 저장</li>
<li>이력과 비교해서 같은 코드일 경우 채점 X</li>
</ul>
<h2 id="맞힌-사람">맞힌 사람</h2>
<ul>
<li>제출 이력을 소팅<ul>
<li>메모리 &gt; 시간 &gt; 코드 길이</li>
</ul>
</li>
</ul>
<h2 id="랭킹">랭킹</h2>
<ul>
<li>데이터<ul>
<li>맞은 문제</li>
<li>제출</li>
<li>정답 비율</li>
</ul>
</li>
</ul>
<h2 id="페이지-정리">페이지 정리</h2>
<p><img src="https://velog.velcdn.com/images/brill_be/post/f80022d8-a806-40d4-8696-e1bb9caad6ec/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[온라인 져저 디자인하기]]></title>
            <link>https://velog.io/@brill_be/%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%A0%B8%EC%A0%80-%EB%94%94%EC%9E%90%EC%9D%B8%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@brill_be/%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%A0%B8%EC%A0%80-%EB%94%94%EC%9E%90%EC%9D%B8%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 11 Aug 2022 18:17:33 GMT</pubDate>
            <description><![CDATA[<h2 id="ui-디자인을-한-이유">UI 디자인을 한 이유</h2>
<blockquote>
<p> 설계 하기 편하니까! 계속 디자인 고민을 안해도 되니까!</p>
</blockquote>
<p>여러 프로젝트를 진행하면서 디자인이 없는 경우가 많았다.
 개발공부를 시작한지 얼마안돼서 초기에는 와이어프레임 정도만 만들고 &#39;스테이트는 필요해 보일때 마다 알아서 만들어서 관리하자^-^&#39;라고 생각하고 개발했었는데, 늘 커다란 에러가 생겼고 그 에러를 해결하는데 나머지 부분을 개발하는 것보다 더 많은 시간을 투자했었다.
** 설계를 하지 않거나 꼼꼼하지 않은 설계를 하면, 결국 상태가 꼬여버리고 그 문제를 해결하기 위해 많은 시간을 들여야할 뿐만 아니라 코드가 더러워지는 경우가 많았다.**
 설계 부재의 참혹함을 느낀 이후로 꼭 스테이트 설계/ 코드 구조 설계/ 여러 컨벤션 등을 먼저 정하고 개발에 들어가는 편인데, 이 때 디자인이 구체화되어 있지 않으면 컴포넌트를 어떻게 쪼갤지 상상이 잘 안돼서 힘들때가 많았다. 그래서 일찌감치 UI를 만들어 설계하기 쉽게 하려고 했다.</p>
<h3 id="설계할-때-고려할-것">설계할 때 고려할 것</h3>
<ul>
<li>주로 통신으로 받아온 데이터를 어떻게 관리할 것이며 오류 처리는 어떻게 할 것인가를 생각해서 설계<ul>
<li>어떤 식으로 컴포넌트를 쪼갤지</li>
<li>스테이트는 어디서 관리하고 어떻게 내려줄 </li>
<li>전역 스테이트가 어울릴지 그냥 지역적으로 스테이트를 사용할지</li>
<li>애초에 스테이트가 필요한 부분은 맞는지 생각!</li>
</ul>
</li>
</ul>
<h2 id="피그마를-사용해보자">피그마를 사용해보자</h2>
<ul>
<li>AdobeXD를 사용한 경험이 있었는데 지금은 유료화가 돼버려서😭 피그마를 사용했다.</li>
<li>일단 깔끔하게 보이게만 해뒀고, 어떤 컴포넌트가 어떤 식으로 들어갈지만 정리해두었다.=
<img src="https://velog.velcdn.com/images/brill_be/post/5266445c-56a3-47e8-992b-71b7a0bbe6e9/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[온라인 져저 만들기]]></title>
            <link>https://velog.io/@brill_be/%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%A0%B8%EC%A0%80-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@brill_be/%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%A0%B8%EC%A0%80-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Tue, 09 Aug 2022 15:25:21 GMT</pubDate>
            <description><![CDATA[<h1 id="온라인-져저를-만들어보자">온라인 져저를 만들어보자!</h1>
<h2 id="왜만드니">왜만드니?</h2>
<p>대학교 재학시절 나는 SW운영보조원 활동을 2년간 했다. 주로 어떤걸 했었냐면..</p>
<ul>
<li><strong>QnA 답변 활동</strong> : 프로그래밍 과목 QnA게시판에 대한 답 달아주기(과제하다가 막힌 부분이 있으면 힌트를 주는 방식으로 진행)</li>
<li><strong>오픈소스 프로그램 커스텀</strong> : Indico 한글화 및 필요한 기능만 남기기, 디자인 커스텀
여담) 웹 개발 자체도 처음이었는데 flask가 너무 생소하고, 그 당시 나에겐 너무 큰 규모의 프로그램이었던지라 코드를 읽는데 정말 많이 애를 썼다. 1년 동안 얼렁뚱땅 수정을 하긴 했었는데 2년이 지난 지금에서야 어떤 구조로 돼있었는지 어렴풋이 이해가 가는 것 같다.</li>
<li><strong>도커 튜토리얼 작성</strong> : 도커 사용법 및 간단한 예제를 만들어 ppt로 제작했다.</li>
<li><strong>Online-Judger 개발</strong> : angular, express.js, kafka, mongodb를 이용해 개발을 하려고 했고, 도커 + 젠킨스를 이용해 학교 서버에서 배포하려고 했다. 하지만 웹개발 초보자였던 나에게는 이 모든걸 하기 너무 벅찼다.. 결국 이론만 공부하다가 1년이 다 가버렸고 실질적인 개발에 많은 도움이 되진 못했다. 나는 도커에서 카프카 컨슈머가 메세지를 분배해서 가져가지 않고, 한 컨슈머가 모든 메시지를 가져오는 이슈를 해결했었다.</li>
<li>대신 거기서 배운 것들을 ( docker, express, RESTAPI, kafka )를 졸업작품에 적용해보았다.</li>
<li>온라인 져저를 직접 구현해보고 배포한 경험이 생긴다면 정말 멋있을 거라고 생각했는데, 내 기여도는 상당히 낮아서 아쉬웠다😭. 언젠가 꼭 내손으로 만들어보고 싶었고, 웹 개발에 대한 지식이 조금 생겼다고 생각이 들어 만들어보기로 했다!</li>
</ul>
<h2 id="어떤-기술들을-사용할까">어떤 기술들을 사용할까?</h2>
<ul>
<li>우선 내가 하고 싶어서 해보는 프로젝트인 만큼 내가 쓰고 싶었던 기술들도 마음껏 써보기로 했다!(이 프로젝트에 딱 맞는 기술이 아니라고 할지라도,, graphql같이 너무 방향성이 다르다~싶은 것만 아니면 써보기로 했다. )<h3 id="그동안-배우고-써본-것들">그동안 배우고 써본 것들</h3>
</li>
<li>리액트 : 애증하는 리액트..</li>
<li>약간의 최적화(LazyLoading, 렌더링 최적화, 코드 스플리팅)</li>
<li>리덕스</li>
<li>리덕스 툴킷</li>
<li>타입스크립트</li>
</ul>
<h3 id="공부했지만-써보지-못한-것들">공부했지만 써보지 못한 것들</h3>
<ul>
<li>Next.js : 쓸까말까 정말 고민을 많이 했다. 온라인 져저 특성상 스테이트의 변화가 매우 잦기 때문에 Next.js를 쓰는 의미가 있을까?싶었는데 문제를 보여주는 페이지는 정적으로 만들어줘도 나쁘지 않다고 생각해서 Next.js를 써보기로 했다.</li>
<li>리덕스 사가 or redux toolkit의 createAsyncThunk: 늘 예제에서만 실행해보고 사용해봤던, 그 리덕스 사가! 내가 푼 문제의 채점 현황을 리덕스로 관리해서 알림으로 띄워주면 좋을 것 같은데, 채점에 걸리는 시간은 들쭉날쭉하니 비동기로 처리해야한다. =&gt; 이거 완전 리덕스 사가쓰기 좋은 이슈아닌가! 그래서 망설임 없이 리덕스 사가를 써보기로 했다.</li>
<li>OAuth</li>
<li>Jest, React Testing Library, ... (테스팅)</li>
</ul>
<h3 id="모르지만-써볼-것">모르지만 써볼 것</h3>
<ul>
<li>Github Action(CI/CD)</li>
<li>STOMP</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[courseology_디자인부터해보자]]></title>
            <link>https://velog.io/@brill_be/courseology%EB%94%94%EC%9E%90%EC%9D%B8%EB%B6%80%ED%84%B0%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@brill_be/courseology%EB%94%94%EC%9E%90%EC%9D%B8%EB%B6%80%ED%84%B0%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Tue, 09 Aug 2022 15:13:14 GMT</pubDate>
            <description><![CDATA[<p>asdf</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[온라인 코스 서비스 새로 만들기(courseology)]]></title>
            <link>https://velog.io/@brill_be/%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%BD%94%EC%8A%A4-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%83%88%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0courseology</link>
            <guid>https://velog.io/@brill_be/%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%BD%94%EC%8A%A4-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%83%88%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0courseology</guid>
            <pubDate>Sun, 31 Jul 2022 08:25:14 GMT</pubDate>
            <description><![CDATA[<h2 id="♻️이번에-다시-만들어-볼-서비스는">♻️이번에 다시 만들어 볼 서비스는</h2>
<ul>
<li><p>기존 서비스 : <a href="https://github.com/YOONLEEVERSE/onlinecourse-front">https://github.com/YOONLEEVERSE/onlinecourse-front</a></p>
</li>
<li><p>온라인 강의를 등록하고 관리할 수 있고, 수강이 가능한 서비스이다.  유튜브에서 유용한 강의를 모아서 강의 리스트로 만들어 한 페이지에서 쉽게 볼 목적으로도 사용할 수 있을 것 같았다.</p>
</li>
</ul>
<h2 id="🤔-왜-다시-만들게-되었나">🤔 왜 다시 만들게 되었나?</h2>
<ul>
<li>취준생이라는 생각을 하니 마음이 조급해지기만 했고 단기간에 많은 서비스를 구현해야 한다고 생각했다. 그래서 graphql 이나 react 구조를 처음부터 <strong>꼼꼼하게 설계하지 못했고 후반부로 갈수록 코드는 더러워져만 갔다.</strong> 프로젝트를 진행하면서 내가 옳게 구현하고 있는건가,.? 나는 왜이렇게 못하지..?라는 생각에 좀 슬럼프를 겪으면서 해당 서비스의 구현이 많이 딜레이 됐다.<ul>
<li>겨우겨우 필수 기능 구현이 완료됐지만 구조며 코드며 하나도 마음에 드는 게 없었다. 좀 더 깔끔한 설계와 코드가 필요하다고 생각한 나는 원티드 프리온보딩 코스를 듣게 되었다. 원티드 프리온보딩 프론트엔드 코스를 진행 하면서 <strong>내 코드의 문제점을 많이 파악하게 됐는데 기존 프로젝트를 보완해보고 싶다는 생각이 들었다.</strong> 그래서 제일 처음 재구축 할 프로젝트로 이 온라인 코스 서비스를 선택하게 되었다.</li>
<li>제일 최근에 만든 서비스라 어떤 의도로 만들었는지, 어떻게 생각하면서 그 부분을 구현했는지 기억이 제일 잘 나서 잘못 생각했던 부분을 고치기 가장 쉬울 것 같았다. 그리고 구조 분리를 시도해보기도 했던 때라, 그나마 폴더 구조가 정리 돼있어서 과거의 코드와 현재의 코드를 비교해보기 좋을 것 같았다.</li>
</ul>
</li>
</ul>
<h2 id="📖새로-만들-때-원칙">📖새로 만들 때 원칙</h2>
<ol>
<li>단일 컴포넌트에서는 되도록 하나의 일을 하도록 하자</li>
<li>common한 함수/컴포넌트와 한 컴포넌트에 종속돼있는 함수/컴포넌트를 잘 구분지어 정리하도록 하자</li>
<li>useRef를 써서 리렌더링을 좀 줄일 수 있도록 해보자</li>
<li>혼자 하는 프로젝트지만, commit convention, code convention을 잘 지키면서 구현하자</li>
<li>무작정 구현하지 말자. 충분히 생각을 해보고 설계를 마친 후에 구현하자! 설계가 훨씬 중요하다. UX도 충분히 고려한 설계일 것</li>
<li>Theme Provider를 이용해 theme을 관리하도록 하자</li>
<li>클린한 코드를 짤 수 있도록 늘 노력하자</li>
<li>리팩토링은 필수!</li>
<li>UI 라이브러리에 의존하지 말 것. 웬만하면 내가 다 구현하자</li>
<li>폴더 구조를 깔끔하게 가져가자</li>
<li>통신 모듈은 항상 그냥 쓰지 않는다. Wrapper로 한 번 묶어줄 것(에러 핸들링을 하기 위함)</li>
<li>테스트 코드를 작성해보자</li>
<li>최적화를 해보자(useMemo, useCallback, Debounce, Throttle)</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[1-3장]JavaScript의 기본적 이해]]></title>
            <link>https://velog.io/@brill_be/1-3%EC%9E%A5JavaScript%EC%9D%98-%EA%B8%B0%EB%B3%B8%EC%A0%81-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@brill_be/1-3%EC%9E%A5JavaScript%EC%9D%98-%EA%B8%B0%EB%B3%B8%EC%A0%81-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Fri, 15 Jul 2022 23:21:37 GMT</pubDate>
            <description><![CDATA[<h1 id="1-3장-가볍게-정리">[1-3장] 가볍게 정리</h1>
<h2 id="syntax-vs-semantic">Syntax VS Semantic</h2>
<ul>
<li><p><strong>syntax</strong> : 문법적인 것 =&gt; 보통 디버거로 잡기 쉬움</p>
</li>
<li><p><strong>semantic</strong> : 의미적인 것 =&gt; 로직이나 프로그램의 흐름 등. 논리의 오류 때문에 발생하는 문제이기 때문에 디버거로 잡기 쉽지 않음</p>
<h2 id="javascript와-ecmascript">JavaScript와 ECMAScript</h2>
<h3 id="ecmascript">ECMAScript</h3>
</li>
<li><p>ECMAScript === ECMA-262(자바스크립트의 표준 사양).</p>
</li>
<li><p>프로그래밍 언어의 값, 타입,객체와 프로퍼티, 함수 등에 적용된 규칙이라고 생각하면 된다.</p>
<h3 id="javascript">JavaScript</h3>
</li>
<li><p>ECMAScript(기본 뼈대) + Web API(브라우저 지원, DOM,BOM, Canvas, XMLHttpRequest...)</p>
</li>
<li><p>특징</p>
<ul>
<li><p>기본문법은 c, java와 유사</p>
</li>
<li><p>프로토타입 기반 상속</p>
</li>
<li><p>일급 함수 개념 차용(일반 변수값처럼 사용할 수 있는 함수, 즉 return값으로도 함수를 줄 수 있고 parameter로도 함수 넘겨주기 가능)</p>
</li>
<li><p>인터프리터 언어</p>
</li>
<li><p>멀티 패러다임 프로그래밍 언어. 명령형 + 함수형 + 프로토타입 기반 객체지향 프로그래밍</p>
<blockquote>
<h4 id="프로그래밍-패러다임">프로그래밍 패러다임</h4>
<p><strong>명령형 프로그래밍</strong> = 무엇을 어떻게 할 것인가. &#39;어떻게&#39;할 지를 중심으로 코드로 만들어주면 됨
<strong>함수형 프로그래밍</strong> = &#39;어떻게&#39;를 안 보이게 한다. 작은 문제를 해결하기 위한 함수를 만들어 그 함수를 사용하는 방식. </p>
</blockquote>
</li>
</ul>
</li>
<li><p>ES6를 지원하지 않는 브라우저가 있기 때문에 ES6이상의 최신 문법을 적용할 경우 babel같은 <strong>트랜스파일러</strong>로 ES5이하의 사양으로 다운그레이드해줘야한다.(어차피 다 같은 코든데 최신 문법을 적용했냐 안했냐의 차이다)</p>
</li>
</ul>
<h2 id="javascript개발-환경">JavaScript개발 환경</h2>
<h3 id="1-브라우저">1. 브라우저</h3>
<ul>
<li>원래는 브라우저환경에서 실행되도록 만들어진 언어. 브라우저는 자바스크립트 엔진을 내장하고 있다.</li>
<li>클라이언트 사이드 WebAPI 지원(DOM,BOM,Canvas, XMLHttpRequest, fetch, requestAnimationFrame, SVG, Web Storage, Web Component, Web Worker)<h3 id="2-nodejs">2. Node.js</h3>
</li>
<li>브라우저 외의 환경에서도 JS가 실행될 수 있게 해준다. Node.js도 자바스크립트 엔진을 내장한다.</li>
<li>파일시스템을 기본 제공</li>
</ul>
<blockquote>
<h4 id="주의-브라우저와-nodejs는-용도가-다르다">주의! 브라우저와 Node.js는 용도가 다르다.</h4>
<p><strong>브라우저</strong> : JS를 실행해 웹페이지를 브라우저에 렌더링하는 게 주목적
<strong>Node.js</strong> : 브라우저 외부에서 자바스크립트를 실행하는 게 주목적
각자 추가로 제공하는 API가 다르다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[1주차 회고내용]]]></title>
            <link>https://velog.io/@brill_be/1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%82%B4%EC%9A%A9</link>
            <guid>https://velog.io/@brill_be/1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%82%B4%EC%9A%A9</guid>
            <pubDate>Sat, 09 Jul 2022 18:00:41 GMT</pubDate>
            <description><![CDATA[<ul>
<li><input disabled="" type="checkbox"> javascript deepdive 내용 정리
1단원 4단원.</li>
<li><input disabled="" type="checkbox"> 코드리뷰 받은 것 정리<ul>
<li>styled-components 를 따로 분리 했다면 파일명이나 폴더 구조로 알아 볼수 있게 하면 좋겠습니다.(ex style.Input.js 등)
if문이 반복되면 함수 분리를 고민해봅시다.
form 이벤트를 사용하면 keydown을 따로 처리 하지 않아도 됩니다.
검색창 input을 ref로 활용해보시면 좋을 것 -&gt; 최적화</li>
</ul>
</li>
<li><input disabled="" type="checkbox"> 수업에서 배운 점 정리<ul>
<li>data fetching 모듈화</li>
<li>각 수업별 요약본을 기준으로 보충해서 정리.</li>
</ul>
</li>
<li><input disabled="" type="checkbox"> 팀활동을 하면서 배운 점/개선점/생각해볼만한 것을 체크해도 될 것 같음)</li>
</ul>
<h1 id="01-선발과제-리팩토링">01. 선발과제 리팩토링</h1>
<aside>
💡 유저인증에 따른 라우팅 처리가 참신하네요! 점점 더 좋은 방법을 찾아가시리라 믿습니다!
input에 붙일 수 있는 useValidation Hook도 만드셨네요! 넘 좋습니다.
data fetching을 모듈화 하신 부분도 칭찬 드리고 싶습니다!!
구조에 대한 고민이 옅보이네요! 깔끔합니다. 더 큰 사이즈의 프로덕트에서는 어떻게 구조를 가져가면 좋을지에 대한 고민도 해보시면 좋겠습니다.

</aside>

<h2 id="구조">구조</h2>
<ul>
<li>styled-components 를 따로 분리 했다면 파일명이나 폴더 구조로 알아 볼수 있게 하면 좋겠습니다.(ex style.Input.js 등)</li>
</ul>
<h2 id="컨벤션">컨벤션</h2>
<ul>
<li>축약어를 사용하지 않고 검색가능한 변수를 사용하면 좋겠습니다.</li>
</ul>
<pre><code class="language-jsx">// 이렇게 처리 하신 부분 넘 좋네요. 
// 이렇게 하면 useEffect가 실행 될 때만 함수가 재선언 되기 때문에 
// 외부에서 사용하지 않는 함수라면 넘 효율적이죠!
useEffect(() =&gt; {
    async function fetchData() {
      const result = await getFeed();
      setFeeds(result);
      setIsLoading(false);
    }
    fetchData();
  }, []);</code></pre>
<pre><code class="language-jsx">    &lt;&gt;
      &lt;GNB /&gt;
      {isLoading ? (
        &lt;Loader&gt;loading...&lt;/Loader&gt;
      ) : (
        &lt;FeedContainer feeds={feeds} isLoading={isLoading} /&gt;
      )}
    &lt;/&gt;

        // 요런 방법도 상황에 따라 고려해보시면 좋습니다. 길이가 길면 길수록 삼항연산자는 가독성이 떨어져요!
        // 물론 지금정도 길이에선 삼항연산자가 더 좋을 수 있습니다! 참고용!
        &lt;&gt;
      &lt;GNB /&gt;
      {isLoading &amp;&amp; (&lt;Loader&gt;loading...&lt;/Loader&gt;)}  
      {!isLoading &amp;&amp; (
        &lt;FeedContainer feeds={feeds} isLoading={isLoading} /&gt;
      )}
    &lt;/&gt;</code></pre>
<h2 id="로직">로직</h2>
<ul>
<li>if문이 반복되면 함수 분리를 고민해봅시다.</li>
<li>form 이벤트를 사용하면 keydown을 따로 처리 하지 않아도 됩니다.</li>
</ul>
<h1 id="02-영화-정보-사이트">02. 영화 정보 사이트</h1>
<aside>
💡 컨벤션을 최대한 맞춰주신 부분이 너무 좋습니다..!
theme도 상황에 맞게 잘 추가해주셨고, helper를 따로 두고 사용하신 부분도 좋습니다.
네이밍에도 최대한 많은 고민을 하신 흔적이 보이는 것 같아요.
컨벤션에 따라 다르겠지만 Modal을 useModal과 함께 사용하도록 같은 파일에 넣어놓은 부분도 고민의 흔적이라 생각합니다! 아직 시간이 많이 남았으니 새로운 기능들을 추가해보면 좋을 것 같습니다. 저희가 추천검색어 과제와 두가지 기능을 합치기로 했으니 쿼리로 검색을 대신하는 것보다 직접 전체 데이터를 받아와서 데이터들 중에 검색하는 로직을 만들어보면 좋겠습니다. 장르별 검색(전체,action,romance등)을 할수있는 드롭다운을 만들어 보는 것도 좋을 것 같아요.

</aside>

<h2 id="구조-1">구조</h2>
<ul>
<li>router는 유일하지 않을 확률이 높습니다. 지금은 괜찮지만 추후에 라우터가 추가 된다면 폴더로 따로 분리 해주시는것도 좋은 방법입니다.</li>
<li>globalStyle과 theme을 styles를 만들어 모아주시면 유지 보수할때 더 편할 것 같습니다.</li>
<li>recoil파일은 store라는 폴더를 따로 두고 관리하면 좋을 것 같습니다.</li>
</ul>
<h2 id="컨벤션-1">컨벤션</h2>
<ul>
<li>컨벤션은 잘 맞춰진 느낌이 듭니다!</li>
</ul>
<h2 id="로직-1">로직</h2>
<ul>
<li>Modal의 Overlay가 굳이 필요한지에 대해 의문이 있습니다. prop으로 받은걸 그대로 재사용할 뿐이라면 Styled-components에 바로 넘겨주어도 괜찮을 것 같습니다.</li>
<li>이전 리팩토링에서처럼 검색창 input을 ref로 활용해보시면 좋을 것 같습니다. 검색 버튼을 두면 ref에서 검색 버튼을 누를 때 current.value를 가져오는 방법으로 랜더링 최적화를 시킬 수 있을 것 같습니다.</li>
</ul>
<pre><code class="language-jsx">// find를 사용하셔도 좋을 것 같습니다.
const handleCardClick = (movieId) =&gt; {
    const [movie] = movies.filter((movie) =&gt; movie.id === movieId);
    setSelectedMovie(movie);
    openModal();
  };</code></pre>
<p>참고 </p>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find">Array.prototype.find() - JavaScript | MDN</a></p>
<h1 id="02-영화-정보-사이트-part-2">02. 영화 정보 사이트 part 2</h1>
<aside>
💡 한 주간 고생 많으셨습니다! theme provider도 적용해보시면 좋을 것 같아요!

</aside>

<h2 id="구조-2">구조</h2>
<ul>
<li>database를 src 외부로 옮기는 것도 고려해보시면 좋겠습니다. (제가 src에 넣어두어서….;;)</li>
<li>pages 내부에 해당 페이지에서 사용하는 컴포넌트를 넣지 않고 components에 page에서 쓰이는 컴포넌트를 따로 모아두는 것도 좋아보입니다.</li>
<li>globalStyle은 따로 styles 폴더로 관리해주시면 좋을 것 같습니다.</li>
</ul>
<h2 id="컨벤션-2">컨벤션</h2>
<ul>
<li>대체적으로 잘 정리 된 것 같습니다! 컴포넌트 내부의 변수나 함수 등의 순서를 일관성있게 관리해보시는 것도 추천드려요!</li>
</ul>
<h2 id="로직-2">로직</h2>
<ul>
<li>custom hook을 더욱 적극적으로 사용해보시는 것도 좋겠습니다! 사실 필요 없는 부분에 적용할 필요는 없지만 연습하신다 생각하고 후에 재사용이 가능하다고 느껴지는 부분이 있다면 적용 해보세요.</li>
</ul>
<h1 id="폴더-구조-고민">폴더 구조 고민</h1>
<p>components/  -common한 컴포넌트 모아두는 곳
store/    - redux, recoil등 상태관리 관련 모아두기
hooks/    - 공통 hook 작성
pages/     - page 모아두는 곳
services/  - 아직도 역할 잘 모르겠움.
styles/    - 공통스타일 관련
utils/     - 공통적으로 쓸 수 있는 것들 모아둠
├─ constants/
├─ helpers/
routers/   - 라우터
App.js     - 렌더링할 것
index.js   - entry 포인트</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Day1. 클린코드]]></title>
            <link>https://velog.io/@brill_be/Day1.%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@brill_be/Day1.%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C</guid>
            <pubDate>Mon, 04 Jul 2022 20:45:42 GMT</pubDate>
            <description><![CDATA[<h1 id="학습자료-및-학습내용-정리">학습자료 및 학습내용 정리</h1>
<p><a href="https://jinheeplan.notion.site/Day-1-cd860d5095e64018acdf251372069d39">노션</a></p>
<hr>
<h1 id="오늘-한-것">오늘 한 것</h1>
<h2 id="✅-내-코드-설명하기--코드-리뷰-받기">✅ 내 코드 설명하기 &amp; 코드 리뷰 받기</h2>
<ul>
<li>오늘 소통에 있어서 미숙한 점을 참 많이 느낀 것 같다. 내 코드 전체를 다른사람에게 설명해본 적이 없어서 많이 버벅거렸다.앞으로 내 코드를 남에게 설명할 일이 많을텐데 좀 더 남을 이해하기 쉬운 방향으로 설명할 수 있는 능력을 키워야겠다는 생각을 했다. 긴장을 해서 많이 버벅거리기도 했는데 이건 많이 하다보면 충분히 개선될 거라고 생각한다.</li>
<li>프로젝트를 왜 이렇게 구성했는지, 프로젝트 진입점부터 시작해서 요구사항을 어떤 로직으로 구현했는지를 중점으로 설명하는 연습을 하면 좋을 것같다. 핵심적인 기능의 로직은 따로 빼서 설명하면 더 좋을 것 같다.</li>
<li>나는 다른 분들 코드 리뷰를 할 때 syntax적인 부분을 집중해서 봤었는데, 로직에 대해서도 보고 고민해보는 시간을 가진 후 로직관련 리뷰도 남기면 좋을 것 같다. 그리고 내 말이 다 옳은 것이 아니니 꼭 권유/의문 형태로 리뷰를 남길 것!</li>
</ul>
<h2 id="✅-클린코드-학습">✅ 클린코드 학습</h2>
<ul>
<li>클린코드를 측정할 수 있는 단위는 WTF 단위 뿐..! 남이 내 코드를 봤을 때 WTF이 덜 나오게 노력하자!</li>
<li>중구난방 내 맘대로 지은 변수이름들을 공통된 의미를 갖는 단어를 써서 읽기 편하게 만들어줘야 할 것 같다.</li>
<li>함수는 늘 자기가 맡은 한 가지의 행위만 하도록!</li>
<li>함수를 생성할 때 순수함수로 만들도록 노력하자. 순수함수로 만들기 위해서는 parameter를 flag로 쓰지 않는 것이 가장 중요할 것같다. parameter를 flag로 써서 조건 분기를 하는 순간 함수는 하나의 동작이 아닌 여러개의 동작을 하게 되어 단일 책임원칙에도 어긋나게 된다.</li>
<li>사이드 이펙트를 피하기</li>
</ul>
<h2 id="✅-선발과제-리팩토링">✅ 선발과제 리팩토링</h2>
<h3 id="클린-코드를-학습한-후-보인-내-코드의-문제점">클린 코드를 학습한 후 보인 내 코드의 문제점</h3>
<h4 id="1-변수--함수-이름이-중구난방">1. 변수 / 함수 이름이 중구난방</h4>
<ul>
<li>함수 이름 같은 경우 보통 동사로 시작되게 네이밍을 하는데 함수의 의미를 잘 전달되게 하는 동사를 찾는 것이 어렵다. eventhandler의 경우 handle~~의 형태로 함수명을 짓는데 그 외의 것들도 나름의 규칙을 갖고 작명하면 좋을 것 같다.</li>
<li>같은 List형태의를 갖는 컴포넌트인데 어떤 곳에서는 그냥 복수형으로 컴포넌트이름을 짓고, 어떤 곳에서는 [~]List라는 형태로 이름을 지었다. 통일해주자.<h4 id="2-여러-곳에서-공유되는-함수도-아닌데-utils-폴더에-정리">2. 여러 곳에서 공유되는 함수도 아닌데 utils 폴더에 정리</h4>
</li>
<li>공통적으로 쓰는 함수 / 단일 컴포넌트에서 쓰는 함수 모두 utils 폴더에 정리했다. utils 폴더를 만든 이유가 다른 컴포넌트에서도 사용하는 함수들을 분리해놓기 위함인데, 거기에 굳이 단일 컴포넌트에서 쓰는 함수를 정리할 필요가 없는 것같다. 단일 컴포넌트에서 쓰는 함수는 그냥 컴포넌트 내에서 정리해도 괜찮을 것 같다.</li>
<li>또 utils보다는 helper/common이라는 이름이 직관적으로 폴더 구조를 이해하기 더 쉬울 수 있을 것 같다. 나<h4 id="3-코드의-중복성">3. 코드의 중복성</h4>
</li>
<li>이메일 validation/비밀번호 validation을 할 때 거의 같은 로직인데 따로 함수를 만들어서 사용했다.</li>
<li>이메일 validation과 비밀번호 validation에서 다른 점은 validation을 할 때 사용하는 Regex 표현식 뿐이다. regex를 이용해 조건을 테스트하고, 테스트 결과에 따라 state를 업데이트한다. 이 로직을 함수로 만들고, 이메일/비밀번호 regex만 바뀌게 해서 좀 더 공통적으로 사용할 수 있는 형식으로 바꾸는 게 좋을 것 같다.<h4 id="4-굳이싶을-정도로-너무-세세하게-컴포넌트를-분리">4. 굳이..?싶을 정도로 너무 세세하게 컴포넌트를 분리</h4>
</li>
<li>styled-component를 써서 만든 컴포넌트를 사용해서 가독성 좋게 표현할 수 있기 때문에 굳이 Style만 지정해놓은 컴포넌트를 따로 파일로 빼놓지 않아도 될 것 같다. 너무 세분화해도 좋지 않고, 너무 뭉쳐놔도 좋지 않다. 뭐든지 적정한 지점을 찾는 게 가장 어려운 법이다. 그 지점을 찾을 수 있도록 연습해보자.</li>
</ul>
<h2 id="✅-아쉬웠던-점">✅ 아쉬웠던 점</h2>
<ul>
<li>첫 날이라 좀 준비가 미흡했던 점이 많았던 것 같다. 회의에 참여할 때는 늘 논의할만한 것들을 생각해가고, 논의할만한 것에 대한 의견도 꼭 준비해가자.</li>
<li>의견을 내놓기 전에는 왜 이런 의견을 냈는지도 추가해서 설명하는게 설득력을 높이기 좋을 것 같다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[해결할 점.]]></title>
            <link>https://velog.io/@brill_be/%ED%95%B4%EA%B2%B0%ED%95%A0-%EC%A0%90</link>
            <guid>https://velog.io/@brill_be/%ED%95%B4%EA%B2%B0%ED%95%A0-%EC%A0%90</guid>
            <pubDate>Wed, 29 Jun 2022 18:08:26 GMT</pubDate>
            <description><![CDATA[<ul>
<li>input시 렌더링 최적화는 어떻게?<ul>
<li>react 공식 문서에서 input이랑 state랑 연결해서 쓰는 걸 권장하는데, 그냥 ref를 쓰면 왜 안되지?</li>
</ul>
</li>
<li>image 최적화. img 태그 자체에서 img의 size를 조절하면 안좋다고 알고 있는데 그럼 그거 최적화는 어떻게 하지?</li>
<li>CSS설계 이렇게 하는게 맞나 싶다<ul>
<li>BEM, PRECSS 설계 방식에 맞게 짜려고 노력 중인데 막상 styled-component로 작성하다보면 이게 맞나...?싶기도 하다. HTMLelement와 CSS결합도가 너무 높아지는 느낌?</li>
</ul>
</li>
<li>infinite scroll할 때 화면에 요소가 나타나는지 intersectionObserver를 써서 탐지하고, 마지막 DOM상에서 마지막 요소가 보이면 데이터를 추가 요청하는걸 해보려고 했는데 intersectionObserver가 리액트에 적용했을 때 이상하게 적용됐다.(첫번째 요소가 보이고 있는데 세번째요소가 화면에 보이는 중이라고 감지되거나,,? 그런거)</li>
<li>testing요소가 너무 많은데 이걸 어느 정도로 디테일하게 테스트 해야 하는지,,? UI/ server mockup 테스트 코드짜는데 걸리는 시간이 훨씬 많이 걸린다.</li>
<li>사실 Next.js SSR에 대해서 좀 헷갈린다. SSR는 server side에서 페이지를 온전하게 만들어서 보내주고 그걸 화면에 뿌리는 걸로 알고 있는데 Next.js가 왜 SSR인지,,? 내가 SSR에 대한 이해를 이제껏 잘못하고 있었나..</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[원티드 프리온보딩 코스] 숏에세이]]></title>
            <link>https://velog.io/@brill_be/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9-%EC%BD%94%EC%8A%A4-%EC%8B%A0%EC%B2%AD</link>
            <guid>https://velog.io/@brill_be/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9-%EC%BD%94%EC%8A%A4-%EC%8B%A0%EC%B2%AD</guid>
            <pubDate>Wed, 29 Jun 2022 04:15:18 GMT</pubDate>
            <description><![CDATA[<h1 id="제도가-있는-이유">제도가 있는 이유?</h1>
<p> 요즈음 취업을 준비하는 사람들이라면 &#39;개발자를 꿈꿔보세요! 개발자 붐입니다!&#39;라는 내용의 광고, 뉴스들을 심심치 않게 보게 됩니다. 실제로 요즘 많은 사람들이 &#39;개발자&#39;라는 직업에 도전하고 있습니다. 이런 상황에서 기업들은 수많은 지원자중에서 개발에 대한 열정이 있고, 실제 개발을 할 때 잘 어우러질 수 있는 지원자를 찾아야 합니다. 하지만 많은 사람들이 입사하기 전 공부하는 내용은 실무와는 꽤 많이 다릅니다. 공부하는 단계에서는 실무에서 어떤 프로세스를 밟아 개발이 진행되고, 어떤식으로 소통을 하는지 정확히 알 수 없습니다. 이 점 때문에 지원자가 실제 회사에 입사해 업무를 맡게 되었을 때 적응 기간도 오래 소요되고, 기업 입장에서도 너무 많은 것을 가르쳐야 하는 상황이라고 생각합니다.
 원티드 프리온보딩 코스는 지원자가 실제 기업의 프로세스와 다른 이들과의 협업 과정을 경험을 할 수 있게 해 줄 것입니다. 실무에 가까운 환경에서 학습을 한 사람에게 프리온보딩의 참가기업에 지원하게 해 기업입장에서도 원하는 인재를 좀 더 쉽게 찾을 수 있게하기 위해 코스 참가자가 참가 기업에게 지원하는 제도가 있는 것 같습니다.</p>
<h1 id="지원하고-싶은-참가-기업">지원하고 싶은 참가 기업</h1>
<ul>
<li>스티비 <a href="https://www.wanted.co.kr/wd/105028">https://www.wanted.co.kr/wd/105028</a></li>
<li>GNA컴퍼니 <a href="https://www.wanted.co.kr/wd/99416">https://www.wanted.co.kr/wd/99416</a></li>
<li>트립비토즈 <a href="https://www.wanted.co.kr/wd/72388">https://www.wanted.co.kr/wd/72388</a>
이 세 회사에 가장 지원해보고 싶고, 나머지 기업도 모두 지원해보고 싶습니다!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[도움되는 글]]></title>
            <link>https://velog.io/@brill_be/%EB%8F%84%EC%9B%80%EB%90%98%EB%8A%94-%EA%B8%80</link>
            <guid>https://velog.io/@brill_be/%EB%8F%84%EC%9B%80%EB%90%98%EB%8A%94-%EA%B8%80</guid>
            <pubDate>Sun, 15 May 2022 09:37:10 GMT</pubDate>
            <description><![CDATA[<p>리액트 클린코드
<a href="https://one-it.tistory.com/entry/%EB%B2%88%EC%97%AD-React-Clean-Code%EB%A5%BC-%EC%9C%84%ED%95%9C-%ED%8C%81?category=760174">https://one-it.tistory.com/entry/%EB%B2%88%EC%97%AD-React-Clean-Code%EB%A5%BC-%EC%9C%84%ED%95%9C-%ED%8C%81?category=760174</a></p>
<p>리액트 구조
<a href="https://www.xenonstack.com/insights/reactjs-project-structure">https://www.xenonstack.com/insights/reactjs-project-structure</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ㅌㅅ 과제 후기]]></title>
            <link>https://velog.io/@brill_be/%E3%85%8C%E3%85%85-%EA%B3%BC%EC%A0%9C-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@brill_be/%E3%85%8C%E3%85%85-%EA%B3%BC%EC%A0%9C-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Mon, 18 Apr 2022 08:44:22 GMT</pubDate>
            <description><![CDATA[<p>프론트엔드 과제를 풀어볼 수 있는 기회가 생겼다.</p>
<p>총 5시간이나 주어졌고, 과제도 비교적 쉬웠는데 참 아쉽다.
시간도 충분했는데, 평상시에 비동기 처리를 얼마나 대충했는지 알수 있었다..,^^</p>
<h2 id="고민해볼-것">고민해볼 것</h2>
<p>앞으로 타임어택식으로 개발해보고 시간내에 개발 못한 부분을 집중적으로 파봐야 할 것 같다.</p>
<ul>
<li>시간이 아~~주 오래걸리는 작업일 경우에 사용자에게 어떤 문구를 어떻게 안내할 지 고민해볼 것.</li>
<li>브라우저 종료 시에도 데이터를 유지하려면 서버에 임시 데이터를 일정 주기로 저장하고, 새로 접근할 때마다 =&gt; 회원 시스템이 있을 경우에만 가능할 듯 싶고, 서버와의 통신이 많아진다는 단점이 있음</li>
<li>브라우저의 로컬스토리지는 브라우저 종료시에도 남아있다. 임시 데이터를 저장해놓는 용도라면 로컬 스토리지를 쓰는 것도 좋을 것이라고 생각했다. 그런데 보통 폼에 넣는 데이터는 유출되면 안될 경우가 많아서.. 암호화를 하거나 해야할 것 같은데 어떻게해야할 지 고민해볼 것!</li>
<li>프론트단에서 수동으로 캐시 조작할 수 있는 방법 찾아보기</li>
<li>폼에 데이터를 입력할 때 가장 기초적인 방식으로 계속 사용해왔다. 이렇게하면 한글자 입력할 때마다 스테이트가 업데이트되면서 리렌더링이 계속 된다. 당연히 최적화 해줘야 할 대상이다. Throttling이나 Debounce를 이용하면 입력할 때마다 스테이트 업데이트가 되지 않을 것 같은데 이 경우에 DOM에서 element의 value를 가져와 state를 업데이트해줘야 할 것 같다. 이게 맞는 방법인지는 다른 사람 코드를 보면서 계속 고민해봐야 할 듯..(ref를 사용해야한다는 뜻!)</li>
<li>알다시피 상위 컴포넌트가 리렌더링 =&gt; 하위 컴포넌트도 리렌더링 됨. React.memo를 적극활용해야 할 것 같은데 아직 익숙치가 않다.. 연습 또 연습!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Next.js 문서보기]]></title>
            <link>https://velog.io/@brill_be/Next.js-%EB%AC%B8%EC%84%9C%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@brill_be/Next.js-%EB%AC%B8%EC%84%9C%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Sat, 16 Apr 2022 18:49:53 GMT</pubDate>
            <description><![CDATA[<h1 id="nextjs">Next.js</h1>
<h1 id="create-a-nextjs-app">Create a Next.js App</h1>
<h2 id="리액트를-빌드할-때-해야하는-것">리액트를 빌드할 때 해야하는 것</h2>
<ol>
<li>웹팩같은 번들러로 번들링, babel같은 컴파일러로 commonJS형태로 변환</li>
<li>코드 스플리팅 같은 최적화가 필요함.</li>
<li>성능과 SEO를 위해 pre-render이 필요하고 그와 동시에 SSR 또는 CRS필요</li>
<li>data store에 웹 앱을 연결시키기 위해 몇몇 서버사이드 코드를 작성해야 할 것.</li>
</ol>
<h2 id="nextjs--리액트-프레임워크">Next.js : 리액트 프레임워크</h2>
<ol>
<li>위의 4가지에 대한 해결책을 모두 제공해줌.</li>
<li>특징<ul>
<li>직관적인 페이지 기반의 라우팅 시스템(+다이나나믹 라우트 제공)</li>
<li>프리렌더링이 지원됨.</li>
<li>자동적으로 코드 스플리팅(더 빠른 페이지 로딩 지원)</li>
<li>Built-in CSS, Sass , CSS-in-JS 지원</li>
<li>개발환경에 빠른 새로고침을 제공</li>
<li>서버리스 기능으로 API 엔드포인트를 구축하는 API 라우팅</li>
</ul>
</li>
</ol>
<h1 id="blog-만들기-예제">Blog 만들기 예제</h1>
<h2 id="navigate-between-pages">Navigate Between Pages</h2>
<aside>
📖 *  새로운 페이지 생성(파일 시스템 라우팅)
*  Link 컴포넌트 사용법(클라이언트 사이드 네비게이션)
* 코드 스플리팅과 프리패칭(데이터 미리 불러오는 거)를 위한 기본적인 지원 기능

</aside>

<h3 id="pages-in-nextjs">Pages in Next.js</h3>
<ul>
<li><strong>파일 이름</strong>에 기반해 라우팅 됨. 즉, pages폴더 안에 원하는 대로 파일 구성해주면 됨.</li>
<li>컴포넌트는 아무 이름이나 써도 되지만, export default 형태로 꼭 export해주어야 함.</li>
</ul>
<pre><code class="language-jsx">ex. 
1. &#39;pages/index.js&#39;는 &#39;/&#39; 라우트
2. &#39;pages/post/first-post.js&#39;은 &#39;/posts/first-post&#39;로 라우트.</code></pre>
<ul>
<li><p>Link Component</p>
<ul>
<li><p>Link컴포넌트 ===  a tag.</p>
</li>
<li><p>href 속성에 route주소 알려주기.</p>
<pre><code class="language-jsx">import Link from &#39;next/link&#39;

&lt;Parent-Component&gt;
  &lt;Link href=&quot;/psots/first-post&quot;&gt;go to page&lt;/Link&gt;
&lt;/Parent-Component&gt;</code></pre>
</li>
<li><p>a태그 스타일을 입히고 싶다면 아래처럼</p>
<pre><code class="language-jsx">&lt;Link href=&quot;/&quot;&gt;
 &lt;a&gt;Back to home&lt;/a&gt;
&lt;/Link&gt;</code></pre>
</li>
</ul>
</li>
<li><p>Client-Side Navigation</p>
<ul>
<li>클라이언트 사이드 네비 : 자바스크립트를 이용한 페이지 전환. 즉, 브라우저에 의해 실행되는 기본 네비게이션에 비해 빠르다.</li>
<li>자바스크립트를 이용 ⇒ 페이지의 모든 내용을 새로 가져오지 않음(실제 css background 지정하고 다른 페이지 넘겼다가 다시 오면 배경색 유지됨)</li>
<li>a태그이용하면 브라우저가 fully-refresh할 것임.(로딩 속도에 별로 안좋겠져~)</li>
</ul>
</li>
<li><p>Code splittnig and prefetching</p>
<ul>
<li>자동적으로 코드 스플리팅이 됨.</li>
<li>각 페이지에 필요한 것만 로드함. ⇒ 빠른 로딩이 가능하게 함.</li>
<li>요청한 페이지의 코드만 로딩하므로 페이지는 다른 페이지와 분리되어 있음 ⇒ 특정 페이지가 에러를 발생시키더라도, 어플리케이션의 나머지 부분은 여전히 동작함.</li>
<li>프로덕션 빌드에서 Link 구성요소가 브라우저의 뷰포트에 나타날 때마다 Next.js는 <strong>자동으로 링크된 페이지의 코드를 백그라운드로 프리페치</strong>합니다.(넘어갈 페이지의 데이터가 프리페치되어 미리 준비되어 있다고 보면 됨)</li>
</ul>
</li>
</ul>
<h2 id="assets-metadata-and-css">Assets, Metadata, and CSS</h2>
<p>css를 추가해봅시당~(CSS, sass 지원)</p>
<aside>
📖 * static file 추가하는 법(이미지/페이지 메타데이터 같은 거)
* 각 페이지마다 <head>안에 들어가는 내용 커스터마이징
* CSS Module을 이용하는 재사용가능한 리액트 컴포넌트 작성하는 법
* global CSS 추가하기(in pages/_app.js)
* Next.js에서 스타일링하는 팁

</aside>

<h3 id="assets">Assets</h3>
<ul>
<li>‘public’폴더(가장 상위 레벨)에서 static assets 제공 가능</li>
<li>public폴더 안에 있는 파일들은 참조될 수 있음</li>
<li>public 디렉토리는 ‘robots.txt’(google site verification)에도 유용함</li>
</ul>
<h3 id="image">image</h3>
<ul>
<li>public/images/[내이미지] 저장</li>
<li>public이 static files의 root로, public안의 주소를 적어주면 됨.</li>
</ul>
<pre><code>  jsx
&lt;img src=&quot;/images/[내이미지] &quot;/&gt;</code></pre><p>그러나 위와 같이 그냥 img태그를 쓰면 생기는 문제점이 있음</p>
<ul>
<li><em>다른 화면 사이즈에 대한 핸들링 해야함</em></li>
<li><em>써드파티 툴/라이브러리를 이용해 이미지 최적화 해야함.</em></li>
<li><em>이미지가 뷰포트에 있을 때만 로딩 됨</em></li>
</ul>
<h3 id="image-component-and-image-optimization">Image Component and Image Optimization</h3>
<ul>
<li>‘next/image’는 HTML의 img태그를 모던 웹애 맞게 확장시킨 것.</li>
<li>기본적으로 이미지 최적화를 제공함(resizing, optimizing, WebP같은 현대적 포멧으로 이미지 제공)<ul>
<li>⇒  작은 사이즈의 스크린에서 큰 이미지를 들고오지 않아도 됨</li>
<li>⇒  차후 미래의 이미지 포맷을 자동적으로 적용할 수 있음.</li>
</ul>
</li>
<li>외부 데이터 소스여도 자동적으로 최적화 해줌.</li>
</ul>
<h3 id="using-the-image-component">Using the Image Component</h3>
<ul>
<li>유저들이 이미지를 요청하면, 그 때 최적화가 진행된다(빌드될 때 최적화x ⇒ 이미지가 몇개든 빌드 시간은 변화가 없음.)</li>
<li>이미지는 기본적으로 ‘lazy loading’. 이미지가 뷰포트안에 들어왔을 때 로드됨.</li>
<li>Images are always rendered in such a way as to avoid <a href="https://web.dev/cls/">Cumulative Layout Shift</a>, a <a href="https://web.dev/vitals/#core-web-vitals">Core Web Vital</a>
 that Google is going to <a href="https://webmasters.googleblog.com/2020/05/evaluating-page-experience.html">use in search ranking</a>(SEO에 유리한 방식으로 렌더링 됨)</li>
</ul>
<h3 id="metadata">Metadata</h3>
<ul>
<li><Head>컴포넌트를 이용해 각 페이지의 metadata 수정 가능.

</li>
</ul>
<pre><code class="language-jsx">&lt;Head&gt;
  &lt;title&gt;Create Next App&lt;/title&gt;
  &lt;link rel=&quot;icon&quot; href=&quot;/favicon.ico&quot; /&gt;
&lt;/Head&gt;</code></pre>
<h3 id="third-party-javascript">Third-Party JavaScript</h3>
<ul>
<li>cdn으로 다른 라이브러리나 소스를 가져올 때</li>
<li>Script 컴포넌트 사용. &lt;Script src=”link” / &gt;로 들고옴.</li>
</ul>
<pre><code class="language-jsx">&lt;Script
        src=&quot;https://connect.facebook.net/en_US/sdk.js&quot;
        strategy=&quot;lazyOnload&quot;
        onLoad={() =&gt;
          console.log(`script loaded correctly, window.FB has been populated`)
        }
      /&gt;

속성은 따로 봐야할 것 같음
1. strategy : 언제 써드파티 스크립트가 로드되어야 할 지 정함. 2. onLoad : 스크립트가 로딩을 끝낸순간 실행된다.</code></pre>
<h3 id="css-styling">CSS Styling</h3>
<ul>
<li>styled-jsx : CSS-in_JS library</li>
<li>다른 css,scss 추가는 react 때랑 똑같이 하면 됨.</li>
<li>아래와 같이 사용해야 함!(css에 이름 붙여 import하고, className에는 css이름.사용할 클래스 로 지정해주어야 함)</li>
<li>이렇게 css modules를 이용하면 독창적인 이름을 알아서 지어줌.</li>
</ul>
<pre><code class="language-jsx">// components/layout/layout.module.css
.container{
    max-width: 36rem;
    padding : 0 1rem;
    margin : 3rem auto 6rem;
}

// components/layout/layout.js
import styles from &quot;./layout.module.css&quot;

export default function Layout({children}){
    return &lt;div className={styles.container}&gt;{children}&lt;/div&gt;
}</code></pre>
<h3 id="global-styles">Global Styles</h3>
<ul>
<li>모든 페이지에 공통적으로 적용되기를 원하는 전역 css가 있다면?</li>
<li>pages/_app.js 파일 생성</li>
</ul>
<pre><code class="language-jsx">import &#39;..styles/global.css&#39;

export default function App({ Component, pageProps }) {
  return &lt;Component {...pageProps} /&gt;
}</code></pre>
<ul>
<li>이 _app.js에서 global CSS를 추가할 수 있다.(다른데선X) 단순히 import로 불러와주기만 하면 됨!</li>
</ul>
<h3 id="using-classnames-library-to-toggle-classes">Using <code>classnames</code> library to toggle classes</h3>
<p>(조건에 따라 클래스 바꾸기 위해서는 classnames 라이브러리 쓰는걸 춫천추천!)</p>
<p><code>[classnames](https://github.com/JedWatson/classnames)</code> is a simple library that lets you toggle class names easily. You can install it using <code>npm install classnames</code> or <code>yarn add classnames</code>.</p>
<p>Please take a look at its <a href="https://github.com/JedWatson/classnames">documentation</a> for more details, but here’s the basic usage:</p>
<ul>
<li>Suppose that you want to create an <code>Alert</code> component which accepts <code>type</code>, which can be <code>&#39;success&#39;</code> or <code>&#39;error&#39;</code>.</li>
<li>If it’s <code>&#39;success&#39;</code>, you want the text color to be green. If it’s <code>&#39;error&#39;</code>, you want the text color to be red.</li>
</ul>
<p>You can first write a CSS module (e.g. <code>alert.module.css</code>) like this:</p>
<pre><code>.success {
  color: green;
}
.error {
  color: red;
}
</code></pre><p>And use <code>classnames</code> like this:</p>
<pre><code>import styles from &#39;./alert.module.css&#39;
import cn from &#39;classnames&#39;

export default function Alert({ children, type }) {
  return (
    &lt;div
      className={cn({
        [styles.success]: type === &#39;success&#39;,
        [styles.error]: type === &#39;error&#39;
      })}&gt;
      {children}
    &lt;/div&gt;)</code></pre><h2 id="pre-rendering-and-data-fetching">Pre-rendering and Data Fetching</h2>
<aside>
📖 * Next.js’ pre-rendering feature.
* 프리 렌더링의 두 형태 : Staic Generation & Server-side Rendering.
* Static Generation with data, and without data.
* `getStaticProps` 사용 방법

</aside>

<h3 id="프리-렌더링">프리 렌더링</h3>
<ul>
<li>Pre-render : next.js는 기본적으로 모든 페이지를 프리 렌더링하고 있다.(즉, Next.js는 사전에 각 페이지에 대한 HTML을 만들어 둔다.)</li>
<li>프리 렌더링 될 때 최소한의 js만 남기게 되고, 로딩될 때 js를 실행시켜 fully interactive하게 되어진다.(이 과정을 hydration이라고 함)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/brill_be/post/4c29eef0-0c1a-4d1b-8143-2793ea3fdbdc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/brill_be/post/56d82819-d94c-4cc2-ae4a-306bbe03756d/image.png" alt=""></p>
<h3 id="two-forms-of-pre-rendering">Two Forms of Pre-rendering</h3>
<ol>
<li>Static Generation: 빌드하는 동안 HTML을 생성하는 프리렌더링 방식. 프리렌더링된 HTML은 요청이 들어올 때 재사용된다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/brill_be/post/cd199134-5a33-4c75-a055-e16753c0d3f4/image.png" alt=""></p>
<ol>
<li>Server-side Rendering:  : 요청이 들어오면 각 요청에 대한 HTML을 만드는 프리렌더링 방식</li>
</ol>
<p><img src="https://velog.velcdn.com/images/brill_be/post/b3961bcc-4603-4cbd-a4af-f79bcf1d9548/image.png" alt=""></p>
<h3 id="per-page-basis">Per-page Basis</h3>
<ul>
<li>Next.js는 각 페이지마다 어떤 프리렌더링 방식을 사용할지 정하게 한다.(페이지마다 다른 프리렌더링 방식을 사용할 수 있음)</li>
</ul>
<h3 id="when-to-use-static-generation-vs-server-side-rendering">When to Use Static Generation VS Server-side-rendering</h3>
<p><strong>Static-Generation 추천</strong></p>
<ul>
<li>일반적으로 Static Generation을 추천. HTML 한 번 만들어주고 재활용이 가능하고, CDN으로 제공해 속도가 빠름</li>
<li>아래와 같은 사이트에서는 Static Generation이 유리<ul>
<li>마케팅 페이지, 블로그 포스트, 쇼핑몰 상품 리스트, Q&amp;A, documentation ...</li>
</ul>
</li>
<li>사용자의 요청 이전에 페이지를 미리 렌더링해둬도 된다 ⇒ Static Generation 사용!</li>
</ul>
<p><strong>Server-side rendering 추천</strong></p>
<ul>
<li>사용자의 요청 시에 그 요청 정보를 가지고 렌더링을 해야하는 경우라면, Server-side rendering을 추천!</li>
<li>데이터가 자주 업데이트되고, 요청마다 페이지의 내용이 바뀌는 경우에 Server side rendering</li>
<li>Static Generation보다는 느리지만 내용은 언제나 최신! 혹은 pre-rendering을 하지 않고 client-side js를 사용하는 방법도 있음.</li>
</ul>
<h3 id="static-generation-with-and-without-data">Static Generation with and without Data</h3>
<ul>
<li>Static Generation의 경우에 데이터가 있어도, 없어도 가능.</li>
<li>외부 데이터 없이 제작 가능 ⇒ 그냥 앱이 빌드될 때 정적으로 HTML페이지가 생성됨.</li>
<li>어떤 페이지는 외부 데이터를 먼저 불러와야 렌더링이 가능한 경우가 있음 ⇒ 요건 getStaticProps를 사용해서 처리 가능(Data Fetching ⇒ Static Generation)</li>
</ul>
<h3 id="static-generation-with-data-using-getstaticprops">Static Generation with Data using <code>getStaticProps</code></h3>
<ul>
<li>getStaticProps ⇒ async function.</li>
</ul>
<pre><code class="language-jsx">export default function Home(props) { ... }

export async function getStaticProps() {
  // Get external data from the file system, API, DB, etc.
  const data = ...

  // The value of the `props` key will be
  //  passed to the `Home` component
  return {
    props: ...
  }
}</code></pre>
<p>Essentially, getStaticProps allows you to tell Next.js: “Hey, this page has some data dependencies — so when you pre-render this page at build time, make sure to resolve them first!”</p>
<pre><code>---
title: &#39;Two Forms of Pre-rendering&#39;
date: &#39;2020-01-01&#39;
---

Next.js has two forms of pre-rendering:**Static Generation** and**Server-side Rendering**. The difference is in**when** it generates the HTML for a page.

-**Static Generation** is the pre-rendering method that generates the HTML at**build time**. The pre-rendered HTML is then_reused_ on each request.
-**Server-side Rendering** is the pre-rendering method that generates the HTML on**each request**.

md맨 위의 -- -- 사이의 title과 date.는 metadata임
이것은 gray-matter라는 라이브러리로 파싱이 가능함.
*/</code></pre><h3 id="pre-rendering-and-data-fetching하는-곳-제대로-안봤음-주의해서-볼것">Pre-rendering and Data Fetching하는 곳 제대로 안봤음 주의해서 볼것!</h3>
<ul>
<li>내가 무조건 최신의 데이터를 들고올 필요는 없다 ⇒ server side rendering사용하면 되는데, 이 때는 getServerSideProps라는 함수를 이용해야 함.</li>
<li>Client-side Rendering의 경우 사용자의 요청에 따라 최신 검색이 필요할 경우인데,</li>
</ul>
<h3 id="swr">SWR</h3>
<ul>
<li>SWR : 데이터 페칭을 위한 리액트 훅.</li>
<li>클라이언트 사이드에서 데이터를 패칭해야 할 경우 적극 추천! 약간 useQuery 훅 쓰는 거랑 비슷함. {data,error} = useSWR(’’,~) 이런식으로.</li>
</ul>
<h2 id="dynamic-routes">Dynamic Routes</h2>
<h3 id="page-path-depends-on-external-data">Page Path Depends on External Data</h3>
<ul>
<li>page <strong>path</strong>가 external data에 의존하는 경우</li>
<li>그니까 이런거임</li>
<li>posts 폴더에 있는 컴포넌츠들 이름을 가지고 라우트<ul>
<li>path : /posts/<id> , <id>는 posts폴더에 있는 파일의 이름.</li>
</ul>
</li>
</ul>
<h3 id="overview-of-the-steps">Overview of the Steps</h3>
<ol>
<li>[id].js파일을 만듦 . [로 시작하고 ]로 끝나는 이름을 갖는 페이지 ⇒ 다이나믹 라우트임</li>
<li>export async function called ‘getStaticPaths’. 해당 함수는 id로 사용가능한 값을 반환한다.</li>
<li>마지막으로 getStaticProps가 필요. → 주어진 id를 이용해 블로그 포스트에 필요한 데이터를 패치 . getStaticProps는 params를 제공함.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/brill_be/post/8b503823-9ef4-48bc-b566-c698dc7b5934/image.png" alt=""></p>
<h3 id="dynamic-routes-details">Dynamic Routes Details</h3>
<p>Here is some essential information you should know about <a href="https://nextjs.org/docs/routing/dynamic-routes">dynamic routes</a>.</p>
<h3 id="fallback">Fallback</h3>
<ul>
<li>getStaticPaths에서 return 내용에 {fallback:false}를 넣어서 보냈음. 근데 fallback이 머죠?</li>
<li>if fallback is false ⇒ 결과가 404인 path는 리턴X</li>
<li>if fallback is true, getStaticProps의 행동이 변함<ul>
<li>getStaticPaths에서 리턴된 paths이 렌더될 것임</li>
</ul>
</li>
</ul>
<h3 id="dynamic-routes-맨-마지막-페이지-덜함220219">Dynamic Routes 맨 마지막 페이지 덜함!~(22.02.19)</h3>
<h2 id="api-routes">API Routes</h2>
<h2 id="deploy">Deploy</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React]UX, 최적화]]></title>
            <link>https://velog.io/@brill_be/ReactUX-%EC%B5%9C%EC%A0%81%ED%99%94</link>
            <guid>https://velog.io/@brill_be/ReactUX-%EC%B5%9C%EC%A0%81%ED%99%94</guid>
            <pubDate>Thu, 07 Apr 2022 02:19:35 GMT</pubDate>
            <description><![CDATA[<h2 id="ux">UX</h2>
<p>사용자가</p>
<ul>
<li>사용하기 익숙한 형태로,</li>
<li>로딩 지연시간이 최대한 짧게,</li>
<li>사용하기에 불편함이 없도록(응답이 안됨. 알림 메시지가 안떠서 진행상황 전혀 알 수 없음, 취소 버튼 없음...),</li>
<li>더불어 사용하기 편하도록(입력 마쳤을 때 자동으로 다음 입력란으로 포커싱 혹은 페이지 넘김, 한 눈에 파악하기 편한 UI ...)</li>
</ul>
<p>서비스를 지원해야 한다.</p>
<h2 id="코드를-가볍게">코드를 가볍게</h2>
<ul>
<li>코드를 가볍게 하기 위해선 역시 코드양을 줄이는 게 최고다!<ul>
<li>그렇다고해서 코드를 너무 압축해서 다른 사람이 코드를 알아보지 못한다면 안된다.</li>
</ul>
</li>
<li>안쓰는 CSS 정리는 꼭 해주자</li>
<li>번들링할 때 minimize해주자</li>
</ul>
<h2 id="코드-스플리팅">코드 스플리팅</h2>
<ul>
<li>코드 스플리팅 =&gt; 하나의 파일로 번들링x 특정 기준에 따라 몇 개로 나눠서 파일을 번들링,실제로 사용될 때 쪼갠 것을 로딩하도록 해서 초기 로딩 시간이 너무 길어지지 않도록 함.</li>
<li>코드가 하나의 js파일로 번들링이 되어 있으면 초기 로딩시간이 길어지므로 당연히 좋지않음.</li>
<li>방법1) React.Lazy 사용(SSR에도 곧 도입된다고 문서에 적혀있음)</li>
<li>방법2) 동적 import 사용</li>
<li>방법3) webpack을 이용한 코드 스플리팅</li>
<li>코드 스플리팅 가장 간단한 기준 =&gt; 페이지 별로 나누기</li>
</ul>
<h2 id="seosearch-engine-optimization">SEO(Search Engine Optimization)</h2>
<ul>
<li>구글 서치봇 =&gt; 웹 페이지를 크롤링해서 검색할 때 사용함. 그러면 웹 사이트가 검색엔진의 상단에 뜨게하기 위해서는 봇이 크롤링을 잘 해갈 수 있도록 해주어야 함<ul>
<li>메타 데이터, 타이틀을 페이지별로 잘 뜨게 해주자. - React의 경우 React Helmet을 이용해 각 페이지 별로 </li>
</ul>
</li>
</ul>
<h2 id="ssrserverside-rendering">SSR(ServerSide Rendering)</h2>
<ul>
<li>SPA의 경우 SEO 최적화가 힘듦. 그럼 페이지를 만들어서 응답하는 서버사이드렌더링을 사용해 meta, title,...을 페이지별로 잘 작성해서 크롤링이 잘 되도록 도와주면 좋겠다.</li>
<li>React만으로도 SSR은 가능하지만, 사용하기 불편.</li>
<li>SSR 프레임워크인 Next.js를 사용해보자</li>
<li>Next.js의 특징<ul>
<li>직관적인 페이지 기반의 라우팅 시스템(+다이나믹 라우트 제공)</li>
<li>프리렌더링이 지원됨.</li>
<li>자동적으로 코드 스플리팅(페이지 뼐로 코드스플리팅. 더 빠른 페이지 로딩 지원)</li>
<li>Built-in CSS, Sass , CSS-in-JS 지원</li>
<li>서버리스 기능으로 API 엔드포인트를 구축하는 API 라우팅</li>
</ul>
</li>
</ul>
<h2 id="캐싱">캐싱</h2>
<ul>
<li>수많은 요청과 응답.</li>
<li>모든 요청에 일일히 응답을 해주면 사용자 수가 적을 땐 괜찮을 수 있어도 사용자 수가 일정 수준 이상으로 많아지면 응답이 많이 지연될 수 있다.(모든 요청을 일일히 처리하고 응답해주어야 하기 때문에 처리하는데 시간이 많이 걸려 응답시간이 지연된다.)</li>
<li>사용자가 자주 요청하는 것은 캐싱해놓고 같은 요청일 경우 캐시에 저장된 내용을 반환해준다.(서버로는 요청x) 그러면 서버로 향하는 요청 수가 적어져 응답 할 거리도 적어지니 응답시간 지연률이 적어짐.</li>
<li>http통신을 할 경우 GET 요청은 기본적으로 캐시를 사용한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[State management]]></title>
            <link>https://velog.io/@brill_be/State-management</link>
            <guid>https://velog.io/@brill_be/State-management</guid>
            <pubDate>Wed, 06 Apr 2022 05:16:33 GMT</pubDate>
            <description><![CDATA[<h1 id="0-state-management">0. State management</h1>
<p>하나의 상태를 여러 개의 스크린/컴포넌트에서 사용해야한다면?
state managemen를 사용하지 않을 경우, 상위 컴포넌트에서 상태를 만들고 하위 컴포넌트로 props를 통해 넘겨주어야 함.(react는 단일 방향으로만 흐르도록 설계가 되어 있으니까)
그런데 전달해주어야 하는 depth가 너무 깊거나, 중간에서는 사용안하는데 단지 하위 컴포넌트로 해당 상태값을 넘겨주기 위해 props로 사용하지 않는 값을 받아야하는 경우가 있다. </p>
<p>쉽게 말해 state management란 글로벌하게 사용되는 상태를 따로 관리해주는 것.</p>
<h1 id="1-redux">1. Redux</h1>
<p>순수 리덕스 + 리액트 리덕스 + 액션,리듀서를 작성하기 편하게 해주는 툴킷 + 비동기 처리를 쉽게 만들어 줄 thunks/saga ....
붙일게 좀 많기는 함.</p>
<h1 id="2-recoil">2. Recoil</h1>
<p>아직 공부한 지 얼마 안됐음
state라는 용어대신 atom이란 용어를 사용함</p>
]]></description>
        </item>
    </channel>
</rss>