<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jimin-fundamental</title>
    <link>https://jimin-fundamental.tistory.com/</link>
    <description>jimin-fundamental 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 6 Apr 2026 04:18:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>쟈민</managingEditor>
    <item>
      <title>첫 오픈소스 컨트리뷰션 도전: 이슈 선정부터 PR 승인까지</title>
      <link>https://jimin-fundamental.tistory.com/3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;회사에 다니니까 개인 개발할 시간이 부족해지는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부는 더 하고 싶다고 생각이 들던 찰나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈소스 컨트리뷰션을 해보면 어떨까 생각이 들었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 새로운 라이브러리 탐색하고 익히면서 나중에 내 프로젝트나 사내 프로젝트할 때에도 좋은 라이브러리 도입할 수 있게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다른 팀의 코드베이스 탐색하고 파악하는 경험 쌓기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 좋은 경력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같은 이유로 다짐했다!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Contribute할 프로젝트 및 이슈 고르기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Contribute을 하는 방법은 마음에 드는 프로젝트를 찾고, 그 프로젝트 내의 issue 중 내가 해결할 수 있을만 한 걸 찾아서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결 후 커밋해서 PR을 날리는 게 일반적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 어떤 프로젝트를 할지가 제일 고민이 됐다......!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 spring boot나 java 라이브러리 같은 유명한 프로젝트를 해보려고 했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;issue들을 보니까 'teams-only'(개인 기여자가 아니라 스프링부트를 만든 팀이 해결해야하는 이슈)가 대부분이어서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 contribute하는 내가 기여할 수 있는 프로젝트를 찾아 나섰다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 참고한 게 이 블로그(&lt;a href=&quot;https://dev-hiro.tistory.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dev-hiro.tistory.com/23)&lt;/a&gt;의 팁이었는데, 깃허브의 고급검색을 활용하면 된다는 것!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;깃허브에서 spring을 검색한 후 왼쪽 nav바 하단에 Advanced search를 누른 다음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;1243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LblII/dJMcaiWLaqL/Fjib4gKFdb198rRvhLSPhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LblII/dJMcaiWLaqL/Fjib4gKFdb198rRvhLSPhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LblII/dJMcaiWLaqL/Fjib4gKFdb198rRvhLSPhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLblII%2FdJMcaiWLaqL%2FFjib4gKFdb198rRvhLSPhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;415&quot; height=&quot;427&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;1243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;language: 선택한 언어로 개발&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;팔로워의 수나 스타 수: ex) &amp;gt; 5000&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;라벨: ex) &quot;good first issue&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;과 같이 고급 검색을 이용하면 기여할만 한 프로젝트 및 이슈를 찾기가 매우 쉬워진다!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이슈와 프로젝트 분석하기&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 기여하고자 하는 프로젝트는 &lt;b&gt;'Dependency-Check'&lt;/b&gt;(&lt;a href=&quot;https://github.com/dependency-check/DependencyCheck/issues/8356&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/dependency-check/DependencyCheck/issues/8356)&lt;/a&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFSRSA/dJMcacbdiFa/clfi4BQjQt0yzHyQZJYCjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFSRSA/dJMcacbdiFa/clfi4BQjQt0yzHyQZJYCjK/img.png&quot; data-alt=&quot;무려 7.5k의 repo이다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFSRSA/dJMcacbdiFa/clfi4BQjQt0yzHyQZJYCjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFSRSA%2FdJMcacbdiFa%2Fclfi4BQjQt0yzHyQZJYCjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;249&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무려 7.5k의 repo이다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;이 프로젝트는 &lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;4&quot;&gt;소프트웨어 구성 분석(SCA, Software Composition Analysis)&lt;/b&gt; 도구로, 프로젝트에서 사용하는 외부 라이브러리(의존성) 내에 공개된 보안 취약점(CVE)이 포함되어 있는지 탐지하는 역할을 한다. Java, .NET, Ruby, Node.js 등 다양한 기술 스택을 지원하며, 각 라이브러리의 메타데이터를 수집하여 미국 국가 취약점 데이터베이스(NVD)와 대조함으로써 개발자가 사전에 보안 위험을 인지하고 조치할 수 있도록 돕는 오픈소스 보안 엔진이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;그중에서 해결하고자 하는 이슈는 'Narrow down VersionFilterAnalyzer scope (#8356)'이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;a href=&quot;https://github.com/dependency-check/DependencyCheck/issues/8356&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/dependency-check/DependencyCheck/issues/8356&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB6B6b/dJMcaa5xiIv/Dw7DKDvugwYyo7kUDRYwf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB6B6b/dJMcaa5xiIv/Dw7DKDvugwYyo7kUDRYwf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB6B6b/dJMcaa5xiIv/Dw7DKDvugwYyo7kUDRYwf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB6B6b%2FdJMcaa5xiIv%2FDw7DKDvugwYyo7kUDRYwf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;395&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;이 이슈는 &lt;b data-index-in-node=&quot;6&quot; data-path-to-node=&quot;6&quot;&gt;VersionFilterAnalyzer 클래스가 설계된 의도와 다르게 너무 넓은 책임을 가지고 있는 문제&lt;/b&gt;를 말하는 이슈이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;현재 VersionFilterAnalyzer의 JavaDoc에는 이 클래스가 JAR 형식에만 분석을 수행해야 한다고 하지만, 실제 구현상으로는 모든 타입의 의존성 파일을 대상으로 분석 로직을 실행하고 있다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;이는 불필요한 연산 자원을 낭비할 뿐만 아니라, 특정 파일 타입(JAR)을 위해 설계된 로직이 다른 타입의 파일에 적용되어 예기치 않은 부작용을 낳을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;이 문제점을 해결하기 위해서는 다음과 같은 변경사항이 필요하다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;상속 구조의 변경:&lt;/b&gt; 현재 &lt;b&gt;AbstractAnalyzer&lt;/b&gt;를 따르고 있는 VersionFilterAnalyzer가 &lt;b&gt;AbstractFileTypeAnalyzer&lt;/b&gt;를 상속받도록 수정해야 한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;분석 대상 제한:&lt;/b&gt; 상속받은 AbstractFileTypeAnalyzer의 기능을 활용하여, 분석 프로세스 진입 전 대상 파일이 &lt;b data-index-in-node=&quot;76&quot; data-path-to-node=&quot;9,1,0&quot;&gt;JAR 확장자&lt;/b&gt;인지 확인하는 필터링 로직을 적용한다. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AbstractAnalyzer&lt;/b&gt; 과 &lt;b&gt;AbstractFileTypeAnalyzer&lt;/b&gt; 의 차이는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- AbstractAnalyzer: &lt;/b&gt;가장 기본적인 추상 클래스로, 파일의 타입이나 확장자에 상관없이 모든 리소스에 대해 분석 로직을 실행할 수 있는 범용적인 구조다.&amp;nbsp;현재 상태는&amp;nbsp;VersionFilterAnalyzer가 이 클래스를 상속받고 있어, 파이썬이나 자바스크립트 파일까지 불필요하게 분석 프로세스에 포함되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;AbstractFileTypeAnalyzer: &lt;/b&gt;AbstractAnalyzer를 한 번 더 확장한 클래스로, 파일 확장자 기반의 자동 필터링 기능이 내장되어 있다. 이 클래스를 상속받으면 getSupportedExtensions()라는 메서드를 오버라이드해야 한다. 여기에 &quot;jar&quot;라고 명시해두면, 엔진이 파일을 스캔할 때 확장자가 일치하지 않는 파일은 아예 이 분석기를 거치지 않기 때문에 프로세스가 정확해진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Assign 받기&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVFGMw/dJMcagLsSqI/v3fQFY6kRyjpHh0pWGvuXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVFGMw/dJMcagLsSqI/v3fQFY6kRyjpHh0pWGvuXK/img.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;568&quot; data-is-animation=&quot;false&quot; width=&quot;502&quot; height=&quot;313&quot; style=&quot;width: 57.5013%; margin-right: 10px;&quot; data-widthpercent=&quot;58.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVFGMw/dJMcagLsSqI/v3fQFY6kRyjpHh0pWGvuXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVFGMw%2FdJMcagLsSqI%2Fv3fQFY6kRyjpHh0pWGvuXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;912&quot; height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3UzPk/dJMcaaxHZdg/6kzzyRxyBZotIya2HCHAB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3UzPk/dJMcaaxHZdg/6kzzyRxyBZotIya2HCHAB0/img.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;778&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.3359%;&quot; data-widthpercent=&quot;41.82&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3UzPk/dJMcaaxHZdg/6kzzyRxyBZotIya2HCHAB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3UzPk%2FdJMcaaxHZdg%2F6kzzyRxyBZotIya2HCHAB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;이슈 해결 전 assign 요청을 하는 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈소스 생태계에서는 작업 중복 방지 등을 이유로 이슈 해결 전 assign을 받는 문화가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 나도 이렇게 assign을 요청했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9wEcg/dJMcaaYKTcc/oknPGP4mpkjoICfZamD1ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9wEcg/dJMcaaYKTcc/oknPGP4mpkjoICfZamD1ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9wEcg/dJMcaaYKTcc/oknPGP4mpkjoICfZamD1ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9wEcg%2FdJMcaaYKTcc%2FoknPGP4mpkjoICfZamD1ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;308&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;assign을 요청한 후 issue 발행인의 댓글과 함께 assign을 받으면 작업을 시작하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;작업하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;오픈소스 기여는 일반적인 사내 협업과는 조금 다른 절차가 있으니 실수를 줄이기 위해 단계를 나눠 정리해봤다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;1. Fork &amp;amp; Clone: 내 IDE로 가져오기&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQonnv/dJMcabwAIHj/tCsouecTwFoO0Ejjg9ZQf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQonnv/dJMcabwAIHj/tCsouecTwFoO0Ejjg9ZQf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQonnv/dJMcabwAIHj/tCsouecTwFoO0Ejjg9ZQf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQonnv%2FdJMcabwAIHj%2FtCsouecTwFoO0Ejjg9ZQf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;589&quot; height=&quot;217&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;오픈소스 원본 저장소(Upstream)에는 내 마음대로 커밋을 올릴 권한이 없다. 그래서 먼저 내 계정으로 통째로 복사해오는 과정이 필요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub 페이지 우측 상단의 &lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;7,0,0&quot;&gt;[Fork]&lt;/b&gt; 버튼을 눌러 내 계정으로 가져온다.&lt;/li&gt;
&lt;li&gt;그다음, 내 컴퓨터로 소스코드를 내려받는다. (Clone)
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone https://github.com/내-계정-ID/DependencyCheck.git
cd DependencyCheck
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;2. Upstream 설정: 원본과 동기화하기&lt;/h4&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;내가 작업하는 동안에도 원본 프로젝트에는 새로운 코드들이 계속 올라온다. 내 코드가 옛날 버전이 되지 않도록 원본 저장소를 연결해둔다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi9t-OxkZCTAxUAAAAAHQAAAAAQygM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;git remote add upstream https://github.com/dependency-check/DependencyCheck.git
git fetch upstream
# 항상 최신 상태의 main에서 작업을 시작하는 게 국룰!
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;3. 이슈 전용 branch 생성&lt;/h4&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;main 브랜치에서 바로 수정하는 건 위험하다. 이슈 번호나 작업 내용을 담은 새 브랜치를 만들어서 깔끔하게 관리하자.&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;어떤 브랜치 이름으로 만들지는 해당 프로젝트에 기존 브랜치 이름들을 참고하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi9t-OxkZCTAxUAAAAAHQAAAAAQywM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;git checkout -b fix/8356-narrow-version-filter-scope
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;4. 코드 수정하기&lt;/h4&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;드디어 인텔리제이를 켜고 코드를 수정할 시간! 내가 분석한 대로 extends를 변경하고 로직을 다듬는다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 구조 변경: 명세에 맞는 상속 구조 선택&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;기존 VersionFilterAnalyzer는 모든 파일을 대상으로 분석을 시도하는 AbstractAnalyzer를 상속받고 있었다. 이를 특정 확장자만 선별적으로 처리할 수 있는 &lt;b&gt;AbstractFileTypeAnalyzer&lt;/b&gt;로 변경했다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi9t-OxkZCTAxUAAAAAHQAAAAAQ_AQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// 부모 클래스를 변경하여 파일 타입 기반 분석기로 정의
public class VersionFilterAnalyzer extends AbstractFileTypeAnalyzer {

 	// JAR 필터
    private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(&quot;jar&quot;).build();

    // JAR 파일만 허용하는 필터 적용
    @Override
    protected FileFilter getFileFilter() {
        return FILTER;
    }

    // 구조 변경에 따른 초기화 메서드 구현
    @Override
    public void prepareFileTypeAnalyzer(Engine engine) throws InitializationException {
        // 별도 초기화 로직 없음
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size14&quot;&gt;&lt;i&gt;실제 주석은 영어로 코드 베이스에 맞게 작성해야 한다!&lt;/i&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;- 검증: 테스트 코드로 로직 증명&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;수정한 로직이 의도대로 동작하는지 확인하기 위해 테스트 케이스를 추가했다. .jar 파일은 정상적으로 수용하고, 그 외의 확장자(.war, .exe, pom.xml 등)는 제외하는지 검증했다.&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi9t-OxkZCTAxUAAAAAHQAAAAAQ_QQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;@Test
void testAcceptOnlyJarFiles() {
    VersionFilterAnalyzer instance = new VersionFilterAnalyzer();
    instance.initialize(getSettings());
    
    // JAR 파일은 통과
    assertTrue(instance.accept(new File(&quot;example-1.2.3.jar&quot;)));
    
    // 그 외 확장자는 차단 (설계 의도 확인)
    assertFalse(instance.accept(new File(&quot;example-1.2.3.war&quot;)));
    assertFalse(instance.accept(new File(&quot;example-1.2.3.exe&quot;)));
    assertFalse(instance.accept(new File(&quot;pom.xml&quot;)));
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;테스트까지 완료했으면 그 다음 step으로 넘어간다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style2&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;작업이 완료되었으면?&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi9t-OxkZCTAxUAAAAAHQAAAAAQzAM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px;&quot;&gt;1. Commit &amp;amp; Push: 명확한 메시지 남기기&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;커밋 메시지는 해당 프로젝트의 다른 커밋들을 보고 이와 형식을 맞춰서 작성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;20&quot;&gt;내 프로젝트는 contribution 가이드라인이 있어서 그걸 따라서 작성했다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;20&quot;&gt;커밋 관련 규칙은 다음과 같았다. -&amp;nbsp;&lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/&quot;&gt;https://www.conventionalcommits.org/en/v1.0.0/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 말하는 feat과 fix의 차이점은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;feat: 새로운 기능을 codebase에 추가하는 것&lt;/li&gt;
&lt;li&gt;fix: codebase의 버그(의도와 다르게 동작하는 것)을 수정하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi9t-OxkZCTAxUAAAAAHQAAAAAQzQM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git add .
git commit -m &quot;fix: narrow down VersionFilterAnalyzer scope to JAR files&quot;
git push origin fix/8356-narrow-version-filter-scope&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;2. Pull Request (PR) 날리기&lt;/h3&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;내 GitHub 저장소로 가보면 상단에 &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;21&quot;&gt;[Compare &amp;amp; pull request]&lt;/b&gt; 버튼이 떠 있을 것이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;보통 PR 메세지는 아래의 내용을 포함하는데, 이것 또한 해당 프로젝트의 컨벤션을 확인하고 같은 형식으로 진행하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;22&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,0,0&quot;&gt;What:&lt;/b&gt; 무엇을 고쳤는지 (상속 구조 변경 등)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,1,0&quot;&gt;Why:&lt;/b&gt; 왜 고쳤는지 (JavaDoc과 실제 코드의 불일치 해결 등)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,2,0&quot;&gt;How:&lt;/b&gt; 어떻게 테스트했는지 이 내용들을 정성스럽게 적어서 PR을 날리면 끝!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 프로젝트의 PR 형식은 정해져있었는데 이는 다음과 같았다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1772975573924&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## Description of Change

&amp;lt;!--
Please add a description of the proposed change
--&amp;gt;

## Related issues

&amp;lt;!--
e.g 
- fixes #xxxx
- relates to #xxxx
--&amp;gt;

## Have test cases been added to cover the new functionality?

*yes/no*&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다른 분들의 리뷰를 기다리기만 하면 된다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;1063&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b80AZi/dJMcahKnpQh/EiGfHMcsuFsMo06OXBEhbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b80AZi/dJMcahKnpQh/EiGfHMcsuFsMo06OXBEhbk/img.png&quot; data-alt=&quot;뿌듯하다ㅎㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b80AZi/dJMcahKnpQh/EiGfHMcsuFsMo06OXBEhbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb80AZi%2FdJMcahKnpQh%2FEiGfHMcsuFsMo06OXBEhbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1276&quot; height=&quot;1063&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;1063&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;뿌듯하다ㅎㅎ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Being Good Developer/지식 정리</category>
      <category>Contribution</category>
      <category>opensource</category>
      <category>오픈소스</category>
      <category>오픈소스컨트리뷰션</category>
      <author>쟈민</author>
      <guid isPermaLink="true">https://jimin-fundamental.tistory.com/3</guid>
      <comments>https://jimin-fundamental.tistory.com/3#entry3comment</comments>
      <pubDate>Sun, 8 Mar 2026 22:55:55 +0900</pubDate>
    </item>
    <item>
      <title>TIL: 무한 피어리뷰의 늪에서 깨달은 &amp;ldquo;이해하기 쉬운 커밋&amp;rdquo;의 조건</title>
      <link>https://jimin-fundamental.tistory.com/2</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;처음으로 회사에서 제대로 된 프로젝트를 Git에 올리기 시작하면서, 나는 말 그대로 &lt;b&gt;무한 피어리뷰의 늪&lt;/b&gt;에 빠졌다. &lt;br /&gt;&lt;br /&gt;혼자 개발하거나 해커톤에서 빠르게 구현할 때는 서로의 커밋을 꼼꼼히 보거나 코드리뷰를 하는 경우가 거의 없다 보니, 나의 커밋 단위는 늘 &lt;b&gt;크게&lt;/b&gt; 유지됐다.&lt;br /&gt;기능 A를 어느 정도 완성하면, 다음 기능 B로 넘어가기 전에 &lt;i&gt;일종의 백업용&lt;/i&gt;으로 커밋을 했기 때문이다.&lt;br /&gt;즉, &lt;b&gt;나의 커밋은 협업을 위한 것이 아니라, 그저 나 자신을 위한 기록&lt;/b&gt;이었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 협업 속 Git은 철저히 &amp;ldquo;남을 위한 도구&amp;rdquo;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;612&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;하지만 회사에서의 커밋은 완전히 다르다.&lt;br /&gt;커밋은 단순 백업을 넘어서 &lt;b&gt;협업의 기반이자, 다른 개발자가 내 코드를 이해하도록 돕는 중요한 소통 수단&lt;/b&gt;이 된다.&lt;/p&gt;
&lt;p data-end=&quot;677&quot; data-start=&quot;614&quot; data-ke-size=&quot;size16&quot;&gt;동료들은 내 코드를 처음 본다.&lt;br /&gt;심지어 프로젝트 전체를 clone하고 분석한 뒤 커밋을 읽는 것도 아니다.&lt;/p&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;679&quot; data-ke-size=&quot;size16&quot;&gt;그들은 &lt;b&gt;커밋 메시지 제목 &amp;rarr; 본문 &amp;rarr; 코드 변경&lt;/b&gt; 순으로 읽으며 단서를 찾아간다.&lt;br /&gt;즉, 커밋은 그들에게 있어 &lt;b&gt;내 코드를 이해하기 위한 유일한 가이드라인&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;795&quot; data-start=&quot;777&quot; data-ke-size=&quot;size16&quot;&gt;그래서 나는 피어리뷰 늪에 빠지면서 깨달았다.&lt;/p&gt;
&lt;blockquote data-end=&quot;837&quot; data-start=&quot;797&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;837&quot; data-start=&quot;799&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lsquo;아&amp;hellip; 지금까지의 내 커밋 방식은 협업에서 완전히 탈락이다.&amp;rsquo;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-end=&quot;870&quot; data-start=&quot;844&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;그렇다면 &amp;ldquo;이해하기 쉬운 커밋&amp;rdquo;은 무엇일까?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;933&quot; data-start=&quot;872&quot; data-ke-size=&quot;size16&quot;&gt;그걸 정의하려면 오히려 반대로 생각하면 쉽다.&lt;br /&gt;&lt;b&gt;상대가 절대 이해할 수 없는 커밋&lt;/b&gt;을 떠올려보면 된다.&lt;/p&gt;
&lt;h4 data-end=&quot;958&quot; data-start=&quot;935&quot; data-ke-size=&quot;size20&quot;&gt;이해하기 어려운 커밋의 3가지 특징&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1291&quot; data-start=&quot;960&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1067&quot; data-start=&quot;960&quot;&gt;&lt;b&gt;한 커밋에 너무 많은 것이 들어 있다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1067&quot; data-start=&quot;993&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1028&quot; data-start=&quot;993&quot;&gt;서로 다른 기능, 서로 다른 목적의 수정이 한데 섞여 있다.&lt;/li&gt;
&lt;li data-end=&quot;1067&quot; data-start=&quot;1032&quot;&gt;읽는 사람은 이 커밋이 &amp;ldquo;무엇을 위한 것인지&amp;rdquo; 알기 어렵다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1180&quot; data-start=&quot;1069&quot;&gt;&lt;b&gt;커밋 간 순서가 뒤죽박죽이다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1180&quot; data-start=&quot;1097&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1138&quot; data-start=&quot;1097&quot;&gt;A 작업 중간에 갑자기 생각난 B를 넣고, 그 뒤에 C가 끼어들고&amp;hellip;&lt;/li&gt;
&lt;li data-end=&quot;1180&quot; data-start=&quot;1142&quot;&gt;흐름이 없으니 읽는 사람은 작성자의 사고 과정을 추적하기 어렵다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1291&quot; data-start=&quot;1182&quot;&gt;&lt;b&gt;커밋 메시지가 나만 알아보게 쓰여 있다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1291&quot; data-start=&quot;1216&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1255&quot; data-start=&quot;1216&quot;&gt;&amp;ldquo;fix bug&amp;rdquo;, &amp;ldquo;temp&amp;rdquo;, &amp;ldquo;작업함&amp;rdquo;, &amp;ldquo;update&amp;rdquo;&amp;hellip;&lt;/li&gt;
&lt;li data-end=&quot;1291&quot; data-start=&quot;1259&quot;&gt;메시지가 &amp;lsquo;왜 이런 커밋이 필요한지&amp;rsquo; 설명하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1342&quot; data-start=&quot;1293&quot; data-ke-size=&quot;size16&quot;&gt;돌아보면, 솔직히 말해 &lt;b&gt;과거의 내 커밋은 이 모든 항목을 완벽히 충족&lt;/b&gt;하고 있었다&amp;hellip;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 이해하기 쉬운 커밋을 만드는 방법 &lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면 하나씩 고치면 된다.&lt;/p&gt;
&lt;h4 data-end=&quot;1410&quot; data-start=&quot;1371&quot; data-ke-size=&quot;size20&quot;&gt;1. 커밋의 단위는 &lt;b&gt;&amp;lsquo;작업의 의미&amp;rsquo;&lt;/b&gt;로 나눈다&lt;/h4&gt;
&lt;p data-end=&quot;1458&quot; data-start=&quot;1412&quot; data-ke-size=&quot;size16&quot;&gt;A라는 기능을 구현하기 위해&lt;br /&gt;a &amp;rarr; b &amp;rarr; c 순서의 작업이 필요하다고 해보자.&lt;/p&gt;
&lt;p data-end=&quot;1531&quot; data-start=&quot;1460&quot; data-ke-size=&quot;size16&quot;&gt;개발자인 나는 A라는 목적과 세부 단계들을 모두 알고 있지만,&lt;br /&gt;이 커밋을 처음 보는 사람은 &lt;b&gt;A가 무엇인지조차 모른다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1571&quot; data-start=&quot;1533&quot; data-ke-size=&quot;size16&quot;&gt;그래서 각 커밋에는 &lt;b&gt;단 하나의 작업(a)&lt;/b&gt;만 들어가야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1672&quot; data-start=&quot;1573&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1601&quot; data-start=&quot;1573&quot;&gt;&amp;ldquo;공통 Repository 인터페이스 추가&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1642&quot; data-start=&quot;1602&quot;&gt;&amp;ldquo;MongoDB Repository가 인터페이스 구현하도록 수정&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1672&quot; data-start=&quot;1643&quot;&gt;&amp;ldquo;DynamoDB 전용 Repository 추가&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1725&quot; data-start=&quot;1674&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 나누면 커밋 하나를 봐도 &amp;ldquo;이 커밋은 ○○를 위한 것&amp;rdquo;이라는 의미 전달이 명확해진다.&lt;/p&gt;
&lt;p data-end=&quot;1770&quot; data-start=&quot;1727&quot; data-ke-size=&quot;size16&quot;&gt;반면 a+b+c를 한 커밋에 넣으면&lt;br /&gt;이유도 흐름도 목적도 전부 섞여버린다.&lt;/p&gt;
&lt;p data-end=&quot;1770&quot; data-start=&quot;1727&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1809&quot; data-start=&quot;1777&quot; data-ke-size=&quot;size20&quot;&gt;2. 커밋 순서 = 내가 실제로 코드를 작성한 순서&lt;/h4&gt;
&lt;p data-end=&quot;1863&quot; data-start=&quot;1811&quot; data-ke-size=&quot;size16&quot;&gt;리뷰어는 커밋을 시간 순서대로 읽는다.&lt;br /&gt;그 흐름은 곧 &lt;b&gt;내 사고 과정의 흐름&lt;/b&gt;이 된다.&lt;/p&gt;
&lt;p data-end=&quot;1920&quot; data-start=&quot;1865&quot; data-ke-size=&quot;size16&quot;&gt;그런데 작업 중간에 갑자기 &amp;ldquo;아 맞다 이것도 고쳐야지&amp;rdquo; 하며&lt;br /&gt;d 같은 다른 작업을 끼워 넣으면?&lt;/p&gt;
&lt;p data-end=&quot;1964&quot; data-start=&quot;1922&quot; data-ke-size=&quot;size16&quot;&gt;리뷰어는 자연스럽게 &lt;b&gt;이 커밋이 왜 여기서 튀어나오는지&lt;/b&gt; 헷갈리게 된다.&lt;/p&gt;
&lt;p data-end=&quot;1969&quot; data-start=&quot;1966&quot; data-ke-size=&quot;size16&quot;&gt;따라서&lt;/p&gt;
&lt;blockquote data-end=&quot;2059&quot; data-start=&quot;1971&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2059&quot; data-start=&quot;1973&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생각난 수정이라도 작업을 끼워넣지 않고 별도 커밋으로 분리하는 것&lt;/b&gt;&lt;br /&gt;(필요하다면 &amp;ldquo;chore: 누락된 validation 추가&amp;rdquo;처럼 명확하게)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2079&quot; data-start=&quot;2061&quot; data-ke-size=&quot;size16&quot;&gt;이게 리뷰 난이도를 크게 낮춰준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2126&quot; data-start=&quot;2086&quot; data-ke-size=&quot;size20&quot;&gt;3. 커밋 메시지는 &amp;ldquo;why / what / how&amp;rdquo; 구조로 쓴다&lt;/h4&gt;
&lt;p data-end=&quot;2169&quot; data-start=&quot;2128&quot; data-ke-size=&quot;size16&quot;&gt;커밋 메세지는 내 커밋을 요약하는 부분이자, 상대가 코드를 읽기 전 읽게되는 부분이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2169&quot; data-start=&quot;2128&quot; data-ke-size=&quot;size16&quot;&gt;따라서 아래와 같은 정보를 넣어주면 이해하기 쉽다.&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2196&quot; data-start=&quot;2171&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2196&quot; data-start=&quot;2171&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;why &amp;ndash; 왜 이 커밋이 필요한가?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2230&quot; data-start=&quot;2197&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2213&quot; data-start=&quot;2197&quot;&gt;어떤 문제를 해결하는가&lt;/li&gt;
&lt;li data-end=&quot;2230&quot; data-start=&quot;2214&quot;&gt;어떤 목적을 달성하는가&lt;/li&gt;
&lt;li data-end=&quot;2230&quot; data-start=&quot;2214&quot;&gt;이 commit의 Goal이 무엇인가.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2260&quot; data-start=&quot;2232&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;what &amp;ndash; 목적을 위해 무엇을 했는가?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2306&quot; data-start=&quot;2261&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2277&quot; data-start=&quot;2261&quot;&gt;어떤 변화를 만들었는지&lt;/li&gt;
&lt;li data-end=&quot;2306&quot; data-start=&quot;2278&quot;&gt;어떤 파일, 어떤 로직이 수정 혹은 추가되었는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2336&quot; data-start=&quot;2308&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;how &amp;ndash; 기술적으로 어떻게 구현했는가?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2403&quot; data-start=&quot;2337&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2370&quot; data-start=&quot;2337&quot;&gt;어떤 방식, 어떤 패턴, 어떤 라이브러리를 사용했는지&lt;/li&gt;
&lt;li data-end=&quot;2403&quot; data-start=&quot;2371&quot;&gt;특별한 이유가 있는 설계 선택이라면 반드시 여기에 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2484&quot; data-start=&quot;2405&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;how는 상황에 따라 생략해도 된다.&lt;/b&gt;&lt;br /&gt;단, 리뷰어가 &amp;ldquo;왜 이런 구현을 했지?&amp;rdquo; 하고 궁금할 만한 부분이 있다면 적어주는 것이 좋다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 실제 예시로 보는 좋은 커밋의 구조 &lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2625&quot; data-start=&quot;2514&quot; data-ke-size=&quot;size16&quot;&gt;상황:&lt;br /&gt;기존 프로젝트는 MongoDB만 사용하도록 구조가 고정돼 있었고,&lt;br /&gt;DB 전환이 어려운 문제가 있었다.&lt;br /&gt;이를 해결하기 위해 &lt;b&gt;브릿지 패턴&lt;/b&gt;을 도입해 구조를 유연하게 만들기로 했다.&lt;/p&gt;
&lt;p data-end=&quot;2646&quot; data-start=&quot;2627&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면 커밋의 &amp;ldquo;why&amp;rdquo;는 다음과 같다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2694&quot; data-start=&quot;2648&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2694&quot; data-start=&quot;2650&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정 DB에 대한 종속성을 제거하고 쉽게 전환 가능한 구조를 만들기 위해&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2715&quot; data-start=&quot;2696&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2715&quot; data-start=&quot;2696&quot; data-ke-size=&quot;size16&quot;&gt;그리고 작업은 다음과 같이 나뉜다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2828&quot; data-start=&quot;2717&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2744&quot; data-start=&quot;2717&quot;&gt;공통 Repository 인터페이스 정의&lt;/li&gt;
&lt;li data-end=&quot;2788&quot; data-start=&quot;2745&quot;&gt;기존 MongoDB Repository가 인터페이스를 구현하도록 변경&lt;/li&gt;
&lt;li data-end=&quot;2828&quot; data-start=&quot;2789&quot;&gt;DynamoDB Repository 추가 후 공통 인터페이스 구현&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2851&quot; data-start=&quot;2830&quot; data-ke-size=&quot;size16&quot;&gt;이 각각이 &lt;b&gt;하나의 커밋&lt;/b&gt;이 된다. 이 커밋들의 why는 모두 동일하겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2851&quot; data-start=&quot;2830&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2866&quot; data-start=&quot;2853&quot; data-ke-size=&quot;size16&quot;&gt;그리고 &amp;ldquo;how&amp;rdquo;에는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2948&quot; data-start=&quot;2867&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2888&quot; data-start=&quot;2867&quot;&gt;브릿지 패턴을 어떻게 적용했는지&lt;/li&gt;
&lt;li data-end=&quot;2914&quot; data-start=&quot;2889&quot;&gt;어떤 인터페이스가 어떤 메서드를 갖는지&lt;/li&gt;
&lt;li data-end=&quot;2948&quot; data-start=&quot;2915&quot;&gt;기존 구조와 어떻게 연결되는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등의 내용을 적어준다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하자면 핵심은 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt; 리뷰어가 커밋 메시지만 읽어도 &amp;ldquo;아 이런 코드가 나오겠구나&amp;rdquo; 하고 자연스럽게 예측 및 이해되도록 하는 것. &lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3060&quot; data-start=&quot;3033&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 커밋을 작성하면 다음과 같은 효과가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3195&quot; data-start=&quot;3062&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3079&quot; data-start=&quot;3062&quot;&gt;피어리뷰 시간이 줄어든다&lt;/li&gt;
&lt;li data-end=&quot;3112&quot; data-start=&quot;3080&quot;&gt;동료들의 내가 작성한 코드에 대한 이해도가 올라간다&lt;/li&gt;
&lt;li data-end=&quot;3156&quot; data-start=&quot;3113&quot;&gt;나 자신도 개발 단계&amp;middot;흐름을 더 명확하게 정리하면서 코드를 짤 수 있다&lt;/li&gt;
&lt;li data-end=&quot;3195&quot; data-start=&quot;3157&quot;&gt;나중에 과거 코드를 다시 볼 때도 훨씬 빠르게 복기할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3274&quot; data-start=&quot;3197&quot; data-ke-size=&quot;size16&quot;&gt;커밋은 단순히 코드를 저장하는 도구가 아니다.&lt;br /&gt;&lt;b&gt;나의 사고 과정과 의도를 녹여, 미래의 나와 동료에게 &amp;lsquo;이해&amp;rsquo;를 전달하는 도구&lt;/b&gt;이다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Being Good Developer/TIL</category>
      <category>COMMIT</category>
      <category>GIT</category>
      <category>Til</category>
      <category>커밋</category>
      <author>쟈민</author>
      <guid isPermaLink="true">https://jimin-fundamental.tistory.com/2</guid>
      <comments>https://jimin-fundamental.tistory.com/2#entry2comment</comments>
      <pubDate>Sat, 6 Dec 2025 18:41:33 +0900</pubDate>
    </item>
    <item>
      <title>4개월차 신입 개발자 회고</title>
      <link>https://jimin-fundamental.tistory.com/1</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;타임라인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2025.06.30&lt;/b&gt; 인턴 백엔드 개발자로 IT 스타트업 회사에 입사&lt;br /&gt;&lt;b&gt;2025.09.30&lt;/b&gt; 정규직으로 전환&lt;br /&gt;이후 실제로 실무를 한지 한달이 조금 넘었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 회사이자, 첫 실무를 하면서 배운 것들이 많아 이를 기록해보려고 한다.&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;회사 후기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굉장히 자유로운 분위기의 전형적인 IT 스타트업인 거 같다.&lt;br /&gt;이 회사가 첫 회사라 다른 회사와의 비교가 불가능하지만, 아래와 같은 장점들이 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 복지가 정말 좋다.&lt;/b&gt;&lt;br /&gt;회사의 여러 복지 중에서 내가 가장 좋아하는 것은 '유연근무제'이다.&lt;br /&gt;8~12시 사이에 내가 원하는 때에 회사에 가서 8시간 ~ 9시간을 채우고 퇴근하면 되는데,&lt;br /&gt;아침이나 저녁 일정을 자유롭게 조절할 수 있는 점이 정말 좋다.&lt;br /&gt;최근에는 9시에 가서 저녁을 먹고 7시까지 일한 후 헬스를 가는 루틴으로 살고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 배울 수 있는 분위기이다.&lt;/b&gt;&lt;br /&gt;실무를 할 때, 단순히 일이 주어지고 혼자서 해내야하는 분위기가 아니라, 관련 개념에 대해서 먼저 발표를 직접 하거나 다른 사람들의 발표를 듣고, 이를 바탕으로 실무를 한다.&lt;br /&gt;예를 들어, k8s로 환경 구축을 해야하는 미션을 받았다고 해보자. 그러면 'k8s로 환경 변경해!'가 아니라,&lt;br /&gt;k8s에 대해 공부하고 이에 대해 발표해라 -&amp;gt; 발표를 팀장님이 들으시고, ~ 부분에 대해서 이해를 못한 거 같다. 더 보완해서 다시 발표해라 -&amp;gt; 이제 우리 서버를 다 k8s로 돌려라.&lt;br /&gt;이런 식으로 진행이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 실무에 바로 투입되고 싶은 마음이 컸기 때문에 이러한 특징이 마냥 달갑지는 않았는데,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래의 나의 잘못된 습관이었던&amp;nbsp; '완벽히 이해하지 않고 바로 구현하기'를 고치는 데 많은 도움이 되고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 문서를 뜯어보고, 완전히 이해하기 위해 노력하면서 내가 성장하는 게 느껴진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 다양한 분야를 접할 수 있다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 장점이자 단점일 수 있는데, 단순 서버 개발자에 한정되지 않고 다양한 업무를 도전해볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 개발뿐 아니라, 인프라 엔지니어의 역할은 물론, 최근에는 html 개발까지 하고 있다. 또한, 다음 주에는 VC의 역할로 부산 지스타로 출장을 나간다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가에게는 단점일 수 있지만, 나의 경우에는 프론트엔드에도 관심이 있었고, 실무에서 다양한 업무를 직접 해보면서 나에게 뭐가 맞는지 찾고 싶은 마음이 컸었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 일반 백엔드 개발자라면 할 수 없는 것들(출장, html 개발 등)을 하면서 내 식견을 넓힐 수 있는 거 같아 좋다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;지금까지 한 것&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 배운 것 중에 기록하고 싶은 소재는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OOP와 SOLID&lt;/li&gt;
&lt;li&gt;발표할 때(커뮤니케이션 할 때) 지켜야 하는 것들&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;K8S&lt;/li&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;DeepLink(Applink, Universal Link, Custom URL scheme)&lt;/li&gt;
&lt;li&gt;nvidia orin driver 연결 방법&lt;/li&gt;
&lt;li&gt;(곧 있을 출장 후기)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 최대한 꾸준히 배운 것들을 정리하면서 성장하는 모습을 기록하고, 또 성장하고 싶다.&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;032&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/032.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/032.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>Being Good Developer/회고</category>
      <category>회고</category>
      <author>쟈민</author>
      <guid isPermaLink="true">https://jimin-fundamental.tistory.com/1</guid>
      <comments>https://jimin-fundamental.tistory.com/1#entry1comment</comments>
      <pubDate>Mon, 10 Nov 2025 15:33:28 +0900</pubDate>
    </item>
  </channel>
</rss>