<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Code-Review on kastori</title><link>http://blog.kastori.dev/tags/code-review/</link><description>Recent content in Code-Review on kastori</description><generator>Hugo -- gohugo.io</generator><language>ko-kr</language><lastBuildDate>Mon, 08 Jun 2026 00:00:00 +0900</lastBuildDate><atom:link href="http://blog.kastori.dev/tags/code-review/index.xml" rel="self" type="application/rss+xml"/><item><title>PR을 잘 쓴다는 것 — 작성자와 리뷰어가 모두 편한 코드 리뷰</title><link>http://blog.kastori.dev/tech/2026-06-08-git-03-pull-request/</link><pubDate>Mon, 08 Jun 2026 00:00:00 +0900</pubDate><guid>http://blog.kastori.dev/tech/2026-06-08-git-03-pull-request/</guid><description>&lt;h2 id="리뷰어의-입장에서-생각하기"&gt;&lt;a href="#%eb%a6%ac%eb%b7%b0%ec%96%b4%ec%9d%98-%ec%9e%85%ec%9e%a5%ec%97%90%ec%84%9c-%ec%83%9d%ea%b0%81%ed%95%98%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;리뷰어의 입장에서 생각하기
&lt;/h2&gt;&lt;p&gt;PR을 올리고 &amp;ldquo;리뷰 부탁드립니다&amp;quot;를 남긴다. 리뷰어는 맥락 없이 diff만 본다. &amp;ldquo;이게 왜 바뀐 거지?&amp;rdquo;, &amp;ldquo;뭘 테스트해야 하지?&amp;rdquo;, &amp;ldquo;어디서 실행해볼 수 있지?&amp;rdquo; — 이 질문들이 드는 PR은 리뷰 시간이 3배가 된다.&lt;/p&gt;
&lt;p&gt;좋은 PR은 리뷰어의 이 질문들을 미리 답해놓은 문서다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="pr-크기--작을수록-좋다"&gt;&lt;a href="#pr-%ed%81%ac%ea%b8%b0--%ec%9e%91%ec%9d%84%ec%88%98%eb%a1%9d-%ec%a2%8b%eb%8b%a4" class="header-anchor"&gt;&lt;/a&gt;PR 크기 — 작을수록 좋다
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ 이상적인 PR
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 변경 파일 5~10개 이하
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 변경 라인 400줄 이하
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 하나의 목적 (기능 1개, 버그 1개)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❌ 피해야 할 PR
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &amp;#34;기능 A + 리팩터링 + 의존성 업그레이드&amp;#34; 한 번에
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 1,000줄 넘는 PR → 리뷰어가 세부 사항을 놓침
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;큰 기능을 어떻게 쪼개는가: &lt;strong&gt;레이어 단위&lt;/strong&gt;로 나눈다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PR 1: Entity + Repository 추가
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PR 2: Service 로직 구현
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PR 3: Controller + API 엔드포인트
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PR 4: 테스트 코드
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;각 PR이 독립적으로 리뷰·머지 가능하도록 설계하면 리뷰 속도가 빨라진다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="pr-본문--리뷰어가-필요한-정보를-모두-담는다"&gt;&lt;a href="#pr-%eb%b3%b8%eb%ac%b8--%eb%a6%ac%eb%b7%b0%ec%96%b4%ea%b0%80-%ed%95%84%ec%9a%94%ed%95%9c-%ec%a0%95%eb%b3%b4%eb%a5%bc-%eb%aa%a8%eb%91%90-%eb%8b%b4%eb%8a%94%eb%8b%a4" class="header-anchor"&gt;&lt;/a&gt;PR 본문 — 리뷰어가 필요한 정보를 모두 담는다
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 변경 사항
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Google OAuth2를 통한 소셜 로그인 기능을 구현했습니다.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;기존 이메일/비밀번호 로그인과 함께 사용할 수 있습니다.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 변경 이유
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;회원가입 과정의 마찰을 줄이기 위해 소셜 로그인을 추가합니다.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 주요 변경 파일
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`OAuthController.java`&lt;/span&gt; — OAuth2 콜백 처리
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`OAuth2UserService.java`&lt;/span&gt; — 사용자 정보 조회 및 저장
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`SecurityConfig.java`&lt;/span&gt; — OAuth2 설정 추가
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 테스트 방법
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; 로컬 실행 후 &lt;span class="sb"&gt;`/oauth2/authorization/google`&lt;/span&gt; 접속
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; Google 계정으로 로그인
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; 리다이렉트 후 JWT 토큰 발급 확인
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 관련 이슈
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Closes &lt;span class="ni"&gt;#123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="코드-리뷰--리뷰어-가이드"&gt;&lt;a href="#%ec%bd%94%eb%93%9c-%eb%a6%ac%eb%b7%b0--%eb%a6%ac%eb%b7%b0%ec%96%b4-%ea%b0%80%ec%9d%b4%eb%93%9c" class="header-anchor"&gt;&lt;/a&gt;코드 리뷰 — 리뷰어 가이드
&lt;/h2&gt;&lt;h3 id="코멘트-레이블"&gt;&lt;a href="#%ec%bd%94%eb%a9%98%ed%8a%b8-%eb%a0%88%ec%9d%b4%eb%b8%94" class="header-anchor"&gt;&lt;/a&gt;코멘트 레이블
&lt;/h3&gt;&lt;p&gt;의견의 강도를 명확히 표현하면 작성자가 우선순위를 잡을 수 있다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MUST] → 반드시 수정 필요. 머지 전 해결.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 예: &amp;#34;NPE 발생 가능 [MUST]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[SHOULD] → 수정을 강하게 권장. 이유 설명.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 예: &amp;#34;이 로직은 Service로 옮기는 게 좋을 것 같습니다 [SHOULD]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[OPINION] → 개인 의견. 수정 강제 아님.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 예: &amp;#34;저라면 메서드명을 ~로 했을 것 같아요 [OPINION]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[QUESTION] → 이해를 위한 질문. 비판 아님.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 예: &amp;#34;여기서 왜 synchronized를 쓰셨나요? [QUESTION]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[PRAISE] → 잘한 부분 칭찬.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 예: &amp;#34;이 패턴 깔끔하네요! [PRAISE]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="리뷰-에티켓"&gt;&lt;a href="#%eb%a6%ac%eb%b7%b0-%ec%97%90%ed%8b%b0%ec%bc%93" class="header-anchor"&gt;&lt;/a&gt;리뷰 에티켓
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ 코드를 비판하지 말고 개선을 제안한다
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;이건 잘못됐어요&amp;#34; → &amp;#34;이렇게 하면 더 나을 것 같습니다&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ 질문형으로 작성한다
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;왜 이렇게 했나요?&amp;#34; → &amp;#34;이렇게 한 이유가 있으신가요?&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ 칭찬도 남긴다
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 좋은 코드를 보면 [PRAISE]로 표현
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ 24시간 이내에 리뷰한다
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 리뷰가 밀리면 PR 작성자의 컨텍스트도 날아간다
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="머지-전략"&gt;&lt;a href="#%eb%a8%b8%ec%a7%80-%ec%a0%84%eb%9e%b5" class="header-anchor"&gt;&lt;/a&gt;머지 전략
&lt;/h2&gt;&lt;p&gt;GitHub에서 PR 머지 시 세 가지 방법을 제공한다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Merge commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 머지 커밋 생성. 브랜치 기록 보존.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → Git Flow에 적합
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Squash and merge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 브랜치의 모든 커밋을 하나로 합쳐서 머지
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 커밋 히스토리 깔끔. GitHub Flow에 적합
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → WIP 커밋이 많아도 괜찮음
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Rebase and merge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 브랜치 커밋들을 main 위로 rebase 후 머지
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 선형 히스토리 유지
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;팀이 하나의 전략을 통일해서 쓰는 게 중요하다. 섞어 쓰면 히스토리가 일관성 없어진다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="draft-pr-활용"&gt;&lt;a href="#draft-pr-%ed%99%9c%ec%9a%a9" class="header-anchor"&gt;&lt;/a&gt;Draft PR 활용
&lt;/h2&gt;&lt;p&gt;완성되지 않았지만 피드백을 받고 싶을 때는 Draft PR로 올린다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PR 생성 시 &amp;#34;Create draft pull request&amp;#34; 선택
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;→ 머지 불가 상태
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;→ 완료되면 &amp;#34;Ready for review&amp;#34;로 전환
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;ldquo;WIP:&amp;rdquo;, &amp;ldquo;DO NOT MERGE&amp;rdquo; 같은 제목 접두사 대신 Draft PR을 쓰는 게 GitHub 표준이다.&lt;/p&gt;
&lt;p&gt;다음 편에서는 PR이 머지된 후 릴리즈를 어떻게 관리하는지 다룬다.&lt;/p&gt;</description></item></channel></rss>