<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[blog.holy.kiwi]]></title><description><![CDATA[Personal blog by Jon Jee. I hope to explain with words and code.]]></description><link>https://blog.holy.kiwi</link><generator>RSS for Node</generator><lastBuildDate>Wed, 21 Apr 2021 10:10:48 GMT</lastBuildDate><item><title><![CDATA[👨‍💻 내가 맥북을 세팅하는 방법]]></title><description><![CDATA[💻🛠]]></description><link>https://blog.holy.kiwi/gen/mac-setting/</link><guid isPermaLink="false">https://blog.holy.kiwi/gen/mac-setting/</guid><content:encoded>&lt;blockquote&gt;
&lt;p&gt;업데이트 2021-04-21: 자주 사용하는 애플리케이션 추가함&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;맥북 2015년형에서 2019년형으로 바꾸는 김에 작성하는 나만의 맥북 세팅, 필수 애플리케이션 정리&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;시스템-환경설정&quot;&gt;&lt;a href=&quot;#%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;시스템 환경설정&lt;/h2&gt;
&lt;h3 id=&quot;키보드&quot;&gt;&lt;a href=&quot;#%ED%82%A4%EB%B3%B4%EB%93%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;키보드&lt;/h3&gt;
&lt;h4 id=&quot;키보드--단축키&quot;&gt;&lt;a href=&quot;#%ED%82%A4%EB%B3%B4%EB%93%9C--%EB%8B%A8%EC%B6%95%ED%82%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;키보드 &gt; 단축키&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;이전 입력 소스 선택(한영전환)은 &lt;code class=&quot;language-text&quot;&gt;command&lt;/code&gt; + &lt;code class=&quot;language-text&quot;&gt;space&lt;/code&gt;로 변경&lt;/li&gt;
&lt;li&gt;Spotlight 검색 보기는 &lt;code class=&quot;language-text&quot;&gt;control&lt;/code&gt; + &lt;code class=&quot;language-text&quot;&gt;space&lt;/code&gt;로 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;키보드--텍스트&quot;&gt;&lt;a href=&quot;#%ED%82%A4%EB%B3%B4%EB%93%9C--%ED%85%8D%EC%8A%A4%ED%8A%B8&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;키보드 &gt; 텍스트&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;맞춤법 자동 수정 X&lt;/li&gt;
&lt;li&gt;자동으로 문장을 대문자로 시작 X&lt;/li&gt;
&lt;li&gt;스페이스를 두 번 눌러 마침표 추가 X&lt;/li&gt;
&lt;li&gt;Touch Bar 입력 제안 X&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;키보드--키보드--control-strip-사용자화&quot;&gt;&lt;a href=&quot;#%ED%82%A4%EB%B3%B4%EB%93%9C--%ED%82%A4%EB%B3%B4%EB%93%9C--control-strip-%EC%82%AC%EC%9A%A9%EC%9E%90%ED%99%94&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;키보드 &gt; 키보드 &gt; Control Strip 사용자화&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;터치바 사용자화 가능&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;잠자기 버튼을 시리 대신 배치함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;dock&quot;&gt;&lt;a href=&quot;#dock&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Dock&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dock은 오른쪽으로&lt;/li&gt;
&lt;li&gt;확대 X&lt;/li&gt;
&lt;li&gt;가리기 X&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;사운드&quot;&gt;&lt;a href=&quot;#%EC%82%AC%EC%9A%B4%EB%93%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;사운드&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;메뉴 막대에서 음량 보기를 체크&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;파인더&quot;&gt;&lt;a href=&quot;#%ED%8C%8C%EC%9D%B8%EB%8D%94&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;파인더&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;파인더 - 보기 - 경로 막대 표시, 상대 막대 표시&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;파인더 - 환경설정 - 고급 - 폴더우선정렬: 윈도우에서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;정렬 상관없이 폴더가 맨 위로 정렬&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;siri&quot;&gt;&lt;a href=&quot;#siri&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Siri&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Siri에게 요청하기 활성화 해제&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;트랙패드&quot;&gt;&lt;a href=&quot;#%ED%8A%B8%EB%9E%99%ED%8C%A8%EB%93%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;트랙패드&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;탭하여 클릭하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;기타&quot;&gt;&lt;a href=&quot;#%EA%B8%B0%ED%83%80&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;기타&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;오디오 파일이 음악앱에서 안열리게 하기&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;정보 가져오기 - 다음으로 열기 - 퀵타임 플레이어 - 모두 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;필수-애플리케이션&quot;&gt;&lt;a href=&quot;#%ED%95%84%EC%88%98-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;필수 애플리케이션&lt;/h2&gt;
&lt;h3 id=&quot;chrome&quot;&gt;&lt;a href=&quot;#chrome&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.google.com/chrome&quot;&gt;Chrome&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;세계 1등 브라우저 크롬&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;whale&quot;&gt;&lt;a href=&quot;#whale&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://whale.naver.com/ko/download&quot;&gt;Whale&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;요즘은 웨일을 메인으로 쓰고 있다.&lt;/li&gt;
&lt;li&gt;크롬에 없는 유용한 기능들이 많다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;vs-code-비주얼-스튜디오-코드&quot;&gt;&lt;a href=&quot;#vs-code-%EB%B9%84%EC%A3%BC%EC%96%BC-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-%EC%BD%94%EB%93%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://code.visualstudio.com/download&quot;&gt;VS Code (비주얼 스튜디오 코드)&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JS 개발자가 가장 많이 사용하는 IDE&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;설치해야-하는-확장프로그램&quot;&gt;&lt;a href=&quot;#%EC%84%A4%EC%B9%98%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%ED%99%95%EC%9E%A5%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;설치해야 하는 확장프로그램&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;eslint&lt;/li&gt;
&lt;li&gt;prettier&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Material Theme&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Material Theme High Contrast 사용중&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Material Icon Theme&lt;/li&gt;
&lt;li&gt;git lens&lt;/li&gt;
&lt;li&gt;git history&lt;/li&gt;
&lt;li&gt;Typescript React code snippets&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;폰트&quot;&gt;&lt;a href=&quot;#%ED%8F%B0%ED%8A%B8&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;폰트&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;FiraCode&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;설정&quot;&gt;&lt;a href=&quot;#%EC%84%A4%EC%A0%95&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;설정&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Settings &gt; Format On Save 체크&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Preferences &gt; Keyboard Shortcuts&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;오른쪽 상단에 &lt;code class=&quot;language-text&quot;&gt;Open Keyboard Shortcuts (JSON)&lt;/code&gt; 클릭 후 다음 코드 추가&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;command&lt;/code&gt; + 숫자 조합으로 탭 이동 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;설정 코드 펼치기 / 접기&lt;/summary&gt;
&lt;pre&gt;
[
    {
        &quot;key&quot;: &quot;cmd+0&quot;,
        &quot;command&quot;: &quot;workbench.action.openLastEditorInGroup&quot;
    },
    {
        &quot;key&quot;: &quot;cmd+1&quot;,
        &quot;command&quot;: &quot;workbench.action.openEditorAtIndex1&quot;
    },
    {
        &quot;key&quot;: &quot;cmd+2&quot;,
        &quot;command&quot;: &quot;workbench.action.openEditorAtIndex2&quot;
    },
    {
        &quot;key&quot;: &quot;cmd+3&quot;,
        &quot;command&quot;: &quot;workbench.action.openEditorAtIndex3&quot;
    },
    {
        &quot;key&quot;: &quot;cmd+4&quot;,
        &quot;command&quot;: &quot;workbench.action.openEditorAtIndex4&quot;
    },
    {
        &quot;key&quot;: &quot;cmd+5&quot;,
        &quot;command&quot;: &quot;workbench.action.openEditorAtIndex5&quot;
    },
    {
        &quot;key&quot;: &quot;cmd+6&quot;,
        &quot;command&quot;: &quot;workbench.action.openEditorAtIndex6&quot;
    },
    {
        &quot;key&quot;: &quot;cmd+7&quot;,
        &quot;command&quot;: &quot;workbench.action.openEditorAtIndex7&quot;
    },
    {
        &quot;key&quot;: &quot;cmd+8&quot;,
        &quot;command&quot;: &quot;workbench.action.openEditorAtIndex8&quot;
    },
    {
        &quot;key&quot;: &quot;cmd+9&quot;,
        &quot;command&quot;: &quot;workbench.action.openEditorAtIndex9&quot;
    },
    {
        &quot;key&quot;: &quot;ctrl+1&quot;,
        &quot;command&quot;: &quot;workbench.action.focusFirstEditorGroup&quot;
    },
    {
        &quot;key&quot;: &quot;ctrl+2&quot;,
        &quot;command&quot;: &quot;workbench.action.focusSecondEditorGroup&quot;
    },
    {
        &quot;key&quot;: &quot;ctrl+3&quot;,
        &quot;command&quot;: &quot;workbench.action.focusThirdEditorGroup&quot;
    },
    {
        &quot;key&quot;: &quot;cmd+&apos;&quot;,
        &quot;command&quot;: &quot;editor.action.goToTypeDefinition&quot;
    }
]
&lt;/pre&gt;
&lt;/details&gt;
&lt;h3 id=&quot;alfred-4&quot;&gt;&lt;a href=&quot;#alfred-4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.alfredapp.com/&quot;&gt;Alfred 4&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Alfred 없이 macOS를 쓰는건 매우 불편하다.&lt;/li&gt;
&lt;li&gt;Mega Supporter 파워팩을 구매해서 사용하고 있다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;주로 Alfred의 Clipboard History, Snippets, Web Search, Workflows 기능을 사용한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clipboard History 기능은 복사하는 내용들을 보관해준다. 텍스트, 사진 등 모두 보관해줘서 편리하다.&lt;/li&gt;
&lt;li&gt;Snippets 기능은 많이 쓰는 텍스트나 이모지를 짧은 텍스트로 매핑해놓으면 편하게 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;cslg&lt;/code&gt; 네글자만 입력하면 &lt;code class=&quot;language-text&quot;&gt;console.log({cursor});&lt;/code&gt;과 같은 코드가 작성되도록 하는 등 설정할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;추천 workflows는 &lt;a href=&quot;https://github.com/zenorocha/alfred-workflows&quot;&gt;alfred-workflows&lt;/a&gt; 참고&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;source-tree&quot;&gt;&lt;a href=&quot;#source-tree&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.sourcetreeapp.com/&quot;&gt;Source Tree&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;주로 사용하는 Git GUI&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;git-kraken&quot;&gt;&lt;a href=&quot;#git-kraken&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.gitkraken.com/&quot;&gt;Git Kraken&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Source Tree에서 Git Kraken으로 옮김&lt;/li&gt;
&lt;li&gt;매우 직관적인 Git GUI 애플리케이션 (유료)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;magnet-마그넷&quot;&gt;&lt;a href=&quot;#magnet-%EB%A7%88%EA%B7%B8%EB%84%B7&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/magnet-%EB%A7%88%EA%B7%B8%EB%84%B7/id441258766&quot;&gt;Magnet (마그넷)&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;유료 애플리케이션 (살 때는 1,200원이었는데 지금보니 3,900원이다)&lt;/li&gt;
&lt;li&gt;단축키로 화면 분할을 쉽게 할 수 있게 해줌&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ishot&quot;&gt;&lt;a href=&quot;#ishot&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/ishot-%E6%88%AA%E5%9B%BE-%E9%95%BF%E6%88%AA%E5%9B%BE-%E8%B4%B4%E5%9B%BE-%E5%BD%95%E5%B1%8F%E5%B7%A5%E5%85%B7/id1485844094?mt=12&quot;&gt;iShot&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;스크린샷을 도와주는 유틸 앱&lt;/li&gt;
&lt;li&gt;편한 단축키 지원&lt;/li&gt;
&lt;li&gt;스크린샷 후 꾸미기 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;올ㅋ사전&quot;&gt;&lt;a href=&quot;#%EC%98%AC%E3%85%8B%EC%82%AC%EC%A0%84&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;http://allkdic.xoul.kr/&quot;&gt;올ㅋ사전&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;언제 어디서든 단축키 하나로 사전 팝업을 켤 수 있어서 좋음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;giphy-capture&quot;&gt;&lt;a href=&quot;#giphy-capture&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://giphy.com/apps/giphycapture&quot;&gt;GIPHY Capture&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;빠르게 Gif 파일을 만들 수 있어 좋음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;slack&quot;&gt;&lt;a href=&quot;#slack&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/slack/id803453959&quot;&gt;Slack&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;업무용 채팅앱&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;kakaotalk&quot;&gt;&lt;a href=&quot;#kakaotalk&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%86%A1/id869223134&quot;&gt;Kakaotalk&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&quot;line&quot;&gt;&lt;a href=&quot;#line&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/line/id539883307&quot;&gt;Line&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&quot;evernote&quot;&gt;&lt;a href=&quot;#evernote&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://evernote.com/intl/ko/download&quot;&gt;Evernote&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;막 메모하기 좋은 앱&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;notion&quot;&gt;&lt;a href=&quot;#notion&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.notion.so/desktop&quot;&gt;Notion&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;정리해놓기 좋은 앱&lt;/li&gt;
&lt;li&gt;에버노트랑 노션이랑 기본 메모앱이랑 같이 쓰고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ticktick&quot;&gt;&lt;a href=&quot;#ticktick&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://ticktick.com/&quot;&gt;TickTick&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;할일 목록을 체계적으로 관리할 수 있음&lt;/li&gt;
&lt;li&gt;마크다운도 가능&lt;/li&gt;
&lt;li&gt;모바일, 데스크탑 모두 지원함&lt;/li&gt;
&lt;li&gt;유료임&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;iterm-2&quot;&gt;&lt;a href=&quot;#iterm-2&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.iterm2.com/&quot;&gt;Iterm 2&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;기본 터미널 앱보다 멋지다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;postman-혹은-insomnia&quot;&gt;&lt;a href=&quot;#postman-%ED%98%B9%EC%9D%80-insomnia&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.postman.com/downloads/&quot;&gt;Postman&lt;/a&gt; 혹은 &lt;a href=&quot;https://insomnia.rest/download/&quot;&gt;Insomnia&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;API를 개발하거나 연동할 때 유용하게 쓰는 앱들&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;microsoft-office-word-powerpoint-excel&quot;&gt;&lt;a href=&quot;#microsoft-office-word-powerpoint-excel&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/microsoft-word/id462054704&quot;&gt;Microsoft Office (Word, Powerpoint, Excel)&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&quot;sketch&quot;&gt;&lt;a href=&quot;#sketch&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.sketch.com/get/&quot;&gt;Sketch&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;UI 디자인 앱&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zeplin&quot;&gt;&lt;a href=&quot;#zeplin&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://zpl.io/download-mac&quot;&gt;Zeplin&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;개발자, 디자이너 협업 툴&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;xcode&quot;&gt;&lt;a href=&quot;#xcode&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/xcode/id497799835&quot;&gt;Xcode&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For iOS 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;android-studio&quot;&gt;&lt;a href=&quot;#android-studio&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://developer.android.com/studio&quot;&gt;Android Studio&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For Android 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;선택-애플리케이션&quot;&gt;&lt;a href=&quot;#%EC%84%A0%ED%83%9D-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;선택 애플리케이션&lt;/h2&gt;
&lt;h3 id=&quot;final-cut-pro&quot;&gt;&lt;a href=&quot;#final-cut-pro&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/final-cut-pro/id424389933&quot;&gt;Final Cut Pro&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;비싸지만 영상 편집에 편하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;screenflow-8&quot;&gt;&lt;a href=&quot;#screenflow-8&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://dynamic.telestream.net/downloads/download-screenflow.asp?prodid=screenflow&quot;&gt;ScreenFlow 8&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;화면 녹화용&lt;/li&gt;
&lt;li&gt;라이센스는 동시에 한 컴퓨터에만 적용 가능&lt;/li&gt;
&lt;li&gt;버전 업그레이드 하는데 또 돈 내야해서 일단 8 쓰는중&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;dynamo&quot;&gt;&lt;a href=&quot;#dynamo&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/dynamo/id1445910651&quot;&gt;Dynamo&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;사파리에서 유튜브, 넷플릭스 등을 키보드 단축키로 쉽게 속도 조절 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cli&quot;&gt;&lt;a href=&quot;#cli&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CLI&lt;/h2&gt;
&lt;h3 id=&quot;homebrew&quot;&gt;&lt;a href=&quot;#homebrew&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://brew.sh/index_ko&quot;&gt;Homebrew&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;macOS용 패키지 매니저&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/bin/bash -c &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;git&quot;&gt;&lt;a href=&quot;#git&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;git&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;mac은 설치되어 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;nodejs&quot;&gt;&lt;a href=&quot;#nodejs&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://nodejs.org/ko/download/&quot;&gt;node.js&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&quot;npm&quot;&gt;&lt;a href=&quot;#npm&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.npmjs.com/get-npm&quot;&gt;npm&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;node.js 설치하면 설치됨&lt;/li&gt;
&lt;li&gt;node package manager&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;yarn&quot;&gt;&lt;a href=&quot;#yarn&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://yarnpkg.com/getting-started/install&quot;&gt;yarn&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Facebook에서 만든 node package manager&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm install -g yarn&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;oh-my-zsh&quot;&gt;&lt;a href=&quot;#oh-my-zsh&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://ohmyz.sh/&quot;&gt;oh my zsh&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A delightful community-driven framework for managing your zsh configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;git-권한-설정&quot;&gt;&lt;a href=&quot;#git-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Git 권한 설정&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;터미널에서 키 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ssh-keygen -t rsa -C {이메일}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;ssh 키 등록&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ssh-add ~/.ssh/id_rsa&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;p&gt;깃헙에 키 등록&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;github -&gt; settings -&gt; SSH and GPG keys -&gt; New SSH Key -&gt; public key 복붙!&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;커맨드마다-passphrase-입력하기-귀찮으면&quot;&gt;&lt;a href=&quot;#%EC%BB%A4%EB%A7%A8%EB%93%9C%EB%A7%88%EB%8B%A4-passphrase-%EC%9E%85%EB%A0%A5%ED%95%98%EA%B8%B0-%EA%B7%80%EC%B0%AE%EC%9C%BC%EB%A9%B4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;커맨드마다 passphrase 입력하기 귀찮으면&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;eval &lt;code class=&quot;language-text&quot;&gt;ssh-agent&lt;/code&gt;로 agent를 실행&lt;/li&gt;
&lt;li&gt;ssh-add -K ~/.ssh/&amp;#x3C;private&lt;em&gt;key&lt;/em&gt;file&gt; 프라이빗키를 등록&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://confluence.atlassian.com/bitbucket/set-up-an-ssh-key-728138079.html&quot;&gt;https://confluence.atlassian.com/bitbucket/set-up-an-ssh-key-728138079.html&lt;/a&gt; 참고&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;터미널-환경-세팅&quot;&gt;&lt;a href=&quot;#%ED%84%B0%EB%AF%B8%EB%84%90-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;터미널 환경 세팅&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.iterm2.com/&quot;&gt;iTerm 2&lt;/a&gt; 설치&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://ohmyz.sh/&quot;&gt;oh my zsh&lt;/a&gt; 설치&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;다음 명령어로 기본 쉘을 &lt;code class=&quot;language-text&quot;&gt;zsh&lt;/code&gt;로 변경&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;chsh -s /usr/bin/zsh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;~/.zshrc&lt;/code&gt; 파일에 들어가서 &lt;code class=&quot;language-text&quot;&gt;ZSH_THEME=&amp;quot;agnoster&amp;quot;&lt;/code&gt;로 터미널 테마 변경&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/powerline/fonts&quot;&gt;ubuntu mono derivative powerline&lt;/a&gt; 폰트 설치&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;iTerm 2 -&gt; Preferences -&gt; Profile -&gt; Text -&gt; Font 변경&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;다음 레포지토리를 클론하여 &lt;code class=&quot;language-text&quot;&gt;dracula&lt;/code&gt; 테마 적용&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git clone https://github.com/dracula/iterm.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;iTerm 2 -&gt; Preferences -&gt; Profile -&gt; Color -&gt; Color Presets 변경&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;터미널에서 username 제거&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;~/.zshrc&lt;/code&gt; 파일 맨밑에 넣어주면 된다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;prompt_context&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  emojis&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;🥝&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🔥&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;👑&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;😎&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🐵&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🦄&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🌈&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🚀&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;💡&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🎉&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🇰🇷&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🌙&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;🌞&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  RAND_EMOJI_N&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$((&lt;/span&gt; $RANDOM &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; ${#emojis[@]} &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
  prompt_segment black default &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${emojis[$RAND_EMOJI_N]}&lt;/span&gt; &quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;zsh&lt;/code&gt; 플러그인 &lt;code class=&quot;language-text&quot;&gt;zsh-syntax-highlighting&lt;/code&gt; 설치&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;터미널에서 사용 가능한 커맨드는 초록색, 사용 가능하지 않은 커맨드는 빨간색으로 표시해줌&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# brew를 통해 설치해줍니다.&lt;/span&gt;
brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; zsh-syntax-highlighting
&lt;span class=&quot;token comment&quot;&gt;# 플러그인을 적용합니다.&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;source&lt;/span&gt; /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
&lt;span class=&quot;token comment&quot;&gt;# 위 커맨드를 ~/.zshrc 맨 아래에 넣습니다.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;참고&quot;&gt;&lt;a href=&quot;#%EC%B0%B8%EA%B3%A0&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;서울리안님 유튜브 &lt;a href=&quot;https://www.youtube.com/watch?v=WP1_CrtufvY&quot;&gt;https://www.youtube.com/watch?v=WP1_CrtufvY&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
                &lt;div style=&quot;margin-top=55px; font-style: italic;&quot;&gt;(This is an article posted to my blog at blog.holy.kiwi. You can read it online by &lt;a href=&quot;https://blog.holy.kiwi/gen/mac-setting/&quot;&gt;clicking here&lt;/a&gt;.)&lt;/div&gt;
              </content:encoded></item><item><title><![CDATA[🎄 크리스마스에 치앙마이에서 2019년 회고 쓰는 내 인생이 레전드다]]></title><description><![CDATA[🎄 + 🌞 = 😎]]></description><link>https://blog.holy.kiwi/gen/2019-developer-review-christmas-chiangmai/</link><guid isPermaLink="false">https://blog.holy.kiwi/gen/2019-developer-review-christmas-chiangmai/</guid><content:encoded>&lt;blockquote&gt;
&lt;p&gt;현재 시각 오후 12:47 (태국 현지 시간 기준) 치앙마이에서 일하기 좋은 카페 &lt;a href=&quot;https://www.google.com/maps/place/Brain+awake/@18.7895115,98.9819849,17z/data=!3m1!4b1!4m5!3m4!1s0x30da3a9baecfffdd:0x3dcb498c9ef4386e!8m2!3d18.7895115!4d98.9841736&quot;&gt;Brain Awake&lt;/a&gt;에서 이 글을 씁니다. 이름이 너무 마음에 듬. 아 에어팟 놓고 왔네 망했다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;올해 3월에 &lt;a href=&quot;https://blog.holy.kiwi/gen/190319/&quot;&gt;2018년 회고&lt;/a&gt;를 썼었는데 벌써 2019년 회고라니&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;-여름까지-회사와-학교를-병행&quot;&gt;&lt;a href=&quot;#-%EC%97%AC%EB%A6%84%EA%B9%8C%EC%A7%80-%ED%9A%8C%EC%82%AC%EC%99%80-%ED%95%99%EA%B5%90%EB%A5%BC-%EB%B3%91%ED%96%89&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🏫 여름까지 회사와 학교를 병행&lt;/h2&gt;
&lt;p&gt;2019년 3월, 학교에 복학했다. 하지만 일이 있었다. 1차 복학신청 기간을 놓쳐서 수강신청 후에 2차 복학신청 기간 때 복학 신청을 해야했다. &lt;del&gt;날짜를 잘못봤다.&lt;/del&gt; 그래서 수강신청을 못했다. 당연히 &lt;del&gt;꿀 빠는&lt;/del&gt; 인기 있는 수업들은 고사하고 전공필수까지 못듣게 될 상황이었다. 전공 수업 세 개를 개강 후에 겨우 GET했다. (교수님한테 찾아가서) 그리고 회사에 이번에 수업을 조금 듣게 되었으니 학교 다니면서 회사도 같이 다니고 싶다고 말했다. 회사는 OK 해주셨고 내 편의를 봐주셔서 80%의 근무만 하도록 허용해주셨다. &lt;del&gt;당연히 월급도 80% 히히&lt;/del&gt; 하루는 원격으로 근무했고 토요일엔 10 to 7 FULL 근무를해서 근무시간 80%를 채웠다. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;토요일에 회사에 혼자 가니 무척 심심했다. ㅠㅠ (가끔 스터디 하러 오신 동료 개발자 형님 오셔서 좋았음 shout to &lt;a href=&quot;https://github.com/knilnissim&quot;&gt;@knilnissim&lt;/a&gt;) 토요일 오전에 사먹는 타이거슈가 꿀맛!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;주로 node.js 백엔드 업무를 맡았고 그렇게 6월 종강까지 학교와 회사를 병행하면서 바쁘게 지냈다. 바쁘게 지내서 뭔가 뿌듯했지만 너무 정신없었다. 다시는 못할것 같다. &lt;del&gt;시험기간 벼락치기를 위해서 휴가를 써야하는 슬픔.&lt;/del&gt; 3학년 1학기 때 전공학점을 너무 못채워서 4학년 1학기 때 빡세게 들어야한다.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 87.5%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsSAAALEgHS3X78AAADC0lEQVQ4y42USWsUQRiG84tEPago4oLkEMGAIuLNgwj+AC/eBH+DiIggiIrrQRH1IK4xiQmaxWS2xMT09PTePZ3pnuml6vXt6nESMS7FvFRNFfX0V/V+Xw3FcYxOp4MoilTfbrfh+z46/F+sRWp9HZ7bgu/pCNsWPMdA4JoIfQe+Y1EcezbnbAwF3KxrGmzDQJam+NnSJIHVasEyTLR9C6HzAehNQcRTCL5PQTo1wKsjXP2C1FxU467VwNDlS5ewY9s2HBsZgdlsDoDzs7M4cugg9u7eg7s3r3OmQtgEZHcK8CsAgdKpAm6tryp6BdAiZLVaxVqdX1hfHwBjHn+lUsHyYhWO9g3oThM2SX2C9BZLICFSgTcBsalJKSGEgGDP3+YViMyDzL2y95cIJMyt/Q4sAAVICqn6YrOUhIpcwWV/fYAWVLBKYGVrYIkolctSG3GVKiJOUn6gv/ZXYByGSPt3d//eQ+w/NIzho6O4cfM2rU6VHGbA8ZOnceDwMM6cPQ93ZY7G1CGcLe4wZMrkGt21LTTma3j07B0ePHmNyfEZpNoaYJqINR3PX03iwdM3ePJyDJFRZ5pswH41JQggjRY32nD1BpabM9DsBQQenTUtBcwMHd3OCs/gUDZNaShTsKUpHp3TGWEQ4u2Lx7hw8RzejN9BkjQ4byioMNfQCz5AxmMQ0TjTZuHPaSNZKeAdgVUhwnX0khw5neSgjNxglHZTVQn+Jw+LCAdAmvPTVcEaVvMsPWnpyOM55N1Zao7Ayr+BkkB0uxs5k2WM0FCC4+CXxrSRTJst77A4soJZNvTlJbyfHMfEl2m0dE0ZUijh+vTMZ7yf+Iiv9QpSd0kBVB72VcAHEWbFo8DavXXjOrbv242d+/bg6rUr4FumgG6jgdFTJ7Bj7y6Mnj4Jc+kT06YGYS1A2otKoHpmbZMpVPG+abGPZuTBDZwyQs7nlgUj8tGKA+js04SFkEaQhZKOGhfqdQIMpa6LjEfKdF48q0aIsq5zmqLmCxEoeKeC9os8R6YklNJsYxzFXfwAEnkzeaOfsO8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_timetable&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/4928c6710a9881c36b057fbe13f949d8/fb8a0/191225_timetable.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/4928c6710a9881c36b057fbe13f949d8/1a291/191225_timetable.png 148w,https://blog.holy.kiwi/static/4928c6710a9881c36b057fbe13f949d8/2bc4a/191225_timetable.png 295w,https://blog.holy.kiwi/static/4928c6710a9881c36b057fbe13f949d8/fb8a0/191225_timetable.png 590w,https://blog.holy.kiwi/static/4928c6710a9881c36b057fbe13f949d8/526de/191225_timetable.png 885w,https://blog.holy.kiwi/static/4928c6710a9881c36b057fbe13f949d8/ab5af/191225_timetable.png 960w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;2019년 1학기 시간표&lt;/i&gt;&lt;/p&gt;
&lt;h2 id=&quot;-회사-첫-퇴사&quot;&gt;&lt;a href=&quot;#-%ED%9A%8C%EC%82%AC-%EC%B2%AB-%ED%87%B4%EC%82%AC&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🚪 회사 첫 퇴사&lt;/h2&gt;
&lt;p&gt;6월 중순에 종강하고 7월말까지 회사를 다니고 퇴사했다. 인턴 기간까지 1년 8개월동안의 내 첫 회사생활을 마쳐서 아쉬움이 더 컸다. 전역하고 바로 입사해서 그런지 제 2의 군대를 전역하는 느낌이었다. &lt;del&gt;문화가 군대라는 건 절대 아님. 퇴사 느낌이 그렇다는거.&lt;/del&gt; 하지만 회사생활은 정말 재밌어서 군생활보다 훨씬 짧게 느껴졌다. 첫회사를 핀다로 오게 된건 정말 큰 행운이었다. 모두에게 배울 점들이 넘쳤고 스타트업은 정말 재밌고 성장하는 곳이라는 느낌을 뇌리에 강하게 박히도록 했다. 전역 후 회사로 오지 않고 바로 학교에 갔더라면 시야가 좁은 우물 안의 개구리 학생으로 학교 생활을 마쳤을 것이다. (학교에서는 주로 Low Level의 시스템 프로그래밍 위주로 배우기 때문)&lt;/p&gt;
&lt;h2 id=&quot;-사이드-프로젝트&quot;&gt;&lt;a href=&quot;#-%EC%82%AC%EC%9D%B4%EB%93%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🎎 사이드 프로젝트&lt;/h2&gt;
&lt;h3 id=&quot;군돌이---국민-전역일계산기-앱&quot;&gt;&lt;a href=&quot;#%EA%B5%B0%EB%8F%8C%EC%9D%B4---%EA%B5%AD%EB%AF%BC-%EC%A0%84%EC%97%AD%EC%9D%BC%EA%B3%84%EC%82%B0%EA%B8%B0-%EC%95%B1&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;군돌이 - 국민 전역일계산기 앱&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://onelink.to/goondori&quot;&gt;군돌이&lt;/a&gt;는 &lt;a href=&quot;https://blog.holy.kiwi/js/190127/&quot;&gt;예전 포스트&lt;/a&gt;에서 말했듯이 2018년 8월에 &lt;code class=&quot;language-text&quot;&gt;React Native&lt;/code&gt;로 개발해서 9월에 런칭한 전역일계산기 앱이다. 2018년 회고글을 쓸 때만 해도 군돌이가 이렇게 클 줄 몰랐는데 2019년 4월 이후로 연예인 입대와 맞물려 급성장을 해서 현재는 누적 20만 다운로드에 달하는 애플리케이션이 되었다. (앱스토어에서 무료 라이프스타일 카테고리 3위, 전체 38위까지 랭크된 적도 있다.)&lt;/p&gt;
&lt;h4 id=&quot;2019년-군돌이-작업-내용&quot;&gt;&lt;a href=&quot;#2019%EB%85%84-%EA%B5%B0%EB%8F%8C%EC%9D%B4-%EC%9E%91%EC%97%85-%EB%82%B4%EC%9A%A9&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2019년 군돌이 작업 내용&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;군인 최대 8명까지 등록 가능&lt;/li&gt;
&lt;li&gt;13개국 언어 지원&lt;/li&gt;
&lt;li&gt;테마 변경 기능&lt;/li&gt;
&lt;li&gt;iOS, Android 위젯 기능&lt;/li&gt;
&lt;li&gt;공지사항 게시판 추가 (AWS Lambda, DynamoDB 이용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;유저와의 소통을 중요시하려고 매우 노력중이다. 플레이스토어와 앱스토어의 리뷰에 대부분 답변을 달고 있고, 이메일로 오는 문의 메일들로 소통하고 있다. 문의사항, 건의사항 등 피드백을 받다보면 여러 유저분들이 중복으로 느끼는 니즈가 있는데 (가령 몇개월 며칠 표시 기능) 유저들의 니즈를 바탕으로 작업의 우선순위를 정하고 있다.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 49.91394148020654%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABTElEQVQoz51S2U4DMQzc//82nnipoDy0FWq3ZY8mmzt2Bme7i1SEqMDRyFFkT8ZH472H1hrGGBARqpVS8B+reU0lSSkh5zw//AW8+EwFxDcRzfcfHgErUGYRzATtGOfzB1jENQ8JcI+qpsKngkQ3cpZzvF5ggvudsBLEJTlLSToUTAuMZ8SQpGyC11FmYCW6/ExYjQWVaBgzjJSkJ0JQGbACR7MvmWfdLP7UtjDW3PdwtRBFjSKoK2FsnRBkeBUxTAGdi+htxM54qJiEjYU/o/NawiKa2g8XGFdDkkDohoyXd4vX84T9YLE1Djvn8Sb+WVk8DRobbbGRu823NRuFuO9HUSpD0TZhe1A4dR5t73C4aAw+IhT5WaZofIAnlh5KeSkuw/laCxEo7xK7Pe7RG1VLLkvH1iC6S1iXvVqUfSUh4HUHl/d6z3XWQvwJb70Rn6fwN0MAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_goondorigraph&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/e3d7aa2a38f0741277d8526eb32dc5af/fb8a0/191225_goondorigraph.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/e3d7aa2a38f0741277d8526eb32dc5af/1a291/191225_goondorigraph.png 148w,https://blog.holy.kiwi/static/e3d7aa2a38f0741277d8526eb32dc5af/2bc4a/191225_goondorigraph.png 295w,https://blog.holy.kiwi/static/e3d7aa2a38f0741277d8526eb32dc5af/fb8a0/191225_goondorigraph.png 590w,https://blog.holy.kiwi/static/e3d7aa2a38f0741277d8526eb32dc5af/526de/191225_goondorigraph.png 885w,https://blog.holy.kiwi/static/e3d7aa2a38f0741277d8526eb32dc5af/fc540/191225_goondorigraph.png 1162w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;군돌이 활성사용자 그래프&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 177.77777777777777%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAkABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAECBAX/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAQID/9oADAMBAAIQAxAAAAHuSsVWGfPkZ6bmFZ2QxIr/xAAdEAABBAIDAAAAAAAAAAAAAAAAAQIDJBIgEBET/9oACAEBAAEFAuMU0Xsk9CFr8bhcLmn/xAAYEQACAwAAAAAAAAAAAAAAAAAQYQASE//aAAgBAwEBPwEUczZ//8QAFxEBAAMAAAAAAAAAAAAAAAAAEAAREv/aAAgBAgEBPwEuaf/EABwQAAEEAwEAAAAAAAAAAAAAAAABESDxEBIiMf/aAAgBAQAGPwLHkFORdndyiiof/8QAHRAAAwACAgMAAAAAAAAAAAAAAAERITEQQYGR0f/aAAgBAQABPyHTweCvT0Ni4a8hJqtvHZUSapSAk720HL2w1T7x/9oADAMBAAIAAwAAABDDxf3/AM//xAAbEQABBAMAAAAAAAAAAAAAAAAAARARkSFBYf/aAAgBAwEBPxBlhmFicLNN/8QAGBEAAwEBAAAAAAAAAAAAAAAAAAEQESH/2gAIAQIBAT8QmGMZ2f/EAB0QAQEAAwEAAwEAAAAAAAAAAAERACExQRBhgVH/2gAIAQEAAT8QuiQuymA75veYoVVcQWqXncVPf0+AS7UlPww6IyAm624BlX0QgHv1lYtv3iMl/rgsBJ6YgSpvpMLveD3P/9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_kakaotalkmain&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/7c04ac62dda1e8962fc42063f5346cfa/fb8a0/191225_kakaotalkmain.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/7c04ac62dda1e8962fc42063f5346cfa/1a291/191225_kakaotalkmain.png 148w,https://blog.holy.kiwi/static/7c04ac62dda1e8962fc42063f5346cfa/2bc4a/191225_kakaotalkmain.png 295w,https://blog.holy.kiwi/static/7c04ac62dda1e8962fc42063f5346cfa/fb8a0/191225_kakaotalkmain.png 590w,https://blog.holy.kiwi/static/7c04ac62dda1e8962fc42063f5346cfa/49f97/191225_kakaotalkmain.png 720w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;&lt;a href=&quot;https://m.cafe.daum.net/SoulDresser/FLTB/121116?svc=topRank&quot;&gt;카카오톡 FUN 메인에 뜬 군돌이 관련 글&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;
&lt;h3 id=&quot;playground---교내-소프트웨어-공모전-참여-학장상&quot;&gt;&lt;a href=&quot;#playground---%EA%B5%90%EB%82%B4-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%EB%AA%A8%EC%A0%84-%EC%B0%B8%EC%97%AC-%ED%95%99%EC%9E%A5%EC%83%81&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Playground - 교내 소프트웨어 공모전 참여 (학장상)&lt;/h3&gt;
&lt;p&gt;교내 소프트웨어 공모전이 매년 8월 ~ 9월에 열리는데 이 공모전에서 은상 이상을 수상하면 졸업요건 중 하나가 채워진다. 그리고 학교 다니면서 교내 소공전은 한 번 참여해봐야 하지 않겠나 하고 1학기 초반부터 팀 빌딩을 했다. 성실한 친구들 위주로 팀을 구성했고 1학기 내내 아이디어 회의를 했다. 그렇게 해서 나온 아이디어는 &lt;strong&gt;플러그인을 통해 확장하여 사용가능한 웹 대쉬보드&lt;/strong&gt;였다. 사용자가 HTML, CSS, Javascript를 통해 플러그인을 개발해서 플랫폼의 마켓플레이스에 업로드할 수도 있고 다른 사용자가 개발해놓은 플러그인을 개발해서 다운로드할 수 있는 웹 기반 대쉬보드 플랫폼이었다. 팀 구성은 내가 전반적인 개발을 담당했고 웹 프론트엔드 개발 1명, 백엔드 개발 1명, 디자인 1명으로 구성했다. 사용한 기술 스택은 &lt;code class=&quot;language-text&quot;&gt;React&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Typescript&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Mobx&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Node.js&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Express&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Serverless&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;AWS DynamoDB&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;AWS Lambda&lt;/code&gt;였다. 처음 서버리스 프레임워크를 사용해봤는데 서버 개발이 쉽고 재밌었다. 다음에도 서버 개발할 일이 있으면 서버리스로 할 것 같다. 또 리액트로 서버에서 받아온 동적인 JS 코드를 컴포넌트에 주입할 때 어려움이 있었지만 &lt;code class=&quot;language-text&quot;&gt;Function&lt;/code&gt; 생성자를 통해 서드파티 모듈을 사용할 수 있도록 하는 등 삽질 후 해결했다.&lt;/p&gt;
&lt;p&gt;참 신기한 생성자다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; sum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;return a + b&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;// 3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 56.22317596566524%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC5ElEQVQozyWTS29bRRiGzy9hw4bLAgkhVfwBBIhuKkEkqgICsQBBBQuksqGA2nRBlVag0JKCaOw0joMTuU6CW6M4pK3V3OyWJM5JnDp17OPLybnY535IXB7G7kiP9M1o9M4773wjvTE8xauDo7z0zW/EF5Y4aCh0Oha2bWNZlqg7rO1WuZzJMzCS5uULf/DM2XFeGIzzQSTDsR8mefbbUZ4/F+XF8xGkD2NzDC3kubG6jSVEekI9Ecdx+thC1DBNxhdX+T55ly8nFnj3ygzHf05xOvYXn4zO8tlYmi9it/g4Mov0++pDwo7J/l4Z13U5PDxEqdUwDAPP83HFAYqqc3Eux0/zea5mCwzF5/k0muFHYWTwZpYzE2kG5+5yJplFWq8p6JrOo8cVukIsCEM6jo3fE/NdLMcSTm3+E+tPgoBu4LOxr3B64jbPXYgyEEkzurTByOIal7LLSJbIq6IaKHobXdRltcFOs86B3RbOqijNGg2zReqfdSbzBRKFB3TaJoXSHseGbnAuc5+noyuMOEg1rU1xS0aWt9nVTR7Km+Tu5djvaFSVCsaBTqOt8XliRrhJcDKaYEdp0DrQeC8yw0fiuldyBS4trvD17DySZrbZVZp9moZJSa1TrO/TsgyqjQquOLXRMRi4luLN4SQnfkmxUVE48hzOzmZ5fSTO8V8nee3qOK8MjSC5tieCD3GsgMAJRR30557j09YdDr0jVNvg8u01zqeWuPjnCpWWRjf0ycm7vH19mpNjSd6PJXnr2hhS1XzEppZD1lcoaktsGyvsmKuCPNG977jTmMJ3Q1r1Gv+KR+qn1T3CFw/kiw6ILxc4cX2SU7FpIR5DKioKqWKRW9syaVkmUyr1+btc5lR8iuF7y+J6HptbW9TE3marhaqqoqW8ft96ok+n1x4IwQTvRMaRVN2lXA953AgEIZXmU6qtkDsbT1gviyh8p++oJ9LD9/0+vZ/UIxA5398p8dXNFP8DupjoTYMMluUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_playground&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/27492b3a8fce6204bdc075f1eb788591/fb8a0/191225_playground.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/27492b3a8fce6204bdc075f1eb788591/1a291/191225_playground.png 148w,https://blog.holy.kiwi/static/27492b3a8fce6204bdc075f1eb788591/2bc4a/191225_playground.png 295w,https://blog.holy.kiwi/static/27492b3a8fce6204bdc075f1eb788591/fb8a0/191225_playground.png 590w,https://blog.holy.kiwi/static/27492b3a8fce6204bdc075f1eb788591/526de/191225_playground.png 885w,https://blog.holy.kiwi/static/27492b3a8fce6204bdc075f1eb788591/fa2eb/191225_playground.png 1180w,https://blog.holy.kiwi/static/27492b3a8fce6204bdc075f1eb788591/08f6a/191225_playground.png 1770w,https://blog.holy.kiwi/static/27492b3a8fce6204bdc075f1eb788591/0e91c/191225_playground.png 2796w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;플레이그라운드 대쉬보드 스크린샷&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;인공지능, 블록체인, 임베디드 등 상 받기 좋은 기술 없이 오로지 웹 기반으로만 개발해서 높은 상은 기대하지 않았는데 두번째로 높은 학장상을 받아서 기분이 너무 좋았다. 공모전 작품 전시할 때도 많은 분들이 칭찬해주셔서 보람 있었다. :)&lt;/p&gt;
&lt;p&gt;프로젝트 링크: &lt;a href=&quot;http://plgr.netlify.com/&quot;&gt;http://plgr.netlify.com/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;2019-naver-campus-hackday-winter-참여&quot;&gt;&lt;a href=&quot;#2019-naver-campus-hackday-winter-%EC%B0%B8%EC%97%AC&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2019 NAVER CAMPUS HACKDAY WINTER 참여&lt;/h3&gt;
&lt;p&gt;네이버에서 주최하는 대학생, 대학원생들만 참여할 수 있는 1박 2일 해커톤이다. 기존 해커톤 개념과는 다르게 미리 주제가 정해져 있고 참가자들은 정해져있는 주제 중에 선택해서 참가하는 방식이었다. 기본적으로 주제당 멘토는 1명, 멘티는 최대 3명이었다. 역시 네이버 해커톤이라 그런지 참가하는데에도 지원서에 쓸 내용이 많았고 코딩테스트까지 봤다. 코딩테스트를 못봐서 큰 기대를 하지 않았는데 다행히 운좋게 참가자로 선정돼서 참가할 수 있게 되었다. 사전 모임에서 멘토님께 들었는데 코딩테스트 결과는 참가자 선정에 크게 영향이 없었다고 하셨고 깃헙과 어떤 프로젝트를 했었는지 등을 최우선적으로 보셨다고 한다.&lt;/p&gt;
&lt;p&gt;원래 주제와는 다르게 요즘 핫하게 떠오르는 프론트엔드 프레임워크인 &lt;a href=&quot;https://svelte.dev/&quot;&gt;Svelte&lt;/a&gt;로 컴포넌트 만들기를 하기로 했다. 아예 새로운 기술로 도전적으로 1박2일 해커톤을 하는 것이 의미 있어 보였다. 그렇게 1박 2일동안 네이버의 춘천 커넥트원에 가서 맛있는 것도 많이 먹고 스벨트로 코딩도 열심히 하고 좋은 시간을 보냈다. 무엇보다도 숙소가 대박이었다. 1인실이었고 시설이 무척 좋아서 호캉스 온 느낌이었다. &lt;del&gt;보안서약서를 작성해서 내부 사진은 공개하지 못합니다 ㅠ&lt;/del&gt; 이후에 멘토님이 긍정적으로 평가해주셔서 네이버 핵데이 우수참가자 전형으로 인턴 면접을 볼 수 있었다.&lt;/p&gt;
&lt;h3 id=&quot;awesome-apple-watch-레포지토리-100&quot;&gt;&lt;a href=&quot;#awesome-apple-watch-%EB%A0%88%ED%8F%AC%EC%A7%80%ED%86%A0%EB%A6%AC-100&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;awesome-apple-watch 레포지토리 ⭐100&lt;/h3&gt;
&lt;p&gt;심심풀이로 연습삼아 애플워치 앱을 개발할 때 작성한 애플워치 관련 라이브러리와 자료 등을 모아놓은 &lt;a href=&quot;https://github.com/738/awesome-apple-watch&quot;&gt;awesome-apple-watch&lt;/a&gt; 레포지토리다. 별이 꾸준하게 천천히 오르다가 시험 기간에 공부하다 심심해서 해외 커뮤니티인 레딧에 레포지토리 홍보글을 올렸더니 며칠만에 ⭐100이 되었다. 문서 레포지토리라서 개발 실력과는 관련이 없지만 많은 해외 개발자들이 관심을 가지고 별을 눌러줘서 기분이 좋았다.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 30.303030303030305%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA3ElEQVQY05VR0W7DIAzM/3/eHqY+VHnqQiAkKW0awIbcYqfd9jRtSKezbHP4TENEyMR4pKKIuWBNAskxuFTUWlEE5ck/4y8uoF2nWZYFFxdwsgUnk3F2hLdLRusZ7x2BCv50mAtyzodg27awzuOjMzC9g7EOnenRK1uFGzy8HzHNV+0V9uOEYc9Jbds2ddKkzHDjVS9bN2jDNM/Kpj+EpBZj2qeQFZSD+cWsVkVQ7DfIN6zujCUSQgj6Mu1Nt/sd/z2yy4YpIT0CUiadYo0R8lESy6K/UX+F2JVBPgEjwdIQbXuGKQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_awesome-apple-watch&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/f84782d2a2f7ade7af1bf38588d1a76f/fb8a0/191225_awesome-apple-watch.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/f84782d2a2f7ade7af1bf38588d1a76f/1a291/191225_awesome-apple-watch.png 148w,https://blog.holy.kiwi/static/f84782d2a2f7ade7af1bf38588d1a76f/2bc4a/191225_awesome-apple-watch.png 295w,https://blog.holy.kiwi/static/f84782d2a2f7ade7af1bf38588d1a76f/fb8a0/191225_awesome-apple-watch.png 590w,https://blog.holy.kiwi/static/f84782d2a2f7ade7af1bf38588d1a76f/526de/191225_awesome-apple-watch.png 885w,https://blog.holy.kiwi/static/f84782d2a2f7ade7af1bf38588d1a76f/837f2/191225_awesome-apple-watch.png 924w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;awesome-apple-watch 레포지토리&lt;/i&gt;&lt;/p&gt;
&lt;h3 id=&quot;1일-1커밋&quot;&gt;&lt;a href=&quot;#1%EC%9D%BC-1%EC%BB%A4%EB%B0%8B&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1일 1커밋&lt;/h3&gt;
&lt;p&gt;2018년 4월 29일부터 꾸준히 1일 1커밋을 하려고 노력하고 있다. &lt;del&gt;듬성듬성 빠진 잔디도 있지만.&lt;/del&gt; 역시 1일 1커밋을 습관화하다보니 알고리즘 문제를 풀어서 올린다던가 Readme 문서를 고친다거나 하는 쓸데 없는 커밋이 늘어가고 있는 느낌이 있긴 하지만 형식적으로라도 습관화하는게 중요하다고 생각한다. &lt;del&gt;아님 말구&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 25.94458438287154%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAABBElEQVQY05WP20rDQBRF+/+/4ptQjFgqqAgiiKAVtRa1tA+5TZK5ZiaNy9O8+OzAZvaeOSzOninVUJYVRVFy9Eop/nNiHDDGiTzeB2bD4UAfI857QujxomNOKVHqnF29Q7kC5Su2zR5lcnzsMH2NDhUutLQ2x0pOQ2I2juME0+YoS2fM5K0z3G8zrr5OeCrnvFTn3O1OWRVz1moh+Yz3eslncyk5Y28ep40nYAhBAAHjNNpquQVuWxm85SHPeC4zXutzASzkbcmmWfBWXwjshu/2mrX8FW7zB9ThgLIDjYtSU+r3iXEcsMnSSCWXtPgO3WvxlniwpNESopHZjo96Rd7m8AO/dG56pV8+QGEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_commit2018&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/701d9e460359b436a73db46c24729602/fb8a0/191225_commit2018.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/701d9e460359b436a73db46c24729602/1a291/191225_commit2018.png 148w,https://blog.holy.kiwi/static/701d9e460359b436a73db46c24729602/2bc4a/191225_commit2018.png 295w,https://blog.holy.kiwi/static/701d9e460359b436a73db46c24729602/fb8a0/191225_commit2018.png 590w,https://blog.holy.kiwi/static/701d9e460359b436a73db46c24729602/526de/191225_commit2018.png 885w,https://blog.holy.kiwi/static/701d9e460359b436a73db46c24729602/fa2eb/191225_commit2018.png 1180w,https://blog.holy.kiwi/static/701d9e460359b436a73db46c24729602/e7725/191225_commit2018.png 1588w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  

  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 25.91194968553459%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAABG0lEQVQY042Q607CQBSEef8X8TcQhQiJRH9AooZYrJeCMSKt9LbdXmnZwucBX8CTTGZzZjI5Ox2tNUEYEYUKnaSoWBNHCa058J9pGkOel4KKqtrRadsDRaUJM49t4pGUvrx/hAOKXUiUbSlqRdkITlwn6CrE1Z5oPqV4VOGLV2GMocMRPtUCK+jy4PVYJWOmXp/x8gLLHTDbXDLfXvGhhjjRNW76yMztMl13eQtGog15jUa4+ZxT1jnwK3lhEfb5zu6wwxG2GO43fVZqwu26hyWBjuxsf8g6nWIJPwcD3tUtT8ENTjwhrpxzBZ2jBAbSgZcq4qKUr2jyOsMcSvZtQVZralPQtH+oTcZetMrkZLucSipYxjYqi88X/gL4LnTNnnno1AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_commit2019&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/2dc2639a8d6fb0b9f724b0deb4bac435/fb8a0/191225_commit2019.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/2dc2639a8d6fb0b9f724b0deb4bac435/1a291/191225_commit2019.png 148w,https://blog.holy.kiwi/static/2dc2639a8d6fb0b9f724b0deb4bac435/2bc4a/191225_commit2019.png 295w,https://blog.holy.kiwi/static/2dc2639a8d6fb0b9f724b0deb4bac435/fb8a0/191225_commit2019.png 590w,https://blog.holy.kiwi/static/2dc2639a8d6fb0b9f724b0deb4bac435/526de/191225_commit2019.png 885w,https://blog.holy.kiwi/static/2dc2639a8d6fb0b9f724b0deb4bac435/fa2eb/191225_commit2019.png 1180w,https://blog.holy.kiwi/static/2dc2639a8d6fb0b9f724b0deb4bac435/213f9/191225_commit2019.png 1590w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;1일 1커밋 잔디&lt;/i&gt;&lt;/p&gt;
&lt;h3 id=&quot;첫-외주&quot;&gt;&lt;a href=&quot;#%EC%B2%AB-%EC%99%B8%EC%A3%BC&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;첫 외주&lt;/h3&gt;
&lt;p&gt;11월에 동료였던 개발자분이 외주를 소개시켜주셔서 처음으로 외주를 해봤다. 프론트엔드 개발인줄 알았지만 거의 HTML, CSS 위주의 퍼블리싱 일만 해서 좀 힘들었다. 그래도 오랜만에 회사 다니는 느낌이 나서 좋았다. 직원분들이 다 너무 잘해주셔서 즐겁게 일했다.&lt;/p&gt;
&lt;h2 id=&quot;-코딩테스트-면접-경험&quot;&gt;&lt;a href=&quot;#-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%A9%B4%EC%A0%91-%EA%B2%BD%ED%97%98&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;👨‍💻 코딩테스트, 면접 경험&lt;/h2&gt;
&lt;p&gt;국내 IT 대기업인 네카라(네이버, 카카오, 라인)에 한 번 쯤은 가보고 싶어서 3학년인 지금 여러 인턴십을 지원해봤다.&lt;/p&gt;
&lt;h3 id=&quot;2019-카카오-개발자-겨울-인턴십&quot;&gt;&lt;a href=&quot;#2019-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B2%A8%EC%9A%B8-%EC%9D%B8%ED%84%B4%EC%8B%AD&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2019 카카오 개발자 겨울 인턴십&lt;/h3&gt;
&lt;h4 id=&quot;코딩테스트&quot;&gt;&lt;a href=&quot;#%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;코딩테스트&lt;/h4&gt;
&lt;p&gt;코딩테스트를 위해 9월부터 꾸준히 백준 온라인 저지 문제를 풀었다. 카카오 코딩테스트 열흘 전부터는 항상 도서관이나 카페에 가서 카카오 코딩테스트 기출 등 위주로 풀면서 코테를 준비했다. 대부분 고급 알고리즘보다는 시뮬레이션 유형이 많아서 가능성 있을거라 생각했다. 온라인 코테 당일날 카페에 미리 가서 몇문제를 풀면서 머리를 풀었다. 워밍업을 한 덕분에 5문제 중 1,2번은 빠른 시간 내에 풀 수 있었다. 그리고 3번은 히든케이스 하나가 말썽이었다. 4,5번은 효율성 문제였는데 5번은 의외로 솔루션이 번뜩 떠올라서 자바스크립트로 구현했는데 (본인은 코딩테스트에서 주로 자바스크립트를 이용한다.) 정확성만 통과하길래 C언어로 문법을 바꿨더니 효율성까지 통과했다. 역시 4번은 정확성만 통과되었고 효율성은 어려워서 못풀었다. PS 고인물들은 무난하게 5문제 모두 풀 수 있는 난이도였던것 같았다. 내 결과는 5문제 중 3문제 완료였는데 운좋게 커트라인에 걸쳤는지 서류 및 코딩테스트 합격 메일이 왔다. 이런 합격 메일은 거의 처음 받아본거라 기분이 좋았다.&lt;/p&gt;
&lt;h4 id=&quot;기술면접&quot;&gt;&lt;a href=&quot;#%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;기술면접&lt;/h4&gt;
&lt;p&gt;기술면접 준비는 역시 다른 지원자들도 많이 보는 &lt;a href=&quot;https://github.com/yangshun/front-end-interview-handbook&quot;&gt;Front End Interview Handbook&lt;/a&gt;, &lt;a href=&quot;https://github.com/JaeYeopHan/Interview_Question_for_Beginner&quot;&gt;Technical Interview Guidelines for beginners&lt;/a&gt; 등의 레포지토리를 위주로 준비를 많이 했다. 또한, 지금까지 한 프로젝트나 회사에서 한 일들을 위주로 예상질문들에 대한 답변들을 준비했다. 인터넷 세계에 퍼질 글이라서 정확한 세부 내용은 공개하기가 그렇지만 프론트엔드로 지원해서 주로 자바스크립트 위주의 질문이 주를 이루었다. 많은 질문들이 예상한대로 나와서 대부분 잘 대답했다고 느꼈다. 하지만 역시 카카오의 문턱은 높았다. 결과: 불합격.&lt;/p&gt;
&lt;h3 id=&quot;2019-네이버-동계-인턴십&quot;&gt;&lt;a href=&quot;#2019-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%8F%99%EA%B3%84-%EC%9D%B8%ED%84%B4%EC%8B%AD&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2019 네이버 동계 인턴십&lt;/h3&gt;
&lt;h4 id=&quot;기술면접-1&quot;&gt;&lt;a href=&quot;#%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-1&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;기술면접&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;#2019-naver-campus-hackday-winter-%EC%B0%B8%EC%97%AC&quot;&gt;위에서&lt;/a&gt; 말한대로 핵데이 우수참가자로 선정되어 서류는 면제되고 바로 기술면접을 봤다. 시험기간이라 많은 준비는 못했다. 또한, 포지션이 명시되어 있지 않아서 어떤 질문이 올지 감이 안왔었다. 예상대로 질문은 정말 다양했다. 기초 CS 지식부터 백엔드, DB, 프론트엔드, 기술 외의 culture fit 질문 등 1시간 30분동안 탈탈 털렸다. 면접을 너무 못 본 느낌이라 큰 기대하지 않았는데 어떤 내 장점을 발견하셨는지 ㅠㅠ 운 좋게 합격했다. 감사합니당 :)&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 71.6%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIBBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAe1SjQf/xAAXEAADAQAAAAAAAAAAAAAAAAAAARAR/9oACAEBAAEFAhXJ/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAHBAAAAYDAAAAAAAAAAAAAAAAAAEQETGhQVFh/9oACAEBAAE/ITmATloz5oM0n//aAAwDAQACAAMAAAAQ08//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAcEAEAAQQDAAAAAAAAAAAAAAABEQAQIVExQWH/2gAIAQEAAT8QTL1tqbnHcrCagw90IDC3/9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_naver&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/1ca4d94186bb2f9bf12ff231b6c2e8c2/fb8a0/191225_naver.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/1ca4d94186bb2f9bf12ff231b6c2e8c2/1a291/191225_naver.png 148w,https://blog.holy.kiwi/static/1ca4d94186bb2f9bf12ff231b6c2e8c2/2bc4a/191225_naver.png 295w,https://blog.holy.kiwi/static/1ca4d94186bb2f9bf12ff231b6c2e8c2/fb8a0/191225_naver.png 590w,https://blog.holy.kiwi/static/1ca4d94186bb2f9bf12ff231b6c2e8c2/d47ca/191225_naver.png 750w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;2019 네이버 동계 인턴십 합격 메일&lt;/i&gt;&lt;/p&gt;
&lt;h3 id=&quot;카카오-계열사-인턴십&quot;&gt;&lt;a href=&quot;#%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B3%84%EC%97%B4%EC%82%AC-%EC%9D%B8%ED%84%B4%EC%8B%AD&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;카카오 계열사 인턴십&lt;/h3&gt;
&lt;h4 id=&quot;코딩테스트-1&quot;&gt;&lt;a href=&quot;#%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-1&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;코딩테스트&lt;/h4&gt;
&lt;p&gt;출범한지 얼마 안된 카카오 계열사다. 수시채용 인턴십 공고가 뜬 것을 본 후 바로 지원했다. 지원한지 2일 이내에 서류 통과되고 그 다음날 코딩테스트 일정이 잡혔다. 수시채용이라 해커랭크로 혼자 편한 시간에 보면 되는 방식이었다. 시험기간이었지만 빨리 결과를 보고 싶어서 코딩테스트를 응시했다. 역시 해커랭크 코딩테스트라 그런지 들은대로 난이도는 무척 낮았다. 3시간반동안 3문제 푸는것이었는데 1시간만에 풀었고 1시간동안 리팩토링했다. (세 문제 모두 자바스크립트로 풀었다.)&lt;/p&gt;
&lt;h4 id=&quot;화상-기술면접&quot;&gt;&lt;a href=&quot;#%ED%99%94%EC%83%81-%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;화상 기술면접&lt;/h4&gt;
&lt;p&gt;채용프로세스가 무척 빠르게 진행되었다. 코딩테스트 합격 결과는 영업일 5일 이내에 도착했고 1~2일 후 전화로 화상 면접 일정을 잡았다. 화상 면접은 처음이었는데 나름 재밌었다. 바디랭귀지는 거의 없이 음성으로만 소통하다보니 더 집중력이 많이 필요했다. 그래도 지금까지 본 기술면접 중에는 제일 잘 본 느낌이었다. 집에서 화상면접을 진행해서 덜 긴장한 탓도 있는 것 같다. 주로 자바스크립트, 리액트, 그 외 경험에 관한 질문들이었다. 그 후 프로세스는 현장면접이다. 아직 화상 기술면접 결과를 기다리고 있다.&lt;/p&gt;
&lt;h3 id=&quot;기술면접-후-느낀점&quot;&gt;&lt;a href=&quot;#%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-%ED%9B%84-%EB%8A%90%EB%82%80%EC%A0%90&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;기술면접 후 느낀점&lt;/h3&gt;
&lt;p&gt;역시 면접은 많이 경험해보는 것이 승률을 높이는 것에 큰 도움을 주는 걸 느꼈다. 면접을 하면 할수록 면접 스킬이 상승하고 있다는 것을 느꼈고 어떤 방향으로 기술 면접을 준비해야할지 감이 잡혔다.&lt;/p&gt;
&lt;h2 id=&quot;-pt-후-몸무게-증가-체력-상승&quot;&gt;&lt;a href=&quot;#-pt-%ED%9B%84-%EB%AA%B8%EB%AC%B4%EA%B2%8C-%EC%A6%9D%EA%B0%80-%EC%B2%B4%EB%A0%A5-%EC%83%81%EC%8A%B9&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🏃 PT 후 몸무게 증가, 체력 상승&lt;/h2&gt;
&lt;p&gt;9월에 2년만에 다시 운동을 시작했다. 근래에 체력이 많이 떨어졌다는 것을 느꼈기 때문이다. 마침 학교 앞 PT 스튜디오에 12년지기 친구가 트레이너로 일하고 있어서 딱 좋았다. 지인 DC를 받고 학교 다니는 3개월동안 PT와 식단관리를 받았다. 벤치프레스, 스쿼트, 데드리프트, 랫풀다운, 숄더프레스, 브이싯업 등 다양한 운동을 올바른 자세로 배울 수 있는 점이 좋았다. &lt;del&gt;무지 비싸지만.&lt;/del&gt; 그리고 혼자라면 절대 못할 양의 운동을 억지로라도 하니까 매우 고통스럽고 힘들었지만 하고 나면 기분이 좋았다. 그렇게 근력 운동과 런닝 머신 운동을 통해 체력이 좋아진 것을 체감했고 하루 4~5끼 식단을 통해 3개월동안 6~7kg 정도 찌울 수 있었다.&lt;/p&gt;
&lt;h2 id=&quot;️-여행&quot;&gt;&lt;a href=&quot;#%EF%B8%8F-%EC%97%AC%ED%96%89&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✈️ 여행&lt;/h2&gt;
&lt;p&gt;회사에서 돈도 벌었겠다. 모은 돈으로 시간 날 때마다 해외 여행을 다니고 있다. 한살이라도 젊을 때 많이 가야 나중에 후회하지 않을 것 같다.&lt;/p&gt;
&lt;h3 id=&quot;-1월-베트남-다낭-10일&quot;&gt;&lt;a href=&quot;#-1%EC%9B%94-%EB%B2%A0%ED%8A%B8%EB%82%A8-%EB%8B%A4%EB%82%AD-10%EC%9D%BC&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🇻🇳 1월 베트남 다낭 (10일)&lt;/h3&gt;
&lt;p&gt;설날 껴서 휴가 3일 내고 다녀왔다. 곧 군대가는 친구랑 5일 지내고 혼자 5일 지냈다. 혼자 5일 지내는 동안 카페에서 다른 스위스인 디지털노마드 형님을 알게 되어서 좋았다. 역시 겨울에는 동남아시아가 최고다. &lt;del&gt;서울은 너무 추워;&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 99.49409780775717%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAAFbUlEQVQ4yz2Sa1PTZxqH8xG6s916WKWBhCSEhJwgiAJGFPCwHArKoUQoqAsqIOuBQyVUqCMoIHIKClQICASRUIQiEBUpIIFwiIqKtdbZmX3Rzk532k9w9S+d2RfX3PPcM89vrue+H5H24BE+z8mjt62Bx0MdTA7ZsNbXcP1aJc31tVitLTS2tHHpchW11VV0d7TTcOMGd+127n/roLfvLn0Ctu5ebF13EIXEf07D9avYv2lk+n4HC48cOPpuM9zbynBfO9amRi5fqeKfOScpL69gaKCXewN2+vvttHd0c7O9i9ud3fT19nCvvwfRDiHQOdjOd/YWpka6mBzuZejOTb7raaTrZg03aiqpufo15WUlPBju58HoEJPjo0w7R3k4NszjifvMPxnn6dTYRk8UEJ2Io7uZKUcro31W2pqqGb3TwPxIO66RWyyP3+bpyDe01lxkfc7Bu6Vxflya4M2Sk7erT3i9/ITn7mmWXU+Ym3mMqLCkULjUybi9iZGuOsa6a3k00MijQSsrzk7eLTh4Nt2P5/sBfvI4+WH1EevPZnj1woXH42J5ZRHX8iLTrgUezswhctjqmexvYupuPe7hOn523eLXpTb+M9fK+1kbbxcGmXf2MOvsY/35FM9WZ1h74Wb1uZuVNQ9uzypzS26mFhaZmBUCpwdbeOVs5eVEMz9OXue3N3Z+/eFb/utq4ac5G+sfDF1DpCQn0Glr4f17Dy/WFnj9ZoXv55y4V1ysvvTwVDCdcbsQVXxloeZKGc3XLDy0lfN+xspva3f4ZaGNt4LhK1c/rxcH0Ydoqa4q5N3qGP/2PODZjIOYCDVfJEew/vIpb9ZmWVsRZniptAhL0VmulZ3jVuU57HUXeHCrhKmOUiY6K7hvu8ZQeyXhUYF8WZTNw7utzI71cv5kGqfT44gO9qLsbBqv50eZG+v5M7Di4nnKigooPZ/H1Yv5NFecobo0n/KifCzC0orOnyMlK0EwCudSaQlNTQ1E7wunpLiYpNjdhCg/oqLiEtfr6hElph4lYv8hDsXEcPhwIgkJn2FOTSZN4HhWBseyMjGnHyX1qJkguYK42M+IOngAkymUxBQzYeG70Cn+RkJcFJmnLyAKDduJ0WjAGKRll1FDZLieyN0GNCoFOq0Kf5Ufcn8Faq0ajT4Ag16Hyk+Cj8QXjVaPn0zBpk+2YNBpCQreiai8+JQwv1wayvMYqM3n94Uq/rdYzb26AqxXCqgoOUVuthnjDh1KtZzIXUaiw0Px81fjLZXj46tAIlOiUqtR+vsjKjlzjMovc2j+Op++2n8x31OMvfYkhTnJHDPHYbmQTWryIWQqKbtDAjEF6TgQtoO9IUb0egMypRqJXIlYIuFTbwmi4oJsck+kYU6KIf3wfnJSI2m2fMFXeUnkHk+g9vIZMjMSiIoKZ4fw5FCdij1G3QYmo54ggwE/lUawlSH28UWk1QYQs38PuRnxWC1Z3C5Pw91TQlnuEbLMMVzIyyDpyAEMgQFIxV4EKuUboWFCeJhevVGNBj1qjVYwlSPatP2vFOemUVV0nJrCo1wtiBNmeZrEQyYy02I4kR5PVGQom/++BYW3F3qFL8HCwnYG+BGi/rPuDFASbNARoNEgkqu9yc1M5OyJw1hOJ5N5JArLqWT+sS+IpLgIEmP3IpGKEW/bip94Owa5FKO/DKNSwE9G8AcUH85yAjVqRHqjkhPmWLIzEomODCcl1kRtYTopcXvZ7LUFP6UU8fZt+G7fitpHMJR5C/9RSqBMulH/j0yCUbAXRZiCSYo/yL49oZjC9ERHBBEfbWJXkJq/fPIxWzZvQrx1MzKvbai8xWilPuilEgyyD6GSDQwyoefrg0HgD0Ldqu5iPiD4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_danang&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/6d0b07c4c036a2fca71405babb4b0229/fb8a0/191225_danang.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/6d0b07c4c036a2fca71405babb4b0229/1a291/191225_danang.png 148w,https://blog.holy.kiwi/static/6d0b07c4c036a2fca71405babb4b0229/2bc4a/191225_danang.png 295w,https://blog.holy.kiwi/static/6d0b07c4c036a2fca71405babb4b0229/fb8a0/191225_danang.png 590w,https://blog.holy.kiwi/static/6d0b07c4c036a2fca71405babb4b0229/526de/191225_danang.png 885w,https://blog.holy.kiwi/static/6d0b07c4c036a2fca71405babb4b0229/fa2eb/191225_danang.png 1180w,https://blog.holy.kiwi/static/6d0b07c4c036a2fca71405babb4b0229/93fd0/191225_danang.png 1186w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;다낭 용다리&lt;/i&gt;&lt;/p&gt;
&lt;h3 id=&quot;-8월-헝가리-부다페스트-한달살기-28일---&quot;&gt;&lt;a href=&quot;#-8%EC%9B%94-%ED%97%9D%EA%B0%80%EB%A6%AC-%EB%B6%80%EB%8B%A4%ED%8E%98%EC%8A%A4%ED%8A%B8-%ED%95%9C%EB%8B%AC%EC%82%B4%EA%B8%B0-28%EC%9D%BC---&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🇭🇺 8월 헝가리 부다페스트 한달살기 (28일) (+ 🇸🇰, 🇦🇹)&lt;/h3&gt;
&lt;p&gt;7월 31일에 퇴사하고 항상 내가 노래 부르던 한달살기를 드디어 실천했다. 부다페스트로 선택한 이유는 여름이라서 동남아시아는 무조건 싫었고 &lt;a href=&quot;https://nomadlist.com/&quot;&gt;nomadlist&lt;/a&gt;에서 부다페스트가 꽤 상위 랭크에 있었기 때문이다. 역시 동유럽이라서 물가도 괜찮은 편이었고 도시 자체도 무척 예쁘고 이국적이어서 좋은 선택이었다. 한달살기 초반에는 인터넷 속도도 느리고 버스 타는 것도 적응이 안되고 힘들어서 한국으로 돌아가고 싶었지만 적응할수록 떠나는게 아쉬웠다. 도시 자체가 작아서 금방 길이 익숙해지고 마음에 들었다. 트램도 멋졌고 강도 아름답고 밤에 야경 보는 것도 무척 좋았다. 중간에 2박 3일로 슬로바키아, 오스트리아도 잠깐 다녀왔는데 특별한 경험이었다. 주 3~4일은 여행하고 3~4일은 카페에 가서 군돌이 작업 등 개발을 했다. (카페는 &lt;a href=&quot;https://www.google.com/maps/place/California+Coffee+Company/@47.489623,19.0615672,17.43z/data=!4m8!1m2!2m1!1scalifornia+coffee+company!3m4!1s0x0:0xeff03b72e92b66a8!8m2!3d47.4901447!4d19.0623951&quot;&gt;California Coffee Company&lt;/a&gt;었고 일하기 좋은 카페로 추천!) 제일 궁금할 부분인 비용은 항공, 숙박, 슬로바키아, 오스트리아 간 것까지 다 포함해서 총 250만원 정도 지출했다. 요리를 해먹거나 항공권 등을 충분히 더 싸게 구하면 더 줄일 수 있을 것 같다.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 99.83136593591905%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAAClUlEQVQ4y61UTWsUQRDtH2Jidr57vnYyWdddshs1uxvXuEIiITEEI14CZj0JuQRzyEUUPHgUUUGJoIIfeFEQL4IHPUgE8aCgB3/Is6pnZjNZk7CChzfdXVP1+lVXdwnrsA1z2DoQg/hkEHs5523ZnMdBIPYj+VeiHuFBCvud7RFnX/xFmA/sX9sjCZlTkLuhSUjdpfkOscgr0obMPcgSIknBnuHCM30aPSKitelhYnxSkfYIe4GEqgzgUWA+PSZzOaBAZJqL2JQIiFTqPnwaAyuAoydq2VeYFGyQKofSOhFEcMloDCebGKla+5CJRhxidX4aWze7mD1eQ8WlDShVlwVQrFkgfxqFR7uHZgAm9skhpnQCskW085gTYnG6hRd31vHh0Sp+vL+F39sP8PHZBt7e6+L1w00sd6ZQkhGqYYxaFEPMNhuYazXUwYa6g7LlY4zOpuwWUY/K6M418fPlCj7dXcK3pwv4+mQGX7YW8fn+Er4/v4i15TNoH62jWa6Q8jqES+dSpLPgSmqUGoMLE1AqxpCNk+VRbJ4fx8a5OrZvt/Hr8STeXT+NV1c7eHOtg/lmjTIKENmBEiFkWsGs0lwcj2xcHEmqI1Lrah5OVaq4stDCjUttXD7bwIWpCazMtNGqHVPF46PzCYI/vGACPzX6WjIGdE34PIumi5LtY5TIY8qmZHk4QusiraMcFKEKMBIDE3DVGJ7Oo0Pqk0oqcoOL5SmiPBnPQ9o0pP/CIbmcdk+RwVVPyfVMtVRFyzLgwFKqsKiOJIljYclL4UtccFRQ9pMDM7Uy/ZfZWb3KiOYyvdBS+cmdbpPB7msCZu5t24V8I3B2vWEr/5YzGPSWMyS2fKNw+t53gv5mIgbtxAN37P9N+AdM0WXcVpUxvgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_budapest&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/813b1475b75a5000036ec8b5d7cc8035/fb8a0/191225_budapest.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/813b1475b75a5000036ec8b5d7cc8035/1a291/191225_budapest.png 148w,https://blog.holy.kiwi/static/813b1475b75a5000036ec8b5d7cc8035/2bc4a/191225_budapest.png 295w,https://blog.holy.kiwi/static/813b1475b75a5000036ec8b5d7cc8035/fb8a0/191225_budapest.png 590w,https://blog.holy.kiwi/static/813b1475b75a5000036ec8b5d7cc8035/526de/191225_budapest.png 885w,https://blog.holy.kiwi/static/813b1475b75a5000036ec8b5d7cc8035/fa2eb/191225_budapest.png 1180w,https://blog.holy.kiwi/static/813b1475b75a5000036ec8b5d7cc8035/93fd0/191225_budapest.png 1186w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;부다페스트 국회의사당&lt;/i&gt;&lt;/p&gt;
&lt;h3 id=&quot;-12월-태국-치앙마이-10일---진행중&quot;&gt;&lt;a href=&quot;#-12%EC%9B%94-%ED%83%9C%EA%B5%AD-%EC%B9%98%EC%95%99%EB%A7%88%EC%9D%B4-10%EC%9D%BC---%EC%A7%84%ED%96%89%EC%A4%91&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🇹🇭 12월 태국 치앙마이 (10일) - 진행중&lt;/h3&gt;
&lt;p&gt;현재 나는 어제(크리스마스 이브) 태국 치앙마이에 도착했다. 원래 지원한 인턴십이 다 떨어지면 1월에 치앙마이 한달살기, 2월에 발리 한달살기를 하려고 했는데 생각지도 않게 네이버에서 불러주셔서 첫출근 전까지 크리스마스와 새해는 치앙마이에서 보내기로 했다. 새해 카운트다운을 외국에서 하는 것이 내 버킷리스트이기도 했다. 아직 태국이란 나라에 적응중이라 힘들지만 많이 힘들어야 좋은 추억이 되는 것 같다. &lt;del&gt;하하 :)&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgX/xAAWAQEBAQAAAAAAAAAAAAAAAAADAAH/2gAMAwEAAhADEAAAAUURoWIJDT//xAAcEAEAAgEFAAAAAAAAAAAAAAABAAIUAwQSEyH/2gAIAQEAAQUCyLs7WZFSHJNpX10Cz//EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8BVpp//8QAGBEAAgMAAAAAAAAAAAAAAAAAAAECESH/2gAIAQIBAT8BlSRh/8QAHBAAAgICAwAAAAAAAAAAAAAAACEBEQIxEjJB/9oACAEBAAY/AnrwyR1sUGfOtFwj/8QAHBAAAgICAwAAAAAAAAAAAAAAAREAITFRQYHB/9oACAEBAAE/ITtHYagvKQvYKua4IV3cQRgosw9aB4c//9oADAMBAAIAAwAAABDHD//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxC2kP/EABgRAAIDAAAAAAAAAAAAAAAAAAABESFB/9oACAECAQE/EGoE6P/EABwQAQEAAgIDAAAAAAAAAAAAAAERACExUWFxgf/aAAgBAQABPxB5Ijt2JxZjB2NvUdYTsgUMmim/OHyAJUGDeI8sbvWNn8Iz/9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;191225_thai&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/bf02087344c70824fcdaa93e48d546f6/fb8a0/191225_thai.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/bf02087344c70824fcdaa93e48d546f6/1a291/191225_thai.png 148w,https://blog.holy.kiwi/static/bf02087344c70824fcdaa93e48d546f6/2bc4a/191225_thai.png 295w,https://blog.holy.kiwi/static/bf02087344c70824fcdaa93e48d546f6/fb8a0/191225_thai.png 590w,https://blog.holy.kiwi/static/bf02087344c70824fcdaa93e48d546f6/526de/191225_thai.png 885w,https://blog.holy.kiwi/static/bf02087344c70824fcdaa93e48d546f6/fa2eb/191225_thai.png 1180w,https://blog.holy.kiwi/static/bf02087344c70824fcdaa93e48d546f6/275c2/191225_thai.png 1280w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;현재 치앙마이 카페 글 마무리 순간; 쓰는데 5시간 걸렸다 으아&lt;/i&gt;&lt;/p&gt;
&lt;h2 id=&quot;🥝-2019년을-보내며&quot;&gt;&lt;a href=&quot;#%F0%9F%A5%9D-2019%EB%85%84%EC%9D%84-%EB%B3%B4%EB%82%B4%EB%A9%B0&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🥝 2019년을 보내며&lt;/h2&gt;
&lt;h3 id=&quot;요약&quot;&gt;&lt;a href=&quot;#%EC%9A%94%EC%95%BD&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;요약&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1년 8개월 회사 다니고 퇴사함&lt;/li&gt;
&lt;li&gt;3학년 복학함&lt;/li&gt;
&lt;li&gt;군돌이 여러 기능 추가했고 다운로드 수 많이 늘어남&lt;/li&gt;
&lt;li&gt;교내 소프트웨어 공모전 학장상 수상함&lt;/li&gt;
&lt;li&gt;네이버 핵데이 참여함&lt;/li&gt;
&lt;li&gt;기술면접 세번 봄&lt;/li&gt;
&lt;li&gt;5개국 다녀왔고 한 도시에서 한달 정도 지내봄&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;올해 별로 한 것 없이 지나갔다고 느꼈는데 막상 적어보니 뭔가 많다. 학교 공부하고 &lt;del&gt;별로 하지도 않았지만&lt;/del&gt; 군돌이 이런저런 기능 추가하고 이것저것 뭐든지 하느라 막상 내가 공부하고 싶은 기술에 대한 깊은 공부를 하는 시간이 좀 부족했던 것 같다. 내년에는 내가 정한 방향인 프론트엔드 기술을 더 깊게 공부하고 싶고 그걸 바탕으로 더 재밌는 토이 프로젝트들 많이 하고 싶다. 🥝&lt;/p&gt;
                &lt;div style=&quot;margin-top=55px; font-style: italic;&quot;&gt;(This is an article posted to my blog at blog.holy.kiwi. You can read it online by &lt;a href=&quot;https://blog.holy.kiwi/gen/2019-developer-review-christmas-chiangmai/&quot;&gt;clicking here&lt;/a&gt;.)&lt;/div&gt;
              </content:encoded></item><item><title><![CDATA[🗓 이제야 쓰는 2018년 회고]]></title><description><![CDATA[2018년 회고]]></description><link>https://blog.holy.kiwi/gen/190319/</link><guid isPermaLink="false">https://blog.holy.kiwi/gen/190319/</guid><content:encoded>&lt;blockquote&gt;
&lt;p&gt;갑자기 2018년 회고를 쓰고 싶어서 씁니다. 지금 안쓰면 2018년을 기억할 수 없을 것 같아서. 기억에서 버리기엔 너무 소중한 시간들이었습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;-첫-회사에서-첫-개발자-생활&quot;&gt;&lt;a href=&quot;#-%EC%B2%AB-%ED%9A%8C%EC%82%AC%EC%97%90%EC%84%9C-%EC%B2%AB-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%83%9D%ED%99%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🎡 첫 회사에서 첫 개발자 생활&lt;/h2&gt;
&lt;h3 id=&quot;회사에-들어간-계기&quot;&gt;&lt;a href=&quot;#%ED%9A%8C%EC%82%AC%EC%97%90-%EB%93%A4%EC%96%B4%EA%B0%84-%EA%B3%84%EA%B8%B0&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;회사에 들어간 계기&lt;/h3&gt;
&lt;p&gt;대학교를 졸업하기 전에 회사에 다니는 많은 멋있는 개발자 친구들을 보면서 나도 회사에 다녀보면서 직접 개발을 하고 많은 것들을 경험하고 배워보고 싶었다. 내 장점은 추진력이었다. GOP에 근무할 때 사지방(사이버지식정보방)에서 &lt;a href=&quot;https://www.rocketpunch.com/&quot;&gt;로켓펀치&lt;/a&gt;를 훑어보면서 갈만한 회사가 없나 살펴보고 많이 뽑는 개발자 포지션과 자격 요건 등을 연구했다. 핫하게 뜨고 있는 React가 가장 눈에 띄었고 React 관련 자료들을 찾아 인쇄해서 공부했다. 그리고 틈틈이 휴가 나와서 실습을 해보면서 React 관련 기술을 익혔다. 그 후, 예전에 만들어놓았던 개인 프로젝트들을 긁어모아서 보잘것없는 포트폴리오를 만들어서 수십 군데의 스타트업에 직접 이메일을 돌렸다. 수십 군데 중 네 군데에서 면접 연락이 와서 말년 휴가때, 월화수목 4일 빡빡하게 면접 일정을 잡았다. 그 중 현재 다니고 있는 회사, &lt;a href=&quot;https://www.finda.co.kr&quot;&gt;핀다&lt;/a&gt;가 가장 배울 점이 많아 보였고 체계가 잡혀보였다. 그래서 2017년 11월에 육군 병장으로 만기 전역한 후, 현재 다니고 있는 회사에 소프트웨어 엔지니어로 합류하게 되었다.&lt;/p&gt;
&lt;h3 id=&quot;react-프론트엔드-그리고-안드로이드&quot;&gt;&lt;a href=&quot;#react-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;React 프론트엔드 그리고 안드로이드&lt;/h3&gt;
&lt;p&gt;처음에는 웹 프론트엔드 개발 (React, TypeScript) 포지션으로 일을 시작했다. 아무래도 개발자로써의 첫 직장생활이다보니 Git으로 협업하는 것도 익숙하지 않았고 이렇게 매일매일 풀타임으로 코딩을 하는 경험은 많이 없어 회사의 레거시 코드들을 보면서 구조와 내용들을 파악하는 것이 무척 어려웠다. 하지만 CTO님과 같은 개발자 선배님 동료분들이 많은 도움을 주셨고 코드를 계속 보게 되니까 많이 익숙해졌다. 그렇게 1~2개월 웹 프론트엔드 관련 이슈들을 처리하면서 업무에 적응하고 있었다. &lt;del&gt;많은 스타트업이 그렇듯이 리소스 부족의 문제로&lt;/del&gt; 회사에서 개발하고 있던 안드로이드 애플리케이션 막바지 개발 작업을 하게 되었다. 웹뷰 기반의 앱이어서 네이티브 소스코드는 그렇게 많지는 않았지만 새로운 프로젝트에 다시 적응해야하니 당황했었다. 하지만 자바로 안드로이드 개인 프로젝트를 한 경험도 있었고 나는 초짜개발자였기 때문에 최대한 많은 분야의 업무들을 넓게 해보고 싶었다. 그래서 즐거운 마음으로 안드로이드 앱 프로젝트 이슈들을 재밌게 처리했고 직접 구글 플레이에 베타버전을 출시하는 갚진 경험을 하게 되었다. &lt;/p&gt;
&lt;h3 id=&quot;nodejs-백엔드&quot;&gt;&lt;a href=&quot;#nodejs-%EB%B0%B1%EC%97%94%EB%93%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Node.js 백엔드&lt;/h3&gt;
&lt;p&gt;안드로이드 앱을 출시하고 나서는 웹 프론트엔드 이슈를 주로 처리하면서 백엔드단인 node.js(express)도 맡겨주셔서 간간히 처리했다. 2018년 4월 정도 회사생활이 많이 적응했을 때 쯤 또 하나의 새로운 프로젝트를 하게 되었다. 대형 포털과 제휴를 맺게 되어 관련해서 검색 키워드를 처리하는 API 개발 부분을 맡겨주셨다. 이것저것 많이 넓게 하는 느낌은 있었지만 많은 경험을 해보고 싶었기 때문에 좋은 기회라고 생각해서 열심히 했다. 해당 프로젝트를 하면서 요구사항이 점점 복잡해지고 검색 키워드가 점점 많아지면서 머리는 아팠지만 런칭하고 난 후, 내가 개발한 API가 대형 포털에서 돌아가는 것을 보고 보람을 많이 느꼈다.&lt;/p&gt;
&lt;h3 id=&quot;ios-스위프트까지&quot;&gt;&lt;a href=&quot;#ios-%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8%EA%B9%8C%EC%A7%80&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;iOS 스위프트까지&lt;/h3&gt;
&lt;p&gt;안드로이드 앱을 출시했으니 iOS 앱도 만들어야되지 않겠는가. 2018년 6월 즈음 합류한 시카고 대학원에 재학중인 개발자 형과 함께 iOS 앱을 백지에서 시작하게 되었다. 웹뷰 기반의 앱이고 기존 안드로이드 앱을 참고해서 개발하면 되어서 많이 어렵지는 않은 프로젝트였지만 iOS 플랫폼은 처음이었고 Swift 언어도 생소해서 막막했다. 하지만 열심히 스터디해가면서 영혼을 갈아넣어 2개월 정도 만에 출시했다.&lt;/p&gt;
&lt;h3 id=&quot;다시-안드로이드&quot;&gt;&lt;a href=&quot;#%EB%8B%A4%EC%8B%9C-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;다시 안드로이드&lt;/h3&gt;
&lt;p&gt;iOS 앱을 출시한 후, 백엔드 이슈를 처리하며 즐겁게 회사를 다니던 도중 또 하나의 프로젝트를 하게 된다. 안드로이드에서 차별화된 기능을 개발하기 위해 스크래핑 업체와 제휴해서 특정 데이터를 가져오는 것과 공인인증서, 보안키패드 관련 모듈을 연동하는 것이었다. 개인 프로젝트로는 쉽게 할 수 없는 것들이라 직접 이런 것들을 할 수 있었던 것에 대해서 정말 감사했다. 즐겁게 외부 업체와 미팅도 하고 관련 문서도 열심히 읽으면서 삽질을 했다. 현재는 오로지 백엔드 이슈만 담당하고 있지만 안드로이드 개발을 많이 할 수 있었던 것에 대해서 감사하게 생각하고 있다.&lt;/p&gt;
&lt;h2 id=&quot;-개발자-컨퍼런스&quot;&gt;&lt;a href=&quot;#-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%BB%A8%ED%8D%BC%EB%9F%B0%EC%8A%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;👑 개발자 컨퍼런스&lt;/h2&gt;
&lt;p&gt;회사가 코엑스 근처에 있어서 개발 관련 컨퍼런스들을 쉽게 참여할 수 있어서 좋았다. 4월에는 동료분들과 같이 AWS SUMMIT 2018에 참여해서 DevOps에 관련해서 궁금하거나 알고 싶었던 세션에 대해 자유롭게 참여했고 10월에는 네이버 개발자 컨퍼런스 DEVIEW에 참여해서 자바스크립트 관련 세션들을 들었다. 한국에 정말 멋있는 개발자분들이 많다는 것을 몸소 느낄 수 있었던 컨퍼런스였다. 동기부여와 자극도 충분히 되어서 컨퍼런스에 갈 기회가 있으면 자주 가고 싶다.&lt;/p&gt;
&lt;h2 id=&quot;-여러-사이드-프로젝트들&quot;&gt;&lt;a href=&quot;#-%EC%97%AC%EB%9F%AC-%EC%82%AC%EC%9D%B4%EB%93%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%93%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🦁 여러 사이드 프로젝트들&lt;/h2&gt;
&lt;p&gt;나는 코딩을 정말 좋아한다. 그래서 회사 업무로써의 개발 말고도 개인 프로젝트로 뭔가를 많이 했었다. &lt;/p&gt;
&lt;h3 id=&quot;네뷸러스-dapp-개발&quot;&gt;&lt;a href=&quot;#%EB%84%A4%EB%B7%B8%EB%9F%AC%EC%8A%A4-dapp-%EA%B0%9C%EB%B0%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;네뷸러스 DApp 개발&lt;/h3&gt;
&lt;p&gt;네뷸러스는 중국의 퍼블릭 블록체인이다. 2017년말, 2018년초에 블록체인(암호화폐) 열풍을 맞아서 블록체인에 한창 관심이 있을 때 쯤에 네뷸러스를 알게 되었다. 이더리움, EOS와 마찬가지로 DApp(탈중앙화 애플리케이션)을 개발할 수 있는 플랫폼 종류의 블록체인이다. 많은 플랫폼 블록체인 중에서 네뷸러스가 관심 있었던 것은 우선 로고가 이뻤고 자바스크립트, 타입스크립트를 사용해서 DApp을 개발할 수 있는 점이었다. 또한, Developer Incentive Program이라고 해서 네뷸러스로 DApp을 개발하기만 하면 상금을 준다는 것에 이끌렸다. (당시 금액으로는 100만원 이상이었다. 현재는 많이 떨어졌지만) 그래서 DIP 기간동안 &lt;a href=&quot;http://github.com/738/nebulas-voting&quot;&gt;Votestagram&lt;/a&gt;, &lt;a href=&quot;https://github.com/738/nebulas-fortunecookie&quot;&gt;Fortune Cookie&lt;/a&gt;, &lt;a href=&quot;https://github.com/738/nebulas-addressbook&quot;&gt;AddressBook&lt;/a&gt; 세 개의 DApp을 개발했다. DApp 개발을 계기로 3개월동안 네뷸러스 대사로 활동하면서 네뷸러스 깃헙에서 활동도 하고, 백서 검수 활동도 하는 등 뜻깊은 경험을 했다. 블록체인에 종사하는 좋은 사람들도 많이 알게된 것도 좋았다.&lt;/p&gt;
&lt;h3 id=&quot;inko-자바스크립트-오픈소스-라이브러리-개발&quot;&gt;&lt;a href=&quot;#inko-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EA%B0%9C%EB%B0%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://inko.js.org&quot;&gt;Inko&lt;/a&gt; 자바스크립트 오픈소스 라이브러리 개발&lt;/h3&gt;
&lt;p&gt;네이버나 구글 같은 검색엔진을 사용할 때, 한글로 쳐야할 검색어를 영어로 잘못 친 경험은 누구나 있을 것이다. 그리고 잘못 친 영타를 바로 한글로 잡아줬던 기억도 같이 있을 것이다. 바로 이 기능을 자바스크립트 오픈소스로 개발하고 싶었다. 자바스크립트로 영타를 한글로, 한타를 영어로 변환하는 함수 두 가지를 만들고 NPM에 &lt;a href=&quot;https://npmjs.com/package/inko&quot;&gt;inko&lt;/a&gt;라는 이름을 가지고 배포를 했다. (이름의 유래는 “english to korea” -&gt; “inko” 이다.) 내 첫 오픈소스 프로젝트이기도 하고 다른 분들도 풀리퀘스트를 통해 프로젝트에 참여해주시고 그래서 나에게 정말 의미있는 프로젝트가 되었다.&lt;/p&gt;
&lt;h3 id=&quot;react-native-군돌이-앱-개발&quot;&gt;&lt;a href=&quot;#react-native-%EA%B5%B0%EB%8F%8C%EC%9D%B4-%EC%95%B1-%EA%B0%9C%EB%B0%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;React Native &lt;a href=&quot;http://onelink.to/goondori&quot;&gt;군돌이&lt;/a&gt; 앱 개발&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.holy.kiwi/js/190127/&quot;&gt;이전 포스트글&lt;/a&gt;에서 썼듯이 내가 개인프로젝트로 처음 출시한 앱이다. React Native로 빌드했고 많은 유저들이 사용하고 있어서 가장 신경을 많이 쓰고 있는 프로젝트이다. 앞으로도 계속 기능 추가, 관리를 이어갈 것이고 계속 잘되었으면 좋겠다.&lt;/p&gt;
&lt;h2 id=&quot;-1일-1커밋&quot;&gt;&lt;a href=&quot;#-1%EC%9D%BC-1%EC%BB%A4%EB%B0%8B&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🐙 1일 1커밋&lt;/h2&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://blog.holy.kiwi/static/54cd65ce9c8e74da21513842a1b89dc8/0d55f/190319_github.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 28.662420382165603%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAABT0lEQVQY022QW0/bQBCF8///B1KBliKk8oiQikjKJVyScIkoTXFiB6/jy8a79sZOPsYuvKDO6mh2ZmfOzJ6OHwT4foDnTVuvlGp9gyRJaWwj57NtNhvSNGMRJ2SZZrGIsbags16v0VrjnMMYwzK32KIgLyzG2rbIuRWrVUVRlpSlE5RUlcRSZ0xTY+VeUgtXp0nqZd4mLr0Tfv4+ZJL1GEUndJ+PuJ0dMdV9XiT3J+kR6AEvaU/iLpPklNH8mL/pKX7+2HyFTrNVppdCqvk12+V8vsXF/AuDcJdLf5uh+spNuMP16zYP0Q/uoj3BNwZqv30bxwcy/DuhGf8jrGrRwgihED8nQ/rzM2m8YpoNGKs+gUxWZsSrQEmTMveCO7xsiKeveIrPeAy7FKv0fcOyJlpWLPKaOIfMQKTBug/1/4/CVqKrExkmzFSIKyvRsOYNkJHBe14vZKIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;190319_github&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/54cd65ce9c8e74da21513842a1b89dc8/fb8a0/190319_github.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/54cd65ce9c8e74da21513842a1b89dc8/1a291/190319_github.png 148w,https://blog.holy.kiwi/static/54cd65ce9c8e74da21513842a1b89dc8/2bc4a/190319_github.png 295w,https://blog.holy.kiwi/static/54cd65ce9c8e74da21513842a1b89dc8/fb8a0/190319_github.png 590w,https://blog.holy.kiwi/static/54cd65ce9c8e74da21513842a1b89dc8/526de/190319_github.png 885w,https://blog.holy.kiwi/static/54cd65ce9c8e74da21513842a1b89dc8/fa2eb/190319_github.png 1180w,https://blog.holy.kiwi/static/54cd65ce9c8e74da21513842a1b89dc8/0d55f/190319_github.png 1256w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;2018년 4월 29일부터 1일 1커밋을 해오고 있다. (모두 다 채운건 아니지만 거의 다 채웠다.) 이제 습관적으로 뭐라도 깃헙에 커밋하고 있다. 오픈소스 프로젝트에 이슈나 풀리퀘스트를 하거나 BOJ 풀이, 사소한 개인 프로젝트 등을 주로 커밋하고 있다.&lt;/p&gt;
&lt;h2 id=&quot;-한-해동안-느낀-점&quot;&gt;&lt;a href=&quot;#-%ED%95%9C-%ED%95%B4%EB%8F%99%EC%95%88-%EB%8A%90%EB%82%80-%EC%A0%90&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;😶 한 해동안 느낀 점&lt;/h2&gt;
&lt;p&gt;지난 1년동안 개발자로써의 첫 회사 생활을 통해 정말 많은 것들을 하면서 Jira나 Confluence 같은 협업 툴이라던지 MVC 패턴이라던지 주변 동료분들에게 학교에서 배울 수 없는 것들을 배웠다. 그리고 이벤트 트래킹, 퍼널, 리텐션 등 스타트업에서 데이터 분석은 어떻게 하는지에 대해서도 알 수 있었다. 만약 학교에 3학년으로 복학해서 공부만 했더라면 이만큼 성장하지 못했을것이다. 또한, 회사에 다니면서 주말 혹은 퇴근 후의 시간에 개인 프로젝트를 하면서도 회사에서 사용하지 않는 기술들을 스터디하고 직접 해보면서 실력을 성장시킬 수 있었고 결과물이 나오면 보람을 느낄 수 있었다. 2018년 참 알차게 보낸 것 같아 기분이 좋다.&lt;/p&gt;
&lt;h2 id=&quot;-앞으로-올해에는&quot;&gt;&lt;a href=&quot;#-%EC%95%9E%EC%9C%BC%EB%A1%9C-%EC%98%AC%ED%95%B4%EC%97%90%EB%8A%94&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🛫 앞으로 올해에는?&lt;/h2&gt;
&lt;p&gt;올해는 3학년으로 복학을 했고 1학기동안에는 회사와 병행을 하기로 했다. 원래는 학교만 열심히 다니려고 했지만 지금 다니고 있는 회사에 좋은 사람들과 계속 일하고 싶어서 그만두기가 뭔가 아쉬웠다. 그래서 1학기만 더 일하고 나머지 학기에 더 학업에 열중하려고 한다. 올해 목표는 자바스크립트를 깊이 파는 것이다. 지난 1년동안 여러 포지션의 업무를 해보면서 모바일 네이티브보다는 자바스크립트가 더 나에게 맞는 것을 느꼈다. 그래서 JS를 더 파보려고 한다. 또 React Native 앱을 여러가지 만들고 싶고 군돌이도 계속 유지/보수, 기능 추가할 것이다. 결론, 학점도 잘받고 싶고 개인 프로젝트도 많이 하고 싶고 다 잘하고 싶다. 올해도 열심히 살아야지. 🥝&lt;/p&gt;
                &lt;div style=&quot;margin-top=55px; font-style: italic;&quot;&gt;(This is an article posted to my blog at blog.holy.kiwi. You can read it online by &lt;a href=&quot;https://blog.holy.kiwi/gen/190319/&quot;&gt;clicking here&lt;/a&gt;.)&lt;/div&gt;
              </content:encoded></item><item><title><![CDATA[📘 [번역] NPM의 중첩된 종속성]]></title><description><![CDATA[Nested Dependencies 번역 글입니다. NPM이 가진 Nested Dependencies라는 특성에 대해 알아봅시다.]]></description><link>https://blog.holy.kiwi/translate/nested-dependencies/</link><guid isPermaLink="false">https://blog.holy.kiwi/translate/nested-dependencies/</guid><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이번 포스트는 NPM(Node Package Manager)이 다른 언어의 패키지 매니저와는 다른 특징인 Nested Dependencies에 대해 다루는 글을 번역한 글입니다. &lt;a href=&quot;https://maxogden.com/nested-dependencies.html&quot;&gt;원문: Nested Dependencies&lt;/a&gt;입니다. (첫번역글이라 오역이 있을 수 있습니다.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;-중첩된-종속성과-평평한-종속성-nested-dependencies-and-flat-dependencies&quot;&gt;&lt;a href=&quot;#-%EC%A4%91%EC%B2%A9%EB%90%9C-%EC%A2%85%EC%86%8D%EC%84%B1%EA%B3%BC-%ED%8F%89%ED%8F%89%ED%95%9C-%EC%A2%85%EC%86%8D%EC%84%B1-nested-dependencies-and-flat-dependencies&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;✌ 중첩된 종속성과 평평한 종속성 (Nested Dependencies and Flat Dependencies)&lt;/h2&gt;
&lt;p&gt;오늘날 많은 패키지 매니저들이 있지만, 기본적으로 중첩된 종속성(Nested Dependencies)으로 작동하도록 설계된 패키지 매니저는 npm 밖에 없다. (적어도 내가 알기에는)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://maxogden.com/media/nested-vs-flat-deps.png&quot; alt=&quot;nested-vs-flat-deps&quot;&gt;&lt;/p&gt;
&lt;p&gt;위 다이어그램에서 &lt;code class=&quot;language-text&quot;&gt;deps&lt;/code&gt; 컨테이너들은 종속성의 &lt;em&gt;격리된&lt;/em&gt; 집합을 나타낸다. 대부분의 패키지 매니저들은 모든 종속성에 대해서 하나의 ‘네임스페이스’를 갖는다. 나는 이 상태를 ‘flat(평평한)’ 이라고 부른다. 왜냐하면 종속성을 풀 때 오직 한 단계의 검색 용이성을 가진다는 것을 의미하기 때문이다. 그것은 앱 전체에서 ‘foo’ 라는 이름을 가진 종속성이 하나만 있다는 것을 의미한다.&lt;/p&gt;
&lt;h2 id=&quot;🥙-평평한-종속성-flat-dependencies&quot;&gt;&lt;a href=&quot;#%F0%9F%A5%99-%ED%8F%89%ED%8F%89%ED%95%9C-%EC%A2%85%EC%86%8D%EC%84%B1-flat-dependencies&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🥙 평평한 종속성 (Flat Dependencies)&lt;/h2&gt;
&lt;p&gt;평평한 종속성 시스템에서 종속성을 푸는 작업이 어떻게 일어나는지에 대해 알아보기 위해 예제를 살펴보도록 하자.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://maxogden.com/media/flat-deps.png&quot; alt=&quot;flat-deps&quot;&gt;&lt;/p&gt;
&lt;p&gt;이 예제에는 세 개의 종속성이 있다. 검정색 선들은 ‘의존’ 관계를 의미한다. 즉, 우리 앱은 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;b&lt;/code&gt;, 그리고 &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;를 의존하고 있고, &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;는 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;를 의존하고 있다. 우리 앱과 &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;는 모두 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;를 의존하고 있다.&lt;/p&gt;
&lt;p&gt;종속성이 평평하기 때문에 (우리 앱 전체에 오직 하나의 복사본만 가지고 있다는 것을 의미함) 우리 앱과 &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;가 모두 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;의 &lt;em&gt;호환되는 버전&lt;/em&gt;에 의존하도록 해야한다는 것을 의미한다. 만약 우리가 &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;를 새로운 버전으로 업그레이드하고 싶다면, 그러나 새 버전이 우리 앱과 의존하고 있는 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;와 호환되지 않는 버전의 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;로 업그레이드한다면, 종속성 충돌이 발생한다. 이 현상은 “DLL 지옥” (Windows) 또는 더 일반적으로 “종속성 지옥” 이라고 한다.&lt;/p&gt;
&lt;h2 id=&quot;-중첩된-종속성-nested-dependencies&quot;&gt;&lt;a href=&quot;#-%EC%A4%91%EC%B2%A9%EB%90%9C-%EC%A2%85%EC%86%8D%EC%84%B1-nested-dependencies&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🐦 중첩된 종속성 (Nested Dependencies)&lt;/h2&gt;
&lt;p&gt;이번에는 중첩된 종속성 시스템의 같은 예제를 살펴보자.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://maxogden.com/media/nested-deps.png&quot; alt=&quot;nested-deps&quot;&gt;&lt;/p&gt;
&lt;p&gt;여기서는 한 단계의 종속성이 아니라 여러 단계의 종속성을 가지고 있다. &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;와 &lt;code class=&quot;language-text&quot;&gt;b&lt;/code&gt;가 종속성을 가지고 있지 않다고 가정하자. 우리 앱과 &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;는 모두 여전히 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;에 의존하고 있다.&lt;/p&gt;
&lt;p&gt;중첩된 종속성에서는 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;의 두 복사본을 가지고 있다. 우리 앱이 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;의 버전 1이 필요하고 &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;가 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;의 버전 2가 필요하다면 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;의 두 버전을 모두 설치한다. &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;의 종속성들이 &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;에게만 이용 가능하고, 어떤 것도 그것들에 접근할 수 없다. 추가적으로, 우리 앱과 &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;가 모두 &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;와 호환되는 버전에 의존한다는 것이 드러난다면, &lt;code class=&quot;language-text&quot;&gt;c&amp;#39;s deps&lt;/code&gt; 폴더를 생성할 필요가 없다. 이 경우에는 평평한 종속성처럼 보일 것이다. (이것이 &lt;code class=&quot;language-text&quot;&gt;npm dedupe&lt;/code&gt;가 동작하는 방법이다.)&lt;/p&gt;
&lt;h2 id=&quot;-장점과-단점&quot;&gt;&lt;a href=&quot;#-%EC%9E%A5%EC%A0%90%EA%B3%BC-%EB%8B%A8%EC%A0%90&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🔖 장점과 단점&lt;/h2&gt;
&lt;h3 id=&quot;평평한-종속성-flat-dependencies&quot;&gt;&lt;a href=&quot;#%ED%8F%89%ED%8F%89%ED%95%9C-%EC%A2%85%EC%86%8D%EC%84%B1-flat-dependencies&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;평평한 종속성 (Flat Dependencies)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;두 가지 설계 중 더 단순하다. 얼마나 복잡한지를 결정하는 것은 사용자에게 달려있다.&lt;/li&gt;
&lt;li&gt;종속성 충돌이 일어날 수 있다. (a.k.a 종속성 지옥)&lt;/li&gt;
&lt;li&gt;종속성을 독립적으로 불러올 수 없는 언어의 유일한 옵션이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;중첩된-종속성-nested-dependencies&quot;&gt;&lt;a href=&quot;#%EC%A4%91%EC%B2%A9%EB%90%9C-%EC%A2%85%EC%86%8D%EC%84%B1-nested-dependencies&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;중첩된 종속성 (Nested Dependencies)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;종속성 충돌이 일어나지 않는다.&lt;/li&gt;
&lt;li&gt;작고 고립된 모듈의 사용을 권장한다.&lt;/li&gt;
&lt;li&gt;더 복잡하다.&lt;/li&gt;
&lt;li&gt;서로의 종속성을 격리하기 위해 1급 객체 범위 지정을 지원하는 자바스크립트 같은 언어에 좋다.&lt;/li&gt;
&lt;li&gt;필요하다면 종속성의 여러 복사본을 설치한다. 즉, 더 많은 디스크 공간을 차지한다. (실제로 코드가 작기 때문에 거의 문제가 되지 않는다.)&lt;/li&gt;
&lt;li&gt;모듈형으로 설계되지 않은 종속성을 사용하는 사용자를 혼란스럽게 한다. (예: ‘왜 내 앱에 jQuery 5개 버전이 있지?‘)&lt;/li&gt;
&lt;/ul&gt;
                &lt;div style=&quot;margin-top=55px; font-style: italic;&quot;&gt;(This is an article posted to my blog at blog.holy.kiwi. You can read it online by &lt;a href=&quot;https://blog.holy.kiwi/translate/nested-dependencies/&quot;&gt;clicking here&lt;/a&gt;.)&lt;/div&gt;
              </content:encoded></item><item><title><![CDATA[🥝 React Native 사이드프로젝트. 보름만에 iOS, 안드로이드 앱 출시하기]]></title><description><![CDATA[전역일계산기 앱을 토이 프로젝트로 시작했었다. 어느 새, 하루에 천 명이 넘는 유저가 내가 만든 앱을 사용하고 있다. 전역일계산기 군돌이 앱 후기.]]></description><link>https://blog.holy.kiwi/js/190127/</link><guid isPermaLink="false">https://blog.holy.kiwi/js/190127/</guid><content:encoded>&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://blog.holy.kiwi/static/31528729693a121e7980a86d590ce820/d47ca/190127_intro.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 88.93333333333334%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsSAAALEgHS3X78AAAEBUlEQVQ4y31UaU8bVxSd39QoEYsiEQjgGJs17DF2AqHpRloCpJsqRWqlqi1LABMoVYvUz/3Sb6GkBAQtSgu4MWaxAW9YNnjsGe+e8YxP73sNEaqqPulq3tx578w95y7CyckJYrEYcrkcFEVBJBJBOBxGoVBAOp2GKIrwuN0IhKNI51Scr1QqhXg8Dl3XkUgk+NlAIABBVVUkkynE4hIdSoO9R6NRBINB7O/vc/BsJo2wrOL3Fy/xx/o6gnSRAWWzWR4E+zkLiC1BkmV4gyEk0xkc+YL8QygUwtHRETY3N+H1evnBPzd+Q0NtDZobzPh48AG2HQ78uryMpWfPsLa+hqeLTyFRpIIkyTj2ByEnkwQYQIqexwTmdDqxtbWFg4MDDrj8yxKMhhpY3+7Fe3f7cRY5QVyMIOD3InJ2StKcAXoeAgv330svFjmVTCaDgqZx357LhXtWG2xtHZgd/wYLDuDOT8Ch/M+deB74eZ8o/7XtwPjoKOafzOL7uW8xNTaBydExzNnt+PGHBcw8nsTq8nN+KU1aykSrUFDgiWpY8+kQU4RULCCjaDiOqRC+/vwLlL5xCXWV11FfXYuKKyW4eukyqsuvosVoQmVpOT4aHIKiKgSYQYqyyUwvsCToJFECeWIDaCjk0xB62jvQZ7Ohtc6MNlM9OhuauFlb29HbdQv9lh5YiaZrx4kwldQp6ZXNZlAkCJXk0HSNy5LIE7iiQ7BYuvHW8H3csVj4RQbUQ8b2tvbO174d50u4Dz3wB/wUYeqV1jqKZExzMaMhllYgmKuqUXftOkyvnuzdVMn2VdyMZA01Bng8bqKWhyTFkSCauXzudRKLPF4NukaAN01mvNPXh66mZtzu7ESjwYiWOhP3tZnr6f0GOkgCx/YW9qjQd3Z24CT6rl0Xp88SpWkFqHoROa0IobKkjKK4huYbBgIw8aQwY75GKuQmQy0lpgy7BJAkqpIsUaZl3nYyNQXrKkXNI6vqSOY1CPaJx7xMpsbGMU37J5NTVCpTYH77xCSmxycwN22H3++jCPcQFaP4vyWwfgwFaUDQEPivdV74Luqcgf438enwMLfPRh7iw/c/wPzMDL589AifDDH/CIRTKgXPgRt+n49PkIvGJohE1FjXrK2soOLyFXQ1NuHuLQu6W1pQVVKKkYH76Cb9O8n/bm8fBDa6/F4fQjTGWLQXjQ0KBsiiXFtdQXVZOe7ZbvOL/VYrNUINAQ6g+2YrjBUV6DCbITBRPTQAfMfHvHcvGgNN0rBQaKS92NjAwvx3lAQRPmIjijEsLS5iljT/anCQJtAQRh48hMBoJShbCTnBnyxzsiTxfYa+nUfKGPh9XsTOIgR6yiVhPi9Npt3V59h1HWDDcYi/AR7oiz4bop8NAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;190127_intro&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/31528729693a121e7980a86d590ce820/fb8a0/190127_intro.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/31528729693a121e7980a86d590ce820/1a291/190127_intro.png 148w,https://blog.holy.kiwi/static/31528729693a121e7980a86d590ce820/2bc4a/190127_intro.png 295w,https://blog.holy.kiwi/static/31528729693a121e7980a86d590ce820/fb8a0/190127_intro.png 590w,https://blog.holy.kiwi/static/31528729693a121e7980a86d590ce820/d47ca/190127_intro.png 750w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;전역일계산기 앱 군돌이&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;2018년 9월 3일에 전역일계산기 앱 &lt;a href=&quot;http://onelink.to/sqc7wh&quot;&gt;군돌이&lt;/a&gt;를 구글 플레이스토어에 처음으로 런칭하고, 그로부터 6일 후인 9월 9일에 추가로 애플 앱스토어에 런칭했다. 런칭한 이후로 어떤 블로그 플랫폼이던 React Native로 앱을 개발하고 안드로이드와 iOS 플랫폼에 모두 런칭했던 이야기를 공유하고 싶었다. (&lt;del&gt;별거 아닌 앱이지만…&lt;/del&gt;) 하지만 귀차니즘으로 작성하지 못했다. 그래서 군돌이 앱의 만 명 설치를 핑계로 React Native로 하이브리드 모바일 애플리케이션을 개발한 후기를 작성해보려한다. &lt;/p&gt;
&lt;h2 id=&quot;-시작&quot;&gt;&lt;a href=&quot;#-%EC%8B%9C%EC%9E%91&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;💫 시작&lt;/h2&gt;
&lt;p&gt;우선, 내가 개발한 앱을 소개하겠다. 간단히 전역일을 계산할 수 있는 애플리케이션이다. 다른 앱과의 차별점을 둔 것은 예쁘고 심플한 디자인과 사용성이다. 현역 생활 때 사용한 타 앱은 많은 유저들이 사용하는 것에 반해 사용성이 많이 부족하다고 느꼈다. 그래서 직접 전역일계산기 앱을 개발해서 현역 군인들과 고무신분들, 부모님들이 더 예쁘고 심플한 디자인의 전역일계산기를 사용하게 하고 싶었다. 물론 디자인은 똥손인 내가 하지 않았고 금손 디자이너 GOM님이 팀원으로써 도와주셨다. (감사합니다! 🥝)&lt;/p&gt;
&lt;p&gt;런칭한지 대략 4개월이 지나지 않았는데 2019년 1월 25일 금요일 기준 안드로이드 3,400명 설치, iOS 6,600명이 설치하여 총 10,000명의 유저가 설치했고, 하루에 1,000명 ~ 1,300명 정도가 사용하는 전역일계산기 앱이 되었다. 구글 플레이스토어의 ASO가 더 좋음에도 불구하고 앱스토어의 설치량이 항상 더 좋은 것이 약간 놀라웠는데 아마 젊은 층의 여성분들이 아이폰을 많이 사용하기 때문이리라 짐작했다. 회사에 다니면서 사이드 프로젝트로 퇴근하고 저녁에 그리고 주말에 틈틈이 작업한 앱을 생각보다 많은 분들이 사용해주셔서 엄청 보람 있었다. 대략 앱을 만들고 처음 배포하기까지 보름 정도 걸렸는데 그 과정과 사용했던 라이브러리 등 그리고 RN으로 개발하면서 느꼈던 장점, 단점 정도를 써보겠다.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://blog.holy.kiwi/static/58e2de22d5f2443eb07eae87e4b2b515/95197/190127_appstoreconnect.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.57715260017051%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABJ0lEQVQoz4VSy07EMAzM//8dFx4XQCAOIK1YdrtpGtsZPE7arpCASqOxHT8mcVOeZ8wOoP2L1sjAog1fxVDEkGtnsRacaq2oohBPUg+Sq+5cpEUybTZcYR6z1nEdj4aiCg5vbU/a8EthFAzVHMZzDk9bQnx/XXXnyLxWG4wYPhrapgA/FGw8wOvP+vvg1N/DcHG52nYVLCQYm/yMi2Cjj7nhdfJrWse5dv9Ue11aH/g9G17OhmfH28XwdDI8DjwcO+4+DbcD98cO2jcHw6GMhnwP7+cKLCYuvnqqCX9gVStu6+C++e6r35DCGE/NHfFNqwrMt70y4wTt9VzdLv7PRtx0wOtFArlUJCq55BlLKRGsUazbBmkzlnMOnqYp8ta3Jy/LEmciFd8HaxRiETh6cgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;190127_appstoreconnect&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/58e2de22d5f2443eb07eae87e4b2b515/fb8a0/190127_appstoreconnect.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/58e2de22d5f2443eb07eae87e4b2b515/1a291/190127_appstoreconnect.png 148w,https://blog.holy.kiwi/static/58e2de22d5f2443eb07eae87e4b2b515/2bc4a/190127_appstoreconnect.png 295w,https://blog.holy.kiwi/static/58e2de22d5f2443eb07eae87e4b2b515/fb8a0/190127_appstoreconnect.png 590w,https://blog.holy.kiwi/static/58e2de22d5f2443eb07eae87e4b2b515/526de/190127_appstoreconnect.png 885w,https://blog.holy.kiwi/static/58e2de22d5f2443eb07eae87e4b2b515/fa2eb/190127_appstoreconnect.png 1180w,https://blog.holy.kiwi/static/58e2de22d5f2443eb07eae87e4b2b515/08f6a/190127_appstoreconnect.png 1770w,https://blog.holy.kiwi/static/58e2de22d5f2443eb07eae87e4b2b515/95197/190127_appstoreconnect.png 2346w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;앱스토어 판매량&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://blog.holy.kiwi/static/d50e766bcdeaa5ab7d6f14f790d99bda/15cfe/190127_firebase.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 33.96414342629482%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABaUlEQVQoz22Sy0rDUBCGowtBEUGpIF5ARe1KEAXxHUQE9RV8JsUWe1FpvXSndOU7qHThvm0udmPJxeSck/z+J2lRxIEvM2eS+Zk5E8PzfYRRBBXHkEr9iyKCaHvv+dhrWNhp2Nh+sJCvm1ivmVi5MXH67MCIKZQkCTIb+j/G96HkdyJCqxdg8crEWLEL47zzw1kH+48WBamh+BgiSSgSBBEZeKFiRELCcz/x6rjIlbuYq1pYq9lYurbSePLSxMETBYOQRUGc4g+IIo4vMgRjJbWXCN0+XhwvHS9ft7HbcLB552Dr3mHOxmEq6Atovv4Q/EIKlXYpZcAOPSxTcJXd5SompkomRi466RUcN20Yrh5FKrhCwOd9upJnLiDNMXb1YpgPefb8Pt4ouFHnMm4dzHPcmUp2n6OFLo60YMyCRG+SxYlekD5rT+JBHKvsD0Ai0frwMFtuY7zIrgptTBTbWKh2MV3q4KRp4RuW8OcO0D04fAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;190127_firebase&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/d50e766bcdeaa5ab7d6f14f790d99bda/fb8a0/190127_firebase.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/d50e766bcdeaa5ab7d6f14f790d99bda/1a291/190127_firebase.png 148w,https://blog.holy.kiwi/static/d50e766bcdeaa5ab7d6f14f790d99bda/2bc4a/190127_firebase.png 295w,https://blog.holy.kiwi/static/d50e766bcdeaa5ab7d6f14f790d99bda/fb8a0/190127_firebase.png 590w,https://blog.holy.kiwi/static/d50e766bcdeaa5ab7d6f14f790d99bda/526de/190127_firebase.png 885w,https://blog.holy.kiwi/static/d50e766bcdeaa5ab7d6f14f790d99bda/fa2eb/190127_firebase.png 1180w,https://blog.holy.kiwi/static/d50e766bcdeaa5ab7d6f14f790d99bda/08f6a/190127_firebase.png 1770w,https://blog.holy.kiwi/static/d50e766bcdeaa5ab7d6f14f790d99bda/15cfe/190127_firebase.png 2008w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;파이어베이스 애널리틱스 대쉬보드&lt;/i&gt;&lt;/p&gt;
&lt;h2 id=&quot;-왜-react-native로-개발하였나&quot;&gt;&lt;a href=&quot;#-%EC%99%9C-react-native%EB%A1%9C-%EA%B0%9C%EB%B0%9C%ED%95%98%EC%98%80%EB%82%98&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;⚛ 왜 React Native로 개발하였나&lt;/h2&gt;
&lt;p&gt;처음에는 패기에 가득차서 간단한 앱이니 swift로 iOS 앱을 개발하고, java나 kotlin으로 안드로이드 앱을 개발하면 되겠다싶어서 swift로 전역일계산기 앱을 구상하고 프로토타입을 개발해보았다. 간단할 줄 알았지만 date 계산 등 swift의 언어적 특징에 많이 익숙하지 않아 많은 난항을 겪었다. 그래서 자연스레 javascript를 사용하는 React Native에 눈을 돌리게 되었다. react와 javascript에는 웬만큼 자신이 있었고 한 번 개발해놓으면 iOS와 안드로이드, 두 플랫폼에서 작동하기 때문에 React Native는 내가 생각하기에 최고의 선택이었다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://facebook.github.io/react-native/&quot;&gt;react-native 공식 웹사이트&lt;/a&gt;를 참고해 공부하면서 개발했는데 웹 프론트엔드 개발하듯이 모바일 앱을 개발하는 개발 경험이 신세계였다. 게다가 expo를 사용하면 굳이 테스트 기기를 유선으로 연결하지 않고, expo 앱을 설치해서 QR코드로 인식하면 내가 개발하고 있는 앱을 실시간으로 확인해보며 개발할 수 있어서 네이티브를 직접 개발할 때와는 생산성과 편의성이 말도 안되게 차이가 났다. 이래서 RN RN 하는 구나 느꼈다. 그리고 모바일 앱의 반응형 디자인을 내가 가장 좋아하는 CSS의 flexbox를 사용해 처리하는 것 때문에 매력적이었다. 개발경험에 있어서 네이티브를 개발한다는 느낌보다는 웹뷰를 개발하는 느낌이지만 React Native는 네이티브 API를 사용하여 네이티브에서 직접 렌더링하기 때문에 네이티브와 유사한 성능, 사용성을 보여준다.&lt;/p&gt;
&lt;h2 id=&quot;-개발환경-설정&quot;&gt;&lt;a href=&quot;#-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;⚒ 개발환경 설정&lt;/h2&gt;
&lt;p&gt;처음에는 위에서 말했듯이 expo라는 React Native를 편하게 개발할 수 있도록 도와주는 서드파티 툴을 사용했다. 하지만 점점 더 많은 기능을 추가하면서 expo의 한계를 느꼈다. 일단 앱의 용량이 비정상적으로 컸고, 무엇보다 네이티브 모듈을 &lt;code class=&quot;language-text&quot;&gt;react-native link&lt;/code&gt; 할 수 없다는게 엄청난 단점이었다. 그래서 결국 &lt;code class=&quot;language-text&quot;&gt;expo eject&lt;/code&gt; 명령어를 통해 expo를 떼어냈다. 떼어내려면 힘들줄 알았는데 expo 관련 라이브러리를 쓰지 않아서 그런지 저 명령어를 통해 eject하고 빌드도 잘되었던 기억이 난다. 위 경험을 통해 처음부터 웬만하면 expo를 사용하지 않는 것이 좋다고 판단하여 다음 RN 프로젝트부터는 expo를 사용하지 않았다. 다른 분들에게도 그렇게 추천하고 있다.&lt;/p&gt;
&lt;p&gt;또한, 추가적으로 정적 타이핑을 위해 &lt;code class=&quot;language-text&quot;&gt;typescript&lt;/code&gt;를 사용하였고, 더 편한 스타일링을 위해 &lt;code class=&quot;language-text&quot;&gt;styled-components&lt;/code&gt;를 사용하였다. 그리고 처음에는 상태관리 라이브러리로 &lt;code class=&quot;language-text&quot;&gt;redux&lt;/code&gt;를 사용했지만 &lt;code class=&quot;language-text&quot;&gt;mobx&lt;/code&gt;의 간편성에 반해서 중간에 &lt;code class=&quot;language-text&quot;&gt;mobx&lt;/code&gt;로 뜯어고치는 과정을 거쳐서 좀 빡셌다. 이러한 개발환경을 세팅할 때, 정말 오래 걸리고 매번 찾는게 번거로워서 &lt;a href=&quot;https://github.com/738/react-native-awesome-starter&quot;&gt;react-native-awesome-starter&lt;/a&gt;라는 레포지토리를 생성해서 초기에 RN의 개발환경 세팅하는 방법들을 정리해놓았다.&lt;/p&gt;
&lt;h2 id=&quot;-개발-과정&quot;&gt;&lt;a href=&quot;#-%EA%B0%9C%EB%B0%9C-%EA%B3%BC%EC%A0%95&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;💻 개발 과정&lt;/h2&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://blog.holy.kiwi/static/8931fcbaa49b47f840310dea802f2819/d47ca/190127_dev.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 88.93333333333334%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsSAAALEgHS3X78AAAEg0lEQVQ4y12T+U9UVxSA50/wlzap/Y2mBZW1LlUcFUpFFsWlSZFqq1ha1Gpa05i2ijTudY+JEWIEQatNkSgoqI0CihpLFRWQbd7sMzDz3jDMPgwM49c7Y21MX/Il525fzj3nXZVavYAZ05OIi3uP9HQ1GRkfk52dg1q9kPiEaSQmJbMoI4OkjSkk7kgheWcaab/MYm75fNJ3LWD27rkk/phM4vYUUn9OQRU//X3eemcKH0yLo7BoFbl5WaxYmcvqwhUkxMcx9e0pvDv1LZK+SyV1z0xm7Egm89AnFFYUsbpyDUuO5ZG8Ky1GSvlMVLMTsshKKKZgwRZWZG1j8cLNZGZsRZ35LZn5W0jN2syMuQUklMYza/dHLNyXSe6RfBYfyiHrYDY5h/PIFvG83WoSoxluSqvlcKKbE0Uyv24Y4fvVIxSvdbFxe5DtJ0OsPQU5P3Uyb8dMltQupaBmJbnnlrGkSoiqcgV5LKtdyeLqXOafXITq/u9WDix/ypkyDRXleo6VWThw0MjxagMn6iwcrLdxplmm6EIhOdcK+Lp1EyWtpeQ0LiW7IZ8NLd9Q2rqZ9a0lLKrJQuXUOND9MYCpUY9sHCY44UHutjJwuQ9Tk56hBxYcjmG2/fYDhZWfU3yuhPXVX7GuqpiS86Wsq9lA0dm1rKn+ks8qi1D5H44RPgQT4mrjdhglgPfWOJNiLnxYzF+IMDY2xpO+To7UH+V0UwWnrp/mRMNJzrZV81zqwqWMIttknIoT1ZBOorflDrpHD9Hcv4emvR1Hdw/uFwO4unpx6A0E/SHuSe2UNJay6fpWShpKKbr8Bcsvfcoj81+8/sITYVSBtjYiZTuZ3L+fyb17Ce/d84oD+wiXlzF+o1mUIcwLXQ+VzWdo72zHPmLH5XPR9vwuNTdraepo5srDq5jsJlSmEZm/DYM80Q/y3Kyjy6il2yDRZ9IzYNTTZ7PiEBlefHyRD0/P4XZfC06bE4/Tw9F7x8k/X0DBhVXMqUinqbcZ1ePAKNWKgSpNN3WyiXqbkXqjRAeTPCVCl0AKBlFEVlpFhy/ow+P3YHPakGwSz0zPMDgMMUa9o6ie+Zxcskpc1vZRN9DDNb2GO0MmeoWwLxxicDKM3u9nzB8gHAqj2BUsQxbkURmvz4tfrAV9QQLeAOOhcVQ9ATd1Vh1XtP00SP3c0Es8UGx0Bf30jwUxRF5iFjK/OOxyuzAYDFitVoKBIKFQKPYHyIqMzW4jKParegMerlp0NA72clOn4U9pkFadlo7hYTRCNBSBYZGB3yeu6vFisVhiQp8YRwVRoaIoyLIci1X9XhdNFgO3hOy2VqJFM8h9nQ5JyOxCpkwIfGNC4BVCD2azOUZUGBVEcTgc2O32V0Kt38tdm4V2s5EOm42ndplOswWDqIkyHmF0EmRv4N8MPbEMo7wpdDqdsSxjQq/fh0bxYneLGol42DGCxWbHLQ44XW70RjNuIYpuDgTEK/J6YwRF518TbUysOSJWvRSdfGycYMQTgojooqxgNpmJRF49OUnS/lf81/x//Cb/APx1bVl7d0yvAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;190127_dev&quot;
        title=&quot;&quot;
        src=&quot;https://blog.holy.kiwi/static/8931fcbaa49b47f840310dea802f2819/fb8a0/190127_dev.png&quot;
        srcset=&quot;https://blog.holy.kiwi/static/8931fcbaa49b47f840310dea802f2819/1a291/190127_dev.png 148w,https://blog.holy.kiwi/static/8931fcbaa49b47f840310dea802f2819/2bc4a/190127_dev.png 295w,https://blog.holy.kiwi/static/8931fcbaa49b47f840310dea802f2819/fb8a0/190127_dev.png 590w,https://blog.holy.kiwi/static/8931fcbaa49b47f840310dea802f2819/d47ca/190127_dev.png 750w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p style=&apos;text-align: center&apos;&gt;&lt;i&gt;군돌이 초안(왼쪽)과 프로토타입(오른쪽)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;사실 전역일계산기 앱에 기능이 많이 없어서 과정이랄게 있을까 싶긴 하지만 간단히 써보도록 하겠다. 우선 다른 앱들을 벤치마킹하고 어떤 내용들을 어떻게 표시하면 좋을지 생각을 해서 조잡하게 wireframe 삼아서 스케치로 대충 그려보았다. 바로 위의 왼쪽 사진이다. 현재의 디자인과 완전 다르다…! (감사합니다. 디자이너님, 저런 garbage를 심폐소생술시켜주셔서 ㅎㅎ) wireframe을 가지고 React Native로 앱 구조를 어떻게 구성할지 고민하고 프로토타입(오른쪽 사진)을 개발했다. 그 후, 디자이너님께 프로토타입을 드리고 바로 맨 위의 스크린샷과 같은 디자인을 주셨다. 컴포넌트 구조를 그래도 잘 해놓아서 디자인을 시안대로 그리는 것은 쉽게 했다. 그리고 편집 화면도 모달로 추가해서 기본적인 기능을 갖추었다.&lt;/p&gt;
&lt;p&gt;기본적인 기능을 갖추었다고 생각한 후, 구글 플레이스토어와 앱스토어 개발자 계정을 구입해서 배포 준비를 했다. 개발자 계정이 비쌈에도 굳이 빨리 구입을 해서 추진했던 이유는 절박함을 만들지 않으면 프로젝트가 느슨해질 것 같았고 출시가 계속 더뎌질 것 같아서였다. 일단 내 목표는 기본 기능만 가진 예쁘고 심플한 전역일계산기 앱을 만들고 그 후에 버그도 고치고 기능도 추가할 계획이었다. 퇴근 후의 저녁과 주말을 반납하여 보름만에 뚝딱 개발을 마치고 플레이스토어와 앱스토어에 런칭했다. (애플은 심사가 오래 걸려서 6일 정도 후에 출시했다.)&lt;/p&gt;
&lt;p&gt;앱스토어까지 출시한 후, 네이버 곰신 카페에 들어가서 군돌이 앱 홍보를 했다. 생각보다 반응이 뜨거웠다. 디자인이 예쁘고 심플하다며 좋아하시는 분들이 많아서 개발한 보람이 있었고 즐거웠다. 이 때, 버그가 많이 발견되었는데도 불구하고 많은 유저분들이 버그리포트도 해주시고 의견 제안도 많이 해주셔서 폭풍 수정하고 바로 배포하는 등 유저와 소통하고 열심히 하는 모습을 보여주려 애썼다. 첫 출시 이후, 예닐곱 번의 꾸준한 배포를 통해 버그 수정 및 기능 추가를 했고 그 결과로 만 명의 유저가 설치한 것을 보게 되어 감사하고 감회가 새롭다. 계속 재밌는 기능들을 많이 추가해서 군돌이 앱을 키워나가고 싶다. 🥝&lt;/p&gt;
&lt;p&gt;과정은 여기까지로 하고 밑에서부터는 트러블 슈팅, 추천 라이브러리, 장단점 등을 공유해보도록 하겠다.&lt;/p&gt;
&lt;h2 id=&quot;-트러블-슈팅&quot;&gt;&lt;a href=&quot;#-%ED%8A%B8%EB%9F%AC%EB%B8%94-%EC%8A%88%ED%8C%85&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🌠 트러블 슈팅&lt;/h2&gt;
&lt;p&gt;React Native를 개발하면서 iOS는 x-code에서 직접 빌드하고, 안드로이드는 안드로이드 스튜디오에서 직접 빌드할 일이 많았다. 그리고 여러 네이티브 모듈을 사용하다보니 삽질할 일이 정말 많았다. 빌드 에러가 정말 많이 났다. 그래서 짧은 기간동안 RN으로 개발하면서 발생했던 에러들을 &lt;a href=&quot;https://github.com/738/react-native-trouble-shooting&quot;&gt;react-native-trouble-shooting&lt;/a&gt; 레포지토리에 정리해놓았다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;혹시 에러가 발생한다면 참고해주시면 좋을 것 같습니다. 레포지토리에 Trouble Shooting이라면 Pull Request 부탁드립니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;최근에 가장 기억이 남는 트러블 슈팅 중에 하나는 iOS 위젯을 개발할 때였다. 유저분들의 위젯 기능 요청이 너무 많아서 큰 부담을 갖고 위젯 기능을 개발하고 있었는데 위젯 익스텐션에서 앱에 저장되어있는 데이터를 가져오는 부분이 정말 어려웠고, 몇 주째 삽질만 하고 있었다. iOS의 위젯을 개발하기 위해서는 당연히 iOS 개발 관련 지식도 필요했고, 계속 digging을 했다. 일단 RN에서 iOS의 위젯을 추가하려면 &lt;a href=&quot;https://github.com/matejkriz/react-native-today-widget&quot;&gt;react-native-today-widget&lt;/a&gt; 라이브러리를 사용해야했고, 군돌이 앱의 메인과 today widget extension 간의 데이터를 공유하려면 iOS의 App Group이라는 개념을 사용해야 했다. 그래서 &lt;a href=&quot;https://github.com/KjellConnelly/react-native-shared-group-preferences&quot;&gt;react-native-shared-group-preferences&lt;/a&gt; 라이브러리도 사용해야했다. 위젯 코드에서 &lt;code class=&quot;language-text&quot;&gt;SharedGroupPreferences&lt;/code&gt;를 import하고 &lt;code class=&quot;language-text&quot;&gt;getItem&lt;/code&gt;이라는 &lt;code class=&quot;language-text&quot;&gt;static&lt;/code&gt; 함수를 사용해야 했는데 &lt;code class=&quot;language-text&quot;&gt;getItem&lt;/code&gt;이라는 함수는 콘솔에 잘찍히는 것을 확인했지만 정작 사용할 때에는 &lt;code class=&quot;language-text&quot;&gt;SharedGroupPreferences&lt;/code&gt;가 &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;라는 에러가 나오는 상황이어서 진짜 포기하기 일보 직전이었다. 많은 것을 시도해보았고 많은 시간이 흘렀다. 지푸라기를 잡는 심정으로 해당 레포지토리의 이슈를 보았는데 &lt;a href=&quot;https://github.com/KjellConnelly/react-native-shared-group-preferences/issues/3&quot;&gt;내 상황과 비슷한 이슈&lt;/a&gt;가 있었다. 답변 중 하나가 link가 안되었을 것이라는 답변이었다. 하지만 나는 link가 잘되어있는 것을 확인해서 그 문제는 아닐 것이라고 생각한게 오산이었다. 앱 메인에는 해당 라이브러리가 link되어있었지만 today widget extension에는 이 라이브러리가 link가 안되어있었어서 &lt;code class=&quot;language-text&quot;&gt;SharedGroupPreferences&lt;/code&gt;를 사용할 수 없었던 것이다. today widget extension에 &lt;code class=&quot;language-text&quot;&gt;react-native-shared-group-preferences&lt;/code&gt; 라이브러리를 직접 link하니 정상적으로 작동했다! 다행히 문제에 대한 solution을 발견하고 다리 쭉 뻗고 잘 수 있었다. ☁ &lt;a href=&quot;https://github.com/KjellConnelly/react-native-shared-group-preferences/issues/3#issuecomment-457814798&quot;&gt;내가 남긴 댓글&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;-꼭-써야한다고-생각하는-라이브러리&quot;&gt;&lt;a href=&quot;#-%EA%BC%AD-%EC%8D%A8%EC%95%BC%ED%95%9C%EB%8B%A4%EA%B3%A0-%EC%83%9D%EA%B0%81%ED%95%98%EB%8A%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🙋 꼭 써야한다고 생각하는 라이브러리&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Microsoft/react-native-code-push&quot;&gt;react-native-code-push&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Microsoft에서 만든 code push는 React Native를 사용하는 이유에도 포함되어있을 정도로 아주 강력한 기능이다. 네이티브 바이너리 파일의 업데이트 없이 간단한 명령어만으로 앱을 업데이트시킬 수 있는 기능이다. code push의 원리는 네이티브 파일에서 로컬이 아닌 code push 서버에 있는 자바스크립트 번들 파일을 바라보고 있다가 개발자가 code push 명령어를 통해 자바스크립트 번들 파일을 교체하면 앱이 업데이트된 것처럼 보이는 원리이다. 물론, 네이티브 모듈을 추가한 것은 코드 푸쉬로 적용이 안된다. 그 때에는 직접 업데이트를 해줘야한다. 하지만 계속 코드 푸쉬를 사용해서 업데이트하는 건 좋지 않다고 생각한다. 왜냐하면 바이너리를 얼마나 꾸준히 업데이트하는 지도 ASO에 영향이 미쳐지기 때문이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/invertase/react-native-firebase&quot;&gt;react-native-firebase&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;React Native에서 firebase를 사용할 수 있도록 도와주는 라이브러리이다. 내가 주로 사용한 부분은 analytics의 event이다. 유저가 특정 액션을 취했을 때, firebase에서 event를 tracking해서 유저가 어떤 플로우를 취하는지 볼 수 있고, funnel을 통해 어디서 bounce rate(이탈률)가 많이 발생하는지 볼 수 있는 등 제공하는 통계 기능이 많다. 위의 firebase 스크린샷은 analytics의 대쉬보드이다. 추가적으로 admob을 사용해 광고 배너를 달 수 있는데, react-native-firebase를 사용할 수도 있지만 더 편리하게 쓸 수 있게 제공해주는 &lt;a href=&quot;https://github.com/sbugert/react-native-admob&quot;&gt;react-native-admob&lt;/a&gt;을 사용했다. 또한 cloud messaging을 통해 푸쉬 알림을 보내는 기능을 해보고 싶었지만 한 번 삽질하다가 안되서 보류중이다. 어쨌든 &lt;code class=&quot;language-text&quot;&gt;analytics&lt;/code&gt; 기능만으로도 &lt;a href=&quot;https://invertase.io&quot;&gt;invertase&lt;/a&gt; 팀의 &lt;code class=&quot;language-text&quot;&gt;react-native-firebase&lt;/code&gt; 라이브러리는 React Native를 한다면 꼭 써야하는 라이브러리이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DylanVann/react-native-fast-image&quot;&gt;react-native-fast-image&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;react-native-fast-image&lt;/code&gt; 라이브러리는 React Native에서 기본적으로 제공하는 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt; 컴포넌트를 사용해도 되지만 &lt;code class=&quot;language-text&quot;&gt;react-native-fast-image&lt;/code&gt;의 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;FastImage /&amp;gt;&lt;/code&gt;를 사용하면 이름 그대로 더 빠르게 이미지를 렌더할 수 있다. 주기능으로는 이미지 캐쉬하기, authorization headers를 추가하기, 이미지 미리 로드하기, 이미지 우선순위 매기기 등이 있다. iOS의 이미지 로드 라이브러리인 &lt;a href=&quot;https://github.com/SDWebImage/SDWebImage&quot;&gt;SDWebImage&lt;/a&gt;와 Android의 이미지 로드 라이브러리인 &lt;a href=&quot;https://github.com/bumptech/glide&quot;&gt;glide&lt;/a&gt;를 플랫폼마다 직접 사용하여 성능을 높였다. 따라서 많은 이미지를 렌더할 일이 있다면, React Native에서 &lt;code class=&quot;language-text&quot;&gt;react-native-fast-image&lt;/code&gt; 라이브러리의 사용은 필수다.&lt;/p&gt;
&lt;h2 id=&quot;-재밌는-라이브러리&quot;&gt;&lt;a href=&quot;#-%EC%9E%AC%EB%B0%8C%EB%8A%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;⚽ 재밌는 라이브러리&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/FuYaoDe/react-native-egg&quot;&gt;react-native-egg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;react-native-egg는 이스터에그를 심어놓기 위해 사용하는 라이브러리이다. 아직 사용은 안해봤지만 앱 안의 비밀스러운 제스쳐를 숨겨놓고 개발을 위한 테스트모드로 진입하게 하거나, 유저들이 우연히 발견한다면 재미 요소를 느낄만한 이스터에그를 숨겨놓을 수 있다. 군돌이 앱에도 나중에 이 라이브러리를 사용해서 이스터에그를 숨겨놓을 생각이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/AppAndFlow/react-native-haptic&quot;&gt;react-native-haptic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;아이폰의 약한 진동인 햅틱을 구현해놓은 아주 좋은 React Native 라이브러리이다. 유저가 버튼을 누를 때, 피드백을 주는 데 햅틱만큼 좋은게 없다고 생각한다. 이 라이브러리를 사용하면 아주 손쉽게 React Native에서 햅틱 효과를 줄 수 있다. 대신 안드로이드는 지원하지 않기 때문에, &lt;code class=&quot;language-text&quot;&gt;Platform.OS&lt;/code&gt;로 분기 처리해주어야 한다.&lt;/p&gt;
&lt;h2 id=&quot;-내가-생각하는-react-native의-장점&quot;&gt;&lt;a href=&quot;#-%EB%82%B4%EA%B0%80-%EC%83%9D%EA%B0%81%ED%95%98%EB%8A%94-react-native%EC%9D%98-%EC%9E%A5%EC%A0%90&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;💁 내가 생각하는 React Native의 장점&lt;/h2&gt;
&lt;p&gt;짧게나마 군돌이 앱을 React Native로 개발해보면서 많은 삽질이 있었지만 정말 좋은 개발 경험을 했다. 무엇보다도 자바스크립트로 네이티브 앱과 사용성, 성능이 거의 동일한 앱을 만들 수 있는 것은 정말 신세계였다. 게다가 iOS와 안드로이드 두 플랫폼에서 돌아가다니… React Native의 광팬이 된 것 같다. 내가 생각하는 React Native의 장점은 다음과 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;생산성이 엄청 높다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cake 앱의 이성민 개발자님이 Cake 앱을 안드로이드와 iOS 두 플랫폼의 앱을 혼자서 한 달만에 개발하고 출시하셨다고 한다. 만약에 안드로이드와 iOS 각각 개발을 했다면 인원과 시간 등 리소스가 더 필요했을 것인데 React Native였기에 가능했다. 한 가지 소스코드로 안드로이드와 iOS의 코드를 공유하게 되니 생산성도 높아지고 마찬가지로 유지보수 비용이 현저히 낮아진다. 또한, 안드로이드와 iOS는 코드를 고치고 확인할 때마다 빌드하면 꽤 오랜시간을 잡아먹는데에 반해 React Native는 live reload 기능을 통해서 코드를 고칠 때마다, 바로바로 수정사항을 확인할 수 있어서 엄청 편하고 빠르게 개발할 수 있다.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;learning curve(학습 곡선)가 비교적 짧다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Javascript, CSS 그리고 React가 익숙하다는 전제 하에 React Native의 learning curve는 말도 안되게 짧다. JS, React가 능숙하다면 React Native를 직접 개발하면서 모르는 것을 그때그때마다 찾아보며 능숙해지는 것도 좋은 방법인 것 같다. &lt;del&gt;많은 삽질이 필요하겠지만&lt;/del&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;라이브러리가 적지 않다. &lt;del&gt;필요하면 직접 만들면 된다&lt;/del&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;밑에서 한 번 더 언급하겠지만 &lt;a href=&quot;https://github.com/jondot/awesome-react-native&quot;&gt;awesome-react-native&lt;/a&gt;를 보면 필요한 라이브러리가 많이 만들어져 있어서 개발하는데 거의 문제가 없었다. 또한, 아주 방대한 &lt;a href=&quot;https://www.npmjs.com&quot;&gt;npm&lt;/a&gt; 모듈들을 마음껏 설치해서 사용할 수 있는 점도 큰 장점 중 하나이다. 네이티브 관련 라이브러리가 안드로이드와 iOS 라이브러리보다야 훨씬 적겠지만 경쟁하고 있는 하이브리드 앱 프레임워크인 &lt;a href=&quot;https://flutter.io/&quot;&gt;flutter&lt;/a&gt;보다는 라이브러리가 많다. 혹시 필요한 라이브러리가 없다면 직접 &lt;a href=&quot;https://github.com/frostney/react-native-create-library&quot;&gt;create-react-native-library&lt;/a&gt;를 통해 라이브러리를 개발할 수 있다. (물론 Android, iOS 플랫폼에서 돌아가도록 직접 코드를 작성해야해서 많은 어려움이 있지만 말이다.)&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;code push를 통한 빠른 배포&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;위에서 말했지만 code push는 React Native를 사용하는 큰 이유 중 하나이다. 며칠씩 걸리는 iOS 심사 및 배포를 생략하고 몇 초만에 배포할 수 있는 점은 아주 강력하다.&lt;/p&gt;
&lt;h2 id=&quot;-내가-생각하는-react-native의-단점&quot;&gt;&lt;a href=&quot;#-%EB%82%B4%EA%B0%80-%EC%83%9D%EA%B0%81%ED%95%98%EB%8A%94-react-native%EC%9D%98-%EB%8B%A8%EC%A0%90&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🙅 내가 생각하는 React Native의 단점&lt;/h2&gt;
&lt;p&gt;React Native의 팬이지만 아쉬운 점이 있다면 다음과 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;위젯이나 워치 익스텐션을 개발하기가 네이티브보다 까다롭다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;안드로이드 위젯은 &lt;a href=&quot;https://github.com/netbeast/react-native-android-widget-poc&quot;&gt;react-native-android-widget-poc&lt;/a&gt;, iOS 위젯은  &lt;a href=&quot;https://github.com/matejkriz/react-native-today-widget&quot;&gt;react-native-today-widget&lt;/a&gt;, 애플워치 앱은 &lt;a href=&quot;https://github.com/mtford90/react-native-watch-connectivity&quot;&gt;react-native-watch-connectivity&lt;/a&gt;, 또한 앱 간의 데이터 공유는 &lt;a href=&quot;https://github.com/KjellConnelly/react-native-shared-group-preferences&quot;&gt;react-native-shared-group-preferences&lt;/a&gt; 라이브러리를 사용하는 등 많은 라이브러리들이 오픈소스로 개발되고 있지만 아무래도 네이티브의 새로운 API들이 나오면 바로바로 지원되는 것은 어렵기 때문에 스마트워치 앱이나 위젯 같은 다른 확장 기능을 사용해야 한다면 React Native는 추천하지 않는다. React Native로 iOS 위젯을 개발하고 있지만 메모리 문제인지 가끔 “로드할 수 없음” 이라고 뜨는 문제가 있어서 살짝 불안정한 점이 보인다.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;호환성 문제로 빌드가 안될 때가 있어 삽질 요소가 많다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;React Native 라이브러리를 많이 link시키다가 보면 라이브러리들이 꼬일 때가 있고, 시뮬레이터 기기에서 작동을 안하는 등 해결방법을 찾기 어려운 트러블이 발생하기 쉽다. 내가 아직 초보라서 못찾는 것일 수도 있긴 하지만, 불친절한 에러메세지도 많고 해서 안드로이드 혹은 iOS 빌드가 안될 때에는 많은 시간의 폭풍 구글링과 시행착오를 요한다. (이는 내공이 쌓이면 해결될 것 같다.)&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;한국어로 된 자료가 많이 부족하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;React Native 관련 서적이 한국에 출판된 게 2~3권 밖에 보이지 않고, 한국의 React Native 커뮤니티가 작아서 그런지 한국어로 된 개발 자료를 많이 찾아볼 수 없었다.&lt;/p&gt;
&lt;h2 id=&quot;-도움이-되었던-라이브러리-혹은-자료&quot;&gt;&lt;a href=&quot;#-%EB%8F%84%EC%9B%80%EC%9D%B4-%EB%90%98%EC%97%88%EB%8D%98-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%ED%98%B9%EC%9D%80-%EC%9E%90%EB%A3%8C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🐘 도움이 되었던 라이브러리 혹은 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://facebook.github.io/react-native/&quot;&gt;react-native 공식 홈페이지&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;React Native 공식 홈페이지는 RN으로 개발하면서 당연 제일 많이 들여다 본 홈페이지일 것이다. 어떤 컴포넌트, API를 제공하고 있는지 보는 재미가 있고, 필요한 컴포넌트의 예제와 명세가 상세히 적혀있어서 많이 참고해야할 사이트이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jondot/awesome-react-native&quot;&gt;awesome-react-native&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;React Native에서 필요한 적재적소의 라이브러리를 나열해놓은 레포지토리다. RN으로 개발할 때 가장 많이 방문했던 레포지토리일 것이다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.slideshare.net/deview/121react-native&quot;&gt;React Native: 웹 개발자가 한 달 만에 앱 출시하기 (발표자료)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;네이버 개발자 컨퍼런스인 deview 2018에서 cake 앱을 개발하신 snow의 이성민 개발자님이 발표해주신 React Native 발표자료이다. 현장에서 참석했는데 React Native가 이렇게 관심이 많은 기술인지 처음 알았다. 아마 세션의 이름으로 어그로가 많이 끌렸긴 하지만.. ㅎㅎ 진짜 서서 듣는 사람들까지 꽉찼을 정도로 인기 있는 세션이었다. 인기가 있는 만큼 강의 내용도 알찼다. 마침 군돌이를 한창 개발했을 때 쯤이어서 발표 내용이 쏙쏙 들어왔고, 몰랐던 React Native의 동작 원리와 여러가지 개발 팁, 노하우 등을 전수받을 수 있어서 좋았다. &lt;a href=&quot;https://www.youtube.com/watch?v=FkFj1kPZIII&quot;&gt;발표 영상&lt;/a&gt; &lt;a href=&quot;https://github.com/738/deview-2018-review/blob/master/React%20Native:%20%EC%9B%B9%20%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80%20%ED%95%9C%20%EB%8B%AC%20%EB%A7%8C%EC%97%90%20%EC%95%B1%20%EC%B6%9C%EC%8B%9C%ED%95%98%EA%B8%B0.md&quot;&gt;제가 정리해놓은 자료&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;-결론&quot;&gt;&lt;a href=&quot;#-%EA%B2%B0%EB%A1%A0&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🚒 결론&lt;/h2&gt;
&lt;p&gt;React Native로 프로젝트를 진행하면서 많은 어려움이 있었지만 많은 삽질을 통해 새로운 기술을 익힐 수 있었다. 하지만 React Native는 개인 프로젝트나 프로토타입같이 빠르고 간단하게 만들 때에는 적합하지만 회사의 대형프로젝트에서 쓰기에는 부적합할 것 같다. 아직 React Native는 버전 업그레이드가 꾸준하고 빠르게 이루어지고 있고 그 말은 불안정하다는 말이니깐 말이다. 그래서 개인 프로젝트로 앱 만들 때에만 React Native를 주로 사용할 것이다. &lt;del&gt;React Native를 사용하는 회사가 거의 없긴 하다.&lt;/del&gt; 이로써 React Native 첫 개발기를 마치도록 하겠다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;왠지 군돌이 앱 개발기를 쓰다가 React Native 찬양글로 바뀐 것 같은 느낌적인 느낌이 들지만… 초보 블로거라 글이 생각보다 두서가 없고 길어지기만 해서 죄송합니다 😅 부족한 글 봐주셔서 감사합니다 🥝&lt;/p&gt;
&lt;/blockquote&gt;
                &lt;div style=&quot;margin-top=55px; font-style: italic;&quot;&gt;(This is an article posted to my blog at blog.holy.kiwi. You can read it online by &lt;a href=&quot;https://blog.holy.kiwi/js/190127/&quot;&gt;clicking here&lt;/a&gt;.)&lt;/div&gt;
              </content:encoded></item><item><title><![CDATA[🏊 React의 JSX 파고들기]]></title><description><![CDATA[React의 JSX에 대해 고찰해보자.]]></description><link>https://blog.holy.kiwi/js/190120/</link><guid isPermaLink="false">https://blog.holy.kiwi/js/190120/</guid><content:encoded>&lt;h2 id=&quot;-jsx가-대체-뭐지&quot;&gt;&lt;a href=&quot;#-jsx%EA%B0%80-%EB%8C%80%EC%B2%B4-%EB%AD%90%EC%A7%80&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;😻 JSX가 대체 뭐지&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Hello world&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;React를 처음 접할 때, 보통의 자바스크립트와는 다른 문법을 볼 수 있다. 위 코드를 보면 변수에 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;div&amp;gt;Hello world&amp;lt;/div&amp;gt;&lt;/code&gt;를 할당하고 있는데 이는 문자열도 아니고, HTML도 아니다. 바로 JSX다. &lt;/p&gt;
&lt;p&gt;JSX는 JS + XML의 줄임말로써 자바스크립트 안에서 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;div&amp;gt;hello world&amp;lt;/div&amp;gt;&lt;/code&gt; 와 같이 HTML 같이 생긴 XML 문법을 사용할 수 있는 자바스크립트에서 확장된 파일형식이다. 나는 React의 JSX를 처음 보고 정말 참신하다고 생각했다. UI에 해당하는 HTML과 로직에 해당하는 Javascript를 나누지 않고 JSX라는 파일형식을 창조하여 컴포넌트 단위로 UI와 로직을 한 파일에 합쳤기 때문이다.&lt;/p&gt;
&lt;p&gt;물론 &lt;a href=&quot;https://reactjs.org/docs/react-without-jsx.html&quot;&gt;React에서 JSX를 사용하지 않을 수 있다.&lt;/a&gt; 하지만, Javascript 코드 안에서 UI가 동작하는 것을 시각적으로 바로 볼 수 있기 때문에 많은 사람들이 사용한다.&lt;/p&gt;
&lt;p&gt;다음은 React에서 JSX의 예제이다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AwesomeComponent&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;React&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Component&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;MyButton color&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;blue&quot;&lt;/span&gt; shadowSize&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
                Click Me
            &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;MyButton&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;위 JSX 코드는 아래와 같이 컴파일된다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AwesomeComponent&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;React&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Component&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; React&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            MyButton&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; color&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; shadowSize&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;Click Me&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://babeljs.io/repl/#?presets=react&amp;#x26;code_lz=GYVwdgxgLglg9mABACwKYBt1wBQEpEDeAUIogE6pQhlIA8AJjAG4B8AEhlogO5xnr0AhLQD0jVgG4iAXyJA&quot;&gt;온라인 바벨 컴파일러&lt;/a&gt;에서 위 내용을 확인할 수 있다.&lt;/p&gt;
&lt;h2 id=&quot;-jsx를-사용할-때-주의할-점들&quot;&gt;&lt;a href=&quot;#-jsx%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90%EB%93%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🍎 JSX를 사용할 때 주의할 점들&lt;/h2&gt;
&lt;h3 id=&quot;jsx를-사용하려면-react가-scope-안에-있어야-한다&quot;&gt;&lt;a href=&quot;#jsx%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A0%A4%EB%A9%B4-react%EA%B0%80-scope-%EC%95%88%EC%97%90-%EC%9E%88%EC%96%B4%EC%95%BC-%ED%95%9C%EB%8B%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JSX를 사용하려면 React가 Scope 안에 있어야 한다.&lt;/h3&gt;
&lt;p&gt;XML 형식의 코드는 &lt;code class=&quot;language-text&quot;&gt;React.createElement&lt;/code&gt; 함수를 호출하는 코드로 컴파일되기 때문에 React를 직접 쓰지 않더라도 React를 임포트해주어야 한다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; AwesomeButton &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./AwesomeButton&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;BlueButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// return React.createElement(AwesomeButton, {color: &apos;blue&apos;}, null);&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;AwesomeButton color&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;blue&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;최상위-부모-dom은-하나여야-한다&quot;&gt;&lt;a href=&quot;#%EC%B5%9C%EC%83%81%EC%9C%84-%EB%B6%80%EB%AA%A8-dom%EC%9D%80-%ED%95%98%EB%82%98%EC%97%AC%EC%95%BC-%ED%95%9C%EB%8B%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;최상위 부모 DOM은 하나여야 한다.&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;React.createElement&lt;/code&gt; 함수의 인자는 &lt;code class=&quot;language-text&quot;&gt;React.createElement(component, props, ...children)&lt;/code&gt;와 같다. 첫번째 인자에 component가 오고, 두번째에는 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt; 형식의 props가 오고 세번째 인자는 가변인수로 children들이 온다. 여기서 중요하게 봐야할 점은 최상위 부모 DOM이다. 최상위에서 제일 처음 호출되는 &lt;code class=&quot;language-text&quot;&gt;React.createElement&lt;/code&gt;는 단 하나만이 호출되기 때문에 최상위 부모 DOM은 오로지 하나여야 한다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 나쁜 예: 최상위 부모 DOM이 두 개이다. 컴파일할 수 없다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;BadComponent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;hello&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;world&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 좋은 예: 최상위 부모 DOM이 한 개이다.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;GoodComponent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;hello&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;world&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 위 GoodComponent.jsx를 컴파일한 GoodComponent.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;GoodComponent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; React&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        React&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;hello&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        React&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;world&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;직접-정의한-컴포넌트는-대문자로-시작해야-한다&quot;&gt;&lt;a href=&quot;#%EC%A7%81%EC%A0%91-%EC%A0%95%EC%9D%98%ED%95%9C-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%8A%94-%EB%8C%80%EB%AC%B8%EC%9E%90%EB%A1%9C-%EC%8B%9C%EC%9E%91%ED%95%B4%EC%95%BC-%ED%95%9C%EB%8B%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;직접 정의한 컴포넌트는 대문자로 시작해야 한다.&lt;/h3&gt;
&lt;p&gt;React는 소문자로 시작하는 컴포넌트를 HTML tag로 인지하기 때문에 대문자로 시작하는 네이밍을 사용해야 한다. 이는 보통 클래스는 대문자로 시작하는게 관습이므로 신경쓰지는 않아도 될듯 싶다.&lt;/p&gt;
&lt;h3 id=&quot;props를-사용할-때-스프레드-연산자를-사용할-수-있다&quot;&gt;&lt;a href=&quot;#props%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-%EC%8A%A4%ED%94%84%EB%A0%88%EB%93%9C-%EC%97%B0%EC%82%B0%EC%9E%90%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8B%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;props를 사용할 때 스프레드 연산자를 사용할 수 있다.&lt;/h3&gt;
&lt;p&gt;props를 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt; type으로 정의하여 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;Greeting {...props} /&amp;gt;&lt;/code&gt;와 같이 사용할 수 있다. 부모 컴포넌트의 props를 자식 컴포넌트에서 그대로 자식 컴포넌트에게 물려줄 때 유용하게 사용할 수 있다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;App1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Greeting firstName&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Ben&quot;&lt;/span&gt; lastName&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hector&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;App2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; props &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;firstName&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Ben&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lastName&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hector&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Greeting &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;children에-javascript의-표현식을-사용할-수-있다&quot;&gt;&lt;a href=&quot;#children%EC%97%90-javascript%EC%9D%98-%ED%91%9C%ED%98%84%EC%8B%9D%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8B%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Children에 Javascript의 표현식을 사용할 수 있다.&lt;/h3&gt;
&lt;p&gt;배열에 있는 아이템을 차례대로 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;&lt;/code&gt;로 보여주고 싶을 때 Javascript의 &lt;code class=&quot;language-text&quot;&gt;map&lt;/code&gt;을 사용하면 쉽게 처리할 수 있다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;TodoList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; todoItems &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;You don\&apos;t know JS 책 읽기&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;깃헙 커밋하기&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;블로그 포스팅하기&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;todoItems&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; index&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;li key&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;li&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;ul&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;boolean-undefined-null은-렌더되지-않는다&quot;&gt;&lt;a href=&quot;#boolean-undefined-null%EC%9D%80-%EB%A0%8C%EB%8D%94%EB%90%98%EC%A7%80-%EC%95%8A%EB%8A%94%EB%8B%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;boolean, undefined, null은 렌더되지 않는다.&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt;은 렌더되지 않기 때문에 이 특징을 사용하여 아래와 같이 쓸 수 있다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 좋은 예&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;showHeader &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Header &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Content &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* NOPE. 하지만 아래와 같이 사용하게 되면 props.messages.length이 0일 때
falsy한 값으로 뒤의 값들이 나오지 않겠지만 0이 렌더되기 때문에 옳은 방법은 아니다. */&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;MessageList messages&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// OK. 이와 같이 바꿔주어야 한다.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;MessageList messages&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;react-코드-살펴보기&quot;&gt;&lt;a href=&quot;#react-%EC%BD%94%EB%93%9C-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;React 코드 살펴보기&lt;/h2&gt;
&lt;p&gt;React 16.4.0 버전의 코드를 살펴보겠다. &lt;code class=&quot;language-text&quot;&gt;ReactElement.js&lt;/code&gt; 파일에서 &lt;code class=&quot;language-text&quot;&gt;createElement&lt;/code&gt;를 정의하는 코드이다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; children&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// ... 중략&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ReactElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    ref&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    source&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    ReactCurrentOwner&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    props&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;React.createElement&lt;/code&gt; 함수는 &lt;code class=&quot;language-text&quot;&gt;ReactElement&lt;/code&gt;라는 자료형으로 반환하는 것을 볼 수 있다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;ReactElement&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ref&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; source&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; props&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// This tag allows us to uniquely identify this as a React Element&lt;/span&gt;
    $$&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;REACT_ELEMENT_TYPE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Built-in properties that belong on the element&lt;/span&gt;
    type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    key&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    ref&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ref&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    props&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; props&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Record the component responsible for creating this element.&lt;/span&gt;
    _owner&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// ... 중략&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;위 코드를 통해 &lt;code class=&quot;language-text&quot;&gt;ReactElement&lt;/code&gt; 자료형은 &lt;code class=&quot;language-text&quot;&gt;$$typeof&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;type&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;key&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;ref&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;props&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;_owner&lt;/code&gt;를 갖는 &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;인 것을 확인할 수 있다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AwesomeComponent&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;React&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Component&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; React&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            MyButton&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; color&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; shadowSize&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;Click Me&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;따라서 위에서 JSX가 컴파일된 코드는 아래와 같이 다시 &lt;code class=&quot;language-text&quot;&gt;ReactElement&lt;/code&gt;로 반환될 것이다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AwesomeComponent&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;React&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Component&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; MyButton&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            props&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                color&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;blue&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                shadowSize&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                children&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Click Me&apos;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;-jsx는-미쳤다&quot;&gt;&lt;a href=&quot;#-jsx%EB%8A%94-%EB%AF%B8%EC%B3%A4%EB%8B%A4&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;👱🏻 JSX는 미쳤다.&lt;/h2&gt;
&lt;p&gt;React에서 가장 중요한 개념인 Component는 UI를 구성하는 개별적인 뷰 단위이다. React로 개발한다는 것은 블록을 조합해 집을 짓는 것과 같다. React 앱은 Component들의 결합으로 만들어지는 것이다. 여기서 주의 깊게 봐야할 부분은 Component가 재사용이 가능하다는 점이다. 재사용이 가능한 React의 Component는 생산성을 극대화시켜주었다. Component를 효율적으로 만들기 위해 React는 JSX라는 특이한 Syntax를 만들어냈고 그 결과는 탁월했다. Javascript 코드 안에 태그를 넣어 사용한다는 생각은 정말로 발상의 전환이었다. 정말 미친 것 같다.&lt;/p&gt;
&lt;p&gt;추가적으로 React의 또 하나의 가장 중요한 특징인 Virtual DOM을 빼놓을 수 없겠다. 아마 다음 포스트 주제가 될 것 같다. 🥝&lt;/p&gt;
&lt;h3 id=&quot;참고&quot;&gt;&lt;a href=&quot;#%EC%B0%B8%EA%B3%A0&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;참고&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://reactjs.org/docs/introducing-jsx.html&quot;&gt;Introducing JSX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://reactjs.org/docs/jsx-in-depth.html&quot;&gt;JSX In Depth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://reactjs.org/docs/react-without-jsx.html&quot;&gt;React Without JSX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
                &lt;div style=&quot;margin-top=55px; font-style: italic;&quot;&gt;(This is an article posted to my blog at blog.holy.kiwi. You can read it online by &lt;a href=&quot;https://blog.holy.kiwi/js/190120/&quot;&gt;clicking here&lt;/a&gt;.)&lt;/div&gt;
              </content:encoded></item><item><title><![CDATA[🚀 개발자에게 블로그는 선택이 아닌, 필수인가?]]></title><description><![CDATA[2019년을 맞이해서 블로그를 시작했다. 티스토리의 단점, 그리고 개츠비]]></description><link>https://blog.holy.kiwi/gen/190112/</link><guid isPermaLink="false">https://blog.holy.kiwi/gen/190112/</guid><content:encoded>&lt;h2 id=&quot;-블로그의-시작&quot;&gt;&lt;a href=&quot;#-%EB%B8%94%EB%A1%9C%EA%B7%B8%EC%9D%98-%EC%8B%9C%EC%9E%91&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🔥 블로그의 시작&lt;/h2&gt;
&lt;p&gt;2019년을 맞이해서 평소에 내가 개발자의 덕목이라고 생각하는 블로그를 쓰려고 한다. 2019년 1월 1일부터 생각했지만, 블로그 시작하기가 여간 어려운 것이 아니었다. 이미, 티스토리(&lt;a href=&quot;https://jonjee.tistory.com&quot;&gt;내 시험용 티스토리 블로그&lt;/a&gt;)로 시작해보려고 시도해보았지만 &lt;code class=&quot;language-text&quot;&gt;react-native&lt;/code&gt; 개발할 때 모아놓은 trouble shooting 포스트만 잔뜩 써놓고 그만두었다. 처음에 티스토리로 시작하려는 이유는 다음과 같았다.&lt;/p&gt;
&lt;h3 id=&quot;티스토리의-장점&quot;&gt;&lt;a href=&quot;#%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%9D%98-%EC%9E%A5%EC%A0%90&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;티스토리의 장점&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;내가 통계 시스템을 신경쓰지 않아도 티스토리에서 알아서 해줘서 편하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;개인이 직접 호스팅하는 블로그에서는 &lt;a href=&quot;https://analytics.google.com&quot;&gt;Google Analytics&lt;/a&gt;와 같은 통계 서비스를 이용해주어야 하지만, 티스토리나 네이버 블로그 같은 경우엔 통계 시스템이 아주 잘되어있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;SEO 최적화를 개인이 호스팅하는 블로그보다 신경쓰지 않아도 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;SEO란, 검색엔진 최적화인데 티스토리가 일단 다음 회사 소유이기 때문에 다음의 검색엔진에 가장 최적화가 잘되어있고, 구글에도 개발 관련 글을 치면 티스토리 블로그가 많이 나온다는 것을 확인할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;광고 붙이기가 쉽다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;애드센스 플러그인 등을 제공해서 글에 쉽게 삽입할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;위 세 가지 장점을 가지고 시작했는데, 몇 가지 단점들 때문에 오래 가지 못할 것 같았다.&lt;/p&gt;
&lt;h3 id=&quot;티스토리의-단점&quot;&gt;&lt;a href=&quot;#%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%9D%98-%EB%8B%A8%EC%A0%90&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;티스토리의 단점&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;편집기에서 마크다운을 지원하지 않는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;티스토리에서는 아직까지 공식적으로 &lt;a href=&quot;https://en.wikipedia.org/wiki/Markdown&quot;&gt;Markdown&lt;/a&gt; 편집 방식을 지원하지 않는다. 개발자에겐 마크다운이 편한데 지원하지 않는다는 것은 아주 큰 불편함이 될 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;템플릿이 너무 정형화되어있고, 덜 개성적이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;티스토리에도 이쁜 스킨(디자인)들이 많겠지만 내 스타일이 아니고(&lt;del&gt;주관적인 의견&lt;/del&gt;) 커스터마이징하는 것에 한계가 있어서 덜 개성적이라고 생각한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;-개츠비의-발견&quot;&gt;&lt;a href=&quot;#-%EA%B0%9C%EC%B8%A0%EB%B9%84%EC%9D%98-%EB%B0%9C%EA%B2%AC&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🕶 개츠비의 발견&lt;/h2&gt;
&lt;p&gt;몇개월 전에 React 개발자인 &lt;a href=&quot;https://github.com/gaearon&quot;&gt;Dan Abramov&lt;/a&gt;가 블로그 &lt;a href=&quot;https://overreacted.io&quot;&gt;Overreacted&lt;/a&gt;를 보고 디자인이 깔끔해서 무척 마음에 들었었는데 그게 &lt;a href=&quot;https://github.com/gatsbyjs/gatsby-starter-blog&quot;&gt;gatsby-starter-blog&lt;/a&gt;였다. 그래서 &lt;a href=&quot;https://gatsbyjs.org&quot;&gt;Gatsbyjs&lt;/a&gt;에 관심 가지게 되었다. 예전에도 블로그를 시작하려고 알아본 정적 페이지 제너레이터 삼대장인 &lt;a href=&quot;https://jekyllrb-ko.github.io/&quot;&gt;지킬&lt;/a&gt;, &lt;a href=&quot;https://hexo.io/&quot;&gt;헥소&lt;/a&gt;, &lt;a href=&quot;https://gohugo.io/&quot;&gt;휴고&lt;/a&gt;를 알고 있었지만 개츠비는 처음 들어봤었다. 위 세가지 것들과 다르게 프론트엔드 템플릿에 react를 사용한다는 점이 마음에 들었다. 그래서 바로 개츠비 공식 웹사이트에 가서 세팅하는 문서를 차근차근 보고 따라해봐서 나온 결과물이 바로 &lt;a href=&quot;https://blog.holy.kiwi/&quot;&gt;이 곳&lt;/a&gt;이다. 개츠비를 더 열심히 파본 다음에, 개츠비 관련 포스트도 작성해봐야겠다.&lt;/p&gt;
&lt;h2 id=&quot;-2019년에는-블로거&quot;&gt;&lt;a href=&quot;#-2019%EB%85%84%EC%97%90%EB%8A%94-%EB%B8%94%EB%A1%9C%EA%B1%B0&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🎆 2019년에는 블로거&lt;/h2&gt;
&lt;p&gt;어떤 책에서 개발자는 무조건 블로그를 해야한다는 글을 본 적이 있다. 그 글을 보고 나서 무조건 블로그를 시작하기로 마음을 먹었지만 좀처럼 쉽지 않았다. 블로그 플랫폼을 선택하는 것부터, 글을 쓰기 위해 노력하는 시간들까지 무엇 하나 신경이 쓰이지 않는 부분이 없었다. 하지만 내가 구글링을 하면서 다른 개발자분들의 기록, 정리들을 살펴보면서 개발에 대한 도움을 많이 얻고 있는데 나는 소비만 하고 생산은 하지않는다는 것이 받기만 하는 느낌이 들었다. 또한, 블로그 하시는 개발자분들을 보며 존경심이 생겼고 많은 자극과 동기부여를 받았다. 그래서 나도 다른 개발자분들에게 도움이 되고 싶고 나름대로 내 공부도 되기 때문에 일타이피로 블로그를 시작하기로 마음 먹었다. (또한, 현재 자기자신의 관심사가 뭔지 보여줄 수 있는 창구가 된다.)&lt;/p&gt;
&lt;p&gt;다음은 내가 생각하는 블로그를 하면 좋은 점이다.&lt;/p&gt;
&lt;h3 id=&quot;블로그를-하면-좋은-점&quot;&gt;&lt;a href=&quot;#%EB%B8%94%EB%A1%9C%EA%B7%B8%EB%A5%BC-%ED%95%98%EB%A9%B4-%EC%A2%8B%EC%9D%80-%EC%A0%90&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;블로그를 하면 좋은 점&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;남에게 설명을 해야하기 때문에 더 깊이 있게 공부할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;블로그 포스트를 쓴다는 것은 생각보다 만만치 않은 일이다. 포스트의 주제를 잡으면 그 내용에 대해 엄청 깊게 조사해봐야 하는 것이다. 내가 블로그를 시작하지 못한 이유 중 하나이다. 포스트를 쓰기 위해서는 대충 알아서는 안되기 때문이다. 대충 알면 독자들에게 제대로 그리고 쉽게 설명할 수 없다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;글쓰기 실력이 늘어난다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;개발자들은 보통 이공계 출신이기 때문에 글쓰기 능력이 많이 떨어진다.(&lt;del&gt;아닌 사람도 많은듯&lt;/del&gt;) 따라서 블로그 포스팅을 함으로써 글쓰기 능력을 기를 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;포트폴리오가 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;개발자에게 블로그는 포트폴리오가 될 수 있다. 자신이 관심 있게 사용한 기술들과 그 기술들을 사용한 내용들이 좋은 글들로써 블로그에 충분히 담겨져 있다면 더할 나위 없을 것이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;-마지막으로&quot;&gt;&lt;a href=&quot;#-%EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🌜 마지막으로&lt;/h2&gt;
&lt;p&gt;이 글을 쓰는데도 적잖은 시간이 들었다. 내가 제대로 꾸준히 블로그를 유지/관리할 수 있을지 걱정된다. 2019년에는 일주일에 퀄리티 좋은 글 하나 쓰기를 목표로 하겠다는 다짐으로 블로그를 시작하겠다. 아자아자!! 🥝&lt;/p&gt;
                &lt;div style=&quot;margin-top=55px; font-style: italic;&quot;&gt;(This is an article posted to my blog at blog.holy.kiwi. You can read it online by &lt;a href=&quot;https://blog.holy.kiwi/gen/190112/&quot;&gt;clicking here&lt;/a&gt;.)&lt;/div&gt;
              </content:encoded></item><item><title><![CDATA[🍉 In JS, is an empty Array return false or true?]]></title><description><![CDATA[We talk about Equality comparisons and sameness of Javascript.]]></description><link>https://blog.holy.kiwi/js/180515/</link><guid isPermaLink="false">https://blog.holy.kiwi/js/180515/</guid><content:encoded>&lt;h2 id=&quot;-general&quot;&gt;&lt;a href=&quot;#-general&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;😃 General&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;When I was coding, there was a situation that if an array has values, it will return true. So I wrote like this &lt;code class=&quot;language-text&quot;&gt;bool = !!array&lt;/code&gt;. But, unexpectedly when &lt;code class=&quot;language-text&quot;&gt;array = []&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;bool&lt;/code&gt; is &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;, not &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;-why&quot;&gt;&lt;a href=&quot;#-why&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🤔 Why?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;First, I thought if empty &lt;code class=&quot;language-text&quot;&gt;string&lt;/code&gt; or empty &lt;code class=&quot;language-text&quot;&gt;Array&lt;/code&gt; is conversed to &lt;code class=&quot;language-text&quot;&gt;Boolean&lt;/code&gt;, it must return &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;But it is not.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Conversion&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Boolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Boolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Implied Conversion&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;In Conversion, the result is like this, so I thought &lt;code class=&quot;language-text&quot;&gt;&amp;#39;&amp;#39;&lt;/code&gt; is &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;[]&lt;/code&gt; is &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Loose Equality&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;But here in Loose Equality, the result is &lt;code class=&quot;language-text&quot;&gt;&amp;#39;&amp;#39;&lt;/code&gt; is &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;(of course), &lt;code class=&quot;language-text&quot;&gt;[]&lt;/code&gt; is &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt; too.&lt;/li&gt;
&lt;li&gt;I found a doc about this. &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness&quot;&gt;Equality comparisons and sameness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;In Loose Equality, &lt;code class=&quot;language-text&quot;&gt;[]&lt;/code&gt; is &lt;code class=&quot;language-text&quot;&gt;Object&lt;/code&gt;, and &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt; is &lt;code class=&quot;language-text&quot;&gt;Boolean&lt;/code&gt;. So in the table, it is applied that &lt;code class=&quot;language-text&quot;&gt;ToPrimitive([]) == ToNumber(false)&lt;/code&gt; and recursively &lt;code class=&quot;language-text&quot;&gt;ToNumber(&amp;quot;&amp;quot;) === 0&lt;/code&gt;. Eventually, it returns true.&lt;/li&gt;
&lt;li&gt;I certainly realized when I saw this table. plz memorize it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;toboolean-table&quot;&gt;&lt;a href=&quot;#toboolean-table&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;toBoolean Table&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;Argument Type&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;same as input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;+0&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;-0&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;NaN&lt;/code&gt; -&gt; &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;, otherwise -&gt; &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;empty string -&gt; &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;, otherwise -&gt; &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;-conclusion&quot;&gt;&lt;a href=&quot;#-conclusion&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🤖 Conclusion&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Because &lt;code class=&quot;language-text&quot;&gt;Array&lt;/code&gt; is type of &lt;code class=&quot;language-text&quot;&gt;object&lt;/code&gt;, the fact that an empty &lt;code class=&quot;language-text&quot;&gt;Array&lt;/code&gt; is conversed to &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt; is correct.&lt;/li&gt;
&lt;li&gt;But in Loose Equality, &lt;code class=&quot;language-text&quot;&gt;[] == false&lt;/code&gt; is right.&lt;/li&gt;
&lt;li&gt;So, above &lt;code class=&quot;language-text&quot;&gt;bool = !!array&lt;/code&gt; code can be changed &lt;code class=&quot;language-text&quot;&gt;bool = array == false&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Or, you can make function that checks &lt;code class=&quot;language-text&quot;&gt;array === undefined&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;array.length === 0&lt;/code&gt;. 🥝&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-reference&quot;&gt;&lt;a href=&quot;#-reference&quot; aria-hidden class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;📖 reference&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness&quot;&gt;Equality comparisons and sameness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codepen.io/arosenb2/post/is-a-javascript-empty-array-falsey-or-not&quot;&gt;Is A JavaScript Empty Array Falsey Or Not?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tc39.github.io/ecma262/#sec-toboolean&quot;&gt;toBoolean Table&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
                &lt;div style=&quot;margin-top=55px; font-style: italic;&quot;&gt;(This is an article posted to my blog at blog.holy.kiwi. You can read it online by &lt;a href=&quot;https://blog.holy.kiwi/js/180515/&quot;&gt;clicking here&lt;/a&gt;.)&lt;/div&gt;
              </content:encoded></item></channel></rss>