<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>let.it.log ✍️</title>
        <link>https://velog.io/</link>
        <description>간단히 기록하는 블로그</description>
        <lastBuildDate>Sun, 14 Aug 2022 23:55:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>let.it.log ✍️</title>
            <url>https://velog.velcdn.com/images/dev-log/profile/ec400cbc-6f84-4f0e-8c36-78e3cd084b62/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. let.it.log ✍️. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev-log" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[약간 늦은 2022 2~3분기 회고와 생각들]]></title>
            <link>https://velog.io/@dev-log/%EC%95%BD%EA%B0%84-%EB%8A%A6%EC%9D%80-2022-23%EB%B6%84%EA%B8%B0-%ED%9A%8C%EA%B3%A0%EC%99%80-%EC%83%9D%EA%B0%81%EB%93%A4</link>
            <guid>https://velog.io/@dev-log/%EC%95%BD%EA%B0%84-%EB%8A%A6%EC%9D%80-2022-23%EB%B6%84%EA%B8%B0-%ED%9A%8C%EA%B3%A0%EC%99%80-%EC%83%9D%EA%B0%81%EB%93%A4</guid>
            <pubDate>Sun, 14 Aug 2022 23:55:54 GMT</pubDate>
            <description><![CDATA[<p>그동안 너무 정신 없이 흘러가는대로 지냈다. </p>
<br>

<h2 id="23분기-동안-진행한-것">2~3분기 동안 진행한 것</h2>
<h3 id="개발">개발</h3>
<p><img src="https://velog.velcdn.com/images/dev-log/post/c7f0c5ff-30be-4e11-b0a9-5c8adc6254d3/image.png" alt=""></p>
<ul>
<li>Spring Batch 스터디<ul>
<li>이전부터 진행하던 <code>점심 인강 듣기 스터디(?)</code>를 꾸준히 진행하고 있다. 현재 절반 가량 수강한 상태다. 확실히 인강으로 같이 하는걸 진행하니 진도가 느려서 다음엔 다른 방식을 선택해보려고 생각중이다.</li>
</ul>
</li>
<li>Clean Code 스터디<ul>
<li><strong>팀내 코드리뷰에 긍정적인 영향이 있었으면 좋겠다는 생각</strong>에 <code>Clean Code</code> 스터디를 주도해 시작했다.</li>
<li>Spring Batch 와 마찬가지로 팀원들에게 부담을 주고 싶지 않아서, 팀장님의 허가를 받아 업무 시간의 일부를 사용하고 스터디 시간 안에 스터디가 끝나는 방식을 고안했다.</li>
<li>스터디 방식으로 <a href="http://egloos.zum.com/agile/v/3684946">삼색볼펜법 방식</a>을 적용했다. </li>
<li>확실히 업무 시간에 진행하고, 그 시간안에 끝내니 서로 부담이 적었고 <code>짧은 시간안에 몰입해 집중</code>할 수 있다는 장점이 있었다. </li>
<li>너무 호흡이 긴 책은 이 방식을 적용하기 어렵겠지만 비슷한 종류의 책으로 스터디를 진행한다면 이 방식을 다시 적용해볼 것 같다.</li>
</ul>
</li>
<li>HTTP 완강<ul>
<li>계속 미뤄지던 영한님 HTTP 강의를 완강했다. <strong>HTTP 책을 보기엔 부담스럽고 지식이 부족하다면</strong> 보기 좋은 강의 같다.</li>
</ul>
</li>
<li>만들면서 배우는 클린 아키텍처 스터디 <ul>
<li>스터디는 완료하고 프로젝트 진행을 간단히 해보았다. 서로의 <code>코드리뷰</code>를 보고 배운 점이 많았다.</li>
</ul>
</li>
<li>사내 기술 블로그 작성<ul>
<li>이전에 했던 프로젝트 중 혼자 이끌어간 프로젝트로 회사 기술블로그에 쓸만한 내용이 있어서 처음부터 복기하면서 포스팅을 작성했다. </li>
<li>여전히 어렵고 완전히 모든걸 알고 있다고 말하긴 어렵지만, <strong>다시 복기하며 프로젝트에 대한 이해도가 높아져 한편으로는 아쉬움도 있었다. 지금의 내가 그 프로젝트를 다시 맡게 된다면 더 잘 할 자신이 있다는 생각이 들어서</strong> 인 것 같다.</li>
<li><strong>회사 블로그에 글을 쓴다는 건 생각보다 주변에 영향을 주며, 어렵고 공부가 되는 일인 듯 하다.</strong> 제대로 알고 쓰기 위해서 추가로 공부할 내용이 정말 많았고 잘못된 정보를 주지 않기 위해 신중해야했다. 애매하게 알고 넘어간 것도 다시 확인을 하게 되었다. 그리고 블로그에 글을 쓴 것 만으로 팀내 팀원들이 읽어보게 되고 타 팀에서도 내 글을 읽고 댓글을 남겨주었고, 이후 멈췄던 사내 기술 블로그에 타팀에서 글이 적극적으로 올라오는 것을 보면서, 이런 공식적인 활동이 팀내외로 <code>긍정적인 영향</code>을 끼치는 구나 생각이 들었다. </li>
</ul>
</li>
<li>인프런 카프카 강의<ul>
<li>카프카 공부하다보면 알게되는 데브원영님 강의를 면접 준비하며 듣게되었다. 새로 알게 되는 것도 있었고 아는 내용도 있었다. </li>
<li>카프카 초심자보다는 <strong>이미 알고 있는 중급자가 아는 내용을 정리</strong>하기 위해 듣기 좋은 강의인 것 같다.</li>
</ul>
</li>
</ul>
<h3 id="이직-준비">이직 준비</h3>
<ul>
<li>경력 이력서 작성<ul>
<li>입사 후 한번도 이력서를 정리한 적이 없어서 경력 이력서 정리를 시작했다.</li>
<li>3년 전 일을 갑자기 꺼내는 건 너무 어려운 일이었다... 이력서 정리는 아무리 바빠도 매번 제때제때 해야하는 듯 하다</li>
<li><strong>이력서를 쓰면서 나를 많이 돌아보게 되었다.</strong> 이런 부분은 부족하구나, 이런 부분은 강점이 될 수 있겠다.</li>
<li>한가지 확실했던 건 지금 상태로 4년차가 되면 경쟁력이 떨어질 것 같다는 생각이 들었다. 그래서 이직을 본격적으로 준비해야겠다는 생각이 들었던 것 같다.</li>
</ul>
</li>
<li>공격적인 이직 준비<ul>
<li>사실 실제로 이직 준비를 하게된 이유는 <code>광고</code> 때문이었다.</li>
<li>이력서를 완성하고 나니(?) 이상하게(?) SNS, 웹서핑 중에 모집 공고가 자주 광고로 올라왔다.</li>
<li>그 중 편하게 지원할 수 있다고 강조하는 회사의 채용 공고를 보고 이력서만 간단히 넣어봤는데 바로 다음날 서류 통과와 코딩테스트를 보게되었다. 코딩테스트를 못봐서 떨어질 줄 알았는데 1차 면접까지 가게되었다. 하지만 3년만의 첫 면접은 준비도 부족했고 대답도 제대로 하지 못했다. <strong>개인적으로 가고 싶은 회사였기에 면접 전까지 일사천리로 진행되는 것을 보고 더 아쉬움이 들었고, 이 지원을 계기로 좀 더 공격적으로 지원을 하게 되었다.</strong></li>
<li>떨어진 곳도 지원하는 곳도 모두 <code>네카라쿠배어쩌고</code> 라인이었다</li>
<li>현재 회사도 좋은 회사지만, <code>좀 더 적극적인 개발 문화가 있는 회사</code>에 가고 싶었던 게 큰 이유였던 것 같다. 다른 뜻이 있었다면 스타트업도 생각해보았을 텐데 아직은 큰 시스템을 좀 더 경험해보고 싶다는 생각이 컸다. 스타트업 경험이 없어서 아직은 아니지만 추후 스타트업 지원을 생각해볼 수도 있을 것 같다.</li>
<li>회사를 다니며 이직 준비를 하는 건 쉽지 않았다. 물론 평소에 아침 저녁으로 영어 공부와 개발 공부를 개인적으로 하고 있지만, 컨디션이 안좋거나 하기 싫을 때 쉴 수 있는 <strong>개인적인 공부와 달리 이직 준비는 그럼에도 불구하고 해야한다는게 힘들었다</strong>. 업무에 가급적 영향을 주지 않게 하려 했지만 몇번 휴가도 쓰게 되었다.</li>
<li>서류 제출, 코딩테스트, 전화면접, 사전과제, 비대면 면접.. 회사마다 요구하는 것도 다양했다.</li>
<li><strong>채용 전형은 최대 2~3개까지 진행할 수 있었다.</strong> 토너먼트 형식으로 Max 수치만큼 맞추고 하나가 탈락시 다른 곳에 새로 서류를 넣는 방식으로 진행했다.</li>
</ul>
</li>
</ul>
<h3 id="그리고-합격">그리고 합격</h3>
<p><img src="https://velog.velcdn.com/images/dev-log/post/5ce5aea8-24e4-4355-a594-387cec4ef366/image.png" alt=""></p>
<ul>
<li>그리고 다행히 지원했던 곳 중 한 곳에 <code>합격</code>을 하게 되었다.</li>
<li>개인적으로는 두 곳 이상 합격하고 싶었지만 함께 진행한 회사에 탈락해서 최종적으로 한 곳만 붙은 점은 좀 아쉬웠다.</li>
<li>굉장히 면접 느낌이 좋았고, 가장 갈증이던 개발 문화에 대한 것도 충족시킬 수 있는 회사로 보여서 기대가 된다.</li>
</ul>
<h2 id="앞으로-해야할-것">앞으로 해야할 것</h2>
<p>앞으로 계속 빅이벤트만 남아있다.</p>
<ul>
<li>퇴사 준비 -&gt; 송별회 -&gt; 이사 준비(대청소) -&gt; 집알아보기 -&gt; 입사 -&gt; 이사 -&gt; 수습 3개월 -&gt; 병원 -&gt; 어쩌면 수술(?) -&gt; 면허 취득</li>
</ul>
<p>남은 올해는 정말 정신 없이 보낼 것 같다. 잘 이직한 것처럼 남은 큰 산들도 무탈히 잘 넘어갔으면 좋겠다. 🙏</p>
<h2 id="앞으로-하고-싶은-것">앞으로 하고 싶은 것</h2>
<p>주로 공부에 대한 내용인데, </p>
<ul>
<li>인프런 자바, 스프링 커리큘럼</li>
<li>인프런 코프링 강의</li>
<li>패스트 캠퍼스 강의</li>
<li>인프런 JPA 강의</li>
</ul>
<p>입사 전까지 여유 있을 때 이 강의들을 듣고 싶다.
얼마나 들을진 모르지만, <strong>여유 있을 때 기본기를 한번 더 다지고 들어가고 싶어서</strong>, 가급적 열심히 들어야겠다는 생각이 든다.</p>
<h2 id="기타-생각들">기타 생각들</h2>
<p>1년 전 쯤부터 블로그를 처음 쓰기 시작했을 때만해도 여러가지로 마음이 불안했다.
현재 내 경력이 물경력은 아닐까, 여태 업무해온 것이 어떤 의미가 있을까 등등
하지만 차근차근 블로그도 쓰고 하고 싶은 공부도 하고, 업무에서도 내가 할 수 있는 <strong>최선을 다해보니 어떻게든 길은 열린 것 같다.</strong></p>
<p>마음이 너무 힘들어서 여러가지 랜선 모임을 찾고 그 분들을 보고 자극 받으며 공부를 슬슬 다시 시작한게 바로 작년 이쯤이었던 것 같다.
<strong>다시해도 되는구나, 이 세상에 늦는 건 없구나 새삼 생각이 든다.</strong></p>
<p>조금씩 바꾸자 한 것들이 모여서 커다란 변화가 되었다.
일찍 자기부터 시작해 오전에 일찍 일어나기, 습관이 들면 오전에 공부하고 출근하기, 그 습관이 들면 오전 일찍 7시 출근하기, 4시 퇴근 후 공부하기 이런 식으로 습관을 하나씩 붙였다. </p>
<p>현재는 숨쉬듯 자연스럽게 습관대로 하고 있다.</p>
<p>이직 준비 또한 마찬가지였다. 위와 같이 개발 공부도 조금씩 계속 하게되었다. 업무에서도 적극적으로 하게 되면서 이력서에 어필할 부분이 많아졌다.</p>
<p>작은 변화가 모여 큰 변화를 만들어 냈다. 
그리고 그것을 직접 겪으며 스스로에 대한 자존감, 자신감도 올라가는 것 같다.</p>
<blockquote>
<p>_남은 올해의 시간들도 지금처럼 최선을 다하기를,
어제의 나보다 오늘의 내가 조금 더 발전하기를 바라며
다시 달려야겠다 _🏃‍♀️🏃‍♀️🔥</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[당신의 코드리뷰가 어려운 이유]]></title>
            <link>https://velog.io/@dev-log/%EB%8B%B9%EC%8B%A0%EC%9D%98-%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0%EA%B0%80-%EC%96%B4%EB%A0%A4%EC%9A%B4-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@dev-log/%EB%8B%B9%EC%8B%A0%EC%9D%98-%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0%EA%B0%80-%EC%96%B4%EB%A0%A4%EC%9A%B4-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Sun, 24 Apr 2022 08:21:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><a href="https://blog.logi-spot.com/%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0%EC%9D%98-%EC%A7%84%EC%A7%9C-%EB%AA%A9%EC%A0%81%EC%9D%80-%EB%94%B0%EB%A1%9C%EC%9E%88%EB%8B%A4/">이미지 출처</a></p>
</blockquote>
<blockquote>
<p>백명석님의 코드리뷰 강의를 듣고 작성한 글입니다.</p>
</blockquote>
<h2 id="코드-리뷰-목적">코드 리뷰 목적</h2>
<ul>
<li>주목적은 <code>품질 문제 검수</code>(버그, 장애)</li>
<li>추가적인 목적<ul>
<li>아키텍처 속성 개선을 위해 <code>코드를 개선</code>하는 것.</li>
<li>코드, 해결책 등과 관련된 <code>지식 공유</code>에 기여하기 위함.</li>
<li>집단 <code>코드 오너십 및 결속 증대</code>.</li>
</ul>
</li>
</ul>
<h2 id="코드-리뷰가-어려운-이유">코드 리뷰가 어려운 이유</h2>
<ul>
<li>저자는 <strong>본인이 멋지다고 생각하는 PR</strong>을 보내고</li>
<li>리뷰어는 <strong>왜 멋지지 않은지에 대해 장황한 이유</strong>를 작성한다.</li>
<li><em>코드에 대한 비판을 자신에 대한 비판으로 이해한다.</em><ul>
<li>특히 상대가 직책자라면 ?</li>
</ul>
</li>
<li>피드백을 _조심스럽게 표현하는 것이 중요_하다.</li>
</ul>
<h2 id="그래서-어떻게-하라고-">그래서 어떻게 하라고 ?</h2>
<h3 id="1-지루한-작업은-컴퓨터로-처리한다">1. 지루한 작업은 컴퓨터로 처리한다.</h3>
<ul>
<li>기계가 할 수 있는 것들<ul>
<li>공백, 들여쓰기 등</li>
</ul>
</li>
<li>별도의 커밋, PR로 분리해 불필요하게 리뷰할 필요 없게 한다.</li>
</ul>
<h3 id="2-스타일-가이드를-통해-스타일-논쟁을-해소한다">2. 스타일 가이드를 통해 스타일 논쟁을 해소한다.</h3>
<h3 id="3-리뷰는-즉시-시작해라">3. 리뷰는 즉시 시작해라.</h3>
<ul>
<li>코드리뷰를 <code>높은 우선 순위</code>로 둔다.<ul>
<li>저자는 리뷰를 받을 때까지 Block 되므로</li>
</ul>
</li>
<li><code>PR의 Size</code>와 <code>Complexity</code>가 중요.<ul>
<li>작고 범위가 좁은 PR -&gt;</li>
<li>쉽고 상쾌하게 리뷰하기 좋음 -&gt;</li>
<li>빠르게 리뷰 수행</li>
</ul>
</li>
<li>리뷰 라운드의 <code>최대 시간은 하루</code><ul>
<li>우선 순위 높은 업무로 1일 내 불가하면 다른 리뷰어를 지정한다.</li>
<li>재지정이 자주 일어난다면, 그 팀의 일하는 속도를 고려해봐야한다.<h3 id="4-고수준으로-시작-저수준으로-내려가라">4. 고수준으로 시작, 저수준으로 내려가라.</h3>
</li>
</ul>
</li>
<li>한 리뷰에 20~50개의 의견은 위험하다.<ul>
<li>초기 라운드에서 <strong>고수준 피드백으로 제한</strong>한다.<ul>
<li>인터페이스 클래스의 재설계, 복잡한 함수의 분리 등</li>
</ul>
</li>
<li>고수준 피드백 처리된 후 저수준의 이슈를 처리한다.<ul>
<li>변수명 변경, 주석을 명확하게 하는 것 등<h3 id="5-예제-코드-제공에-관대해라">5. 예제 코드 제공에 관대해라.</h3>
</li>
</ul>
</li>
</ul>
</li>
<li>하지만, 너무 긴 예제를 제공하는 것은 억압적으로 보인다.</li>
<li>너무 많은 예제를 제공하는 것도 안좋아 보일 수 있다.<ul>
<li>저자가 코드를 작성할 수 없다고 생각한다는 신호가 될 수 있다.<h3 id="6-절대-너라고-하지-마라-님도-같다">6. 절대 &quot;너&quot;라고 하지 마라. (=~님도 같다)</h3>
</li>
</ul>
</li>
<li>리뷰의 핵심은 코드가 나아지게 하기 위한 것.</li>
<li><strong>너라고 하는 순간 비판의 대상은 저자가 된다.</strong></li>
<li>단어가 틀린 경우 <code>&quot;너 스펠링 틀렸어 00&quot; X</code> -&gt; <code>&quot;스펠링만 정정&quot;</code></li>
<li>주어만 빼라</li>
</ul>
<h3 id="7-피드백은-명령이-아니라-요청으로-표현해라">7. 피드백은 명령이 아니라 요청으로 표현해라.</h3>
<ul>
<li>~해(X) / ~하는게 어떨까요?(O)<h3 id="8-의견이-아니라-원칙에-기반해서-피드백해라">8. 의견이 아니라 원칙에 기반해서 피드백해라.</h3>
</li>
<li>저자에게 의견을 줄 때는 <code>&quot;제안하는 변경&quot;</code>과 <code>&quot;변경의 이유&quot;</code>를 모두 설명해라.</li>
<li>SW는 항상 원칙에 기반할 수는 없다.<ul>
<li>단지 그냥 보기 싫거나 직관적이지 않을 수도 있음.</li>
<li>무엇을 할 수 있을지 <code>객관적으로 설명</code>해라.<ul>
<li>이거 너무 혼란스러워(X)</li>
<li>이건 이해하기 어렵다(O)<h3 id="9-한-두-등급만-코드레벨을-올리는-것을-목표로-한다">9. 한 두 등급만 코드레벨을 올리는 것을 목표로 한다.</h3>
</li>
</ul>
</li>
</ul>
</li>
<li>D 등급이면 C나 B 등급을 받도록 도와라.<ul>
<li>Working effective with legacy code</li>
</ul>
</li>
<li><code>Make it work</code>, make it right, make it fast.<ul>
<li>첫번째만 필수고 나머지는 추가적인 것.</li>
</ul>
</li>
<li><strong>완전하지는 않아도 충분히 좋은 코드가 되도록 하면 된다.</strong><ul>
<li>승인을 보류하는 유일한 이유는 수차례 리뷰 후에도 코드가 F인 경우<h3 id="10-반복적인-패턴에-대한-피드백을-제한한다">10. 반복적인 패턴에 대한 피드백을 제한한다.</h3>
</li>
</ul>
</li>
<li>2~3개 정도만 언급하고 끝낼 것.<ul>
<li>개별 사례가 아닌 <code>패턴으로 언급할 것.</code><h3 id="11-리뷰의-범위를-존중한다">11. 리뷰의 범위를 존중한다.</h3>
</li>
</ul>
</li>
<li>PR 범위에 대해서만 언급해라.<ul>
<li>하지만 PR이 둘러싼 코드에 영향을 미칠 경우엔 언급한다.<h3 id="12-큰-리뷰를-잘게-나눌-기회를-찾아라">12. 큰 리뷰를 잘게 나눌 기회를 찾아라.</h3>
</li>
</ul>
</li>
<li>400 라인 이상 리뷰는 작게 분리한다.</li>
<li>분리를 위한 <code>논리적 경계를 식별</code>해 짐을 덜어준다.</li>
<li>여러 파일에 걸쳐 변경했다면, 파일별로 리뷰를 나눠라.</li>
<li><strong>코드 품질이 낮을 때 특히 리뷰 분리를 강조한다.</strong><ul>
<li>품질이 낮은 코드 리뷰는 라인이 늘수록 리뷰하기 어려워지기 때문<h3 id="13-진정한-칭찬을-해라">13. 진정한 칭찬을 해라.</h3>
</li>
</ul>
</li>
<li>잘못된 부분만 리뷰하지 말고 <code>긍정적인 행위</code>에 대해서도 PR 해라.<h3 id="14-사소한-이슈만-남았다면-승인해라">14. 사소한 이슈만 남았다면 승인해라.</h3>
</li>
<li>모든 comment가 수정되는 걸 확인하고 나서야 승인하지 않아도 된다.</li>
<li><strong>중요한 comment가 완료되었다면 승인해도 된다.</strong></li>
<li>아래 조건 중 하나라도 만족되면 승인한다.<ul>
<li>더 이상 comment가 없을 때</li>
<li>남겨진 comment가 사소한 이슈일 때 (오타 등)</li>
<li>남겨진 comment가 선택적 제안인 경우<ul>
<li>ex) 높은 수준의 리팩토링 / 디자인 패턴 적용 등<h3 id="15-교착상태를-적극적으로-처리해라">15. 교착상태를 적극적으로 처리해라</h3>
</li>
</ul>
</li>
</ul>
</li>
<li>comment를 반영하지 않고 승인 거부 하는 경우.</li>
<li>저자는 comment 반영을 거부하는 경우<ul>
<li>만나서 얘기해라</li>
<li>인정하거나 Escalate</li>
</ul>
</li>
<li>인정이 불가한 경우<ul>
<li>팀장이나 테크 리더에게 Escalation을 권유한다.</li>
<li>다른 리뷰어에게 할당</li>
</ul>
</li>
</ul>
<h2 id="좋은-리뷰어가-되기-위한-방법">좋은 리뷰어가 되기 위한 방법</h2>
<ul>
<li><strong>학습, 연습 뿐이다.</strong></li>
<li>사례를 공유한다.</li>
<li>Letter Grade<ul>
<li>Make it work / right / fast : working 할 정도로만 해라</li>
</ul>
</li>
<li>PR Template(Chrome Plugin 등)을 사용해라.</li>
</ul>
<h2 id="안하는-사람들을-어떻게-해야할까">안하는 사람들을 어떻게 해야할까</h2>
<ul>
<li>자신에게 이득이 되어야 한다.<ul>
<li><strong><em>멋져보여야 하고 싶어진다. 그게 뭐든</em></strong></li>
</ul>
</li>
<li>Refactoring Tip을 공유한다.</li>
</ul>
<h2 id="code-review-문화-정착의-어려움과-극복-방법">Code Review 문화 정착의 어려움과 극복 방법</h2>
<ul>
<li>On / Offline의 차이에서 오는 어려움<ul>
<li>꾸중 vs 토론<ul>
<li>Online에서의 토론이 _꾸중_처럼 느껴질 수 있다.</li>
</ul>
</li>
</ul>
</li>
<li>Author의 노력 <ul>
<li>작성자의 노력이 제일 중요하다.</li>
<li>어떻게 작성하느냐에 따라 다수의 리뷰어의 시간을 절약하고, 효과적인 리뷰가 가능하다.</li>
</ul>
</li>
<li><strong>Leader의 관심과 의지가 필요하다.</strong></li>
<li>코드 비난에 대한 두려움 -&gt; 나에 대한 비난이 아니다.</li>
</ul>
<h3 id="pr-효과">PR 효과</h3>
<ul>
<li>예상 못한 <code>버그</code>를 타 프로젝트에서 발견하기도 한다.</li>
<li><code>선플</code>이 달리기 시작함.</li>
<li>많은 사람이 코드를 보고 있다는 생각에 <em>PR 올리기 전 코드를 더 다듬게 된다</em>.</li>
<li><em>좋은 설계, 아키텍처, 클린코드, TDD 등에 대한 공감대가 형성된다</em>.</li>
</ul>
<h3 id="기타">기타</h3>
<ul>
<li>변경 내역이 많으면, 커밋을 의미있게 나눠서 한 경우 <code>커밋 단위</code>로 봐달라고 요청을 하자<ul>
<li>그래도 잘라서 올리자 200-400자 내외로</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[생각난 김에 써보는 2022 1분기 회고와 생각들]]></title>
            <link>https://velog.io/@dev-log/%EC%83%9D%EA%B0%81%EB%82%9C-%EA%B9%80%EC%97%90-%EC%8D%A8%EB%B3%B4%EB%8A%94-2022-1%EB%B6%84%EA%B8%B0-%ED%9A%8C%EA%B3%A0%EC%99%80-%EC%83%9D%EA%B0%81%EB%93%A4</link>
            <guid>https://velog.io/@dev-log/%EC%83%9D%EA%B0%81%EB%82%9C-%EA%B9%80%EC%97%90-%EC%8D%A8%EB%B3%B4%EB%8A%94-2022-1%EB%B6%84%EA%B8%B0-%ED%9A%8C%EA%B3%A0%EC%99%80-%EC%83%9D%EA%B0%81%EB%93%A4</guid>
            <pubDate>Thu, 14 Apr 2022 12:15:33 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@dev-log/2%EB%85%84%EC%B0%A8-%EC%A3%BC%EB%8B%88%EC%96%B4-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B7%B8%EB%8F%99%EC%95%88%EC%9D%98-%ED%9A%8C%EA%B3%A0%EB%A1%9D">2021 회고록</a>을 쓰고 나는 3달 동안 무엇을 했나.</p>
<p>이 글을 쓰기 위해 Notion과 다이어리를 뒤적여봤다.</p>
<h2 id="1분기-동안-진행한-것">1분기 동안 진행한 것</h2>
<h3 id="개발">개발</h3>
<p><img src="https://velog.velcdn.com/images/dev-log/post/973fd768-a64d-4a66-b700-b7f83e6ac2a4/image.png" alt=""></p>
<ul>
<li><code>&lt;모두의 알고리즘 파이썬&gt;</code> 완독 <ul>
<li>알고리즘을 파이썬으로 다시 공부해보려고, 파이썬 문법을 따로 공부하는 대신 쉬운 알고리즘 책을 한 권 뗐다. 개인적으로 개발 경력이 있는 분에게 추천하진 않지만 쉬워서 <strong>스트레스 풀이용</strong> 으로 괜찮았다.</li>
</ul>
</li>
<li><code>Spring Batch</code> 팀 내 스터디 시작 <ul>
<li>작년부터 팀 내 슬슬 언급했던 스터디를 시작했다. 빌드업 하고 보니 스터디라기 보단 인강 같이 듣기 모임(?)에 가까웠다. 매주 목요일 점심시간 1시간을 짬내서 인프런에 스프링 배치 인강을 듣는다. 듣고 공유하고 싶은 부분이나 의문점이 들면 다음 시간에 토론을 하는 방식으로 진행중이..지만 사실상 거의 인강만 듣는다.</li>
<li>팀내 분위기가 스터디에 소극적인데, 일이 몰려오면 급격히 몰려들기 때문이고 도메인 특성상 보수적인(?) 도메인이라 그런 것 같다. 그래서 <strong>가급적 팀원들의 부담을 주지 않는 선에서 함께 공부하는 분위기를 만들어보려고 시도했고 이정도는 괜찮은 시도라고 생각이 든다.</strong></li>
<li><em>단점은, 속도가 굉장히 느리다는 것인데..</em> 현재 1분기 동안 강의의 30% 정도 진행했고, 지금까지의 속도를 보면 올해 말 쯤 되면 완료될 것 같다. 당장 Spring Batch를 도입해야한다면 이런 방식을 사용하지 않겠지만, 위에 말했듯 부담되지 않으며 공부하는 분위기를 조성하기 위한 목적으로는 괜찮다고 생각이 든다. </li>
</ul>
</li>
<li>인프런 <code>HTTP 강의</code> ~ CH6까지 (CH7, 8 남음)<ul>
<li>좀 더 주니어 일때, 기본기에 대한 공부를 해두었으면 좋았겠지만, 여러 이유로 진행하지 못해서(회고록 참조) 올해 하려고 한다. 이 강의도 그의 일환이다. 개인적으로 강의 듣는 것을 별로 좋아하지 않는데, 김영한님 강의는 늘어지는 것 없고 덜 졸립게 재밌게(?) 진행되서 듣기 싫어도 클릭해서 보게 되는 것 같다.</li>
</ul>
</li>
<li>인프런 <code>docker-compose</code> 강의 완</li>
<li>NextStep <code>ATDD</code> 참여 <ul>
<li>넥스트 스탭에 TEST 관련 강의가 있어서 TDD에 이어 들었는데, 개인적으로는 좀 어려웠지만 인수테스트에 대해 알게 되고, 통합 테스트를 작성하는 법, 전반적인 테스트를 작성하는 법에 대해 좀 더 알게 되어 좋았다. 완전히 완료하지 못해서 2분기에 다시 진행하는 것이 목표다.</li>
</ul>
</li>
<li>우아한테크세미나: 우아한 객체지향</li>
<li><code>토비의 스프링</code> 일부 읽기 <ul>
<li>토비의 스프링을 1~2년 전에 읽었는데 완전히 이해하지 못해서 다시 읽으려 한다. 하지만 전체를 각잡고 읽는 것보다 필요한 부분만 발췌독 해 읽으려 한다.</li>
</ul>
</li>
<li><code>&lt;만들면서 배우는 클린 아키텍처&gt;</code> 스터디 진행 중<ul>
<li>회사 CTO 분께서 헥사고날 아키텍쳐로 세미나를 하시기도 하고, 주변에서 &#39;너가 좋아할만한 책&#39;이라는 추천이 여러번 들어와서 읽게되었다. 마침 스터디 할 연이 생겨서 스터디를 진행중이다. 현재는 책을 90퍼 정도 보았고, 이후 간단한 토이 프로젝트를 하는 것이 목표다.</li>
</ul>
</li>
<li>우아한테크세미나: 실시간 음식배달 플랫폼에서 활용한 분산 이벤트 스트리밍</li>
<li><code>도메인 주도 설계로 시작하는 마이크로서비스 개발</code> 읽는 중 <ul>
<li>이거는 서점에서 재밌어보여서 집은 책인데 원래라면 우선순위에 밀려서 바쁘다고 안읽었을 텐데 최근 친구와 <code>진행하는 공부 외 기술 책읽는 모임</code>을 만들어서 꾸준히 읽고 있다 1/3 정도 읽었는데 가볍게 MSA와 DDD 에 대해서 훑는 책이라 읽어서 관련 기반지식을 알아가는 것도 나쁘지 않은 듯 하다. 이후 추가로 깊이있게 보려면 <code>마이크로서비스 패턴</code> 책과 <code>도메인 중심 설계</code> 책을 보는게 좋을 것 같다.</li>
</ul>
</li>
</ul>
<h3 id="기타">기타</h3>
<ul>
<li>영어 공부<ul>
<li>오전에 출근 전 영어 공부 1시간씩 진행하고 있다.</li>
</ul>
</li>
<li>경력 이력서 쓰기 <ul>
<li>당장 이직 생각은 없지만 이력서는 써둬야지 하고 미뤄뒀는데 최근에 처음으로 경력 이력서를 써봤다. 부족한 점이 많이 보이고 보강 해야겠다는 생각이 든다.</li>
</ul>
</li>
</ul>
<h3 id="벌려-놓은-것">벌려 놓은 것</h3>
<ul>
<li>랜선 모각코 인증<ul>
<li>랜선 모각코라는 온라인 상 모각코에서 공부할 때마다 인증 중이다. 최근 다들 활동이 뜸해지는 분위기라 아쉽다.</li>
</ul>
</li>
<li>일일 커밋 인증<ul>
<li>일일 커밋 인증 카톡방을 따로 들어가 있어서 커밋할 때마다 인증한다. </li>
</ul>
</li>
<li>갓생살기 인증(책장 속 책 읽기, 영어 공부, 개발 공부, 운동)<ul>
<li>친구들과 갓생살기 디스코드를 운영 중이다. 자기 계발은 하고 나서의 쾌감은 엄청나지만 시작하기가 어렵다.. 그래서 동기부여를 위해 인증에 미쳐버렸다.</li>
<li>공부 한번만 해도 모각코와 갓생살기 두군데 인증을 한다. 공부도 2배로 한 것 같고 기분이 좋다. 커밋까지 했다면 인증을 3번한다. 좋은 도파민이다.</li>
</ul>
</li>
<li>Spring Batch 스터디</li>
<li>만들면서 배우는 클린아키텍처 스터디</li>
<li>우아한 스터디 (신청은 했는데 될까?)  <ul>
<li>이번에 우아한 스터디를 신청해봤는데 되면 일이 하나 더 벌려지지만 될지 모르겠다 된적이 거의 없다.</li>
</ul>
</li>
</ul>
<h3 id="못한-것">못한 것</h3>
<ul>
<li>가상면접으로 배우는 대규모 시스템 설계 6장 부터 다시 읽기 <ul>
<li>블로그 포스팅 중이던 이 책을 읽다 말아서 <code>도메인 주도 설계로 시작하는 마이크로서비스 개발</code> 을 다 읽고 읽을 생각이다.</li>
</ul>
</li>
</ul>
<h3 id="업무">업무</h3>
<ul>
<li>기존에 하던 밥 짓는 업무를 마무리 했다. (<a href="https://velog.io/@dev-log/2%EB%85%84%EC%B0%A8-%EC%A3%BC%EB%8B%88%EC%96%B4-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B7%B8%EB%8F%99%EC%95%88%EC%9D%98-%ED%9A%8C%EA%B3%A0%EB%A1%9D">2021 회고록</a> 참고) 그리고 새 업무에 들어가는데 입사 이래로 밥 짓는 것 외에는 주로 Fade Out 건을 진행했다. 이번에도 그런 업무지만, 기능을 옮기면서 스터디로 배운 헥사고날 아키텍처를 적용하고 기존 코드에 테스트 커버리지를 올리려고 생각 중이다. </li>
</ul>
<h2 id="앞으로-하고-싶은-것">앞으로 하고 싶은 것</h2>
<h3 id="팀내-코드-리뷰-문화-및-테스트-작성-문화-만들기">팀내 코드 리뷰 문화 및 테스트 작성 문화 만들기</h3>
<ul>
<li>이건 반 이상 성공적으로 진행되고 있다. 입사했을 때는 팀내 코드 리뷰는 크리티컬한 부분만 하고, 클린 코드에 대한 리뷰는 거의 없었다. 그런 분위기를 바꿔보고자 입사 이래로 코드 리뷰를 여러번 시도 했다. 나는 도메인 로직을 시니어 개발자들 보다 모르고, 대신 클린 코드나 TDD에 대해서는 그 분들보다 평소에 관심을 많이 가져서, 그 부분에 대해 주로 리뷰를 했다.<ul>
<li>코드 리뷰는 Code Level의 리뷰보다 Architecture Level의 리뷰를 하는 것이 더 좋다는데.. 아직 나는 그정도 역량이 안되서 되는 선에서 최선을 다하고 있다.</li>
</ul>
</li>
<li>개발자는 Soft Skill이 중요 하다고 하는데 그에 어느정도 공감이 간다. 팀원들과 함께한지 2년이 넘어가니 팀원들도 내 성향을, 나도 팀원들의 성향을 어느정도 알고 내가 어떤 것에 관심 있고 추구하려 하는지 팀원들도 알고 있다. 그래서 원하는 의견을 좀 더 자연스럽게 관철할 수 있게 된 것 같다. </li>
<li>예전 같았으면 코드 리뷰를 무시 받는것에 상처 받았다면, 지금은 좀 덜 받고(?) 리뷰가 무시되는 빈도도 거의 없어졌다. 어떻게 보면 갓 들어온 0년차~1년차가 도메인도 잘 모르면서 Code Level의 리뷰 위주로 하는게 안좋게 보였을 수도 있을 것 같다. </li>
<li>예전에는 PR에 댓글이 0개고 Approve만 되었다면 최근 PR에서 30개 넘는 댓글을 받아 감동받았다. 내가 열심히 분위기를 만들고 기술적으로 더 뛰어난 시니어 개발자 분들이 리뷰하는 문화가 만들어진다면 좀 더 내가 그리는 이상향에 가까워질 것 같다는 생각이 든다.</li>
</ul>
<h3 id="팀내-기술-공유-발표">팀내 기술 공유 발표</h3>
<ul>
<li>헥사고날 아키텍쳐라던지 TDD에 대해서 사내 코드에 적용하게 된다면 관련 내용에 대해 작게 팀 내 기술 발표를 해서 팀내 전파되도록 하고 싶다.</li>
</ul>
<h3 id="기타-생각들">기타 생각들</h3>
<p>올해 초에는 막연히 Java, Spring을 좀 더 깊이 있게 공부해보자 생각했는데, 최근 해온 것들과 관심사가 변하고 <strong>목표를 다시 세웠다</strong>. <strong>분기 단위로 회고를 하는 건 꽤 괜찮은 것 같다</strong>. </p>
<p>업무에서는 <code>클린 코드</code>와 <code>클린 아키텍처</code>, <code>헥사고날 아키텍쳐 적용</code>, <code>TEST 커버리지 올리기</code>, <code>자바 심화 공부</code>를 목표로, 개인적으로는 <code>카프카</code>, <code>아키텍처 설계</code>, <code>MSA</code> 쪽으로 관심 갖고 공부를 진행하려고 한다.</p>
<p>나에게 계획은 세워서 다 지키겠다는 의미보다는 <strong>방향성을 지정하는 것</strong>에 가깝다. 하고 싶은게 많고 시간은 부족하지만, 중요한 건 <code>어제의 나보다 오늘의 내가 발전했는가</code>라고 생각한다.</p>
<p>아는 중니어(?) 시니어(?) 개발자 분께서 <strong>할게 많으니 우선 순위를 잘 세워서 공부해야한다</strong>고 하셨는데 그 말에 공감하면서, <code>당장 눈앞에 재밌어 보이는걸 하자</code> 라는 생각도 들었다. 직장인이 회사 업무 외 일을 한다는 것은 시간과의 싸움에 가깝고 하고 싶은건 많지만 시간도 체력도 따라주지 않는다. 그만큼 이상적인 우선 순위 대로 공부하는 것도 좋지만 당장 내가 관심가고 하고 싶은 것을 먼저 공부하는 것도 나쁘지 않다고 생각한다.</p>
<p>개인적으로 나는 <strong>8시간 근무를 기준으로 하루에 낼 수 있는 순수 시간은 3시간</strong> 인 것 같다. 이 이상 잠을 줄이거나, 공부 시간을 늘리면 기본적인 생활에 지장이 간다. 단 3시간 뿐이라 더 공부와 생산성에 관심을 갖게 된다.</p>
<p>그래서 예전이라면 공부하는 것은 주로 타이핑하고 요약해서 정리를 했다면 요즘은 읽고 흘러가는 대로 두는 것도 괜찮다고 생각한다. 모든 걸 다 기억할 순 없고, 나는 기억력이 나쁘고, 그 당시 읽고 지나가더라도 이해한다면 나중에 관련 일을 할 때 찾아볼 수는 있다고 생각한다. <del>아 그 거시기 뭐 있잖여..</del></p>
<p>또, 예전의 나는 책 한 권을 다 떼지 않으면 다른 공부는 하면 안되는줄 알았지만, 지금은 그냥 여러 권을 돌려가면서 본다. 책 1권만 본 개발자와 일부만 발췌독 했지만 100권을 본 개발자 중에 후자가 나은면<code>도</code> 있다고 생각하기 때문이다.</p>
<blockquote>
<p>&quot;아무 것도 모르면 아무 것도 찾아볼 수 없다. 내가 어떤걸 모르는지 모르기 때문이다.&quot;</p>
</blockquote>
<p><strong>그래서 지금은 당장 재밌어보이는 걸 공부해야겠다.</strong>
2021 회고록에 썼듯이, 열심히 한 눈 팔다보면 무엇이든 길은 나올 것이라 믿기 때문이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2년차 주니어 백엔드 개발자 그동안의 회고록 ]]></title>
            <link>https://velog.io/@dev-log/2%EB%85%84%EC%B0%A8-%EC%A3%BC%EB%8B%88%EC%96%B4-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B7%B8%EB%8F%99%EC%95%88%EC%9D%98-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@dev-log/2%EB%85%84%EC%B0%A8-%EC%A3%BC%EB%8B%88%EC%96%B4-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B7%B8%EB%8F%99%EC%95%88%EC%9D%98-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Sun, 02 Jan 2022 01:20:21 GMT</pubDate>
            <description><![CDATA[<p>난생 처음 공개적으로 작성해보는 회고록.<br>2021 회고록이 아닌 <strong>그동안의</strong> 회고록인 이유는 취준부터 지금까지의 시간을 되돌아보기 위해서이다. </p>
<h1 id="꾸준히-노력하기-위해-노력하는-사람">꾸준히 노력하기 위해 노력하는 사람</h1>
<p>나는 어떤 사람인가? 한마디로 정의내린다면 위와 같을 것 같다. </p>
<p><img src="https://images.velog.io/images/dev-log/post/de135eaf-51ad-4766-a3de-7baabee568f9/image.png" alt="2018년도의 commit"></p>
<p><img src="https://images.velog.io/images/dev-log/post/e33c7b51-5346-4af6-8197-4613f8e736c6/image.png" alt="2019년도의 commit"></p>
<blockquote>
<p>그동안의 일일커밋 기록</p>
</blockquote>
<p>CS 전공이지만 개발자가 아닌 다른 진로를 생각하다 개발자로 취업을 준비하게되어 2018년에 개발 공부를 제대로 처음 시작하게 되었다.  </p>
<p>그동안은 전공 공부 정도로만 개발을 공부했다면 2018년에는 처음으로 <code>Spring</code> 을 공부하며 동시에 프로젝트를 진행했다. C나 Java 정도는 공부했지만 실질적으로 개발에 제로 베이스였던 내가 공부를 시작하며 동시에 프로젝트를 시작할 수 있었던 것은 함께 프로젝트를 진행한 친구가 개발을 어느정도 할 줄 알았고 메인으로 프로젝트를 끌고가 주어서 가능했다. </p>
<p>그 당시 <code>Spring 공부</code>와 <code>프로젝트</code>, <code>23학점</code>의 수업, 졸업요건을 위한 <code>봉사활동</code>, <code>교내 아르바이트</code>까지 동시에 진행을 했고, 정말 잠을 제대로 자지 못할 정도로 시간이 부족했다.  </p>
<p>거의 매일 열람실과 동아리 방에서 밤을 세워 공부하다 다음날 아르바이트를 하러 갔고 모든 남는 시간은 부족한 개발 공부와 프로젝트를 하는데 사용했다. *<em>너무 스트레스 받고 피곤할 때는 의자에서 쪽잠을 자거나 <code>우쿨렐레</code>를 쳤다. *</em> </p>
<p>(지금 생각해보니 지켜보는 사람이 있었다면 얼마나 내가 웃겨보였을까 개발을 열심히 하다가 갑자기 <del>우쿨렐레를 미친 듯이 치고 다시 개발하다가 치고..</del>)  </p>
<p>그리고 나는 <strong>프로젝트를 성공적으로 완료</strong>하고, 당시 <strong>목표였던 성적 4.3</strong>을 받았다. </p>
<p>누군가 인생에서 가장 열심히 살았을 때가 언제니? 라고 묻는다면 망설임 없이 2018년이라 대답할 수 있을 것이다.</p>
<h2 id="개발-홀로서기">개발 홀로서기</h2>
<p>2018년의 하반기부터는 취준의 연속이었다. </p>
<p>프론트 엔드 친구와 두번째 프로젝트를 시작하고 서버 개발부터 배포 까지 온전히 혼자만의 힘으로 진행을 하게 되었다. 부가적으로 <code>Effective Java</code>와 <code>자바 ORM 표준 JPA 프로그래밍</code> 공부, 그리고 <code>AWS로 CI/CD 배포하기</code>를 진행했다.</p>
<p>그 당시에도 그렇고 지금도 그렇고 나에겐 <code>멘토</code>가 없었다. <strong>이 다음엔 어떤 방향으로 나아가야하는지</strong>, 취업 준비는 어떻게 하는지 정보가 전혀 없었다. 그래서 당시에는 인터넷의 도움을 많이 받았다. <strong>구글이 나의 멘토였다.</strong></p>
<p>해당 시기 진행한 프로젝트는 <a href="https://jojoldu.tistory.com/463">창천향로님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 시리즈</a> 도움을 많이 받았다.</p>
<p>나처럼 전공자임에도 정보를 얻을 수 있는 네트워크가 없던 사람, 또는 아예 새로 시작하는 비전공자 등 어떻게든 지푸라기라도 잡고 싶은 주니어들에게 <strong>양질의 개발 글을 작성해주는 개발자분들이 있어 멘토가 없이도 성장할 수 있었다. 참 감사하다.</strong></p>
<h2 id="방향-고민과-첫-대외활동">방향 고민과 첫 대외활동</h2>
<p>지금도 그렇지만 당시에 가장 어려웠던 것은 <code>방향 설정</code>이었다. <strong>열심히는 할 수 있다. 하지만 어떻게 해야하는가?</strong> 많은 주니어 개발자들의 고민 또한 이것일 것이라고 생각한다.</p>
<p>그때까지의 나는 계속 소규모 개발을 해왔기에, IT 동아리 활동을 도전했다. 동아리 활동에서 <strong>기획자와 디자이너와 협업을 어떻게 하는지. 한 프로덕트가 나오기 위해서 어떤 과정을 거치는지</strong> 회사에 가기 전에 미리 배운 것 같다. 그리고 다른 백엔드 개발자와 협업을 하며 <strong>PM의 역할</strong>도 간단히 해보았다.</p>
<p><strong>어떻게 어떤 방향으로 성장하는게 좋을지는 아직도 고민하고 답을 찾고 있는 문제다.</strong> 그래서 그 때도 지금도 답을 외부에서 찾아보는 중이고, 당시의 동아리 활동은 그 헤맴의 일환이었다.</p>
<h2 id="그리고-취업">그리고 취업</h2>
<p>취준 회고를 너무 늦게 작성해서, <em>지금 트렌드와 조금 다르게 포트폴리오가 화려하지 않아도</em> 원하는 회사에 취업에 성공했다. </p>
<p>(정확한 방향은 정하지 못했지만 내가 원했던 회사는 SI가 아니며 자체 IT 서비스가 있으며 대규모 트래픽이 발생하는 회사였다.)</p>
<p>내가 그동안 진행한 것은 소규모 프로젝트 2개 그리고 IT 동아리에서 진행한 프로젝트 1개였다.</p>
<p>그 당시는(?) 내 정보 부족일 수 있지만, 지금처럼 부트캠프나 학원이 성행할 때가 아니었고 1일 1커밋도 슬슬 알려지기 시작할 때라 많이 하고 있지 않은 상황이었다. 
그래서인지 당시에 면접보러 다니던 회사 중 한 곳에서는 <strong>1일 1커밋의 성실함</strong>과 <strong>학원을 다니지 않은 것을 자신감이 있어보인다며 좋게 보기도 했다.</strong></p>
<p>(지금은 워낙 1일 1커밋이 흔하고 화려한 포트폴리오가 많아서 지금 같은 포트폴리오로 신입을 도전한다면 좋게 볼지는 잘 모르겠다. )</p>
<p>한 가지 아쉬운 점은 <em>계속해서 달려오느라 지쳐서, 너무 쉽게 만족해버린 것.</em> 현재 회사에 최종 합격을 했어도 조금 더 다양한 회사에 지원을 좀 더 넣었으면 좋지 않았을까 생각은 든다. </p>
<h1 id="병아리-개발자로-홀로-살아남기">병아리 개발자로 홀로 살아남기</h1>
<p>취업을 하고 정말 많은 일들이 있었다.<br>그 중 나에게 가장 많은 영향을 끼친 일은 <code>홀로 살아남게 된 일</code>이다. </p>
<h2 id="사수가-퇴사했다">사수가 퇴사했다</h2>
<p>사수의 퇴사는 뒤따라오는 <code>Side-Effect</code> 가 많았다.  </p>
<p>우선 팀 내 거의 <strong>유일하게 학습과 성장에 적극적인 분</strong>이었다는 점.<br>따라서 그 분의 퇴사로 팀내 이런 분위기는 침체되어 버렸다. 그리고 그 분이 맡던 서비스를 떠맡게 된 것. 그리고 그 분이 남겨 놓은 똥과 내 똥이 합쳐져 빅똥이 되어 장애가 난 것. 그 장애의 뒤처리. 나도 모르는데 나한테 들어오는 모든 것들. 생각보다 엉망진창인 코드와 생각보다 심각한 팀내 레거시 등</p>
<p>이 과정을 홀로 헤쳐나와야 했다.</p>
<h2 id="취업을-하고-알게된-것">취업을 하고 알게된 것</h2>
<h3 id="직업으로써의-개발자">직업으로써의 개발자</h3>
<ul>
<li>인터넷으로 개발을 배우다 보면 주로 유니콘같은 개발자들을 주로 보게 된다.</li>
<li>좋은 개발 문화를 지향하고 코드 리뷰를 하고 테스트 코드를 작성하고..</li>
<li>현업에서는 생각보다 그런 문화를 지향하는 분이 (회사에 따라) 드물다.</li>
<li>그게 나쁜 것인가? 그건 아니다. 지향점의 차이라는 것을 알았다.</li>
<li>좋은 개발자란 무엇인가 ?</li>
<li>우선은 업력(業力)이 제일 중요하다 </li>
</ul>
<h3 id="무리를-해도-안되는건-안된다">무리를 해도 안되는건 안된다</h3>
<ul>
<li>그동안은 무리를 하면 해결할 수 있는 선이었다.</li>
<li>직업으로써의 개발자는 장기 레이스 선수이다. 그러므로 <strong>되도록 무리하지 말고 되는 데까지 해야한다.</strong></li>
<li>안되는 일정은 조율해야한다.</li>
<li>업무에 100% 이상의 에너지를 쓰면 안된다.</li>
</ul>
<h3 id="레거시를-대하는-마음가짐">레거시를 대하는 마음가짐</h3>
<ul>
<li>레거시는 어디에나 있다.<ul>
<li>오래된 서비스 회사는 오래되어서 있고, 최신 스타트업은 빠른 Business Delivery가 필요해 기술 부채가 존재한다. </li>
</ul>
</li>
<li>오늘의 코드는 내일의 레거시가 된다. </li>
<li>레거시를 그대로 두는 이유는 보통 이유가 있어서..</li>
<li>레거시를 꼭 <code>최-신-식 기술</code>을 넣어서 다 뜯어 고치는게 꼭 정답일까<ul>
<li>레거시를 좀 더 잘 굴러갈 수 있게 포장하는게 올바른 역할일 수 도 있다.</li>
</ul>
</li>
<li>얼마 전 들은 웨비나에서 <code>회사는 리팩토링할 시간을 주지 않는다</code>고 들었다.<ul>
<li>리팩토링 또한 내가 의식적으로 해야하는 것이며, 리팩토링할 시간을 주지 않는다, 없다며 불만을 가질 문제가 아닌 것.</li>
</ul>
</li>
<li>그런 시간을 내는 것 또한 업무, 개발의 능력이라는 생각이 든다</li>
<li>최우선은 리팩토링의 욕심보다 정해진 일정 준수 뒤 부가적으로 욕심내는게 맞는 것.</li>
<li>이런 능력을 기르고 노력한 뒤, 조금 빨라진 속도로 생긴 조금의 여유를 리팩토링과 코드 개선에 투자해야하는 것 같다.</li>
</ul>
<h2 id="번아웃-그리고-코로나-블루">번아웃 그리고 코로나 블루</h2>
<h3 id="절망의-계곡-헤매기">절망의 계곡 헤매기</h3>
<p><img src="https://images.velog.io/images/dev-log/post/0a074d25-073c-4963-8d56-9680c2f559ba/bf7eb9ca0dcb8c80a7263c620a565555.png" alt="더닝 크루거"></p>
<blockquote>
<p>더닝 크루거 곡선에서의 절망의 계곡</p>
</blockquote>
<p>사수의 Side-Effect를 헤치고 나온 나에게 주어진 다음 일은 <code>밥 하는 일</code>이었다. </p>
<p><em>그런데 밥 하는건 좋은데 밭갈고 농사부터 하게 될 줄이야..?</em>  </p>
<p>마치 <strong>농사를 처음 짓는데, 1등급 쌀을 지어서 임금님께 바치세요</strong> 같은 느낌이었다. 하지만 <strong>팀 내 아무도 1등급 쌀을 수확하는 농사법은 모르는 상황</strong>이었다.</p>
<p>입사 전 소박한 Monolithic Architecture를 만들던 나는 갑자기 MSA의 시스템 설계를 하고, 개발하게 되었다. 그것도 혼자.
농사를 짓는 건 어렵지 않았다. 하지만 <strong>정답이 없는 1등급의 쌀을 지어야하는 것</strong>이 어려웠고 큰 부담이었다.</p>
<p>그 당시 공부를 하면 할수록, <code>사내 문서, 공식 문서, 구글링, 한국 공식 기술 모임, 온갖 세미나 영상, 이름 모를 오래된 Blog 등</code>을 찾아볼수록 더 어려웠다. 말 그대로 절망의 계곡이었다.</p>
<h3 id="초조한-제자리-걸음">초조한 제자리 걸음</h3>
<p>학습에 관한 글 중 개인적으로 좋아하는 글이 있다. </p>
<ul>
<li><a href="http://agile.egloos.com/5749946">당신이 제자리 걸음인 이유와 의도적 수련</a></li>
</ul>
<p><code>의도적 수련</code>과 <code>성장</code>에 관한 글이다. </p>
<p>간략하게 요약하자면 <strong>사람은 너무 쉬우면 지루하고, 너무 어려우면 불안함을 느낀다.</strong> 그 모든건 몰입을 방해하는 요소이며 제자리 걸음을 걷게 하는 요소이다. 성장하기 위해서는 몰입 영역에 들어가기 위한 의도적 수련이 필요하다는 요지이다. 너무 어려운 경우 나의 실력을 높이거나, 업무의 난이도를 낮춰서 몰입할 수 있도록 해야한다.</p>
<p>나는 이 기간에 많이 성장했지만 그럼에도 불구하고 많은 불안감과 초조함을 느꼈던 것 같다. </p>
<h2 id="슬럼프의-극복과-지속-가능한-개발">슬럼프의 극복과 지속 가능한 개발</h2>
<h3 id="성장하는-환경-만들기">성장하는 환경 만들기</h3>
<p>사람은 생각보다 의지보다 <code>환경의 영향</code>을 많이 받는다. 모든 일은 <code>노-오-력</code>만으로 되지 않기도 한다. <code>성장하는 환경</code> 또한 마찬가지이다. </p>
<p>얼마전에 본 <a href="https://youtu.be/JdwWgw4fq7I">토크 콘서트</a>에서도 비슷한 이야기가 나왔다. 창의적인 인재란 &quot;얼마나 창의적인 생각을 해낼 수 있냐&quot;보다 <strong>&quot;얼마나 창의적인 상황에 자신을 던질 수 있는지&quot;</strong>가 중요하다고 말이다. </p>
<p>이 내용을 성장에 빗대어 본다면, <strong>나는 얼마나 성장할 수 있는 환경에 나를 던질 수 있는지</strong> 생각해보게 된다. </p>
<p>그동안은 현재 팀이 <code>의식적으로</code> 성장하는 환경이 아니라는 생각에 <code>외부</code>로 눈을 돌렸다. 주로 인프런 등의 강의를 들었고 Next Step의 TDD 수업도 들었다. 특히 여기서 슬럼프 극복에 도움이 된 것은 Next Step의 TDD 수업이었다. </p>
<ul>
<li>우선 개발이 다시 쉽고 재밌었으며</li>
<li>열정 넘치는 사람들에게 둘러 쌓인 환경이었고</li>
<li>끌어주는 멘토(자바지기님)와 리뷰어가 있었다.</li>
<li>그리고 코드 리뷰를 배웠다.</li>
</ul>
<p>그리고 지금은 <code>내부</code>로 시선을 돌려 팀을 성장하는 환경을 만들기 위해 소소하게 나마 내가 할 수 있는 선에서 행동하고 있다.</p>
<p>그동안 </p>
<ul>
<li>업무의 특성</li>
<li>Top-Down 으로 급하게 내려오는 일정</li>
<li>개별 프로젝트로 각자 파편화된 업무 </li>
</ul>
<p>등의 이유로 팀 내 코드리뷰가 거의 이루어지지 않았는데, TDD 수업에서 배운 것을 기반으로 소소하게 <strong>팀 내 코드리뷰를 시작했다.</strong>
작은 시도지만 다른 분들도 코드리뷰를 조금씩 하기 시작하는 등의 변화가 일어나는 것이 눈에 보인다.</p>
<p>그리고 개인적으로는, 랜선 모각코를 들어갔다.
업무에 집중하기 위해 사이드 프로젝트나 IT 동아리 활동을 하기 보다는 회사일과 관련된 공부를 꾸준히 하고 싶었다. 기존에는 오프라인으로 친구들과 만나 공부했지만 코로나로 인해 이전과 같이 할 수 없어 랜선에서의 모임을 찾아봤다. 열심히 공부하는 사람들 사이에 나를 던져 놓아 성장하는 환경을 만들었다.</p>
<h3 id="나의-보상-체계는-성취감">나의 보상 체계는 성취감</h3>
<p>지속 가능한 개발, 지속 가능한 공부를 위해서는 자기 자신과의 약속을 지키고 스스로에게 보상을 확실히 주어야한다. 그런 의미에서 <strong>일일커밋</strong>을 다시 시작했다.</p>
<p>일일커밋에 대해 부정적으로 또는 긍정적으로 보는 상반된 의견이 있는 것으로 알지만 <strong>내 일일커밋은 개인적인 동기부여이다.</strong> 초록색을 채우는게 마치 RPG 게임의 경험치 바를 채우는 느낌이 들고 눈에 보이는 지표이기 때문이다.</p>
<p>억지로 커밋을 하지는 않을 것이다. 가급적 <code>하루에 간단한 코드 한줄이라도 짜보자</code> 는 느낌으로 가볍게 시작해보려고 한다.</p>
<h3 id="그동안의-성장에-대한-갈증과-생각들">그동안의 성장에 대한 갈증과 생각들</h3>
<ul>
<li>너무 많은 걸 다 잘하고 싶어 마구잡이로 교육을 들었다.  <ul>
<li>소화하지 못한 배움은 결국 체한다. (마음만 초조해짐)</li>
<li>모든 걸 다 잘할 순 없다. 선택과 집중이 필요하다</li>
<li>모르는 걸 잘 인정하는 것 또한 좋은 개발자가 아닐까.</li>
</ul>
</li>
<li>깊게 꼭꼭 씹어 소화시킬 것인지 빠르게 훑고 지나갈 것인지 정답은 없지만, 전자로만 살아왔으니 빠르게 훑는 연습을 해야겠다.  </li>
</ul>
<ul>
<li>나는 입사 전의 나보다 개발자로 성장했는가 ? -&gt; YES</li>
<li>나는 입사전의 나보다 <strong>의식적으로</strong> 개발자로 성장했는가 ? -&gt; 모르겠다 </li>
</ul>
<ul>
<li><strong>일을 하지 않는게 아닌이상 성장하는 건 너무 당연하다.</strong> 거의 제로베이스이기 때문에.</li>
<li>하지만 여러 슬럼프와 번아웃으로 인해 나는 내가 생각한 것보다 의식적으로 성장하지 못했다.</li>
</ul>
<ul>
<li>하지만 개발 외적으로 겪은 이런 혼란스러운 감정들은 사회초년생들이라면 으레 맞닥드릴만한 상황들이 아니었을까.</li>
<li>나는 조금 헤맸고, 그만큼 성장했다. 지금의 깨달음은 앞으로 사회생활, 개발자로의 생활에 도움이 될 것이라 생각한다.</li>
<li>아직은 정확히 무엇을 개발하고 싶은지, 하고 싶은지 모르겠지만, <strong>주어진 것에 최선을 다하며, 최선을 다해 한눈을 팔다보면 무엇이든 생길 것이라 믿는다.</strong></li>
</ul>
<h1 id="올해의-목표">올해의 목표</h1>
<ul>
<li>의식적으로 성장하기 </li>
<li>적극적으로 기록하기  <ul>
<li>취업 후 바쁘기도 하고 글쓰기의 생산성이 떨어진다는 생각에 기술 블로그를 중단했었다. 올해는 부담 없이 간단히 기록에만 집중하기 위해 Git Blog에서 Velog로 옮겼다.  </li>
<li>간단한 글을 자주 쓰자. 생산성과 글의 퀄리티 사이의 간극은 차차 메워가자.</li>
</ul>
</li>
<li>건강하기  <ul>
<li>취업을 하고 무리를 하면서 체력이 달린다는 느낌을 많이 받았다. 영양제와 운동을 꼭 챙기자.</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/dev-log/post/52be6254-9114-4612-a133-eeced4bb21db/IMG_1755.jpg" alt=""></p>
<p>그리고 마지막으로, </p>
<ul>
<li>현재의 리듬을 즐길 것.</li>
<li>적정한 나 자신이 될 것.</li>
</ul>
<p>*<em>잘 지내보자 2022 ! *</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[안정 해시 (Consistent hashing) ]]></title>
            <link>https://velog.io/@dev-log/%EC%95%88%EC%A0%95-%ED%95%B4%EC%8B%9C-%EC%84%A4%EA%B3%84Consistent-hashing</link>
            <guid>https://velog.io/@dev-log/%EC%95%88%EC%A0%95-%ED%95%B4%EC%8B%9C-%EC%84%A4%EA%B3%84Consistent-hashing</guid>
            <pubDate>Tue, 30 Nov 2021 15:05:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>&lt;대규모 시스템 설계 기초&gt; &quot;5장 안정 해시 설계&quot;를 읽고 작성하는 포스트 입니다.</p>
</blockquote>
<h1 id="안정-해시consistent-hashing-이란">안정 해시(Consistent Hashing) 이란?</h1>
<p> <code>안정 해시(Consistent Hash)</code>는 일반적으로 요청 또는 데이터를 서버에 <code>균등하게 나누기</code> 위해 일반적으로 사용되는 기술이다. </p>
<h2 id="전통적-해시-테이블hash-table">전통적 해시 테이블(Hash Table)</h2>
<p>전통적인 Hash Table의 경우 모듈로(%) 연산을 이용한다 </p>
<pre><code>ex) serverIndex = hash(key) % N (N은 서버의 개수)</code></pre><p>이 경우 적용하려는 대상(서버 또는 데이터)의 <code>갯수가 고정</code>되어 있는 경우 문제가 없지만, 해당 대상이 추가 되거나 삭제 되는 등의 변동이 있는 경우, 대부분의 해시 대상이 <code>재분배</code> 된다. 따라서 <code>확장성(scalability)</code>에 취약하다 </p>
<h3 id="해시-키-재배치">해시 키 재배치</h3>
<p>해시 키 재배치란, 책에 나온 예를 들자면 Key 8개와 서버 4대가 있을 때 Key는 2개씩 0, 1, 2, 3에 할당되어 있지만 서버 1대가 장애가 나는 경우 <code>서버 대수(위 수식의 N)</code>를 기반으로 해싱하기에 모두 새로 해싱되어 해시 키가 재배치(Rehash) 된다. 이 경우 장애가 발생한 서버에 보관된 키를 제대로 찾지 못해서 대규모 Cache Miss가 발생하게 된다. </p>
<h2 id="안정-해시와-해시-테이블">안정 해시와 해시 테이블</h2>
<p>이런 해시테이블과 다르게 안정 해시는 해시 테이블 크기가 조정될 때 평균적으로 <code>Key/N(위의 서버 수와 동일)</code>의 키만 재배치하도록 하는 해시 기술이다. </p>
<p>안정 해시는 전통적 해시 테이블과 다르게 <code>모듈로 연산(%)</code>으로 대상을 탐색하지 않으며, Hash Ring을 만들어 링 위에서 첫번째 만나는 것을 대상으로 한다.</p>
<p><img src="https://images.velog.io/images/dev-log/post/8ad09799-1e87-406c-a6e8-6fb4da493b12/2007-11-27-image-0000.png" alt=""></p>
<blockquote>
<p><a href="https://tom-e-white.com/2007/11/consistent-hashing.html">이미지 출처</a></p>
</blockquote>
<p>1, 2, 3, 4의 서버가 있을 때 A의 대상 서버는 2이다. 
위와 같은 구조일 때 서버 2에 장애가 난다면 A는 2가 아닌 3 서버에 재배치될 것이다.</p>
<h3 id="안정-해시-기본-구현법의-문제">안정 해시 기본 구현법의 문제</h3>
<ul>
<li>균등 분포 해시 함수를 사용</li>
<li>시계 방향 첫 번째의 서버를 지정하는 것</li>
</ul>
<p>이 해시의 문제점은 균등 분포 해시 함수를 사용해도 <code>해시 파티션(partition) (위 그림의 링 위의 서버 사이의 간격) 의 크기를 균등하게 유지하는게 불가능</code> 하다는 것과 이로 인해 <code>키가 균등하게 분포되기 어렵다</code>는 문제가 있다. </p>
<p>이를 해결 하기 위해 <code>가상노드(Virtual Node)</code> or <code>복제(Replica)</code>라 불리는 기법을 사용한다 </p>
<h3 id="안정-해시의-가상-노드virtual-node">안정 해시의 가상 노드(Virtual Node)</h3>
<p><img src="https://images.velog.io/images/dev-log/post/6d054325-835f-4270-a4cf-b0061f26b03a/1_AMbPPsdN2MHQK9m8hXOnRw.jpeg" alt=""></p>
<blockquote>
<p><a href="https://medium.com/interviewnoodle/how-to-use-consistent-hashing-in-a-system-design-interview-b738be3a1ae3">이미지 출처</a></p>
</blockquote>
<p><code>하나의 서버</code>는 링 위에서 <code>여러 개의 가상 노드</code>를 가지게 된다. (우측 그림) 
따라서 안정 해시는 탐색 후 첫번째 만나는 서버를 대상으로 하므로, 가상 노드가 없는 좌측 그림의 구조와 달리 가상 노드가 많을 수록 키의 분포가 균등하게 된다. 
*<em>가상 노드의 개수를 늘릴 수록 표준 편차의 값은 떨어지지만 가상 노드 데이터를 저장할 공간은 더 많이 필요하므로 시스템의 요구사항에 맞는 적절한 수치가 필요하다. *</em></p>
<h1 id="추가적으로-찾아본-것">추가적으로 찾아본 것</h1>
<p>읽다보니 주 스택으로 사용하는 Java에서의 Hash는 어떻게 구현되어 있나 궁금함이 생겨 검색해보니 아래의 글이 나왔다. </p>
<ul>
<li><a href="https://d2.naver.com/helloworld/831311">Java의 Hash Collection</a><ul>
<li>Java 7에서 Java 8의 Hash 구현 변화와 해시 충돌을 막기 위한 보조 해시 함수에 대한 내용, String 객체에 대한 해시 함수 내용이 있다. 고퀄리티의 글이라 읽는 것을 추천한다. </li>
<li>Java의 HashMap에서는 해시 충돌 방지를 위해 Seperate Chaning과 보조 해시 함수를 사용하고, Java8의 경우 Separate Chaning에서 Linked List 대신 Tree를 사용하기도 한다. </li>
<li>웹 어플리케이션 서버의 경우 HTTP Request가 생성될 때마다 여러개의 HashMap이 짧은 시간내 생성되고 사라지기에 GC의 대상이 된다.</li>
</ul>
</li>
</ul>
<p>또, 책 내에서 참고 문헌으로 든 Discord의 Scaling 사례가 있다.</p>
<ul>
<li><a href="https://blog.discord.com/scaling-elixir-f9b8e1e7c29b">Discord의 Scaling</a><ul>
<li>Discord에서는 Fast Access를 위해 Consistent Hashing 을 사용하고 있으며 사용 후에도 Node 조회에 이슈가 있어 세마포어를 구현해 Node 조회 이슈를 해결한 문제에 대해 설명하고 있다. </li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[처리율 제한 장치(Rate Limiter) 설계 톺아보기 ]]></title>
            <link>https://velog.io/@dev-log/%EC%B2%98%EB%A6%AC%EC%9C%A8-%EC%A0%9C%ED%95%9C-%EC%9E%A5%EC%B9%98-%EC%84%A4%EA%B3%84-%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@dev-log/%EC%B2%98%EB%A6%AC%EC%9C%A8-%EC%A0%9C%ED%95%9C-%EC%9E%A5%EC%B9%98-%EC%84%A4%EA%B3%84-%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Sun, 28 Nov 2021 08:44:05 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>하단에 링크 추가한 Line 블로그의 이미지입니다. </p>
</blockquote>
<blockquote>
<p>&lt;대규모 시스템 설계 기초&gt; &quot;4장 처리율 제한 장치&quot;를 읽고 작성하는 포스트 입니다. </p>
</blockquote>
<h1 id="처리율-제한-장치란-">처리율 제한 장치란 ?</h1>
<p><code>처리율 제한 장비(Rate Limiter)</code>는 클라이언트가 보내는 트래픽의 <code>처리율(Rate)</code>을 제어하기 위한 장치다.
일반적으로 정의된 <code>임계치(Threshold)</code>를 넘어가면 추가로 들어온 모든 호출은 처리를 <code>중단</code>한다.</p>
<p>ex) <code>사용자</code> 는 <code>초당 2회</code> 이상 새 글을 올릴 수 없다.</p>
<p>처리율 제한 장치를 사용할 때의 장점은</p>
<ul>
<li>Dos 공격에 의한 자원 고갈 방지</li>
<li>비용 절감</li>
<li>서버 과부하를 방지</li>
</ul>
<p>등 예상할 수 있는 것들이다. </p>
<h1 id="처리율-제한-장치를-설계할-시-고려할-점">처리율 제한 장치를 설계할 시 고려할 점</h1>
<p>해당 책에서 <code>포인트</code>로 잡는 것은 다음과 같다</p>
<ul>
<li>처리율 제한 장치를 <code>어디에 구축</code>할 것인지 (클라이언트 vs 서버)</li>
<li>어떤 <code>기준</code>을 잡고 API 호출을 <code>제한</code>할 것인지</li>
<li><code>시스템 규모</code>는 어느정도일지</li>
<li><code>분산 환경</code>인지 </li>
<li>독립된 서비스인지, Application에 포함되는지</li>
<li>장치에 걸러진 경우 사용자가 그 사실을 알아야 하는지</li>
</ul>
<p>위 포인트를 기준으로 나온 시스템 요구사항이 이러하다고 가정을 해본다.</p>
<ul>
<li>설정된 처리율 초과시, 정확하게 제한하고</li>
<li>낮은 응답 시간을 가지며</li>
<li>가능한 적은 메모리를 쓴다</li>
<li>분산형 처리율 제한(Distributed Rate Limiting)<ul>
<li>하나의 처리율 제한 장치를 여러 곳에서 공유</li>
</ul>
</li>
<li>예외 처리 <ul>
<li>요청이 제한되었을 때 사용자에게 보여준다</li>
</ul>
</li>
<li>높은 결함 감내성(Fault Tolerance)<ul>
<li>제한 장치에 장애가 생겨도 전체 시스템에 영향을 주면 안된다. </li>
</ul>
</li>
</ul>
<h2 id="처리율-제한-장치를-어디에-구축할-것인지-">처리율 제한 장치를 어디에 구축할 것인지 ?</h2>
<ul>
<li>클라이언트는 쉽게 위변조가 가능하므로 서버에 구축한다</li>
<li>서버에 구축시 같은 서버에 직접 구현하는 경우와</li>
<li>미들웨어로 처리율 제한 장치를 따로 두어 API 서버로 가는 요청을 따로 통제할 수 있다. </li>
<li><a href="https://www.ibm.com/cloud/learn/microservices">일반적</a>으로 처리율 제한 장치는 API Gateway에 구축하는 편이다 </li>
</ul>
<h2 id="장치에-걸러진-경우-사용자가-그-사실을-알아야-하는지-">장치에 걸러진 경우 사용자가 그 사실을 알아야 하는지 ?</h2>
<ul>
<li>이때 제한범위 이상의 Request를 보낸 경우 장치에서 HTTP 상태코드 429(Too many request)로 알려줄 수 있다. </li>
</ul>
<h2 id="어떤-기준을-잡고-처리율을-제한할-것인지">어떤 기준을 잡고 처리율을 제한할 것인지?</h2>
<p>일반적으로 처리율 제한에 사용되는 <code>알고리즘</code>은 다음과 같다</p>
<ul>
<li>토큰 버킷(Token Bucket)</li>
<li>누출 버킷(Leaky Bucket)</li>
<li>고정 윈도 카운터(Fixed Window Counter)</li>
<li>이동 윈도 로그(Sliding Window Log)</li>
<li>이동 윈도 카운터(Sliding Window Counter)</li>
</ul>
<p>토큰 버킷 알고리즘의 경우 지정된 용량을 갖는 컨테이너에 정해진 양의 토큰이 주기적으로 채워지고 토큰이 꽉찬 경우 채워지지 않는다(버려진다). 그리고 요청이 들어올 때마다 토큰을 하나 사용해 요청을 처리한다. <strong>즉 정해진 크기만큼 일정 시간마다 요청을 처리할 수 있게 된다.</strong></p>
<h3 id="버킷은-몇개나-사용해야할까">버킷은 몇개나 사용해야할까?</h3>
<p><code>공급제한 규칙</code>에 따라 달라진다.</p>
<ul>
<li>통상적으로 <code>API Endpoint</code> 마다 별도의 버킷을 둔다 <ul>
<li>ex) 사용자마다 하루에 1번 포스팅 가능하고, 150명까지 추가할 수 있고 좋아요는 5번 가능하다면 사용자마자 3개의 버킷 필요.</li>
<li>ex) 전체 시스템을 초당 N개의 요청으로 제한하고 싶다면 모든 요청이 하나의 버킷을 공유하도록 하면 된다.</li>
</ul>
</li>
</ul>
<p>나머지 4가지 알고리즘은 처리에 대해 섬세하게 다른 부분이 있어 자세한 것은 구글 검색을 추천한다. </p>
<p>중요한 것은 *<em>처리율 제한 알고리즘은 <code>얼마나 많은 요청</code>이 접수되었는지 <code>추적하는 카운터</code>를 추적 대상별로 두고 <code>어떤 한도</code>를 넘어서면 한도를 넘어선 요청을 거부한다는 것이다. *</em></p>
<h2 id="그렇다면-카운터는-어디에-보관할까">그렇다면 카운터는 어디에 보관할까?</h2>
<ul>
<li>일반적으로 빠른 속도가 요구되기때문에 <code>메모리에서 동작하는 캐시</code>가 바람직하다.</li>
<li>Redis가 자주 사용된다. </li>
</ul>
<h2 id="병행성이-심한-환경이라면-">병행성이 심한 환경이라면 ?</h2>
<ul>
<li>경쟁 조건 이슈가 발생할 수 있다.<ul>
<li>ex) Redis에 Counter 3을 가져와 작업을 완료해 다시 +1 하기 전에 다른 요청이 Counter 3을 가져가서 두 요청이 Counter 4를 업데이트 하는 식의 현상 (원래 값은 5가 되어야함)</li>
</ul>
</li>
<li>경쟁 조건은 일반적으로 <code>Lock</code>으로 해결하지만 시스템 성능을 떨어뜨릴 수 있다</li>
<li>Lock 대신 <code>Lua Script</code>와 <code>Redis의 Sorted Set</code>을 사용하기도 한다. </li>
</ul>
<h2 id="동기화-이슈">동기화 이슈</h2>
<ul>
<li>분산 환경에서 처리율 제한 장치 서버를 여러 대 두면 동기화가 필요하다</li>
<li>웹은 State-less이므로 웹은 기존에 가져온 장치의 정보를 가질 수 없기 때문에 Counter 관리가 정상적으로 수행되지 않는다.<h3 id="이를-해결하기-위해">이를 해결하기 위해</h3>
</li>
<li><code>고정 세션(Sticky Session)</code>을 이용해 같은 클라이언트 요청은 같은 처리율 제한 장치로 보내도록 할 수 있지만, 확장 가능성과 유연성이 떨어진다.</li>
<li>대신 <code>Redis와 같은 중앙 집중형 데이터 저장소</code>를 쓴다.<ul>
<li>즉 분산 환경에서 처리율 제한 장치는 중앙에 1개의 서버만 사용하는 것이다. </li>
</ul>
</li>
</ul>
<h2 id="처리율-제한장치를-모니터링-한다면">처리율 제한장치를 모니터링 한다면</h2>
<ul>
<li>채택된 <code>처리율 알고리즘</code>이 효과적인지 확인한다</li>
<li>정의한 <code>처리율 제한 규칙</code>이 효과적인지 확인한다.</li>
</ul>
<h2 id="추가적으로-알면-좋을-것">추가적으로 알면 좋을 것</h2>
<ul>
<li>경성(hard) 처리율 제한 / 연성(soft) 처리율 제한, 임계치를 절대 넘을 수 있는지 잠시 동안은 넘어도 되는지 차이</li>
<li>예시는 Application Layer지만 OSI 다양한 계층에서 처리율 제한 가능하다는 것</li>
<li>클라이언트는 어떻게 설계하는게 좋을까 ?<ul>
<li><code>클라이언트 측 캐시</code>를 사용해 API 호출 횟수를 줄이고</li>
<li>임계치를 알고 짧은 시간동안 너무 많이 호출하지 않도록 하고</li>
<li>에러나 예외를 Gracefully하게 복구하도록 하며</li>
<li>재시도(<code>retry</code>) 로직을 구현할 때는 <code>back-off</code>를 충분하게 둔다</li>
</ul>
</li>
</ul>
<hr>
<h1 id="추가적으로-찾아본-것">추가적으로 찾아본 것</h1>
<h3 id="ratelimit-오픈소스">Ratelimit 오픈소스</h3>
<p><a href="https://github.com/envoyproxy/ratelimit">예제로 나온 Ratelimit 오픈소스</a></p>
<ul>
<li>버킷 알고리즘을 읽으면서 버킷이 아주 많이 생성될 것으로 예상되었는데 Domain과 Desctiptors, limit 조건, now 시간을 기준으로 Redis Key를 만들어 캐싱하고 있었다.<ul>
<li>수가 엄청 나게 많아져도 Redis Key로 생성하는 것이므로 문제가 없나보다 (?)</li>
</ul>
</li>
<li>해당 오픈 소스는 근사치까지 최대한 처리하고 처리 불가능하면 HTTP 429를 보내는 것으로 보인다</li>
<li>근사치 등 처리의 근거는 레디스 캐시 서버에서 가져온다. </li>
</ul>
<h3 id="병행성이-심한-환경에서의-redis의-sorted-set와-lua-script">병행성이 심한 환경에서의 <code>Redis의 Sorted Set</code>와 <code>Lua Script</code></h3>
<p><a href="https://engineering.classdojo.com/blog/2015/02/06/rolling-rate-limiter/">Redis Sorted Set</a></p>
<ul>
<li>토큰 버킷 알고리즘을 사용하기엔 결함이 있었다<ul>
<li>일부 프로세스는 버킷을 계속 다시 채워야함. (너무 처리할 데이터가 많다)<ul>
<li>위 Ratelimit에서 궁금했던 사항이 문제점으로 등장했다.<ul>
<li>Ratelimit의 경우 내부에서 추가적으로 처리하는지 대규모 시스템에서 사용할 수 없는 수준인지는 코드를 좀 더 뜯어봐야 알 것 같다. </li>
</ul>
</li>
</ul>
</li>
<li>더 정교한 방식이 필요했다</li>
</ul>
</li>
<li>Redis의 Sorted Set을 이용해서, 각 유저는 자신과 연결된 정렬된 집합을 가지고 있다가</li>
<li>사용자가 작업을 수행하려 하면 한 interval 전에 발생한 집합 요소를 모두 삭제한다</li>
<li>그리고 집합의 모든 요소를 가져와서 현재 타임스탬프를 세트에 추가한다</li>
<li>... 그 외 자세한 방식은 링크를 참조</li>
<li>이 방식의 장점은 모든 작업을 Redis를 이용해 원자적 작업으로 수행할 수 있다는 것<ul>
<li><a href="https://bstar36.tistory.com/348">Redis Lua Script</a><ul>
<li>Redis의 Lua Script는 Redis에서 명령어를 원자적(Atomic)으로 수행할 수 있게 해준다 </li>
</ul>
</li>
</ul>
</li>
</ul>
<p><a href="https://stripe.com/blog/rate-limiters">Scaling your API with rate limiters</a></p>
<ul>
<li>간략히 정리하면 여러 종류의 Rate Limiter를 사용해 종류별로 Rate를 제한한다.</li>
<li>이를 통해 병행성을 최대한 낮춘다.</li>
</ul>
<h3 id="추가로-읽어볼-것">추가로 읽어볼 것</h3>
<ul>
<li><a href="https://engineering.linecorp.com/ko/blog/high-throughput-distributed-rate-limiter/">고 처리량 분산 비율 제한기 by Line Engineering</a><ul>
<li>해당 책에서는 기본적인 Redis를 이용한 중앙집중적 구조만 나왔지만 Client Side에서 분산하는 구조도 나온다. 또한 논블로킹 구조도 있어 다양한 형태의 분산 처리기에 대해 공부할 수 있다. 현업에서 어떤 식으로 사용되는지도 확인할 수 있다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>