-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrss.xml
88 lines (88 loc) · 18.7 KB
/
rss.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?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[May-B]]></title><description><![CDATA[the force be with you ✨]]></description><link>https://eunjung-seo.github.io/</link><generator>RSS for Node</generator><lastBuildDate>Sun, 15 Apr 2018 16:55:50 GMT</lastBuildDate><item><title><![CDATA[코드 리뷰 어떻게 하고 있나요?]]></title><description><![CDATA[좋은 엔지니어링 팀의 문화로 손꼽히는 것 중 하나가 code review(또는 peer review)이다. 코드 리뷰를 통해 실수를 미리 방지하고 팀원들은 리뷰를 통해 서로의 성장에 도움이 될 수 있다. 꽤 많은 팀들이 코드 리뷰를 도입하고 있고 그와 관련한 아티클들도 많이 찾아볼 수 있다.]]></description><link>https://eunjung-seo.github.io//posts/code-review-guide/</link><guid isPermaLink="false">https://eunjung-seo.github.io//posts/code-review-guide/</guid><pubDate>Sun, 15 Apr 2018 16:55:03 GMT</pubDate><content:encoded><p>좋은 엔지니어링 팀의 문화로 손꼽히는 것 중 하나가 code review(또는 peer review)이다. 코드 리뷰를 통해 실수를 미리 방지하고 팀원들은 리뷰를 통해 서로의 성장에 도움이 될 수 있다. 꽤 많은 팀들이 코드 리뷰를 도입하고 있고 그와 관련한 아티클들도 많이 찾아볼 수 있다.</p>
<p>내가 속해 있던 팀도 코드 리뷰를 했었다. 처음 팀에 합류했을 땐 신입이었기에 코드 리뷰를 하며 많이 성장했고 다양한 생각의 관점을 배울 수 있었다. 특히 가독성을 높이면서도 간결하게 구현하는 법을 배울 수 있었다. (멤버들에게 감사를🙏)</p>
<p>하지만 신입의 기간이 지나면서 코드 리뷰가 감정적으로 힘들어지기 시작했다. 리뷰어가 남긴 코멘트가 명령조처럼 느껴지기도 하고 코드 작성자에 대한 지나친 간섭처럼 느껴졌다. 코드 리뷰는 좋은 문화고 이건 다 날 위한 조언이란 생각에 꾸역꾸역 코드를 수정해 승인을 받았지만, 리뷰 과정에서 받는 스트레스는 날로 커져만 갔다.</p>
<p>코드 리뷰의 목표는 무엇일까? 우리는 무엇을 리뷰하는 것일까? 코드일까 아니면 사람일까? 리뷰 과정에서 내가 취할 수 있는 자세는 무엇일까? 다른 팀들은 어떻게 코드 리뷰를 하고 있을까? 나 같은 생각을 하는 사람들이 있을까?</p>
<p><img src="/hmm-dec436cac8460409deccc5dfe3718466.gif" alt="hmm"></p>
<p>원칙 없이 실행되고 있는 팀의 코드 리뷰 문화에 환기를 주고자 우리 팀을 위한 코드 리뷰 가이드를 작성해보기로 했다. 우선 다른 팀들은 코드 리뷰를 어떻게 진행하고 있는지 찾아봤는데 리뷰 도구나 리뷰 요청법 등 방법론에 관한 글들이 대부분이었다. 가뭄에 콩 나듯 리뷰 가이드가 있었지만, 코드 리뷰의 의미를 기술한 글은 찾기 어려웠다.
결국 당시 팀의 core value와 문화, 1년간 내가 겪은 코드 리뷰의 경험에서 그 의미를 찾아 코드 리뷰 가이드를 작성했고 이 또한 팀의 리뷰를 거쳐 배포되었다.</p>
<p>아래는 내가 작성한 코드 리뷰 가이드이다. 리뷰어와 리뷰이가 지켜야 할 행동 가이드라 할 수 있다. 기존 작성안을 약간 수정해 올려본다.</p>
<hr>
<p>코딩은 개인의 작업이지만 코드 리뷰를 통해 협업과 소통의 장이 됩니다. (coding is a social process). 우리는 서로의 코드를 보며 함께 성장하는 문화를 추구합니다. 그 과정에서 생기는 논쟁들은 당연하며 성장을 위한 발판이라고 생각합니다. 원활한 커뮤니케이션과 효과적인 리뷰를 위해 우리는 다음의 기준들을 지키려 노력합니다.</p>
<h3>Reviewers &#x26; Reviewee</h3>
<ul>
<li>의견을 숨김없이 명확히 전달합니다 - 상대방이 의도를 잘 이해할 수 있도록 전달합니다</li>
<li>코드는 우리 모두의 것입니다 - ‘당신이 작성한 코드’ 혹은 ‘내가 작성한 코드’라는 언급을 피합니다</li>
<li>의견을 강요하는 대신 질문하거나 제안합니다 - ‘~에 대해 어떻게 생각하나요?’</li>
<li>다른 의견도 열린 자세로 받아들입니다</li>
<li>과장법(‘항상’, ‘절대’, ‘하찮은’ 등)을 사용하지 않습니다</li>
</ul>
<h3>Reviewers</h3>
<ul>
<li>작성자가 아닌 코드를 리뷰합니다</li>
<li>작성자의 관점을 이해하려고 노력합니다</li>
<li>코드를 단순화하는 방향으로 리뷰합니다</li>
<li>무엇이 왜 문제가 되는지 잘 설명하고 해결책도 함께 제시합니다</li>
<li>대안을 제시할 때 작성자가 이미 그것을 고려했을 것으로 가정합니다</li>
<li>작성자의 코드가 정 맘에 들지 않는다면 다음 기회에 본인이 수정할 수 있습니다</li>
</ul>
<h3>Reviewee</h3>
<ul>
<li>첫 번째 리뷰어는 나 자신입니다 - 스스로 찾아낼 수 있는 실수들을 미리 고치고 리뷰 요청을 합니다</li>
<li>적절한 크기의 PR을 만듭니다</li>
<li>어떤 문제를 해결하고자 했는지 잘 설명합니다</li>
<li>리뷰어의 의견에 감사하며 되도록 모든 코멘트에 응답하도록 노력합니다</li>
<li>개인에 대한 리뷰로 받아들이지 않습니다</li>
<li>리뷰어의 의견을 잘 청취하되 결정은 본인의 몫입니다</li>
</ul>
<hr>
<p>이 가이드는 잘 지켜졌을까? 나만큼 이 문제에 관심이 있는 팀원이 없어서인지 가이드 제시로만 그치고 만 것 같다. 나름 가이드의 도입 부분에 심적 울림을 주려 노력했는데 내 마음만 울었나 보다. 😂</p>
<p>코드 리뷰에 관심이 있다면, <a href="http://codelegance.com/effective-code-review-with-two-simple-rules/">Effective code review with two simple rules</a> 👈 이 글을 추천한다. 나도 가이드를 작성하며 많이 참고했다.</p></content:encoded></item><item><title><![CDATA[utf8에서 utf8mb4로 character set 변경하기]]></title><description><![CDATA[이전 회사에서 백엔드 개발자로 일하는 동안 가장 빨리 해결하고 싶었던 문제 중 하나가 바로 이모지 저장이다. 슬랙이나 깃헙, SNS 등에서 이모지를 많이 사용하고 있었지만 정작 내가 만드는 서비스에서는 이모지를 사용할 수 없다는 게 꽤나 마음에 걸렸다. 이모지와 관련한 문의들은 대부분 다음과 같다.]]></description><link>https://eunjung-seo.github.io//posts/migrate-utf8-to-utf8mb4-in-rails/</link><guid isPermaLink="false">https://eunjung-seo.github.io//posts/migrate-utf8-to-utf8mb4-in-rails/</guid><pubDate>Wed, 11 Apr 2018 17:30:51 GMT</pubDate><content:encoded><p>이전 회사에서 백엔드 개발자로 일하는 동안 가장 빨리 해결하고 싶었던 문제 중 하나가 바로 이모지 저장이다. 슬랙이나 깃헙, SNS 등에서 이모지를 많이 사용하고 있었지만 정작 내가 만드는 서비스에서는 이모지를 사용할 수 없다는 게 꽤나 마음에 걸렸다. 이모지와 관련한 문의들은 대부분 다음과 같다.</p>
<blockquote>
<p>글을 작성했는데 저장이 안돼요!
저장하기를 누르고 나니 작성한 글이 다 사라졌어요!</p>
</blockquote>
<p>사람들이 이모지를 자주 사용하게 되면서 위와 같은 문의도 점차 증가하기 시작했다. 처음엔 글 작성시의 validation 오류나 사용자의 실수라고 생각했다. 하지만 조금 더 들여다보니(거의 2년 전이라 어떻게 발견했는지 기억이 나질 않는다) 문제는 이모지에 있다는 것을 알게 되었다. DB로 MySQL 사용하고 있었는데 대부분의 character set이 utf8으로 되어있어 4바이트인 이모지를 저장할 수 없었던 것이다. 이모지를 사용하기 직전의 내용까지만 저장되고 그 뒤의 내용은 다 날아가 버렸다.
꽤나 긴 분량의 글을 작성하고 날려버린 사용자들은 운영팀에 도움을 청했고 나는 그때마다 DB 스냅샷을 찾아 글을 복구해주곤 했다. 하지만 언제까지 이 일을 반복할 순 없는 노릇! 문제 발견 후 1년이 지나서야(…) 인코딩 변경에 들어갔다. </p>
<p>(참고로 Rails는 3.2, MySQL은 5.6.34 버전이다.)</p>
<p>블로그 포스트를 예로 들어보자. posts 테이블에는 text 데이터 타입의 body와 string 데이터 타입의 title이 있다. 우리는 body를 utf8에서 utf8mb4로 변경하려 한다. 아래와 같은 migration 파일을 작성한 뒤, <code class="language-text">rake db:migrate</code>를 해주자.</p>
<div class="gatsby-highlight">
<pre class="language-ruby"><code class="language-ruby"><span class="token keyword">class</span> <span class="token class-name">ConvertDatabaseToUtf8mb4</span> <span class="token operator">&lt;</span> <span class="token constant">ActiveRecord</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Migration</span>
<span class="token keyword">def</span> change
execute <span class="token string">'ALTER TABLE posts '</span>\
<span class="token string">'CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'</span>
execute <span class="token string">'ALTER TABLE posts '</span>\
<span class="token string">'MODIFY `body` TEXT CHARACTER SET utf8mb4 utf8mb4_unicode_ci;'</span>
<span class="token keyword">end</span>
<span class="token keyword">end</span></code></pre>
</div>
<p>그러나 다음과 같은 에러가 난다!</p>
<div class="gatsby-highlight">
<pre class="language-ruby"><code class="language-ruby"><span class="token constant">Mysql2</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Error</span><span class="token punctuation">:</span> <span class="token constant">Specified</span> key was too long<span class="token punctuation">;</span> max key length is <span class="token number">767</span> byte</code></pre>
</div>
<p>string 데이터 타입의 title 컬럼은 255자까지 저장 가능한데 이는 한 글자 당 3바이트인 utf8기준이다. 글자 당 4바이트인 utf8mb4로 변경되면 191자까지 가능하다. string limit을 191로 설정해 주면 에러를 피할 수 있다.
change 함수 안에 <code class="language-text">change_column :posts, :title, :string, limit: 191</code>를 한 줄 추가해주고 다시 <code class="language-text">rake db:migrate</code>를 해준다.</p>
<p>여기까지 문제없이 진행했다면 DB에 이모지를 쓰고 불러올 수 있다. </p>
<p>만약 이모지가 포함된 텍스트를 json으로 렌더링 해줘야 한다면 한 가지 작업을 더 해줘야 한다. 내 경우는 Rails를 API로 사용하고 있어 json 렌더링이 필수였다. json으로 데이터를 변환하면 DB에 잘 저장되었어도 유니코드가 잘려 글자가 깨져버렸다. 검색해보니 나와 같은 문제를 겪는 사람들이 꽤 됐고 일반적으로 사용되는 monkey patch가 있어 나도 동일하게 적용해 주었다.</p>
<div class="gatsby-highlight">
<pre class="language-ruby"><code class="language-ruby"><span class="token comment"># config/initializer/active_support_encoding.rb</span>
<span class="token comment"># patch for utf8mb4 encoding</span>
<span class="token keyword">module</span> <span class="token constant">ActiveSupport</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">JSON</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Encoding</span>
<span class="token keyword">class</span> <span class="token operator">&lt;</span><span class="token operator">&lt;</span> <span class="token keyword">self</span>
<span class="token keyword">def</span> <span class="token function">escape</span><span class="token punctuation">(</span>string<span class="token punctuation">)</span>
<span class="token keyword">if</span> string<span class="token punctuation">.</span>respond_to<span class="token operator">?</span><span class="token punctuation">(</span><span class="token symbol">:force_encoding</span><span class="token punctuation">)</span>
string <span class="token operator">=</span> string<span class="token punctuation">.</span><span class="token function">encode</span><span class="token punctuation">(</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Encoding</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">UTF_8</span><span class="token punctuation">,</span> <span class="token keyword">undef</span><span class="token punctuation">:</span> <span class="token symbol">:replace</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">force_encoding</span><span class="token punctuation">(</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Encoding</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">BINARY</span><span class="token punctuation">)</span>
<span class="token keyword">end</span>
json <span class="token operator">=</span> string<span class="token punctuation">.</span><span class="token function">gsub</span><span class="token punctuation">(</span>escape_regex<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">|</span>s<span class="token operator">|</span> <span class="token constant">ESCAPED_CHARS</span><span class="token punctuation">[</span>s<span class="token punctuation">]</span> <span class="token punctuation">}</span>
json <span class="token operator">=</span> <span class="token string">%("<span class="token interpolation"><span class="token delimiter tag">#{</span>json<span class="token delimiter tag">}</span></span>")</span>
json<span class="token punctuation">.</span><span class="token function">force_encoding</span><span class="token punctuation">(</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Encoding</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">UTF_8</span><span class="token punctuation">)</span> <span class="token keyword">if</span> json<span class="token punctuation">.</span>respond_to<span class="token operator">?</span> <span class="token punctuation">(</span><span class="token symbol">:force_encoding</span><span class="token punctuation">)</span>
json
<span class="token keyword">end</span>
<span class="token keyword">end</span>
<span class="token keyword">end</span></code></pre>
</div>
<p>이렇게 해주면 json으로도 문제 없이 이모지를 주고 받을 수 있다.
아래는 내가 참고한 페이지들이다.</p>
<ul>
<li><a href="https://sosedoff.com/2012/02/18/emoji-and-rails.html">Emoji and Rails JSON output issue - Dan Sosedoff</a></li>
<li><a href="https://github.com/rails/rails/issues/3727">Emoji range encoded in JSON mangled · Issue #3727 · rails/rails · GitHub</a></li>
</ul></content:encoded></item></channel></rss>