<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>From Code to Docs Blog</title>
        <link>https://sewonkimm-github-io.vercel.app/en/blog</link>
        <description>From Code to Docs Blog</description>
        <lastBuildDate>Sun, 08 Feb 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[나의 첫 테크니컬 라이팅 업무]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2</guid>
            <pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[직무 전환 후, 첫 주 업무는 워드로 작성하던 매뉴얼을 웹 문서로 전환하기 였습니다.]]></description>
            <content:encoded><![CDATA[<p>직무 전환 후, 첫 주 업무는 <code>워드로 작성하던 매뉴얼을 웹 문서로 전환</code>하기 였습니다.</p>
<p>한 번의 제품 출시에 작성해야 하는 매뉴얼은 4가지였는데, 국문·영문·일문 매뉴얼을 제공하고 있기 때문에 <strong>총 12개</strong>의 워드 파일을 관리해야 하는 구조였습니다.
이전에 FE 개발자로서 일하면서 제품 개발할 때마다 수많은 워드 파일을 관리하는 게 참으로 끔찍한 업무라는 생각을 했었어요.
Typst 같은 플랫폼에서 작성하거나 아예 형상관리를 적용하면 관리가 쉬워질거 같다는 생각은 해왔었는데 아쉽게도 당시 문서의 관리 주체가 형상관리에 대한 이해가 부족했고, 새로운 것을 배우기엔 너무 바쁜 환경이었습니다.
그렇게 몇 년이 흘러... 사용자 가이드는 300페이지가 넘는, 문서를 여는 것도 몇십초 기다려야 열리는 부담스러운 파일이 되었습니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="워드-문서의-문제점">워드 문서의 문제점<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#%EC%9B%8C%EB%93%9C-%EB%AC%B8%EC%84%9C%EC%9D%98-%EB%AC%B8%EC%A0%9C%EC%A0%90" class="hash-link" aria-label="Direct link to 워드 문서의 문제점" title="Direct link to 워드 문서의 문제점" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-수정이-힘들다">1. 수정이 힘들다<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#1-%EC%88%98%EC%A0%95%EC%9D%B4-%ED%9E%98%EB%93%A4%EB%8B%A4" class="hash-link" aria-label="Direct link to 1. 수정이 힘들다" title="Direct link to 1. 수정이 힘들다" translate="no">​</a></h3>
<p>저희 제품은 국문·영문·일문 3가지 매뉴얼을 작성해야 하는데요.
내용이 동일하고, 언어만 다른 다국어 워드 파일은 관리가 매우 까다롭습니다.</p>
<p>파일 하나에 300페이지가 넘기 때문에 세 언어에 능통하지 않은 이상 내용을 수정할 때 정말 헷갈립니다.
특히 일본어를 볼 땐, 뭐가 틀렸는지 보기도 힘들어요.
언어마다 길이가 다르기 때문에 국문에서 130 페이지에 있는 내용이 일문에는 137 페이지에 들어가 있기도 하고, 실수하기 딱 좋은 구조입니다. (실제로 웹 문서로 전환하면서 오번역 된 부분도 많이 잡았습니다.)</p>
<p>그리고 이미지를 한 번 교체하려면 3번의 반복 작업을 해야 합니다.
국문 파일을 열어서 교체하고, 영문 파일을 열어서 교체하고, 마지막으로 일문 파일을 열어서 교체하는데 개발을 해왔던 저에게는 워드 파일 열리는 거 기다리고, 페이지 찾아서 수 십개의 이미지를 교체하는 작업을 반복하는 것이 정말 고역이었습니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-리뷰가-어렵다">2. 리뷰가 어렵다<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#2-%EB%A6%AC%EB%B7%B0%EA%B0%80-%EC%96%B4%EB%A0%B5%EB%8B%A4" class="hash-link" aria-label="Direct link to 2. 리뷰가 어렵다" title="Direct link to 2. 리뷰가 어렵다" translate="no">​</a></h3>
<p>지난 4년간 릴리즈 직전에 문서 오타를 발견해서 재빌드하느라 새벽까지 일했던 경우가 많았는데요.
300페이지 중에 몇 줄씩 찔끔찔끔 수정한 부분만 검수하기가 까다롭기 때문에 발생한 문제였습니다.
놀랍게도 워드에도 리뷰 기능이 있습니다...만 써보면 아실 것 같습니다. 복장 터집니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-버전-관리가-어렵다">3. 버전 관리가 어렵다<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#3-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EA%B0%80-%EC%96%B4%EB%A0%B5%EB%8B%A4" class="hash-link" aria-label="Direct link to 3. 버전 관리가 어렵다" title="Direct link to 3. 버전 관리가 어렵다" translate="no">​</a></h3>
<p>문서라는 것이 날을 하루 잡아서 작업을 끝내버리면 좋지만 아쉽게도 개발 상황에 따라서 중간중간 작업을 해야하기 때문에 최종 버전이 나올 때까지 여러번 작업을 하는 경우가 많습니다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/no_git-85102bcfd304fa65cedfb68e10e69482.jpg" alt="최종, 최최종, 최최최종" loading="lazy"><p class="description_jZe6">최종, 최최종, 최최최종</p></div>
<p>어떤게 최종인지도 잘 모르겠고, 롤백을 하더라도 어떤 버전으로 롤백해야하는지 일일이 까보지 않으면 보기가 힘든 구조였습니다.
처음 인수인계 받았을 때에는 Git 없이 지금까지 어떻게 관리해왔는지 신기하다는 생각이 들었어요.
비 개발자라도 형상관리를 알아두면 업무 효율을 많이 높일 수 있을 것 같습니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="docs-to-code">Docs to Code<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#docs-to-code" class="hash-link" aria-label="Direct link to Docs to Code" title="Direct link to Docs to Code" translate="no">​</a></h2>
<p>워드는 이제 안녕! 👋
본격적으로 웹 문서화하기로 방향을 결정 한 후 한 일은 다음과 같습니다.</p>
<ol>
<li class="">플랫폼 선정(Docusaurus)</li>
<li class="">워드 내용 이전</li>
<li class="">다국어 적용</li>
<li class="">이미지 통합</li>
<li class="">스크립트 적용</li>
</ol>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="docusaurus-선정-이유">Docusaurus 선정 이유<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#docusaurus-%EC%84%A0%EC%A0%95-%EC%9D%B4%EC%9C%A0" class="hash-link" aria-label="Direct link to Docusaurus 선정 이유" title="Direct link to Docusaurus 선정 이유" translate="no">​</a></h3>
<p>여러 플랫폼 PoC를 진행하여 최종적으로 Docusaurus를 선정했습니다.
이유는 다음과 같습니다.</p>
<ul>
<li class="">Blog와 Docs 형태로 분리되는 구조</li>
<li class="">다양한 플러그인 제공</li>
<li class="">Meta에서 개발하여 지속적으로 관리되는 오픈소스</li>
<li class="">방대한 커뮤니티</li>
</ul>
<p>Vitepress, Rspress, Mkdocs 등 다른 SSG 를 살펴보았는데 아무래도 첫 웹 문서 전환이다보니 가장 안전한 플랫폼을 선택하게 되었습니다.
Vitepress는 이후 다른 제품의 매뉴얼을 제작할 때 사용해보았는데 Docusaurus보다 깔끔하고, 가벼운 문서에 적합한 느낌입니다.</p>
<p>포스트 형태가 구분되면서 txt 파일로 따로 관리되고 있던 릴리스 노트도 웹 문서에 포함시킬 수 있게 되었습니다. (관리 리소스 -1 ✌️)</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="빠르게-워드-이전하기">빠르게 워드 이전하기<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EC%9B%8C%EB%93%9C-%EC%9D%B4%EC%A0%84%ED%95%98%EA%B8%B0" class="hash-link" aria-label="Direct link to 빠르게 워드 이전하기" title="Direct link to 빠르게 워드 이전하기" translate="no">​</a></h3>
<p>워드 내용을 이전할 때에는 하나씩 붙여넣기 하기보다는 <a href="https://pandoc.org/index.html" target="_blank" rel="noopener noreferrer" class="">pandoc</a> 으로 docx파일을 markdown으로 변환했습니다.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">pandoc </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> docx </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">입력 파일.docx</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> markdown </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">출력 파일.md</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># -f : 입력 파일 형식</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># -t : 출력 파일 형식</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># -o : 결과물</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="스크립트">스크립트<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8" class="hash-link" aria-label="Direct link to 스크립트" title="Direct link to 스크립트" translate="no">​</a></h3>
<p>개발의 장점은 변수나 함수를 사용해서 반복되는 작업을 줄이는 것에 있습니다.
처음 개발을 배울 때, 변수를 쓰면 100번 할 일을 1번만 하면 된다는 점이 제일 와 닿았었는데요.
문서 전환에서도 제품명이나 회사명, 기능명처럼 고유한 정보들을 변수 처리해두어 일괄 수정이 쉽도록 했습니다.</p>
<p>이미지 크기를 일괄적으로 제어한다거나 제공 국가에 따라 노출하면 안되는 정보를 가린다거나 할 때의 공수를 크게 줄일 수 있었습니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="어려웠던-것들">어려웠던 것들<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#%EC%96%B4%EB%A0%A4%EC%9B%A0%EB%8D%98-%EA%B2%83%EB%93%A4" class="hash-link" aria-label="Direct link to 어려웠던 것들" title="Direct link to 어려웠던 것들" translate="no">​</a></h2>
<p>개인 블로그도 Docusaurus를 쓰고 있으니까 큰 어려움 없이 진행될 줄 알았는데 생각지 못했던 문제들이 있었습니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-배포">1. 배포<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#1-%EB%B0%B0%ED%8F%AC" class="hash-link" aria-label="Direct link to 1. 배포" title="Direct link to 1. 배포" translate="no">​</a></h3>
<p>제품 특성상 오프라인 환경에서도 웹 매뉴얼을 제공해야하고, 외부 노출이 되면 안되기 때문에 클라우드 배포가 아닌 제품에 탑재하는 방식으로 배포해야 했습니다.</p>
<p>Docusaurus는 SPA이므로 JS 번들 파일이 웹 서버를 거치며 실행되어야 hydrate 되며 제대로 보이게 됩니다.
그래서 로컬에서 <code>file:</code> 로 실행하는 것이 아닌 <code>http:</code> 프로토콜을 거쳐야하는 것이죠.
웹 문서는 만들었는데 서빙을 어떻게 해야할지 몰라서 백엔드 개발자분과 여러번 실험을 한 끝에 최종적으로 nginx로 서빙하는 것으로 마무리지었습니다.</p>
<p>배포 부분은 개발 지식이 조금 필요해서 생각보다 어려움이 있었어요.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-용량-최적화">2. 용량 최적화<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#2-%EC%9A%A9%EB%9F%89-%EC%B5%9C%EC%A0%81%ED%99%94" class="hash-link" aria-label="Direct link to 2. 용량 최적화" title="Direct link to 2. 용량 최적화" translate="no">​</a></h3>
<p>다국어 문서에서 중복되어 사용되던 이미지를 하나로 줄이며 용량이 1/3로 줄었지만 그럼에도 여전히 용량 문제는 있었습니다.
매뉴얼을 워드에서 pdf로 추출해서 제공하는 시절에는 몰랐는데 삽입된 이미지 하나하나의 용량이 커서 최종 빌드본 용량이 매우 큰 문제가 있었습니다.</p>
<p><a href="https://developers.google.com/speed/webp/download?hl=ko" target="_blank" rel="noopener noreferrer" class="">cwebp</a>를 사용해 이미지를 webp 형식으로 변환했고, 795MB에서 160MB까지 용량을 줄였습니다.
이 때 사용한 스크립트로 간단한 데스크톱 앱을 만들었는데 이는 다른 포스트에서 다룰 예정입니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-pdf-추출">3. pdf 추출<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#3-pdf-%EC%B6%94%EC%B6%9C" class="hash-link" aria-label="Direct link to 3. pdf 추출" title="Direct link to 3. pdf 추출" translate="no">​</a></h3>
<p>인터넷이 제공되지 않는 환경에서도 매뉴얼을 제공해야하기에 웹 문서를 제공하더라도 pdf를 추출하여 제공해야 했습니다.
<a href="https://github.com/signcl/docusaurus-prince-pdf" target="_blank" rel="noopener noreferrer" class="">docusaurus-prince-pdf</a> 플러그인을 사용해서 pdf를 추출하긴 했지만 섬세한 줄바꿈 같은 것들이 불가능해서 조금 아쉬움은 남습니다.</p>
<p>그리고 pdf 추출 방식이 굉장히 개발 친화적인 느낌이라 비개발자가 업무 인수인계를 받는다면 꽤 난이도가 있을 것 같아서 좀 더 좋은 방법을 찾아야하는 과제처럼 느껴지는 부분입니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="느낀-점">느낀 점<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#%EB%8A%90%EB%82%80-%EC%A0%90" class="hash-link" aria-label="Direct link to 느낀 점" title="Direct link to 느낀 점" translate="no">​</a></h2>
<p>생각지 못했던 어려움들은 있었지만 FE 개발 업무를 하면서 늘 하고 싶었던 문서 형상 관리를 제대로 해보고, 실제로 많은 개선을 이뤄내서 좋았습니다.
그리고 웹 문서가 탑재된 버전이 출시된 이후 비즈팀에서 반응이 좋아서 놀랍기도 했어요.
진작 할 걸!
신규 입사자분들이 제품 사용할 때, 웹 문서를 사용하는 걸 보면 흐뭇합니다☺️</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="이제-뭘-git에-올려볼까">이제 뭘 Git에 올려볼까?<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw-2#%EC%9D%B4%EC%A0%9C-%EB%AD%98-git%EC%97%90-%EC%98%AC%EB%A0%A4%EB%B3%BC%EA%B9%8C" class="hash-link" aria-label="Direct link to 이제 뭘 Git에 올려볼까?" title="Direct link to 이제 뭘 Git에 올려볼까?" translate="no">​</a></h3>
<p>즐겨보는 웹툰에서 개발자가 다른 직무의 업무를 할 때, 모든 것을 Git에 올리려 할 것이라는 장면을 봤을 때 너무 공감이 되어 웃겼는데요 ㅋㅋㅋㅋ</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/git1-f4c805348a6a5e6c2688bb290f8d1e57.jpeg" alt="" loading="lazy"></div>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/git2-bb014fc8a189b557e89b7d8a43aad244.jpeg" alt="근데 진짜 고객문의 깃에 올려주시면 안될까요 고객님?" loading="lazy"><p class="description_jZe6">근데 진짜 고객문의 깃에 올려주시면 안될까요 고객님?</p></div>
<p>아무튼 4년간 묵혀왔던 답답한 업무 병목을 해낸 테크티컬 라이터로서의 첫 업무!
만족도 100점!!</p>
<hr>
<p>워드를 웹 문서로 전환하거나 형상 관리 도입을 고민하고 계신 분들께 이 글이 많은 도움이 되었으면 좋겠습니다.</p>]]></content:encoded>
            <category>테크니컬라이팅</category>
            <category>Docs as Code</category>
        </item>
        <item>
            <title><![CDATA[2025 year in review]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025</guid>
            <pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[회사 생활 4가지 팩트]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="회사-생활-4가지-팩트">회사 생활 4가지 팩트<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#%ED%9A%8C%EC%82%AC-%EC%83%9D%ED%99%9C-4%EA%B0%80%EC%A7%80-%ED%8C%A9%ED%8A%B8" class="hash-link" aria-label="Direct link to 회사 생활 4가지 팩트" title="Direct link to 회사 생활 4가지 팩트" translate="no">​</a></h2>
<ol>
<li class="">프런트엔드 개발자에서 테크니컬 커뮤니케이터로 직무 전환.</li>
<li class="">word로 관리하던 문서를 웹 문서로 전환. 비 개발자를 위한 Git 사용 가이드 제작.</li>
<li class="">CS, VoC 프로세스 개선 프로젝트 참여. 정기 회고 및 CS 리포트 발간 문화 정착.</li>
<li class="">팀 빌딩을 위한 개발 회고 퍼실리테이팅 및 팀 워크샵 주도.</li>
</ol>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="팩트가-가르쳐준-것">팩트가 가르쳐준 것<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#%ED%8C%A9%ED%8A%B8%EA%B0%80-%EA%B0%80%EB%A5%B4%EC%B3%90%EC%A4%80-%EA%B2%83" class="hash-link" aria-label="Direct link to 팩트가 가르쳐준 것" title="Direct link to 팩트가 가르쳐준 것" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="무조건-역지사지">무조건, 역지사지<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#%EB%AC%B4%EC%A1%B0%EA%B1%B4-%EC%97%AD%EC%A7%80%EC%82%AC%EC%A7%80" class="hash-link" aria-label="Direct link to 무조건, 역지사지" title="Direct link to 무조건, 역지사지" translate="no">​</a></h3>
<p>올해 했던 일들은 '협업'이 핵심이었습니다.
개발자로 일할 때에도 협업은 중요했지만, 테크니컬 커뮤니케이터로써의 업무는 협업의 비중이 훨씬 높았습니다.
고객이 바로 내 옆의 동료들이고, 내 결과물이 그들의 업무 효율을 높이는 것이기 때문에 기술을 도입해서 업무가 더 편해지도록 해야했습니다.</p>
<p>내가 문제로 여겼던 일도 상대방에게는 문제가 아닐 수 있고, 문제 정의에서부터 의견이 맞지 않으면 일을 시작조차 할 수 없습니다.
설령 내가 몰아붙여서 시작하더라도 성공적으로 마무리할 수 없습니다.</p>
<ul>
<li class="">기술보다 먼저인 건 상대방의 기분을 헤아리는 것.</li>
<li class="">진실보다 중요한 건 상대방의 기분을 좋게 해주는 것.</li>
</ul>
<p>진정으로 하고 싶은 일을 하기 위한 필수 조건이라고 생각합니다.
이제야 사회 생활이 무엇인지... 조금씩 느껴가고 있습니다.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="중요한-것은-선의善意">중요한 것은 선의(善意)<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#%EC%A4%91%EC%9A%94%ED%95%9C-%EA%B2%83%EC%9D%80-%EC%84%A0%EC%9D%98%E5%96%84%E6%84%8F" class="hash-link" aria-label="Direct link to 중요한 것은 선의(善意)" title="Direct link to 중요한 것은 선의(善意)" translate="no">​</a></h3>
<p>동료 평가에서 매년 빠짐없이 들었던 피드백이 있습니다.</p>
<blockquote>
<p>"커뮤니케이션 스타일이 직설적이다."</p>
</blockquote>
<p>처음엔 고쳐보려고 했는데, 지금은 그렇지 않습니다.
직설적임을 인정하고, 스타일은 유지하되 관점을 바꾸었습니다.</p>
<p>듣기 좋은 소리를 하는 것보다 "상대방이 듣고 싶어 하는 말을 하는 것"이 중요합니다.
내가 하는 말은 "당신을 위해 하는 말이고, 당신을 진심으로 돕고 싶다"는 태도로 다가가면 직설적인 말투도 충분히 수용될 수 있다는 것을 알게 되었습니다.</p>
<p>"아니, 근데"로 첫 마디를 시작하지 않는 것만으로도 대화가 풀립니다.
상대의 의견을 먼저 확인하고 나서 하고싶은 말을 꺼내는 것만으로 사람들은 마음의 문을 엽니다.
간단하지만 실천하기는 정말 어렵습니다.</p>
<hr>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="next-step">Next Step<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#next-step" class="hash-link" aria-label="Direct link to Next Step" title="Direct link to Next Step" translate="no">​</a></h2>
<p>25년도에는 다양한 업무를 했습니다.
마음 한 구석에는 "이렇게 여러 곳에 발을 걸쳐놓는 게 옳은 일일까? 내가 작년에 했던 직무 전환 선언은 스스로 잡부가 되기로 한 것일까?"라는 불안감도 있었습니다.
아마 테크니컬 라이터로서의 전문성이 부족하다는 생각이 들어서겠지요.
불안감을 자동화나 프로세스 구축 등의 잔기술로 해소해보려고 했던 것 같아서 조금 반성했습니다.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="부딫혀보기">부딫혀보기<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#%EB%B6%80%EB%94%AB%ED%98%80%EB%B3%B4%EA%B8%B0" class="hash-link" aria-label="Direct link to 부딫혀보기" title="Direct link to 부딫혀보기" translate="no">​</a></h3>
<p>불안함을 떨쳐내기 위한 방법은 시도하는 것 뿐입니다.
세상에 내가 좋은 테크니컬 라이터일까요? 라고 물어보는 방법 뿐...</p>
<p>26년에는 테크니컬 라이터 버전의 이력서도 작성하고, 면접도 시도해 볼 생각입니다.
부족하다면 노력해보면 되고, 충분하다면 당당하게 재미있게 살면 될 것 같습니다.</p>
<p>일단 이력서를 쓰기로 마음먹은 순간부터 테크니컬 라이터로 쌓아야할 경험들이 생각나고, 업무에서 더 집중해야할 부분들도 보이기 시작했습니다.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ai로-대체될-직업">AI로 대체될 직업<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#ai%EB%A1%9C-%EB%8C%80%EC%B2%B4%EB%90%A0-%EC%A7%81%EC%97%85" class="hash-link" aria-label="Direct link to AI로 대체될 직업" title="Direct link to AI로 대체될 직업" translate="no">​</a></h3>
<p>최근 MS에서 공개한 논문<sup><a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#user-content-fn-1-727736" id="user-content-fnref-1-727736" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetHideOnScrollNavbar_vjPI">1</a></sup>에는 AI와 "협업"하게 될 가능성이 가장 높은 직업군 상위 40개 안에 테크니컬 라이터와 웹 개발자가 포함되어 있습니다.</p>
<p>AI는 초안 작성, 문서 정리, 반복적인 설명을 잘 하지만 제품 맥락 이해, 내부 이해관계자 조율 등의 업무는 아직 사람을 대체하기 힘들기 때문에 직군이 완전히 대체되기보다는 AI와 협업하는 형태로 업무의 형태가 변화할 가능성이 크다는데요.
단순 맞춤법 검사기나 번역기를 넘어 AI를 더 똑똑하게 활용하는 것이 2026년의 과제가 될 것 같습니다.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ai가-대체할-수-없는-능력">AI가 대체할 수 없는 능력<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#ai%EA%B0%80-%EB%8C%80%EC%B2%B4%ED%95%A0-%EC%88%98-%EC%97%86%EB%8A%94-%EB%8A%A5%EB%A0%A5" class="hash-link" aria-label="Direct link to AI가 대체할 수 없는 능력" title="Direct link to AI가 대체할 수 없는 능력" translate="no">​</a></h3>
<p>1년 동안의 경험이 말해주는 저는 "스타 플레이어가 아니고, 조직을 움직이게 하는 사람"입니다.<br>
<!-- -->많은 사람들이 덜 고통받는 구조를 만들고, 일이 돌아가는 시스템을 만드는 역할을 잘 합니다.</p>
<p>아직은 진짜 어느 조직에서든 "잘 할 수 있다"고 말하기에는 자신감이 부족한 거 같아서, 조금 더 경험해보고 실험해보며 역량을 키우는 노력이 필요할 것 같습니다.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ai-대체할-수-없는-능력-2">AI 대체할 수 없는 능력 2<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#ai-%EB%8C%80%EC%B2%B4%ED%95%A0-%EC%88%98-%EC%97%86%EB%8A%94-%EB%8A%A5%EB%A0%A5-2" class="hash-link" aria-label="Direct link to AI 대체할 수 없는 능력 2" title="Direct link to AI 대체할 수 없는 능력 2" translate="no">​</a></h3>
<p>데이터만 주면 AI가 뭐든 카피해가는 시대에, 한 가지 카피할 수 없는 것이 있다면 바로 "태도"입니다.</p>
<p>조금 서툴더라도 포기하지 않고, 본인의 일을 즐기며 끝까지 책임지는 것.
남들에게 자랑하고 싶을 정도로 본인의 일에 애정을 갖는 것.
하고 싶은 일을 하기 전에 먼저, 주어진 일을 최선을 다해 마치는 것.</p>
<p>그런 태도를 가진 인턴분들을 보며, 혹은 가지지 못한 인턴분들을 볼 때에도 다시금 되새기게 됩니다.
조직에서 대체 될 수 없는 사람은 좋은 태도를 가진 사람이 아닐지...</p>
<br>
<br>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI sr-only" id="footnote-label">Footnotes<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetHideOnScrollNavbar_vjPI" id="user-content-fn-1-727736">
<p><a href="https://arxiv.org/pdf/2507.07935?" target="_blank" rel="noopener noreferrer" class="">Working with AI:
Measuring the Applicability of Generative AI to Occupations</a> <a href="https://sewonkimm-github-io.vercel.app/en/blog/career/review-2025#user-content-fnref-1-727736" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>회고</category>
        </item>
        <item>
            <title><![CDATA[소스 코드: 더 비기닝]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/book/sourcecode</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/book/sourcecode</guid>
            <pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[한국의 IT 업계 사람들, 특히 개발자들은 매년, 매 분기, 심하면 매달, 매주 회고를 하는 문화가 있다.]]></description>
            <content:encoded><![CDATA[<p>한국의 IT 업계 사람들, 특히 개발자들은 매년, 매 분기, 심하면 매달, 매주 회고를 하는 문화가 있다.
나도 회고를 꽤 좋아하는 편이라 IT계의 거장인 빌 게이츠가 회고록을 책으로 냈다고 했을 때, 빌 게이츠가 생각한 스스로의 인생 평가가 매우 궁금했다.
마이크로소프트의 열혈 팬도 아니고, 빌 게이츠를 좋아하는 마음도 없었는데도 500페이지에 달하는 회고록은 정말 재미있었다. (빌 게이츠는 개발도 잘하고, 사업도 잘하고, 돈도 많고, 글도 잘 써…)</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="싹수가-남다른-트레이">싹수가 남다른 트레이<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/sourcecode#%EC%8B%B9%EC%88%98%EA%B0%80-%EB%82%A8%EB%8B%A4%EB%A5%B8-%ED%8A%B8%EB%A0%88%EC%9D%B4" class="hash-link" aria-label="Direct link to 싹수가 남다른 트레이" title="Direct link to 싹수가 남다른 트레이" translate="no">​</a></h2>
<p>*트레이는 게이츠 가족에서 빌 게이츠의 애칭이다.</p>
<blockquote>
<p>카드 게임을 통해 나는 아무리 복잡하고 불가사의해 보이는 무엇이라도 결국에는 알아낼 수 있는 경우가 많다는 사실을 배웠다. 세상은 이해할 수 있는 대상이었다.</p>
</blockquote>
<p>책은 할머니 댁에서 카드 게임을 하는 빌의 이야기로 시작한다.
가족에 대한 이야기를 정말 세세하게 썼는데, 본인의 유년기와 청년기를 정말 잘 회고한 것 같다.
그의 어린 시절을 이해하고 나니 빌 게이츠라는 사람을 '세계 1위 부자'에서 좀 더 입체적으로 바라볼 수 있었다.</p>
<br>
<br>
<blockquote>
<p>그 나이의 아이들은 부모와 선생님이 모든 답을 알고 있으리라 기대한다. 나는 점차 부모님과 선생님이 그렇지 않다고, 적어도 나를 만족시킬 만한 답을 주지는 못한다고 느꼈다.</p>
</blockquote>
<p>그리고 빌 게이츠는 정말 똑똑했다.
아주 어린 시절부터 지식에 대한 확신 수준이 남다르다고 생각했다.
나는 아직도 나 자신에게서 나온 답을 믿기보다는 늘 나보다 성숙한 누군가의 답을 기대하는데 고작 9살의 나이에 저런 수준의 자기 확신이 가능한걸까? 신기했다.
그가 수학을 좋아한 이유도 '수학을 통해 다른 학문을 익히는 법을 깨달을 수 있어서'라고 했는데, 수포자 출신으로서 그 표현 자체가 신선했다.
수학을 배움의 치트키로 써먹었다는 그의 경험담을 들으니 수학을 잘하고 싶다는 마음이 뒤늦게야 뿜뿜했다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="잘-하는-사람이-열심히-하면">잘 하는 사람이 열심히 하면?<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/sourcecode#%EC%9E%98-%ED%95%98%EB%8A%94-%EC%82%AC%EB%9E%8C%EC%9D%B4-%EC%97%B4%EC%8B%AC%ED%9E%88-%ED%95%98%EB%A9%B4" class="hash-link" aria-label="Direct link to 잘 하는 사람이 열심히 하면?" title="Direct link to 잘 하는 사람이 열심히 하면?" translate="no">​</a></h2>
<blockquote>
<p>그해 여름, 나는 한 사람이 어떤 분야에서 어떻게 최고가 될 수 있는지에 대해 많은 생각을 했다. 다른 사람들보다 20퍼센트 더 뛰어나려면 무엇이 필요할까? 타고난 재능은 어느 정도 작용하고 헌신적인 노력은 또 얼마나 중요한가? 전날보다 오늘 더 나은 성과를 내기 위해 매일 끊임없이 집중하고 고심하며 얼마나 오랜기간 노력을 기울여야 최고의 경지에 오를 수 있는 걸까?</p>
</blockquote>
<p>가장 인상 깊었던 부분은 타고난 재능이 있음에도 남들과 비교하며 나태하기는커녕, 진짜 하루하루 열심히 살아가는 그의 삶의 태도였다.
정말 매 순간 치열하게 살아왔다는 게 한 문장 한 문장에서 느껴진다.</p>
<p>학업에 집중하지 못했던 어린 시절부터 자기만의 캐릭터를 구축해 나가고, 스스로의 재능을 발견하는 모습, 눈 떠 있는 모든 시간을 프로그래밍에 쏟아붓는 모습 등.
'세계 최고 부자'를 목표로 산 게 아니라, 진짜 본인의 열정을 집요하게 좇으며 사는 태도가 감명 깊었고, 배우고 싶었다.</p>
<p>내가 60살쯤 내 삶을 돌아본다면 총 몇 페이지나 쓸 수 있을까?
아마 100페이지를 채우기도 힘들지도…
열심히 살아온 만큼 돌아볼 것도 많아 500페이지를 꽉꽉 채울 수 있지 않았을까?</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="그-시절-개발-이야기">그 시절 개발 이야기<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/sourcecode#%EA%B7%B8-%EC%8B%9C%EC%A0%88-%EA%B0%9C%EB%B0%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0" class="hash-link" aria-label="Direct link to 그 시절 개발 이야기" title="Direct link to 그 시절 개발 이야기" translate="no">​</a></h2>
<p>1960년대에 처음 컴퓨터를 접하고 그 열정을 불태우던 시기를 아직도 생생하게 기억하는 게 신기했는데, 그 부분을 읽으면서는 1960~70년대의 컴퓨터 환경을 엿볼 수 있어 재미있었다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/8800-906f250c6e111487dfba7618308d7322.jpg" alt="빌 게이츠가 열심히 썼던 알테어 8800" loading="lazy"><p class="description_jZe6">빌 게이츠가 열심히 썼던 알테어 8800</p></div>
<p>책을 다 읽고 넥슨컴퓨터박물관에 가서 직접 천공카드와 알테어 8800을 보고 왔는데 감회가 남달랐다.
베이직 예제 코드를 한 번 따라 쳐보면서 '도대체 이걸로 어떻게 개발을 한 걸까…'싶었고, 그 시절 선배 개발자들에 대한 존경심이 더 깊어졌다.</p>
<p>특히 마이크로소프트를 처음 창업하던 부분을 읽을 때는 스타트업 재직자로서 공감 가는 부분이 많았다.
50년 전 이야기인데도 요즘 스타트업들과 크게 다르지 않다는 점이 신기했다.</p>
<blockquote>
<p>하지만 이제 우리는 전혀 모르는 사람들을 고용하면서 그들에게 뉴멕시코로 이주해 18개월밖에 안 된, 미래가 불투명한 회사에 운명을 맡길 것을 요구하고 있었다. 다소 부담스러운 일이 아닐 수 없었다. 초기에 채용된 그들을 보며 마이크로-소프트가 비로소 진짜 회사처럼 느껴지기 시작했다.
그가 그 사진관에 데려간 '가족'은 우리 회사의 총원 12명 가운데 11명이었다.</p>
</blockquote>
<p>초기 멤버들을 '가족'이라고 표현한 것도 굉장히 의외의 따뜻한 모먼트였다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/ms-f5578e9788f9396e0d750983050e15b5.png" alt="초기 MS 멤버들" loading="lazy"><p class="description_jZe6">초기 MS 멤버들</p></div>
<p>요즘 스타트업처럼 열댓 명 남짓한 직원들과 함께 찍은 단체 사진이 귀엽게 느껴졌다.
회사의 덩치가 점점 커지던 시절, 초기 구성원들은 어떤 기분이었을까 궁금해졌다.
레이크사이드에서 시작했던 프로젝트성 작업들을 이어오다가 회사를 스케일업하면서 또 다른 국면의 경영적 어려움을 느꼈을 텐데, 그 계기와 이후 어떤 방식으로 회사를 운영했는지도 더 알고 싶어졌다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2편을-기대하며">2편을 기대하며...<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/sourcecode#2%ED%8E%B8%EC%9D%84-%EA%B8%B0%EB%8C%80%ED%95%98%EB%A9%B0" class="hash-link" aria-label="Direct link to 2편을 기대하며..." title="Direct link to 2편을 기대하며..." translate="no">​</a></h2>
<p>『소스 코드: 더 비기닝』은 빌 게이츠의 자서전 3부 중 1편에 불과하다.
300페이지쯤 대학에 입학하고, 책의 마지막에서야 겨우 마이크로소프트 창업 이야기가 나온다.</p>
<blockquote>
<p>나는 인생의 대부분을 앞날에 집중하면서 살았다. 지금도 대부분의 시간을 수년후에나 이뤄질, 어쩌면 아예 이뤄지지 않을지도 모르는 획기적인 도약을 모색하는 일에 쓰고 있다. 하지만 나이가 들면서 점점 과거를 돌아보게 된 것도 사실이다. 기억들을 하나씩 꿰맞춰 나가는 과정은 나 자신을 더 잘 이해하는 데 도움이 된다. 어른이 되어 깨달은 경이로운 한 가지는 세월과 배움을 모두 걷어내고 보면 나라는 존재의 많은 부분이 이미 처음부터 갖춰져있었음을 알 수 있다는 사실이다. 여러모로 나는 여전히 할머니 댁의 식탁에 앉아 할머니가 패를 돌리길 기다리던 여덟살 짜리 아이와 같다. 정신을 바짝 차리고 모든 것을 이해하게 되길 열망하는 어린 아이가 여전히 내 안에 남아 있다.</p>
</blockquote>
<p>책의 초반에 이야기했던 카드 게임이 다시 등장하며 마무리되는데, 빌 게이츠 삶의 1부를 관통하는 키워드는 '배움'이 아닐까 싶었다.
정답은 내 안에 있고, 그것을 계속 발견해 나가는 여정.</p>
<p>그리고 패가 좋든 나쁘든, 잘하면 이길 수 있는 것처럼 <strong>내 손에 좋은 패가 있든 나쁜 패가 있든, 그저 열심히 살아봐야겠다.</strong></p>]]></content:encoded>
            <category>독후감</category>
        </item>
        <item>
            <title><![CDATA[From Code to Docs - 나의 직무 전환기]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1</guid>
            <pubDate>Sun, 03 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[이제 프런트엔드 개발자가 아닙니다..!]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="이제-프런트엔드-개발자가-아닙니다">이제 프런트엔드 개발자가 아닙니다..!<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1#%EC%9D%B4%EC%A0%9C-%ED%94%84%EB%9F%B0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EC%95%84%EB%8B%99%EB%8B%88%EB%8B%A4" class="hash-link" aria-label="Direct link to 이제 프런트엔드 개발자가 아닙니다..!" title="Direct link to 이제 프런트엔드 개발자가 아닙니다..!" translate="no">​</a></h2>
<p>지난 4월, 공식적으로 뉴로클의 테크니컬 커뮤니케이터가 되었습니다.
일주일 간의 휴가를 가지고 직무를 변경했고, PM팀 소속의 테크니컬 커뮤니케이터로 일한지도 100일이 훌쩍 넘었습니다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/linkedin-25f4ee905208224064ecba9a935aa084.png" alt="링크드인 프로필도 새롭게 바꿨습니다 :)" width="350px" loading="lazy"><p class="description_jZe6">링크드인 프로필도 새롭게 바꿨습니다 :)</p></div>
<p>제 인생에서 꽤 큰 결정이고, 빅 뉴스인데 한 번도 글로 정리해본 적이 없더라고요.
그래서 이번 글에서는 제가 왜 프런트엔드 개발자에서 테크니컬 커뮤니케이터로 직무를 전환했는지, 어떤 일을 하고 있고, 앞으로 무엇을 해보고 싶은지도 함께 정리해보려 합니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="faq">FAQ<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ" translate="no">​</a></h2>
<p><em>"뉴로클에서 테크니컬 커뮤니케이터로 일하고 있는 김세원입니다."</em> 라고 자기소개를 하면, 거의 100%의 확률로 돌아오는 질문이 있습니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="테크니컬-커뮤니케이터-그게-뭐에요">테크니컬??? 커뮤니케이터?? 그게 뭐에요?<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1#%ED%85%8C%ED%81%AC%EB%8B%88%EC%BB%AC-%EC%BB%A4%EB%AE%A4%EB%8B%88%EC%BC%80%EC%9D%B4%ED%84%B0-%EA%B7%B8%EA%B2%8C-%EB%AD%90%EC%97%90%EC%9A%94" class="hash-link" aria-label="Direct link to 테크니컬??? 커뮤니케이터?? 그게 뭐에요?" title="Direct link to 테크니컬??? 커뮤니케이터?? 그게 뭐에요?" translate="no">​</a></h3>
<p>처음에는 저 스스로도 명확하게 대답하기 어려웠습니다.
'프런트엔드 개발자'만큼 명확하게 정의할 수 있는 직무도 아니었기 때문입니다.</p>
<p>저희 회사에는 '테크니컬 커뮤니케이터'라는 직무는 없는 직무였는데요.
제가 직무 전환을 희망하며 만들어낸 직무입니다.
직무명 후보로 '테크니컬 라이터, 문서 엔지니어, 테크 에반젤리스트' 등 다양한 명칭이 있었고, 회사와 상의하여 제가 정의한 일과 가장 밀접한 직무명을 골랐어요.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="회사에서-하는-일">회사에서 하는 일<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1#%ED%9A%8C%EC%82%AC%EC%97%90%EC%84%9C-%ED%95%98%EB%8A%94-%EC%9D%BC" class="hash-link" aria-label="Direct link to 회사에서 하는 일" title="Direct link to 회사에서 하는 일" translate="no">​</a></h3>
<p>테크니컬 커뮤니케이터는 <strong>문서를 매개로 기술과 사람을 이어줍니다.</strong></p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/townhall1-d62b61a343bd11b77e39fa38c4680411.png" alt="2024년 12월 타운홀 미팅에서 테크니컬 커뮤니케이터로서의 제 역할을 소개했습니다." width="600px" loading="lazy"><p class="description_jZe6">2024년 12월 타운홀 미팅에서 테크니컬 커뮤니케이터로서의 제 역할을 소개했습니다.</p></div>
<ol>
<li class="">외부向: 기술적인 이해도를 기반으로 비개발자, 비전문가도 이해할 수 있는 글 작성</li>
<li class="">내부向: 개발자 간 기술적 소통을 원활히 하기 위한 문서화</li>
</ol>
<p>3년 간 프런트엔드 개발자로 일하며 팀의 개발 문서 작성을 많이 해왔습니다.
개발자 시절부터 문서화와 정리의 중요성을 체감했고, 노션 정리를 취미처럼 하면서 테크니컬 라이터가 하는 일의 가치를 어렴풋이 느꼈어요.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/townhall2-a9c0ebfc1452c767fb9ed8400967d4da.png" alt="암묵지를 형식지로 끌어올리는 일, 즉 머릿속에만 있던 지식을 구조화해 공유하는 일입니다." width="600px" loading="lazy"><p class="description_jZe6">암묵지를 형식지로 끌어올리는 일, 즉 머릿속에만 있던 지식을 구조화해 공유하는 일입니다.</p></div>
<p>머리로만 알고 있던 지식을 글로 정리해두면, 공유할 수 있고, 결과적으로는 조직의 지식 수준을 높여줍니다.
구성원들이 쉽게 지식을 작성하고, 공유할 수 있는 환경을 만들어 주는 것이 테크니컬 라이터의 역할이라고 생각해요.
그리고 이제는, 그 일을 남는 시간에 취미처럼 하는 것이 아니라 메인 직무로 하고 있어요.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="꼭-직무-전환을-해야만-했을까">꼭 직무 전환을 해야만 했을까?<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1#%EA%BC%AD-%EC%A7%81%EB%AC%B4-%EC%A0%84%ED%99%98%EC%9D%84-%ED%95%B4%EC%95%BC%EB%A7%8C-%ED%96%88%EC%9D%84%EA%B9%8C" class="hash-link" aria-label="Direct link to 꼭 직무 전환을 해야만 했을까?" title="Direct link to 꼭 직무 전환을 해야만 했을까?" translate="no">​</a></h2>
<p>직무 전환은 결코 가볍게 내린 결정이 아니었습니다.</p>
<p>2024년 하반기 동안 커리어 방향성에 대해 깊이 고민했습니다.
팀 내 기술적 과제들이 더 이상 흥미롭지 않았고, 트렌드를 쫓는 일도 점점 버겁게 느껴졌어요.<br>
<!-- -->성장하려면 결국 좋아하는 일을 하기보다는 견딜 수 있는 일을 해야한다<sup><a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1#user-content-fn-1-9fdf32" id="user-content-fnref-1-9fdf32" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetHideOnScrollNavbar_vjPI">1</a></sup>는 말을 책에서 읽고, 생각했어요.
나는 무엇을 견딜 수 있을까?</p>
<p>동료 피드백을 기반으로 '내가 잘 하는 일'을, 지금까지 했던 일을 돌아보며 '내가 좋아하는 일'을 정리했습니다.
그리고 지금 '내가 할 수 있는 일'까지 조합하여 커리어의 방향성을 재 설정했습니다.
이 과정에서 리드와 대표님과도 충분히 상의했고, 그래서인지 주변에서는 “뭐 하는 일인지는 잘 모르겠지만, 왠지 잘할 것 같아!”라며 제게 근거없는 자신감을 심어주기도 했습니다. 😄</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="미래">미래<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1#%EB%AF%B8%EB%9E%98" class="hash-link" aria-label="Direct link to 미래" title="Direct link to 미래" translate="no">​</a></h3>
<p>새로운 도전에 응원해주신 분들도 많았지만, ‘개발을 그만두는 것’에 대해 걱정해주는 분들도 계셨습니다.<br>
<!-- -->AI 시대에 글쓰기가 쉽게 대체되는 일이 아니냐는 우려도 있었죠.</p>
<p>하지만 저는 테크니컬 커뮤니케이터라는 역할이 단순히 문서를 작성하는 것 이상이라고 생각합니다.<br>
<!-- -->개발 경험을 바탕으로 디지털 문서 환경을 설계하고 자동화하는 문서 엔지니어링, 비즈니스 이해를 바탕으로 맥락 있는 기술 커뮤니케이션을 설계하는 테크니컬 라이터의 일은 GPT가 쉽게 대체할 수 없는 영역입니다.</p>
<p>그리고 지금은, 개발자라고 해서 AI의 대체 걱정이 없는 시대도 아닙니다.<br>
<!-- -->결국 중요한 건 <strong>내가 이 자리에서 만들 수 있는 가치가 무엇인지</strong> 고민하며,<br>
<!-- -->저만의 방식으로 테크니컬 커뮤니케이터라는 직무를 구체화하고 성장시켜나가는 일이라고 생각합니다.</p>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI sr-only" id="footnote-label">Footnotes<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetHideOnScrollNavbar_vjPI" id="user-content-fn-1-9fdf32">
<p>결국 문제를 뚫고 성장하는 사람(2025), 서현직 <a href="https://sewonkimm-github-io.vercel.app/en/blog/career/tw/1#user-content-fnref-1-9fdf32" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>커리어</category>
        </item>
        <item>
            <title><![CDATA[나는 왜 디버깅을 못할까?]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/debugging</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/debugging</guid>
            <pubDate>Mon, 10 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[인프콘2024 디버깅 마인드셋: 디버깅의 고통을 절반으로 줄이는 고수들의 행동패턴 따라하기를 보고 느낀 점을 정리한 글입니다.]]></description>
            <content:encoded><![CDATA[<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>인프콘2024 <a href="https://www.youtube.com/watch?si=S1LGRsD2L06ruKQ1&amp;v=KkkyYFziOG8&amp;feature=youtu.be" target="_blank" rel="noopener noreferrer" class="">디버깅 마인드셋: 디버깅의 고통을 절반으로 줄이는 고수들의 행동패턴 따라하기</a>를 보고 느낀 점을 정리한 글입니다.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1만-시간의-법칙은-틀렸다">1만 시간의 법칙은 틀렸다<a href="https://sewonkimm-github-io.vercel.app/en/blog/debugging#1%EB%A7%8C-%EC%8B%9C%EA%B0%84%EC%9D%98-%EB%B2%95%EC%B9%99%EC%9D%80-%ED%8B%80%EB%A0%B8%EB%8B%A4" class="hash-link" aria-label="Direct link to 1만 시간의 법칙은 틀렸다" title="Direct link to 1만 시간의 법칙은 틀렸다" translate="no">​</a></h2>
<blockquote>
<p>1만 시간의 법칙; 어떤 분야의 전문가가 되기 위해서는 1만 시간의 훈련이 필요하다는 법칙</p>
</blockquote>
<p>1만 시간을 꾸준히 투자하면 누구라도 특정 분야의 전문가가 될 수 있다는 이야기를 학생때부터 자주 들어왔다.
그러나 이 법칙은 틀렸다.
1만 시간을 주구장창 한다고 전문가 수준에 오를 수는 없다.
핵심은 '1만 시간'이 아니라 '<strong>훈련</strong>'에 있기 때문이다.
의도적인 행동과 피드백을 통해 개선을 반복하는 것을 꾸준히 해야 전문가가 된다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="프로페셔널-프로그래머가-되려면">프로페셔널 프로그래머가 되려면?<a href="https://sewonkimm-github-io.vercel.app/en/blog/debugging#%ED%94%84%EB%A1%9C%ED%8E%98%EC%85%94%EB%84%90-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EA%B0%80-%EB%90%98%EB%A0%A4%EB%A9%B4" class="hash-link" aria-label="Direct link to 프로페셔널 프로그래머가 되려면?" title="Direct link to 프로페셔널 프로그래머가 되려면?" translate="no">​</a></h2>
<p>코드 작성을 잘한다고, 특정 기술을 잘 안다고해서 전문가가 되는 것은 아니다.
개발자는 <strong>소프트웨어를 만들어 고객에게 제공하는 사람</strong>이고, 소프트웨어 제작뿐만 아니라 운영까지 잘 해야한다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="디버깅을-잘-해야-프로">디버깅을 잘 해야 프로!<a href="https://sewonkimm-github-io.vercel.app/en/blog/debugging#%EB%94%94%EB%B2%84%EA%B9%85%EC%9D%84-%EC%9E%98-%ED%95%B4%EC%95%BC-%ED%94%84%EB%A1%9C" class="hash-link" aria-label="Direct link to 디버깅을 잘 해야 프로!" title="Direct link to 디버깅을 잘 해야 프로!" translate="no">​</a></h3>
<p>소프트웨어 운영의 큰 부분 중 하나는 '디버깅'이라고 생각한다.
버그가 리포트되면, 빠르게 문제를 파악하고 해결해야 한다.
그러나 나는 디버깅을 잘 못한다.
에러 문의가 들어오면 긴장감에 심장이 두근두근 거리고, 허둥지둥 헤매기 일쑤였다.
나에게 있어서 전문가로 거듭나기 위해서 넘어야 할 큰 산은 디버깅이었다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="디버깅-마인드셋">디버깅 마인드셋<a href="https://sewonkimm-github-io.vercel.app/en/blog/debugging#%EB%94%94%EB%B2%84%EA%B9%85-%EB%A7%88%EC%9D%B8%EB%93%9C%EC%85%8B" class="hash-link" aria-label="Direct link to 디버깅 마인드셋" title="Direct link to 디버깅 마인드셋" translate="no">​</a></h3>
<p>인프콘 강연의 핵심은 다음과 같다.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">디버깅 실력을 향상시키기 위해서는 </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">무작정 코드에 뛰어들 것이 아니라(시간을 투자하는 것이 아니라) </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">키보드에서 손을 떼고 생각해보는 시간(의도적인 훈련)이 필요하다. </span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="그렇다면-나는-왜-디버깅을-못할까">그렇다면 나는 왜 디버깅을 못할까?<a href="https://sewonkimm-github-io.vercel.app/en/blog/debugging#%EA%B7%B8%EB%A0%87%EB%8B%A4%EB%A9%B4-%EB%82%98%EB%8A%94-%EC%99%9C-%EB%94%94%EB%B2%84%EA%B9%85%EC%9D%84-%EB%AA%BB%ED%95%A0%EA%B9%8C" class="hash-link" aria-label="Direct link to 그렇다면 나는 왜 디버깅을 못할까?" title="Direct link to 그렇다면 나는 왜 디버깅을 못할까?" translate="no">​</a></h2>
<p>강의를 듣다보니 내가 디버깅 마인드셋이 없었다는 사실을 깨달았다.
디버깅을 잘 못하는 이유는 다음과 같다.</p>
<ol>
<li class="">
<p>문제 정의를 하지 않는다.</p>
<p>일단 해당 문제가 발생한 코드로 가서 무작정 console.log를 찍어가며 문제를 파악할 때가 많았다.</p>
</li>
<li class="">
<p>코드를 수정하면서 문제를 파악한다.</p>
<p>코드를 직접 수정하면서 문제를 구체화하는데 운이 좋으면 빨리 해결할 수 있었지만 운이 나쁘면 하루종일 고생하기도 했다.</p>
</li>
<li class="">
<p>디버깅 도구를 제대로 활용하지 않는다.</p>
<p>js에도 <a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/debugger" target="_blank" rel="noopener noreferrer" class="">debugger</a>가 있는데 절대 활용하지 않았다.</p>
</li>
</ol>
<p>알고리즘 문제를 풀 때에도 무조건 코드를 작성하려고 하지말고 생각을 먼저 해봐야한다.<br>
<!-- -->그런데 나는 알고리즘 문제를 풀 때에도, 디버깅을 할 때에도 침착하게 앉아서 상황을 살펴보고, 깊이 생각해보는 과정이 전혀 없었던 것 같다.
문제 정의가 없으니 정상 동작에 대한 정의도 매우 단편적이고, 때로는 그런 해결이 사이드이펙트를 유발하기도 했다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/fixingBugs-4c4909dd2258746f4a7eb1bc517629d1.gif" alt="디버깅 과정 시각화" loading="lazy"><p class="description_jZe6">디버깅 과정 시각화</p></div>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="디버깅-고수-따라잡기">디버깅 고수 따라잡기<a href="https://sewonkimm-github-io.vercel.app/en/blog/debugging#%EB%94%94%EB%B2%84%EA%B9%85-%EA%B3%A0%EC%88%98-%EB%94%B0%EB%9D%BC%EC%9E%A1%EA%B8%B0" class="hash-link" aria-label="Direct link to 디버깅 고수 따라잡기" title="Direct link to 디버깅 고수 따라잡기" translate="no">​</a></h2>
<!-- -->
<p>회사 동료들과 인프런 영상을 함께 보고 이야기를 나눴던 내용이다.
디버깅을 잘한다고 생각했던 분은 대략 위의 과정을 거치셨고, 그 중에서도 '사이드이펙트 조사'가 정말 중요하다고 말씀해주셨다.
처음 발견했던 단편적인 문제가 해결되었다고 끝이 아닌 것이다.
특히, 이 과정에 대해 <strong>회귀 테스트</strong>를 작성해놓으면 큰 도움이 되는 것 같다.</p>
<p>이 일련의 과정을 실천하기 위해서 디버깅 노트 템플릿을 만들어보았다.
&lt; src=<!-- -->/en/assets/images/note1-16c15cc6c38469e7049bf2cc2b4b26f2.jpg<!-- --> description="디버깅 노트 템플릿" /&gt;</p>
<p>먼저 목표 시간을 정하고, 주어진 시간동안 무엇을 할 건지 목표를 세운다.
그 다음 내 생각을 노트에 적고, 정해진 시간이 되면 짧은 회고를 작성한다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="할-수-있다-디버깅-yes-i-can">할 수 있다! 디버깅 YES I CAN!<a href="https://sewonkimm-github-io.vercel.app/en/blog/debugging#%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8B%A4-%EB%94%94%EB%B2%84%EA%B9%85-yes-i-can" class="hash-link" aria-label="Direct link to 할 수 있다! 디버깅 YES I CAN!" title="Direct link to 할 수 있다! 디버깅 YES I CAN!" translate="no">​</a></h2>
<p>실제로 이 노트 템플릿대로 디버깅을 해보았는데 생각보다 효과가 좋았다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/note2-2b86a9135c82edd488aa28577d76c4c1.jpg" alt="나의 첫 디버깅 노트" loading="lazy"><p class="description_jZe6">나의 첫 디버깅 노트</p></div>
<p>버그를 재현해보며 특이 동선을 발견했고, 그 동선에서 힌트를 얻어서 원인이 RTK Listener에서 업데이트 해주는 부분이라는 것을 발견했다.
평소 디버깅을 생각하면 머리가 깜깜해지고, 어느 순간 길을 잃는데 이 템플릿에 맞춰서 생각하니 그 과정들이 정리가되는 느낌이라 좋았다.</p>
<p>바로 훈련의 효과가 나타나는 건가...? 싶었다.
문제를 구체화 해보는 것에 대해서 긍정적인 경험이어서 앞으로도 이 템플릿을 활용해보려고 한다.
<del>다음 버그 드루와</del></p>
<p>노트 없이도 자연스럽게 디버깅 마인드 셋을 갖추는 그날까지...!</p>]]></content:encoded>
            <category>디버깅</category>
        </item>
        <item>
            <title><![CDATA[문서화, 하지 마세요.]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/standard</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/standard</guid>
            <pubDate>Sun, 16 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[저는 문서화를 중요하게 여기지만 사실 문서는 적으면 적을수록 좋다고 생각합니다.]]></description>
            <content:encoded><![CDATA[<p>저는 문서화를 중요하게 여기지만 사실 문서는 적으면 적을수록 좋다고 생각합니다.
코드를 최소한으로 작성해 효과적으로문제를 해결하는 것이 기술이듯 문서도 최소한으로 작성하면서 필요한 정보를 전달해야 합니다.</p>
<p>지난 3년간 회사의 FE팀 위키를 구축하고 유지보수하며 저만의 문서화 기준이 생겼는데요.
이 글에서는 문서화가 필요한 경우와 필요하지 않은 경우를 구분하는 기준을 제시하고, 실용적인 문서화를 통해 개발 효율성을 높이는 방법을 탐색해 보겠습니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="덮어놓고-쓰다-보면">덮어놓고 쓰다 보면...<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/standard#%EB%8D%AE%EC%96%B4%EB%86%93%EA%B3%A0-%EC%93%B0%EB%8B%A4-%EB%B3%B4%EB%A9%B4" class="hash-link" aria-label="Direct link to 덮어놓고 쓰다 보면..." title="Direct link to 덮어놓고 쓰다 보면..." translate="no">​</a></h2>
<p>회사에서는 크게 3가지 방식으로 문서화를 해왔습니다.</p>
<ol>
<li class="">코드 주석</li>
<li class="">Pull Request 설명</li>
<li class="">노션</li>
</ol>
<p>그중 노션은 시간과 정성을 들여 작성해야 하는 '공식적인 문서' 역할이었는데요.
코드 설계나 구성에 대한 설명, 리팩토링 과정, 에러 핸들링 기록, PoC 상세 내용 등을 기록했습니다.
그렇게 3년 정도 노션에 열심히 문서를 쌓아놓다 보니 몇몇 불편한 부분들이 느껴졌습니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="모든-게-중요해지면-결국-아무것도-중요하지-않게-된다">모든 게 중요해지면 결국 아무것도 중요하지 않게 된다<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/standard#%EB%AA%A8%EB%93%A0-%EA%B2%8C-%EC%A4%91%EC%9A%94%ED%95%B4%EC%A7%80%EB%A9%B4-%EA%B2%B0%EA%B5%AD-%EC%95%84%EB%AC%B4%EA%B2%83%EB%8F%84-%EC%A4%91%EC%9A%94%ED%95%98%EC%A7%80-%EC%95%8A%EA%B2%8C-%EB%90%9C%EB%8B%A4" class="hash-link" aria-label="Direct link to 모든 게 중요해지면 결국 아무것도 중요하지 않게 된다" title="Direct link to 모든 게 중요해지면 결국 아무것도 중요하지 않게 된다" translate="no">​</a></h3>
<p>문서가 쌓이면서 검색이 어려워지고, 최신 문서와 오래된 문서가 제대로 정리되지 않아 어떤 정보가 신뢰할 만한지 파악하기도 어려웠습니다.</p>
<p>코드는 계속 변경되는데 문서가 그 속도를 쫓아가지 못하면 그 문서는 더 이상 유용하지 않게 됩니다.
문서도 프로젝트 코드처럼 계속 관리해주어야 하는데 그러지 않으면 어느 순간 정리에 엄두가 안 날 정도로 문서가 쌓이게 되더라고요.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="영원히-끝나지-않는-문서">영원히 끝나지 않는 문서<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/standard#%EC%98%81%EC%9B%90%ED%9E%88-%EB%81%9D%EB%82%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EB%AC%B8%EC%84%9C" class="hash-link" aria-label="Direct link to 영원히 끝나지 않는 문서" title="Direct link to 영원히 끝나지 않는 문서" translate="no">​</a></h3>
<p>회사에서는 문서 작성에 할애할 시간이 부족하기도 합니다.
기능 구현할 것은 많고, 코드 리뷰도 해야 하고, 회의 준비도 해야 하고, 면접에도 들어가야 하고,... 문서 작성은 항상 우선순위가 낮아질 수밖에요.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/oldDocs-c806122b3d2e501e63021ee5a1d8f15b.png" alt="충격. 2년째 작성 중인 문서, 실존!" loading="lazy"><p class="description_jZe6">충격. 2년째 작성 중인 문서, 실존!</p></div>
<p>어떤 문서는 영원히 완성되지 않기도 합니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="어떤-기준으로-문서를-작성해야-할까">어떤 기준으로 문서를 작성해야 할까?<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/standard#%EC%96%B4%EB%96%A4-%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C-%EB%AC%B8%EC%84%9C%EB%A5%BC-%EC%9E%91%EC%84%B1%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C" class="hash-link" aria-label="Direct link to 어떤 기준으로 문서를 작성해야 할까?" title="Direct link to 어떤 기준으로 문서를 작성해야 할까?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="-문서화가-필요한-경우">📝 문서화가 필요한 경우<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/standard#-%EB%AC%B8%EC%84%9C%ED%99%94%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EA%B2%BD%EC%9A%B0" class="hash-link" aria-label="Direct link to 📝 문서화가 필요한 경우" title="Direct link to 📝 문서화가 필요한 경우" translate="no">​</a></h3>
<ol>
<li class="">코드와 관련 없는 정보 : 팀 소개나 회고, 회의록 등 코드와 직접적인 연관이 없는 문서는 노션이 적합합니다.</li>
<li class="">최신화가 필요 없는 정보 : 기술 소개 문서처럼 한 번 작성해 놓고 동료들과 공유해야 하는 경우, 문서를 작성해 두면 좋습니다.
기술 결정 사항(당시 기술을 선택한 이유, 장단점, 논의 사항) 같은 정보도 코드 주석에 구구절절 설명하기에는 길어지는 경향이 있기 때문에 github의 issue나 discussion 기능을 활용해 기록해 놓고 코드 주석에 url만 첨부하는 방식도 좋았습니다.</li>
<li class="">비정기적이지만 반복되는 업무 : 개발환경 세팅방법 같은 경우, 정기적으로 하는 업무는 아니지만 가끔씩 할 때 참고할 수 있는 문서가 있으면 좋습니다.</li>
<li class="">코드만으로 전달이 어려운 개념 : 도메인 지식이나 제품의 특성에 대한 설명, 까다롭게 구현된 코드의 비하인드 등 코드만으로 이해하기 어려운 정보는 문서화가 필요합니다.</li>
</ol>
<p>문서를 작성하기 전에 문서화가 필요한 정보인지 아닌지 파악이 어렵다면  <code>인수인계</code> 관점으로 생각해 보세요!</p>
<ul>
<li class="">
<p>신규 입사자가 들어왔을 때, 이 문서를 보고 업무를 진행할 수 있을까?</p>
</li>
<li class="">
<p>내가 팀에 없을 때 코드만 보고 다른 사람이 문맥을 파악할 수 있을까?</p>
</li>
<li class="">
<p>이 문서는 내가 아니어도 유지보수가 가능한가?</p>
</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="️-문서화가-필요하지-않은-경우">🗑️ 문서화가 필요하지 않은 경우<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/standard#%EF%B8%8F-%EB%AC%B8%EC%84%9C%ED%99%94%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EA%B2%BD%EC%9A%B0" class="hash-link" aria-label="Direct link to 🗑️ 문서화가 필요하지 않은 경우" title="Direct link to 🗑️ 문서화가 필요하지 않은 경우" translate="no">​</a></h3>
<ol>
<li class="">자주 바뀌는 정보 : 코드 구성, UI 세부사항 등에 대한 정보는 굳이 노션으로 작성할 필요가 없습니다.
코드가 변경될 때마다 문서도 함께 변경해 줄 것이 아니라면 작성하지 않거나, 가능한 코드와 가까운 곳(ex. 주석)에 정보를 기록하세요.
이런 정보에 대해 문서화가 필요하다면 자동화가 가능한지를 우선적으로 살펴보는 것이 좋습니다.
API 문서는 Swagger, ReDoc과 같은 도구를 활용해 자동 생성하면 코드 변경을 즉각적으로 반영할 수 있어 문서의 신뢰도를 높여줍니다.</li>
<li class="">자동화 도구를 활용할 수 있는 경우 : 컨벤션은 문서로 서술하는 것보다 Prettier, ESLint 같은 도구를 활용해 강제하는 것이 더 효과적입니다.
코드를 작성할 때마다 매번 컨벤션 문서를 참조하지 않아도 되고, 도구를 적용하면 휴먼 에러가 줄어들기 때문입니다.
규칙을 정할 때에도 자동화할 수 있는지 고려해 보세요.</li>
<li class="">코드로 전달할 수 있는 정보 : 함수명이나 변수명이 충분히 명시적이어서 코드만으로도 의도를 전달할 수 있다면 문서화하지 않습니다.</li>
</ol>
<p>사실 대부분의 문서는 필요 없다고 생각합니다.
유지보수를 제대로 하지 못해 잘못된 정보를 담고 있거나 애초에 완성되지 못한 문서는 있느니만 못하거든요.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="문서만큼은-미니멀리즘">문서만큼은 미니멀리즘!<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/standard#%EB%AC%B8%EC%84%9C%EB%A7%8C%ED%81%BC%EC%9D%80-%EB%AF%B8%EB%8B%88%EB%A9%80%EB%A6%AC%EC%A6%98" class="hash-link" aria-label="Direct link to 문서만큼은 미니멀리즘!" title="Direct link to 문서만큼은 미니멀리즘!" translate="no">​</a></h2>
<p>문서는 개발을 거들 뿐, 문서를 위한 문서를 만드는 것은 피해야합니다.</p>
<ul>
<li class="">필요없는 문서는 삭제하고</li>
<li class="">문서의 목적과 예상 독자를 생각하고</li>
<li class="">가능하면 코드 변경을 즉각 반영할 수 있도록 하고 (자동화 할 수 있다면 자동화)</li>
<li class="">정기적으로 유지보수 하고</li>
<li class="">가능하면 코드만으로 의도를 명확히 전달할 수 있도록 노력합시다.</li>
</ul>
<p>이제는 '문서화 언젠가는 꼭 해야하는데...'라는 부채감에서 벗어나 '필요한 문서만 최소한으로 유지'하는 방향으로 전환할 때입니다.
문서는 많을수록 좋은 것이 아니라, 필요한 만큼, 정확한 정보를 담고 있을 때 가치가 있습니다.</p>
<p>&nbsp;</p>]]></content:encoded>
            <category>문서화</category>
        </item>
        <item>
            <title><![CDATA[함께 자라기]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/book/growuptogether</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/book/growuptogether</guid>
            <pubDate>Sun, 02 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[경상도 사투리로 '어느 정도 높이까지 올라가는 거예요?'를 말하는 밈이 있다.]]></description>
            <content:encoded><![CDATA[<div class="root_P5tw"><img src="data:image/jpeg;base64,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" alt="" loading="lazy"></div>
<br>
<p>경상도 사투리로 '어느 정도 높이까지 올라가는 거예요?'를 말하는 밈이 있다.
난 <code>성장</code>에 대해 생각할 때 항상 이 밈을 떠올린다. 어느 정도 높이까지 올라가야 되는 걸까?
2024년은 성장 속도와 방향성에 대해서 고민이 많았던 한 해였는데 【함께 자라기】는 그런 고민이 있는 사람들에게 일종의 가이드가 되어 줄 수 있는 책인 것 같다.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><ul>
<li class="">경력이 많다고 해서 성장한 것이 아니며, 더 중요한 것은 학습하는 것</li>
<li class="">학습을 잘하는 방법은 의도적 수련과 사회적 활동</li>
<li class="">같이 학습해야 제대로 학습할 수 있다.</li>
</ul></div></div>
<p>책에서 말하고자 하는 큰 맥락은 위 세 문장이라고 생각한다.
전하고자 하는 메시지와 글의 순서나 구조가 너무 잘 짜여있어서 많은 문장들이 마음에 와닿았다.
책의 제목은 함께 &gt; 자라기이지만 목차 순서는 자라기 &gt; 함께 인 것도 다 설계된...!</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="코드만-잘-짜서는-안된다">코드만 잘 짜서는 안된다<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/growuptogether#%EC%BD%94%EB%93%9C%EB%A7%8C-%EC%9E%98-%EC%A7%9C%EC%84%9C%EB%8A%94-%EC%95%88%EB%90%9C%EB%8B%A4" class="hash-link" aria-label="Direct link to 코드만 잘 짜서는 안된다" title="Direct link to 코드만 잘 짜서는 안된다" translate="no">​</a></h2>
<p>책에 반복적으로 나오는 이야기가 있다.</p>
<blockquote>
<p>예전에는 소프트웨어 개발 전문성과 사회성은 별개로 치부되어 "프로그래밍 실력은 좋은데 의사소통 능력은 부족하다"든가 하는 이야기를 했다면, 이제는 프로그래밍을 잘한다는 정의 안에 의사소통 능력을 그 일부로 보게 된 겁니다.</p>
</blockquote>
<p>전통적으로 컴공, 개발자의 이미지는 GEEK 한 느낌이 있었던 것 같다. 검정 뿔테 안경에 거북목과 사회성 부족으로 사람보다 컴퓨터와의 대화가 더 편한 이미지...?
아직까지도 그런 편견이 박혀 있고, 종종 농담거리로 사용되는 걸 보면 기술적 성장과 사회성을 별개로 생각하는 사람이 아직도 많은 것 같다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/husband-7c89607b10cd27f3975c2feca210fa1e.jpg" alt="개발자 === 컴퓨터 ?" loading="lazy"><p class="description_jZe6">개발자 === 컴퓨터 ?</p></div>
<p>번역을 잘하려면 외국어뿐만 아니라 모국어도, 아니 모국어를 훨씬 더 잘해야 한다.
<strong>개발자는 사람과 컴퓨터 사이의 번역가인데 왜 컴퓨터처럼 커뮤니케이션하는 걸 자랑스럽게 여기는 걸까?</strong>
아보카도 있으면 (아보카도를) 6개 사 오라는 말을, 그 맥락을 이해하지 못하는 사람에게 성장을 기대할 수 있을까? 생각해 보니 왜 저자가 프로그래밍 능력에 의사소통을 포함했는지 이해가 되었다.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="알아서-착하자">알아서 착하자<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/growuptogether#%EC%95%8C%EC%95%84%EC%84%9C-%EC%B0%A9%ED%95%98%EC%9E%90" class="hash-link" aria-label="Direct link to 알아서 착하자" title="Direct link to 알아서 착하자" translate="no">​</a></h3>
<p>IT업계 특유의 독성 말투도 사회성 결여의 결과물이라고 생각한다.
"악의는 없다. 경제적으로 커뮤니케이션 하는 것일 뿐이다. 받아들이는 사람이 너무 감성적이라 그렇다. F인 사람들이랑은 협업하기 힘들다." 와 같은 변명이 지금까지는 통해왔던 것 같다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/smart-43e2cc23a1c9cd4ca81a5cda61c98d11.jpg" alt="지적 능력이 뛰어난 프로그래머들의 성과를 구분하는 것은 사회적 능력입니다." loading="lazy"><p class="description_jZe6">지적 능력이 뛰어난 프로그래머들의 성과를 구분하는 것은 사회적 능력입니다.</p></div>
<p>사회성도 프로그래머의 능력에 포함된다면 일잘러가 되기 위해서는 알아서 착해야 할 것이다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="때론-비논리적일-수도-있다">때론 비논리적일 수도 있다<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/growuptogether#%EB%95%8C%EB%A1%A0-%EB%B9%84%EB%85%BC%EB%A6%AC%EC%A0%81%EC%9D%BC-%EC%88%98%EB%8F%84-%EC%9E%88%EB%8B%A4" class="hash-link" aria-label="Direct link to 때론 비논리적일 수도 있다" title="Direct link to 때론 비논리적일 수도 있다" translate="no">​</a></h2>
<p>가장 와닿았던 문장은 남을 설득하기 위해 논리성과 객관성을 버리라는 것이었다. 나도 회사에서 협업을 하고, 종종 남을 설득해 보며 몸소 체험한 인사이트를 잘 정리된 문장으로 보니 굉장히 공감이 갔다.</p>
<blockquote>
<p>남을 설득하려면 논리성과 객관성에 대한 환상을 버려야 합니다. 그래야 현실적으로 설득이 가능합니다. 내가 설득하고 싶은 상대를 자주 만나서 신뢰를 쌓고, 그 사람이 무엇을 중요하게 여기는지, 어떤 설명 방식을 선호하는지 이해해야 합니다. 출발은 결국 내가 설득하려는 사람에게서 하는 것입니다. 자료에서 출발하는 것이 아닙니다.</p>
</blockquote>
<p>비단 개발자만이 아니라 다른 직종의 사람들도 하는 실수다. 어떤 방법론이 정말 훌륭하고, 도입만 하면 문제를 해결할 수 있는데 왜 사람들이 안 따라 줄까? 사람들이 너무 수동적이고 보수적이라서, 내가 자료를 더 그럴싸하게 만들지 못해서 그런 것이 아니다. 아직 듣는 사람의 마음이 열리지 않았고, 아직 그만큼의 신뢰를 쌓지 못했기 때문이다.</p>
<p>부부간의 문제, 부모 자녀 간의 문제를 다루는 예능 같은 걸 보면 서로 신뢰가 바닥인 상태에서는 전문가가 어떤 솔루션을 내려도 통하지 않는다. 가장 먼저 해야 할 건 상대방을 믿어주는 것이었다.</p>
<p>그래서 사회성을 키우는 과정(사람을 대하는 것)은 때론 비논리적이고, 불가해할 수 있다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="나는-공원의-나무-숲의-나무">나는 공원의 나무? 숲의 나무?<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/growuptogether#%EB%82%98%EB%8A%94-%EA%B3%B5%EC%9B%90%EC%9D%98-%EB%82%98%EB%AC%B4-%EC%88%B2%EC%9D%98-%EB%82%98%EB%AC%B4" class="hash-link" aria-label="Direct link to 나는 공원의 나무? 숲의 나무?" title="Direct link to 나는 공원의 나무? 숲의 나무?" translate="no">​</a></h2>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/trees-2fae1681a2f331a503c83c4c8d45fd7f.png" alt="" loading="lazy"></div>
<p>공원의 나무는 숲 속의 나무에 비해서 키가 작은 편이다. 우리 집 앞의 작은 공원의 나무보다 도쿄 신주쿠 쿄엔의 나무가 훨씬 크게 자라기도 하고, 관악산의 나무보다 유럽 숲 속의 나무가 크게 자란다.</p>
<p>어느 정도 높이까지↗︎ 자라는 것보다 더 중요한 건 내가 속한 환경이 마음에 드는지일 것 같다. 집 앞의 공원으로 만족할 수 도 있고, 아마존의 울창한 밀림정도 되야 만족할 수도 있다.
내가 어디서 자라고 싶은지 먼저 생각해보면 얼마나 자랄 수 있을지 가늠이 갈지도 모른다.
어디에서 누구와 함께 자라고 싶은가?</p>]]></content:encoded>
            <category>독후감</category>
            <category>애자일</category>
        </item>
        <item>
            <title><![CDATA[2024 year in review]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/review/2024</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/review/2024</guid>
            <pubDate>Sat, 04 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[2024 Lesson Learned]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2024-lesson-learned">2024 Lesson Learned<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/2024#2024-lesson-learned" class="hash-link" aria-label="Direct link to 2024 Lesson Learned" title="Direct link to 2024 Lesson Learned" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="신뢰는-말이-아니라-행동에서-나온다">신뢰는 말이 아니라 행동에서 나온다<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/2024#%EC%8B%A0%EB%A2%B0%EB%8A%94-%EB%A7%90%EC%9D%B4-%EC%95%84%EB%8B%88%EB%9D%BC-%ED%96%89%EB%8F%99%EC%97%90%EC%84%9C-%EB%82%98%EC%98%A8%EB%8B%A4" class="hash-link" aria-label="Direct link to 신뢰는 말이 아니라 행동에서 나온다" title="Direct link to 신뢰는 말이 아니라 행동에서 나온다" translate="no">​</a></h3>
<p><a class="" href="https://sewonkimm-github-io.vercel.app/en/blog/review/processTF">어느 날, 회사에서 서비스 개발을 멈추기로 했다</a>라는 글에서 한 번 정리했는데 올해 초, 애자일 업무 방식을 도입하기 위해 2개월 간 많은 분들과 치열하게 논의하는 시간을 가졌었다.
논의 할 때, 서로 반대되는 의견을 다룬 적이 많았는데 어떤 사람의 말은 신뢰할만했던 반면, 어떤 사람의 말은 전혀 신뢰하기 어려웠다.
평소 그 사람의 행동이 그 사람의 말에 힘을 실어준다는 것을 느낀 것이다.</p>
<p>말하는 것은 쉽고, 행동하는 것은 어렵다.
사람들이 내 말을 듣게 하려면 평소에 내 말을 직접 실천하는 사람이 되어야한다.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="규칙을-지키려면-시스템을-만들어야한다">규칙을 지키려면 시스템을 만들어야한다.<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/2024#%EA%B7%9C%EC%B9%99%EC%9D%84-%EC%A7%80%ED%82%A4%EB%A0%A4%EB%A9%B4-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%96%B4%EC%95%BC%ED%95%9C%EB%8B%A4" class="hash-link" aria-label="Direct link to 규칙을 지키려면 시스템을 만들어야한다." title="Direct link to 규칙을 지키려면 시스템을 만들어야한다." translate="no">​</a></h3>
<p>올해 4분기에는 프런트엔드 채용 면접에 참여하면서 다양한 개발자들을 만났다.
가지각색의 개성이 있는 분들이었는데 개중에는 '문서화'를 중요하게 생각하는 분들도 있었다.
팀으로 프로젝트를 진행할 때, 본인이 좀 더 시간을 투자해서 꼼꼼하게 주석을 달거나 문서화를 한다는 분이 계셨는데 그 얘기를 들으며 지속가능성이 떨어진다는 생각이 들었다.</p>
<p>나도 입사 초반에는 주석도 달고, 노션에도 남기고, 엑셀에도 기록하는 등 문서화에 신경을 썼었지만 입사 후 3년이 지나 되돌아보니 최신화되지 않은 문서가 너무나 많았다.
코드를 작성하는 속도가 문서화 속도보다 빠르고, 모든 구성원이 문서화'만' 담당하는 것이 아니기 때문에 필연적으로 그렇게 될 수 밖에 없는 것 같다.</p>
<p>코드를 작성하면 문서를 꼭 작성하자는 규칙은 쉽게 지키기 어렵다.
그래서 노션으로 줄줄 설명하는 문서보다는 테스트 코드를 작성해 테스트 케이스에 명세를 기술하고, 테스트를 통해 코드와 문서간의 간극을 줄이는 시스템을 도입했다.</p>
<p>가독성 있고, 일관된 코드 스타일을 유지하기 위해 prettier와 eslint를 사용하는 것처럼 문서와 코드 사이의 차이를 줄이기 위해서는 규칙을 정하는 게 아니라 자동화된 시스템을 만들어야한다.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="성장은-책임에서부터">성장은 책임에서부터<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/2024#%EC%84%B1%EC%9E%A5%EC%9D%80-%EC%B1%85%EC%9E%84%EC%97%90%EC%84%9C%EB%B6%80%ED%84%B0" class="hash-link" aria-label="Direct link to 성장은 책임에서부터" title="Direct link to 성장은 책임에서부터" translate="no">​</a></h3>
<blockquote>
<p>WITH GREAT POWER THERE MUST ALSO COME GREAT RESPONSIBILITY</p>
<p>큰 힘에는 큰 책임이 따른다</p>
</blockquote>
<p>상반기에 3년간 함께했던 백엔드 팀의 리드분이 퇴사하셨다.
나와 같은 나이고, 같은 회사에서 커리어를 시작하셨는데 어느 순간부터 엄청나게 성장하셔서 회사에서 중요한 역할을 하고 계셨기에 기억이 남는다.
그 분이 해주셨던 이야기 중 하나가 "어떤 일에 내가 책임지고 해결한다는 태도를 가져보세요"였다.
그 분도 리드 역할을 맡으면서 책임지는 태도를 장착하셨고, 죽이되든 밥이되든 내가 책임지고 해결한다는 마인드로 일하셨기 때문에 그만큼 단기간에 성장하셨던 것이다.
이 분 한 명만의 이야기가 아니다.
회사에서 만난 분들 중 '이 사람처럼 일하고 싶다. 이 사람 처럼 성장하고 싶다.'라는 생각이 드는 사람들은 다들 이렇게 일하고 계셨다.</p>
<p>성장은 무슨 강의를 듣고, 어떤 컨퍼런스에 가고, 얼마나 많은 책을 읽는지에서 오는 것이 아니라 책임지는 태도에서부터 시작하는 것 같다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="compile-2025">Compile 2025<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/2024#compile-2025" class="hash-link" aria-label="Direct link to Compile 2025" title="Direct link to Compile 2025" translate="no">​</a></h2>
<p>코드를 실행하기 전에 컴파일을 해야한다.
컴파일 과정에서 타입 체크도 하고, 에러를 잡아내기도 한다.
2025년을 'run' 하기 전에 컴파일 과정을 거쳐보자.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="type-check">Type Check<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/2024#type-check" class="hash-link" aria-label="Direct link to Type Check" title="Direct link to Type Check" translate="no">​</a></h3>
<blockquote>
<p>나의 성격과 가치관이 추구하는 목표와 잘 맞는지 점검</p>
</blockquote>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/myType-89d5c948dba694cdcb7cd58a370a6e03.png" alt="2022년 회사에서 발표한 자기소개 내용" loading="lazy"><p class="description_jZe6">2022년 회사에서 발표한 자기소개 내용</p></div>
<p>2022년 회사에서 발표한 자기소개 내용 중 한 페이지이다.
2024년 회사 송년회에서 '테크니컬 커뮤니케이터'로서 직무전환을 알리는 발표에서 '내가 잘 할 수 있고, 남들에게도 필요한 일'을 하고 싶어서 직무 전환을 결심했다고 이야기했었는데 그 이후 회사 동료분께 메세지를 하나 받았다.
"예나 지금이나 세원님께서 뉴로클에서 하고 싶은 일이 동일한 게 신기하다"며 앞으로도 응원한다는 내용의 따듯한 응원의 메세지를 보내주셨는데 나도 잊고 있던 발표자료라 놀랐다.</p>
<p>2024년 상반기까지 내가 하고 싶은 것과 잘 할 수 있는 것, 잘 해내야하는 것들이 잘 안맞아서 고민의 시간을 가졌는데 그게 아마 'type error' 표시였던 것 같다ㅋㅋ!
테크니컬 커뮤니케이터로 직무를 전환하며 큰 방향의 타입은 어느정도 맞추지 않았을까 싶다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="optimization">Optimization<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/2024#optimization" class="hash-link" aria-label="Direct link to Optimization" title="Direct link to Optimization" translate="no">​</a></h3>
<blockquote>
<p>개선하지 않아도 살 수는 있지만 개선하면 좋을 습관 점검</p>
</blockquote>
<p>올해 초, ⎡인생샷 뒤의 여자들⎦이라는 책을 읽고 인스타그램을 완전히 지웠다.
약 10년만에 인스타그램에서 자유로워진 것이다!</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/insta-f4aebba345770a0d79cf8117e1f97ed6.png" alt="" loading="lazy"></div>
<p>나의 집중력을 도둑맞지 않기 위한 결정이었는데, 아직도 개선해야할 집중력 도둑 습관들이 남아있어서 2025년에는 이런 습관들을 개선하고 싶다.</p>
<p>A라는 일을 하려고 브라우저를 켜면 눈에 B, C, D가 들어와서 링크를 타고 타고 웹의 세계에 부유하다 보면 어느 순간 A는 까맣게 잊혀진다.
불과 어제도 이런 순간을 겪었고, 앞으로 다른 분들과 접점이 많아질 예정이라 개선이 시급하다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="dependency-check">Dependency Check<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/2024#dependency-check" class="hash-link" aria-label="Direct link to Dependency Check" title="Direct link to Dependency Check" translate="no">​</a></h3>
<blockquote>
<p>삶에서 의존하고 있는 것, 불필요하게 의존하는 것 점검</p>
</blockquote>
<p>사용하지 않거나 기존 코드와 충돌하는 의존성 라이브러리는 제거해야한다.</p>
<p>더 이상 만나지 않거나 내 삶을 어지럽게 하는 사람들과의 관계도 한번쯤 점검해봐야한다.
그런 관계중에 나와 가장 많이 부딪치고, 나를 힘들게 하지만 떼어내기 힘든 관계는 바로 '가족'이다.
2024년에는 금전적으로 좀 해결해보려고 시도해봤으나 안 맞는 건 어쩔 수 없는 것 같다...
최대한 빨리 물리적으로 떨어지는 것을 목표로 해야겠다.</p>
<p>그리고 회사 동료들에게도 상당부분 의존하고 있는 것 같다.
24년에는 유독 제품팀 분들의 퇴사가 많았는데 특히 리드를 맡았던 분들이 떠날 때에는 나도 덩달아 흔들렸다.
나는 혼자서도 잘 하고 있다고 생각했었는데 알게 모르게 사람에게 의지하고 있었고, 그 분들의 퇴사를 계기로 주변 사람들에게 좀 더 감사하고 잘 하자는 마음을 먹었다.
사내에서 또 하나 목표하고 있는 게 있다면 나도 의존할만한 사람이 되는 것이다.
서로 의지하면서 위기에 더 단단해지는 팀, 회사를 만들고 싶다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="회고의-추상화">회고의 추상화<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/2024#%ED%9A%8C%EA%B3%A0%EC%9D%98-%EC%B6%94%EC%83%81%ED%99%94" class="hash-link" aria-label="Direct link to 회고의 추상화" title="Direct link to 회고의 추상화" translate="no">​</a></h2>
<p>2024년 회고는 이전과는 템플릿을 조금 달리해보았다.
사실 <a class="" href="https://sewonkimm-github-io.vercel.app/en/blog/review/2023">작년 회고</a>처럼 썼다가 다 갈아엎었다.<br>
<!-- -->회고란 결국 지난 1년을 통해서 유의미한 '인사이트'를 뽑아내야한다고 생각했기 때문이다.
올해는 사건 나열식 회고글이 아닌 깨달음과 그 깨달음에 영향을 준 사건들을 위주로 2024년을 추상화해보았다.</p>
<p>개발의 재미있는 점은 인생에 비유해도 찰떡같이 들어맞는다는 것.
프로그램을 만드는 방법을 배운 것이 아니라 인생을 살아가는 데 도움이 되는 멘탈 모델을 배운 것인지도 모른다.
직무는 전환하지만 개발을 놓지 않기를 바라며 2025년을 실행해본다.</p>]]></content:encoded>
            <category>회고</category>
        </item>
        <item>
            <title><![CDATA[리눅스 입문 with 우분투]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/book/linux</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/book/linux</guid>
            <pubDate>Sat, 21 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[얼마전 읽은 책 『코드와 살아가기』는 1978년부터 20년이 넘도록 소프트웨어 엔지니어 및 컨설턴트로 일한 엘런 울먼의 에세이이다.]]></description>
            <content:encoded><![CDATA[<p>얼마전 읽은 책 『코드와 살아가기』는 1978년부터 20년이 넘도록 소프트웨어 엔지니어 및 컨설턴트로 일한 엘런 울먼의 에세이이다.
책에는 작가가 컴퓨터에 기본으로 설치된 윈도우를 삭제하고, 리눅스를 설치하는 부분이 있다.
리눅스를 설치하며 윈도우 운영체제가 얼마나 사용자의 자유를 제한하고 있는지 느끼는 부분을 보며 그동안 컴공 필수 과목으로만 생각해왔던 '운영체제'에 대해서 다시 생각해보게 되었다.</p>
<p>나는 태어나서 처음 접한 운영체제가 윈도우였고, 거의 20년이 넘는 시간동안 컴퓨터에 대한 지식 없이 사용해오면서 <code>컴퓨터 === 윈도우</code>라고 생각해왔다.
그런데 소프트웨어 개발자로 일하게 되면서 고객사에서 윈도우, 맥 뿐만 아니라 다양한 환경에서 컴퓨터를 활용하는 것을 보면서 리눅스에 대해 관심을 갖게 되었다.
그러던 차에 길벗 출판사에서 글또 10기 멤버를 대상으로 책을 지원해주는 이벤트에 당첨되어 리눅스 입문서를 읽어보게 되었다.</p>
<p>&nbsp;</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="글또에서-책-읽기">글또에서 책 읽기<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/linux#%EA%B8%80%EB%98%90%EC%97%90%EC%84%9C-%EC%B1%85-%EC%9D%BD%EA%B8%B0" class="hash-link" aria-label="Direct link to 글또에서 책 읽기" title="Direct link to 글또에서 책 읽기" translate="no">​</a></h2>
<p>글또는 글쓰기 모임이지만 '책 읽기'와 궁합이 잘 맞는다고 생각한다.
읽는 것을 좋아하는 사람들이 보통 쓰는 것도 좋아하기 때문이다. (나 또한 읽는 것을 좋아하는 만큼 쓰는 것도 좋아한다.)</p>
<p>이번에는 글또 덕분에 550여 페이지에 달하는 두꺼운 책을 한달에 걸쳐 완독할 수 있었다.
'<strong>책읽었또</strong>'에서 매일 읽은 책을 인증하는 방식이 두꺼운 책을 꾸준히 읽을 수 있게 하는데 도움이 되었다.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>책읽었또란?</div><div class="admonitionContent_BuS1"><p>책읽는 습관이 몸에 배도록 하루도 빼먹지 않는 것을 목표로하는 독서 소모임<br>
매일 10장(20페이지)의 책을 읽고, 그 안에서 한 문장을 공유하는 방식으로 진행</p></div></div>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/bookclub-ef9e0f460a33c5d1c9eb0da311e1f210.png" alt="덕분에 즐겁게 읽을 수 있었다" loading="lazy"><p class="description_jZe6">덕분에 즐겁게 읽을 수 있었다</p></div>
<p>&nbsp;</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="리눅스와의-재회">리눅스와의 재회<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/linux#%EB%A6%AC%EB%88%85%EC%8A%A4%EC%99%80%EC%9D%98-%EC%9E%AC%ED%9A%8C" class="hash-link" aria-label="Direct link to 리눅스와의 재회" title="Direct link to 리눅스와의 재회" translate="no">​</a></h2>
<p>학부생 시절, 리눅스의 명령어를 달달외워 시험보는 과목이 있었다.
그땐 운영체제에 대한 이해 없이 시험을 위해 CLI 명령어를 외웠다보니, 리눅스에 대한 첫인상은 부정적이었다.
검정색 프롬프트에 대한 궁금증과 두려움을 갖고 있었기 때문에 공부를 미뤄왔는데 책 첫 페이지의 베타 학습단 후기를 보면서 용기를 얻을 수 있었다.</p>
<blockquote>
<p>단순하게 명령어를 외우고 리눅스 사용법을 익히는 책이 아니라, 운영체제에 대해 잘 모르는 사람도 운영체제를 이해하고 리눅스라는 새로운 운영체제를 배울 수 있도록 설명에 공을 들였습니다. - 베타 학습단 후기 중</p>
</blockquote>
<p>명령어를 전부 외우는 것이 목적이 아니라 리눅스를 매개로 운영체제에 대한 이해를 높이는데 좋겠다는 생각이 들었고, 실제로 책을 읽으면서도 컴퓨터에 대한 이해도가 높아지는 것을 느꼈다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/iphoneBook-64957146f08ea6b29ff745a64b31fe6a.png" alt="아이폰 북; 스콧 켈비, 테리화이트 저. 에이콘 출판. 2009" loading="lazy"><p class="description_jZe6">아이폰 북; 스콧 켈비, 테리화이트 저. 에이콘 출판. 2009</p></div>
<p>마치 스마트폰을 처음 사용하시는 노인 분들이 스마트폰 사용법을 책으로 배우는 느낌이 들었는데, 명령어 입력 방법/파일 여는 방법/파일 삭제 방법 등 기본적인 컴퓨터 사용법을 다시 배우는 것 같았다.
새로운 문물이 아닌 몇 십년 전 과거의 컴퓨터 사용법을 배우고 있다니...</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/naruto-e61459635e2fade375c8a65d0e3a5b93.gif" alt="좋아! 이걸로 편하게 움직일 수 있겠어!" loading="lazy"><p class="description_jZe6">좋아! 이걸로 편하게 움직일 수 있겠어!</p></div>
<p>나루토의 록리가 수련을 위해서 일부러 무거운 모래주머니를 차고 있었던 것처럼, 나도 컴퓨터를 더 잘 다루기 위해 마우스 사용을 제한하는 기분이 들기도 했다.</p>
<p>&nbsp;</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="책의-구성">책의 구성<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/linux#%EC%B1%85%EC%9D%98-%EA%B5%AC%EC%84%B1" class="hash-link" aria-label="Direct link to 책의 구성" title="Direct link to �책의 구성" translate="no">​</a></h2>
<p>일단 책은 2개의 파트로 나뉘어져 있다. 파트 1에서는 리눅스에 대한 이해를, 그리고 파트 2에서는 리눅스를 활용하는 법을 상세히 다루는데 단순히 명령어를 달달 외우는 식으로 배웠던 대학 수업과 비교했을 때 나에게 훨씬 잘 맞는 구성이었던 것 같다.</p>
<p>일단 목차만 봐도 책이 다루는 내용이 대략 어떤 것인지 파악할 수 있어서 너무 좋았고, 흐름이 명확해서 많은 양에 압도당하지 않고 읽어낼 수 있었다고 생각한다.</p>
<p>그리고 단순 명령어 설명도 지루하게 풀어내는 것이 아니라 설명이 매우 잘 쓰여있어서 읽으면서 감탄했던 기억이 있다.
대학생 때, 이런 책이 있었다면 수업이 좀 더 즐거웠을지도 모르겠다.</p>
<p>&nbsp;</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="sudo-가-이런-역할이었구나">sudo 가 이런 역할이었구나?!<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/linux#sudo-%EA%B0%80-%EC%9D%B4%EB%9F%B0-%EC%97%AD%ED%95%A0%EC%9D%B4%EC%97%88%EA%B5%AC%EB%82%98" class="hash-link" aria-label="Direct link to sudo 가 이런 역할이었구나?!" title="Direct link to sudo 가 이런 역할이었구나?!" translate="no">​</a></h2>
<p>개발 환경을 구성하거나 할 때, 생각없이 복사했던 명령어들이 이제는 무슨 역할을 하는지 알게 되었다.
<code>apt</code> 명령어는 <del>아파트가 아니라</del> 'Advanced Packaging Tool'의 약자로, 리눅스 배포판의 패키지 관리 시스템이고, curl과 같은 패키지를 다운로드 받을 수 있게 한다.</p>
<p><code>sudo</code> 명령어는 'super user do'의 줄임말로, 일반 사용자가 root 권한을 가진 사용자로 명령을 실행할 수 있게 해주는 명령어인데 작업하다가 뭐 문제가 생겨서 검색해보면 항상 sudo 명령을 사용한 명령어를 쳤던 기억이 난다.
이게 어떤 의미인지 제대로 몰랐는데, 리눅스의 파일 시스템과 유저 시스템, 사용자 권한 시스템을 이해하니 어떤 명령어인지 확 와닿아서 좋았다.
<code>sudo</code>외에도 root 사용자 권한을 주는 방법으로 <code>su</code> 명령어와 <code>runuser</code> 명령어도 있다는 것을 알게 되었다.</p>
<p>명령어의 나열 형식으로 되어있었다면 금방 지루해졌을텐데 이 명령어들을 사용한 예제가 함께 있어서 끝까지 흥미를 잃지 않고 읽을 수 있었고, 이해에도 도움이 되었다.
그리고 각 장의 마지막에는 '요약'과 '연습문제'가 있어서 읽은 내용을 다시 한번 정리하고 복습한 것도 좋았다.
한 장에 적혀있는 수 많은 정보중에서 내가 꼭 기억해야할 중요한 정보들이 무엇인지 요약해서 알려주는 것 같아서 나중에 복습할 땐 이 요약과 연습문제만 훑어보면 될 것 같다!</p>
<p>&nbsp;</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="이러다-코딩-천재">이러다 코딩 천재...?<a href="https://sewonkimm-github-io.vercel.app/en/blog/book/linux#%EC%9D%B4%EB%9F%AC%EB%8B%A4-%EC%BD%94%EB%94%A9-%EC%B2%9C%EC%9E%AC" class="hash-link" aria-label="Direct link to 이러다 코딩 천재...?" title="Direct link to 이러다 코딩 천재...?" translate="no">​</a></h2>
<div style="display:flex;flex-direction:row;justify-content:flex-start;gap:16px"><div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/genius-eae7e468d7c60e955fcb43fe4e2606aa.png" alt="" width="200" loading="lazy"></div><div><p>처음엔 두려움 반, 궁금증 반으로 읽기 시작했던 책인데 책을 덮을 때쯤에는 표지의 이미지처럼 '이러다 코딩 천재...?'하는 욕심도 슬쩍 생겼다.
누가 그렸는지는 몰라도 진짜 잘 그린 것 같다ㅋㅋㅋ!</p><p>중간에 Bash 명령어가 나오는 부분에서는 'Bash 문법도 JS만큼이나 근본없구나... 이걸 누가쓰지..?' 싶은 생각이 들었는데 이제 리눅스에 대한 두려움은 다 떨쳐버렸으니 명령어도 직접 쳐보고 실전에 적용해보면서 익히는 시간을 가지면 좋을 것 같다.</p></div></div>]]></content:encoded>
            <category>독후감</category>
        </item>
        <item>
            <title><![CDATA[첫 PR 그날 밤]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/first</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/first</guid>
            <pubDate>Thu, 14 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[아이유의 노래 '첫 이별 그날 밤'을 듣다가 '처음'에 대해 생각하게 되었습니다.]]></description>
            <content:encoded><![CDATA[<p>아이유의 노래 '첫 이별 그날 밤'을 듣다가 '처음'에 대해 생각하게 되었습니다.
입사 후 저의 첫 커밋, 첫 PR(Pull Request)이 생각났어요.
처음 PR을 작성하고, approve를 받아 메인 코드 베이스에 머지했던 그날은 드디어 사회에서 1인분을 하는 사람이 되어간다는 기분에 설레는 마음이 가득했던 것 같습니다.</p>
<p>입사 후 첫 3주동안에는 회사 제품을 사용해보고, 제품 코드를 리딩하는 업무를 진행했습니다.
약 3년정도 진행중인 프로젝트여서 코드 베이스가 크고 복잡했는데요.
가장 먼저 눈에 들어온 부분은 코드 컨벤션이었습니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="오잉-컨벤션의-상태가">...오잉?! 컨벤션의 상태가...!<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/first#%EC%98%A4%EC%9E%89-%EC%BB%A8%EB%B2%A4%EC%85%98%EC%9D%98-%EC%83%81%ED%83%9C%EA%B0%80" class="hash-link" aria-label="Direct link to ...오잉?! 컨벤션의 상태가...!" title="Direct link to ...오잉?! 컨벤션의 상태가...!" translate="no">​</a></h2>
<p>가장 처음 작업했던 것은 커밋 메시지를 자동화하고, PR 템플릿을 만든 일이었습니다.
프로젝트를 빠르게 개발하는 것이 가장 중요했던 시기라서 제가 입사하기 전에는 문서화 작업이 많이 부족했는데요.
코드 리뷰를 구두로 진행하고, PR에 관련 작업에 대한 설명이 대부분 없었습니다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/pr1-daf5416577eaaf10a242154a6658026a.jpg" alt="예를들면 이런식..." loading="lazy"><p class="description_jZe6">예를들면 이런식...</p></div>
<p>약 2,000 라인이 넘는 changes임에도 불구하고, PR에 아무런 설명이 없었어요.
3년간의 히스토리를 아무런 기록 없이 넘겨받으려니 엄청 막막했습니다.
그래서 PR에 대한 템플릿을 만들어 최소한으로 남겨놓아야할 정보들을 기록할 수 있도록 만들었어요.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/pr2-f0bb88f631b2951ad97c735dd1a49f49.jpg" alt="역사적인 첫 PR🥳" loading="lazy"><p class="description_jZe6">역사적인 첫 PR🥳</p></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="pr-template">PR template<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/first#pr-template" class="hash-link" aria-label="Direct link to PR template" title="Direct link to PR template" translate="no">​</a></h3>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 작업내역</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 작업내역을 작성해주세요. --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 이슈</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 이슈 사항을 작성해주세요. --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 고민</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 코드리뷰 시 같이 고민해 봐야 할 사항을 작성해주세요. --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">🎯</span><span class="token url" style="color:#36acaa">[</span><span class="token url content" style="color:#36acaa">Jira</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">https://</span><span class="token url" style="color:#36acaa">)</span><br></div></code></pre></div></div>
<p>제가 처음 약식으로 작성한 템플릿인데요.
이 템플릿은 신규 입사자분들이 들어오실 때마다 수정을 거쳐 지금의 형태를 갖추게되었습니다.
약 3년동안 PR템플릿도 이렇게나 발전했네요!</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- PR 컨벤션 https://www.notion.so/ --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> Info</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 관련 문서 : []()</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Jira Ticket : </span><span class="token url" style="color:#36acaa">[</span><span class="token url content" style="color:#36acaa">NRT-</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">https://</span><span class="token url" style="color:#36acaa">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 필수 리뷰어 : @</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> BE branch : master</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> Changes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 변경 타입</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- PR이 어떤 유형의 작업인지 작성자/리뷰어가 한 눈에 파악할 수 있도록 타입을 선택해주세요. --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 복수 선택도 가능하지만 PR 크기가 충분히 작지 않다는 의미일 수 있습니다. 한 번 더 검토해주세요! --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 버그 수정</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 기능 추가</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 리팩토링</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 개발 환경 설정</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 문서 업데이트</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 테스트 코드 추가</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 기타 (아래에 설명해주세요)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">기타 설명:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> 주요 변경 사항</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 새로 추가된 기능, 수정된 버그, 리팩토링 내용 등 변경 사항을 작성해주세요. --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 스크린샷(optional)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 작업 전후 비교 등의 스크린샷이 있으면 변경사항을 파악하기 수월해집니다. --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 이미지를 Drag &amp; Drop 하면 추가됩니다. --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 체크포인트</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 해당 PR에서 중점적으로 봐주셨으면 하는 것들을 작성해주세요. --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 이 PR이 영향을 미치는 다른 부분이나 기능이 있다면 명시해주세요. --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> PR Checklist</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 1. 내 컴퓨터 환경에서 잘 동작함.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 2. 브라우저 개발자 도구의 console.log 에러를 확인함.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 3. 코드 내의 불필요한 eslint disabled 처리가 없음.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 4. 코드 내의 오타가 없음.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 5. 새로운 기능에 대한 단위 테스트를 작성하고 실행함.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 올린 PR은 제일 먼저 스스로 확인해보고 셀프 리뷰를 남겨보세요. --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Label 지정 부탁드립니다~! --&gt;</span><br></div></code></pre></div></div>
<p>우선, 해당 룰을 세팅하게 된 논의 과정을 기록해 놓은 노션 문서를 주석에 링크하여 논의에 참석하지 않은 분들도 히스토리를 파악할 수 있게 해놓았습니다.
PR을 되도록이면 작은 크기로 가져가자는 의미에서 하나의 PR에는 하나의 변경사항만 담겨있는지 인지하기 위한 체크박스를 추가했어요.
그리고 PR을 오픈하기 전에 체크리스트의 항목들을 확인해서 혹여나 놓치는 부분이 없도록 해두었어요.
코드 리뷰 문화를 정착시키기 위해서 코드 리뷰에 들어가는 오버헤드를 줄여야 했고, 최대한 리뷰어를 배려하는 형태로 발전되었습니다.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>PR template 적용 가이드</div><div class="admonitionContent_BuS1"><p>이 글에는 PR template을 적용한 상세한 방법은 기술하지 않았습니다.
<a href="https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository" target="_blank" rel="noopener noreferrer" class="">PR template</a> 항목을 참고하세요!</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="commitizen">commitizen<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/first#commitizen" class="hash-link" aria-label="Direct link to commitizen" title="Direct link to commitizen" translate="no">​</a></h3>
<p>제가 입사하면서 팀의 컨벤션을 하나하나 다시 세팅하기 시작했는데요.
컨벤션의 핵심은 <strong>자동화</strong>라는 것을 이때 처음 깨달았던 것 같습니다.
열심히 논의해서 10개의 컨벤션을 정했는데, 자동화가 되지 않으면 이걸 다 기억하기도 힘들고 매번 지적하고 고치는 작업도 쉬운 일이 아니었어요.</p>
<p>그래서 커밋할 때에는 컨벤션 도입의 비용을 줄이고, 통일성을 맞추기 위해 자동화 라이브러리 <a href="https://github.com/commitizen/cz-cli" target="_blank" rel="noopener noreferrer" class="">commitizen</a>을 활용했습니다.
commitizen을 글로벌로 설치하여 사용할 수도 있지만, 프로젝트에 설치하여 저희만의 커밋 컨벤션을 적용했어요.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> custom </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"@digitalroute/cz-conventional-changelog-for-jira/configurable"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">custom</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">jiraMode</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">maxHeaderWidth</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">maxLineWidth</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">jiraPrefix</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NRT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">skipScope</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">types</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">feat</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">description</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"로직 추가, 변경, 삭제 등의 기능 작업"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">title</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"feat"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">refact</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">description</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"동작은 동일하나 내부 로직이 변경된 리팩토링"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">title</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"refact"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">bugfix</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">description</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"의도된 동작과 다르게 구현된 버그 수정"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">title</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"bugfix"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">typo</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">description</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"오타 수정, 번역, 주석 추가 등 로직과는 무관한 타이핑 작업"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">title</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"typo"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">style</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">description</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"로직이 아닌 스타일 변경"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">title</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"style"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">test</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">description</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"테스트코드 작성"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">title</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"test"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">chore</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">description</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"그 외 작업"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">title</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"chore"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>title과 그에따른 description을 설정하여 feat과 refact의 차이를 일일이 기억할 필요가 없도록 했고, jiraMode를 true로 설정하여 JIRA 이슈와 연동할 때 대소문자에 신경 쓰지 않도록 했습니다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/commitizen-0551de29c76754cb801bcb0402855c4f.png" alt="실제 사용 예시" loading="lazy"><p class="description_jZe6">실제 사용 예시</p></div>
<p>커밋 명령어를 작성하면 위와 같이 커스터마이징한 커밋 메세지를 볼 수 있습니다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="좋은-개발-문화를-위한-1보">좋은 개발 문화를 위한 1보👣<a href="https://sewonkimm-github-io.vercel.app/en/blog/docs/documentation/first#%EC%A2%8B%EC%9D%80-%EA%B0%9C%EB%B0%9C-%EB%AC%B8%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-1%EB%B3%B4" class="hash-link" aria-label="Direct link to 좋은 개발 문화를 위한 1보👣" title="Direct link to 좋은 개발 문화를 위한 1보👣" translate="no">​</a></h2>
<p>문서화의 중요성을 가장 크게 느끼는 지점은 프로젝트에 새로 합류한 팀원이 있을 때가 아닌가 싶은데요.
제가 당시 신규 입사자의 입장이어서 더 크게 느꼈던 것 같습니다.</p>
<p>돌아보니 좋은 개발 문화에 타인을 배려한 이런 작업들도 중요한 부분이라는 생각이 드네요.
제가 생각하는 좋은 개발 문화를 주도적으로 도입한 경험은 지금도 회사에서 일할 때 좋은 영향을 미치는 것 같습니다.</p>
<p>노래를 듣다가 별안간 문서화의 중요성을 상기하게 되네요.</p>
<blockquote>
<p>수고했어 PR~ 고생했지 나의 PR~ 🎶</p>
</blockquote>]]></content:encoded>
            <category>문서화</category>
            <category>자동화</category>
        </item>
        <item>
            <title><![CDATA[스타일링 방식을 알아보자]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling</guid>
            <pubDate>Mon, 04 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[CSS는 HTML 문서의 요소들을 꾸미는 역할을 합니다.]]></description>
            <content:encoded><![CDATA[<p>CSS는 HTML 문서의 요소들을 꾸미는 역할을 합니다.
처음 CSS를 배우고 나서는 도전적인 과제가 주어지거나, 인터렉티브한 과제가 주어지지 않는 이상 초반에 배웠던 CSS를 그대로 사용하게 되는데요.
저도 취업 이후에는 따로 CSS를 공부하지 않았던 것 같습니다.
최근 zero-runtime CSS-in-JS 키워드를 접하게 되면서 어떤 스타일링 방식이 있는지 다시 한 번 정리해보고자 합니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="css의-작동방식">CSS의 작동방식<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#css%EC%9D%98-%EC%9E%91%EB%8F%99%EB%B0%A9%EC%8B%9D" class="hash-link" aria-label="Direct link to CSS의 작동방식" title="Direct link to CSS의 작동방식" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><a href="https://developer.mozilla.org/ko/docs/Learn/CSS/First_steps/How_CSS_works" target="_blank" rel="noopener noreferrer" class="">CSS 작동방식</a> MDN</p></div></div>
<!-- -->
<p>CSS는 주로 inline, internal, external 세 가지 방식으로 작성할 수 있습니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="inline-css">inline CSS<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#inline-css" class="hash-link" aria-label="Direct link to inline CSS" title="Direct link to inline CSS" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag" style="color:#00009f"> </span><span class="token tag special-attr attr-name" style="color:#00a4db">style</span><span class="token tag special-attr attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag special-attr attr-value punctuation" style="color:#393A34">"</span><span class="token tag special-attr attr-value value css language-css property" style="color:#36acaa">color</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">:</span><span class="token tag special-attr attr-value value css language-css" style="color:#e3116c"> </span><span class="token tag special-attr attr-value value css language-css color" style="color:#e3116c">blue</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">;</span><span class="token tag special-attr attr-value value css language-css" style="color:#e3116c"> </span><span class="token tag special-attr attr-value value css language-css property" style="color:#36acaa">font-size</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">:</span><span class="token tag special-attr attr-value value css language-css" style="color:#e3116c"> </span><span class="token tag special-attr attr-value value css language-css number" style="color:#36acaa">16</span><span class="token tag special-attr attr-value value css language-css unit" style="color:#e3116c">px</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">;</span><span class="token tag special-attr attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">이 문장은 파란색과 16px 크기입니다.</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>태그의 style 속성에 직접 CSS를 작성하는 방식입니다.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="장점">장점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EC%9E%A5%EC%A0%90" class="hash-link" aria-label="Direct link to 장점" title="Direct link to 장점" translate="no">​</a></h4>
<ul>
<li class="">간단한 적용</li>
<li class="">별도의 CSS 파일이 필요 없음: CSS 파일을 추가로 로드할 필요가 없어서, 네트워크 요청을 줄여 초기 로딩 시간을 약간 단축할 수도 있습니다.</li>
<li class="">특정 요소에 스타일 우선순위 제공: 인라인 스타일은 CSS 규칙 중에서 최우선으로 적용됩니다. 외부 스타일시트에서 스타일이 덮어씌워지는 문제를 방지할 수 있습니다.</li>
</ul>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="단점">단점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EB%8B%A8%EC%A0%90" class="hash-link" aria-label="Direct link to 단점" title="Direct link to 단점" translate="no">​</a></h4>
<ul>
<li class="">재사용성이 떨어짐</li>
<li class="">유지보수가 어려움: 스타일을 한 곳에서 관리하기 어려워 일회성으로 사용되는 경우가 아니라면 권장하지 않습니다.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="internal-css">internal CSS<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#internal-css" class="hash-link" aria-label="Direct link to internal CSS" title="Direct link to internal CSS" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css selector" style="color:#00009f">p</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css property" style="color:#36acaa">color</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css color">green</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css property" style="color:#36acaa">font-size</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">18</span><span class="token style language-css unit">px</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token style language-css">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">body</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">이 문장은 녹색과 18px 크기입니다.</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">body</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>HTML 문서 내부에 <code>&lt;style&gt;</code> 태그를 사용하여 CSS를 작성하는 방식입니다.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="장점-1">장점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EC%9E%A5%EC%A0%90-1" class="hash-link" aria-label="Direct link to 장점" title="Direct link to 장점" translate="no">​</a></h4>
<ul>
<li class="">가독성: 컴포넌트와 스타일 로직이 분리되어 가독성이 높아집니다.</li>
</ul>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="단점-1">단점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EB%8B%A8%EC%A0%90-1" class="hash-link" aria-label="Direct link to 단점" title="Direct link to 단점" translate="no">​</a></h4>
<ul>
<li class="">유지보수가 어려움: 여러 문서에 동일한 스타일을 적용하려면 모든 문서에 동일한 CSS를 작성해야 하므로 유지보수가 어렵습니다.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="external-csscss-in-css">external CSS(CSS-in-CSS)<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#external-csscss-in-css" class="hash-link" aria-label="Direct link to external CSS(CSS-in-CSS)" title="Direct link to external CSS(CSS-in-CSS)" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- HTML 파일 --&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">link</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">rel</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">stylesheet</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">styles.css</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">body</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">이 문장은 외부 CSS 파일에서 스타일을 적용받습니다.</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">body</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* styles.css 파일 */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector" style="color:#00009f">p</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">color</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token color">red</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">font-size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>별도의 css 파일을 작성하고, link 태그로 HTML 문서에 연결하는 방식입니다.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="장점-2">장점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EC%9E%A5%EC%A0%90-2" class="hash-link" aria-label="Direct link to 장점" title="Direct link to 장점" translate="no">​</a></h4>
<ul>
<li class="">재사용성: 여러 문서에서 동일한 스타일을 적용할 때 유용합니다.</li>
<li class="">유지보수가 쉬움: 스타일을 한곳에서 관리할 수 있어 유지보수가 쉽습니다.</li>
<li class="">효율성: Sass나 Less와 같은 CSS 전처리기를 사용하면 CSS를 더 효율적으로 작성할 수 있습니다.</li>
</ul>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="css-전처리기와-후처리기">CSS 전처리기와 후처리기<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#css-%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%99%80-%ED%9B%84%EC%B2%98%EB%A6%AC%EA%B8%B0" class="hash-link" aria-label="Direct link to CSS 전처리기와 후처리기" title="Direct link to CSS 전처리기와 후처리기" translate="no">​</a></h3>
<p>CSS-in-CSS 스타일에서 언급했던 Sass나 Less는 CSS 전처리기 입니다.
CSS 전처리기는 변수 선언, 중첩, Mixin, 함수 등의 고급 기능을 사용하여 반복을 줄이고, 가독성을 높여줍니다.</p>
<p>후처리기는 벤더 프리픽스를 추가해주어 크로스 브라우징 문제를 해결해주고, 폴리필을 추가해 구형 브라우저에서도 잘 동작할 수 있도록 해주는 역할을 해요.
PostCSS 등이 대표적인 후처리기이고, Autoprefixer와 cssnano 같은 플러그인을 설정하면 CSS 파일을 더 작은 크기로 최적화하고 브라우저 호환성을 높이며, 유지보수와 확장성 또한 강화할 수 있습니다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/processor-e886fc9c5e44d7316dc07d88da7e996a.png" alt="https://2024.stateofcss.com" loading="lazy"><p class="description_jZe6">https://2024.stateofcss.com</p></div>
<p>2024년에 가장 많이 사용된 전처리기/후처리기 순위인데요.
Sass와 PostCSS의 빈도가 높네요.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="전처리기와-후처리기는-언제-어떻게-동작하는-걸까">전처리기와 후처리기는 언제, 어떻게 동작하는 걸까?<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%99%80-%ED%9B%84%EC%B2%98%EB%A6%AC%EA%B8%B0%EB%8A%94-%EC%96%B8%EC%A0%9C-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94-%EA%B1%B8%EA%B9%8C" class="hash-link" aria-label="Direct link to 전처리기와 후처리기는 언제, 어떻게 동작하는 걸까?" title="Direct link to 전처리기와 후처리기는 언제, 어떻게 동작하는 걸까?" translate="no">​</a></h4>
<!-- -->
<p>빌드 시점에 전처리기를 사용하여 Sass나 Less 파일을 CSS 파일로 변환하고, CSSOM이 생성된 이후에 후처리기가 동작합니다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="css-in-js">CSS-in-JS<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#css-in-js" class="hash-link" aria-label="Direct link to CSS-in-JS" title="Direct link to CSS-in-JS" translate="no">​</a></h2>
<p>앞서 소개한 방식들 중 어떤 방식을 선택하더라도 CSS가 파싱되어 렌더트리가 생성되는데요.
CSS를 파싱하는 동안에는 JS의 실행이 차단되기 때문에 CSS 적용 방식이 렌더링 성능에 영향을 미칩니다.
CSS-in-JS는 이런 문제를 해결해주는데요.
CSS모델을 문서레벨이 아니라 컴포넌트 레벨로 추상화하고, 중복 및 의존성을 줄여 유지보수를 쉽게 합니다.
JS코드 내에서 CSS를 작성하고 관리하는 방식으로, Styled components, Emotion 등이 있습니다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/cssInJs-e9c1c3565dd3b9cb92171013b4ee49a8.png" alt="https://2024.stateofcss.com" loading="lazy"><p class="description_jZe6">https://2024.stateofcss.com</p></div>
<p>위 통계에 있는 CSS 모듈은 정확히 말하면 CSS-in-JS 방식은 아닙니다.
external CSS 방식과 비교하면, js에서 파일을 import 해서 사용하는 방식<sup><a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#user-content-fn-1-633caa" id="user-content-fnref-1-633caa" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetHideOnScrollNavbar_vjPI">1</a></sup>이기 때문에 통계에 들어간게 아닐까 싶네요.
css 모듈은 선택적으로 컴포넌트 className에 스타일 적용이 가능하지만, CSS-in-JS처럼 동적으로 스타일을 적용할 수 없습니다.
아래는 동적으로 스타일을 적용하는 예시입니다.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">styled</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"styled-components"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token maybe-class-name">Button</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> styled</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">button</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string css language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string css language-css">  </span><span class="token template-string css language-css property" style="color:#36acaa">background-color</span><span class="token template-string css language-css punctuation" style="color:#393A34">:</span><span class="token template-string css language-css"> </span><span class="token template-string css language-css interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string css language-css interpolation punctuation" style="color:#393A34">(</span><span class="token template-string css language-css interpolation parameter">props</span><span class="token template-string css language-css interpolation punctuation" style="color:#393A34">)</span><span class="token template-string css language-css interpolation"> </span><span class="token template-string css language-css interpolation arrow operator" style="color:#393A34">=&gt;</span><span class="token template-string css language-css interpolation"> </span><span class="token template-string css language-css interpolation punctuation" style="color:#393A34">(</span><span class="token template-string css language-css interpolation">props</span><span class="token template-string css language-css interpolation punctuation" style="color:#393A34">.</span><span class="token template-string css language-css interpolation property-access">primary</span><span class="token template-string css language-css interpolation"> </span><span class="token template-string css language-css interpolation operator" style="color:#393A34">?</span><span class="token template-string css language-css interpolation"> </span><span class="token template-string css language-css interpolation string" style="color:#e3116c">"blue"</span><span class="token template-string css language-css interpolation"> </span><span class="token template-string css language-css interpolation operator" style="color:#393A34">:</span><span class="token template-string css language-css interpolation"> </span><span class="token template-string css language-css interpolation string" style="color:#e3116c">"gray"</span><span class="token template-string css language-css interpolation punctuation" style="color:#393A34">)</span><span class="token template-string css language-css interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string css language-css punctuation" style="color:#393A34">;</span><span class="token template-string css language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string css language-css">  </span><span class="token template-string css language-css property" style="color:#36acaa">color</span><span class="token template-string css language-css punctuation" style="color:#393A34">:</span><span class="token template-string css language-css"> </span><span class="token template-string css language-css color">white</span><span class="token template-string css language-css punctuation" style="color:#393A34">;</span><span class="token template-string css language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string css language-css">  </span><span class="token template-string css language-css property" style="color:#36acaa">padding</span><span class="token template-string css language-css punctuation" style="color:#393A34">:</span><span class="token template-string css language-css"> </span><span class="token template-string css language-css number" style="color:#36acaa">10</span><span class="token template-string css language-css unit">px</span><span class="token template-string css language-css punctuation" style="color:#393A34">;</span><span class="token template-string css language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string css language-css">  </span><span class="token template-string css language-css property" style="color:#36acaa">border</span><span class="token template-string css language-css punctuation" style="color:#393A34">:</span><span class="token template-string css language-css"> none</span><span class="token template-string css language-css punctuation" style="color:#393A34">;</span><span class="token template-string css language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string css language-css">  </span><span class="token template-string css language-css property" style="color:#36acaa">border-radius</span><span class="token template-string css language-css punctuation" style="color:#393A34">:</span><span class="token template-string css language-css"> </span><span class="token template-string css language-css number" style="color:#36acaa">5</span><span class="token template-string css language-css unit">px</span><span class="token template-string css language-css punctuation" style="color:#393A34">;</span><span class="token template-string css language-css"></span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string css language-css"></span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="장점-3">장점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EC%9E%A5%EC%A0%90-3" class="hash-link" aria-label="Direct link to 장점" title="Direct link to 장점" translate="no">​</a></h4>
<ul>
<li class="">gloabl namespace를 신경쓸 필요 없음: CSS로 컴파일할 때, 고유이름 생성되기 때문에 클래스 이름 충돌 문제가 없습니다.</li>
<li class="">JS와 CSS 상태 공유</li>
<li class="">CSS 로드 우선순위 이슈가 없음</li>
<li class="">동적 스타일링: css 문법을 거의 그대로 사용하면서도 스타일링을 동적으로 처리할 수 있습니다. 덕분에 테마 적용도 쉽습니다.</li>
<li class="">SSR(서버사이드 렌더링) 최적화: 서버사이드 렌더링을 통해 초기 HTML에 필요한 스타일만 삽입해 사용자에게 빠르게 보여줄 수 있습니다.
초기 로딩 속도를 향상하는 데 이점이 있습니다.</li>
</ul>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="단점-2">단점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EB%8B%A8%EC%A0%90-2" class="hash-link" aria-label="Direct link to 단점" title="Direct link to 단점" translate="no">​</a></h4>
<!-- -->
<ul>
<li class="">런타임 생성 오버헤드 발생: 런타임에 스타일을 계산하고 생성하는 과정에서 발생하는 오버헤드가 있습니다.</li>
<li class="">번들 크기가 커짐: js 번들의 크기가 커져서 초기 로딩 속도에 영향을 미칠 수 있습니다.</li>
<li class="">브라우저에 캐싱되지 않음: 스타일이 js에서 동적으로 생성되기 때문에 CSS가 캐시되지 않아 동일한 스타일이라도 매번 재생성되는 오버헤드가 발생합니다.</li>
</ul>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="zero-runtime-css-in-js">Zero-runtime CSS-in-JS<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#zero-runtime-css-in-js" class="hash-link" aria-label="Direct link to Zero-runtime CSS-in-JS" title="Direct link to Zero-runtime CSS-in-JS" translate="no">​</a></h2>
<p>제가 처음 Zero-runtime CSS-in-JS를 접한 계기는 Material UI 버전 업그레이드 공지<sup><a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#user-content-fn-2-633caa" id="user-content-fnref-2-633caa" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetHideOnScrollNavbar_vjPI">2</a></sup>였습니다.
진행중인 프로젝트의 성능을 최적화 할 수 있는 방법을 찾다가 Zero-runtime CSS-in-JS를 알게 되었어요.
Material UI v6에서는 Pigment CSS를 도입해 CSS를 런타임이 아닌 빌드 타임에 추출하는 방식으로 클라이언트 사이드의 재계산을 피하고, 번들 크기를 줄일 수 있다고 합니다.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> styled </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@pigment-css/react"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token maybe-class-name">Heading</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">styled</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"div"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">fontSize</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"4rem"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">fontWeight</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"bold"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">padding</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"10px 0px"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#d73a49">App</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token maybe-class-name">Heading</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token maybe-class-name">Hello</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token maybe-class-name">Heading</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="장점-4">장점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EC%9E%A5%EC%A0%90-4" class="hash-link" aria-label="Direct link to 장점" title="Direct link to 장점" translate="no">​</a></h4>
<ul>
<li class="">CSS 파싱 문제 해결: 런타임에 스타일을 생성하는 것이 아니라 빌드 시점에 스타일을 추출하여 정직 CSS파일처럼 사용할 수 있습니다.
이를 통해 불필요한 JS 로딩으로 인한 성능 저하를 방지합니다.</li>
<li class="">낮은 러닝커브:사용법은 styled-components와 비슷합니다.
DX적으로는 이점을 유지하면서 성능을 향상시킬 수 있습니다.</li>
</ul>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="단점-3">단점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EB%8B%A8%EC%A0%90-3" class="hash-link" aria-label="Direct link to 단점" title="Direct link to 단점" translate="no">​</a></h4>
<ul>
<li class="">빌드 시간 증가</li>
<li class="">개발 환경에서의 어려움: 빌드 타임에 스타일을 생성하기 때문에 테스트를 작성해야한다거나 실험을 해야할 때 어려움이 있을 수 있습니다.</li>
</ul>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="utility-first-css">Utility-first CSS<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#utility-first-css" class="hash-link" aria-label="Direct link to Utility-first CSS" title="Direct link to Utility-first CSS" translate="no">​</a></h2>
<p>Utility-first CSS는 HTML 요소에 직접 스타일을 적용하는 방식입니다.
미리 정의된 유틸리티 클래스 <code>text-center</code>, <code>p-2</code> 등을 사용하여 스타일을 적용하고, 대표적인 프레임워크로 tailwindCSS가 있습니다.</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">bg-blue-500 text-white px-4 py-2 rounded</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Click me</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>CSS-in-JS와 달리 정적 CSS 클래스 기반으로 스타일을 적용하기 때문에 런타임 오버헤드가 없습니다.</p>
<!-- -->
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="장점-5">장점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EC%9E%A5%EC%A0%90-5" class="hash-link" aria-label="Direct link to 장점" title="Direct link to 장점" translate="no">​</a></h4>
<ul>
<li class="">높은 재사용성</li>
<li class="">개발 속도 향상: CSS를 따로 작성할 필요가 없기에 개발속도가 빠릅니다.</li>
<li class="">런타임 오버헤드 없음</li>
<li class="">브라우저 캐싱: 정적 CSS 파일이 브라우저에 캐싱되어 성능이 최적화됩니다.</li>
</ul>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="단점-4">단점<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EB%8B%A8%EC%A0%90-4" class="hash-link" aria-label="Direct link to 단점" title="Direct link to 단점" translate="no">​</a></h4>
<ul>
<li class="">코드 가독성 저하: 클래스 순서를 일관되게 지키지 않으면 가독성이 떨어질 수 있습니다.</li>
<li class="">러닝커브: 초기 클래스 명명 규칙을 익히는데 시간이 걸릴 수 있습니다.</li>
</ul>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="결론">결론<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#%EA%B2%B0%EB%A1%A0" class="hash-link" aria-label="Direct link to 결론" title="Direct link to 결론" translate="no">​</a></h2>
<p>전통적 스타일링 방식부터 Utility-first CSS까지 다양한 스타일링 방법을 살펴보았습니다.
겉핥기식이었지만 각 방식의 장단점을 정리할 수 있었습니다.
CSS 라이브러리에 대해서는 그냥 유행인 것들을 따라서 써보는 식으로 찍먹해왔는데, 이제는 성능적인 측면을 고려해야겠다는 생각이 들었습니다.</p>
<br>
<hr>
<br>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI sr-only" id="footnote-label">Footnotes<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetHideOnScrollNavbar_vjPI" id="user-content-fn-1-633caa">
<p><a href="https://github.com/css-modules/css-modules" target="_blank" rel="noopener noreferrer" class="">CSS Modules - github</a> <a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#user-content-fnref-1-633caa" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetHideOnScrollNavbar_vjPI" id="user-content-fn-2-633caa">
<p><a href="https://mui.com/material-ui/migration/upgrade-to-v6/#why-you-should-upgrade-to-material-ui-v6" target="_blank" rel="noopener noreferrer" class="">MUI v6</a> <a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/css/styling#user-content-fnref-2-633caa" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>css</category>
        </item>
        <item>
            <title><![CDATA[Vim 배우기 :q!]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/dev/vim</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/dev/vim</guid>
            <pubDate>Mon, 14 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Vim is a highly configurable text editor built to make creating and changing any kind of text very efficient. It is included as "vi" with most UNIX systems and with Apple OS X.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Vim is a highly configurable text editor built to make creating and changing any kind of text very efficient. It is included as "vi" with most UNIX systems and with Apple OS X.<sup><a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/vim#user-content-fn-1-181b13" id="user-content-fnref-1-181b13" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetHideOnScrollNavbar_vjPI">1</a></sup></p>
</blockquote>
<p>Vim은 "Vi IMproved"의 준말로, 원래 UNIX 시스템에서 사용되던 Vi 편집기를 개선한 텍스트 편집기 입니다. 1991년에 v1.14가 처음 공개되었습니다.<sup><a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/vim#user-content-fn-2-181b13" id="user-content-fnref-2-181b13" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetHideOnScrollNavbar_vjPI">2</a></sup></p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/vim-0ba41dfdc0f4b3c6367f193345adf26d.png" alt="vim 실행 화면" loading="lazy"><p class="description_jZe6">vim 실행 화면</p></div>
<p>터미널에 <code>vi</code>를 입력하면 Vim이 실행됩니다.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="vim을-배우고-싶었던-이유">vim을 배우고 싶었던 이유<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/vim#vim%EC%9D%84-%EB%B0%B0%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%97%88%EB%8D%98-%EC%9D%B4%EC%9C%A0" class="hash-link" aria-label="Direct link to vim을 배우고 싶었던 이유" title="Direct link to vim을 배우고 싶었던 이유" translate="no">​</a></h3>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/realProgrammer-b3e10d338ce414a9bd5384ff99a09b98.png" alt="출처 https://xkcd.com/378/" loading="lazy"><p class="description_jZe6">출처 https://xkcd.com/378/</p></div>
<p>어디에선가 <code>vim에 익숙해지면 마우스 없이 모든 명령어를 처리할 수 있고, 생산성이 극대화된다</code>는 말을 들었습니다.
저는 리눅스 환경에 익숙하지 않아서 검은 터미널 화면에 빽빽하게 타이핑하며 개발하는 것에 대한 환상이 있었고, 한 번 배워보고 싶었어요.
그리고 뭔가 '진짜' 개발자처럼 보이잖아요...!</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="vimtutor로-시작하기">Vimtutor로 시작하기<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/vim#vimtutor%EB%A1%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0" class="hash-link" aria-label="Direct link to Vimtutor로 시작하기" title="Direct link to Vimtutor로 시작하기" translate="no">​</a></h2>
<p>터미널에서 <code>vimtutor</code>를 입력하면 Vim에 내장된 튜토리얼을 시작할 수 있습니다.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">=</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">=</span><span class="token plain">    빔 길잡이 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">VIM Tutor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> 에 오신 것을 환영합니다    -      Version </span><span class="token number" style="color:#36acaa">1.7</span><span class="token plain">      </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">==</span><span class="token operator" style="color:#393A34">=</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     빔</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Vim</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">은 이 길잡이에서 다 설명할 수 없을 만큼 많은 명령을 가진</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     매우 강력한 편집기입니다. 이 길잡이는 빔을 쉽게 전천후 편집기로 사용할</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     수 있도록 충분한 명령에 대해 설명하고 있습니다.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     이 길잡이를 떼는 데에는 실습하는 데에 얼마나 시간을 쓰는 가에 따라서</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token number" style="color:#36acaa">25</span><span class="token plain">-30 분 정도가 걸립니다.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     이 연습에 포함된 명령은 내용을 고칩니다. 이 파일의 복사본을 만들어서</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     연습하세요. </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vimtutor 를 통해 시작했다면, 이미 복사본을 사용하는</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     중입니다.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     중요한 것은, 이 길잡이가 직접 써보면서 배우도록 고려되어 있다는 것입니다.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     명령을 제대로 익히려면, 직접 실행해보는 것이 필요합니다. 내용을 읽는</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     것만으로는, 명령을 잊어버리게 될 것입니다.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     자 이제, Caps Lock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Shift-Lock</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> 키가 눌려있지 않은지 확인해보시고, j 키를</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     충분히 눌러서 Lesson </span><span class="token number" style="color:#36acaa">1.1</span><span class="token plain">이 화면에 가득 차도록 움직여봅시다.</span><br></div></code></pre></div></div>
<p>무려 한국어 튜토리얼이 있어 놀랐습니다!
약 7챕터의 레슨으로 구성되어있고, 한 챕터에는 실습 예시와 요약이 함께 있습니다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/vimtutorExample-7e4effd5a3a5ac7b62d764d5f8d881fd.png" alt="" loading="lazy"></div>
<p>내용은 그렇게 어렵지 않았고 설명에 적혀있는대로 30분 정도면 충분히 학습할 정도의 분량이었어요.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="특징">특징<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/vim#%ED%8A%B9%EC%A7%95" class="hash-link" aria-label="Direct link to 특징" title="Direct link to 특징" translate="no">​</a></h3>
<p>메모장이나 VSCode 같은 일반 텍스트 편집기와 비교했을 때, 가장 큰 차이점은 모드 기반의 편집입니다.
vim 관련 meme을 검색해봤을 때 흔하게 나오는 게 "How do I exit Vim?"이라는 질문인데요, Vim은 Noraml모드, Insert모드, Command모드, Visual모드 등 여러 모드를 가지고 있습니다.
종료하려면 일반모드에서 <code>:q</code>를 입력하면 되는데, GUI가 익숙한 저는 시작부터 적응이 어려웠습니다.</p>
<!-- -->
<p>타이핑을 하기 위해서는 <code>i</code>를 눌러 Insert모드로 전환해야 하고, 타이핑한 것을 저장하려면 <code>esc</code>를 눌러 Normal모드로 전환한 후 다시 <code>:</code>를 눌러 Command모드로 전환한 뒤 <code>:wq</code>(저장 후 종료) 같은 명령어를 입력해야 합니다.
그리고 Visual 모드는 마치 마우스로 드래그하는 효과와 같은 기능을 하는데 v를 누르면 커서가 있는 위치부터 텍스트를 선택합니다.</p>
<p>다양한 명령어가 있는데 시험공부 하듯이 외우는 것보다 <code>vimtutor</code>를 통해 직접 사용해보면서 배우는 것이 더 효과적입니다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="vim-사용으로-10x-개발자-되기">vim 사용으로 10x 개발자 되기...?!<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/vim#vim-%EC%82%AC%EC%9A%A9%EC%9C%BC%EB%A1%9C-10x-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%90%98%EA%B8%B0" class="hash-link" aria-label="Direct link to vim 사용으로 10x 개발자 되기...?!" title="Direct link to vim 사용으로 10x 개발자 되기...?!" translate="no">​</a></h2>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/10x-5728dc7a81d362cc95c01de3a1079cbe.jpeg" alt="그래서 과연 생산성이 10배 빨라졌을까요...?" loading="lazy"><p class="description_jZe6">그래서 과연 생산성이 10배 빨라졌을까요...?</p></div>
<p>vim을 사용해보기로 결심한 후에 FEconf 라이트닝 톡에서 vim을 4년, Neovim을 1년 7개월 간 사용하신 프론트엔드 개발자분의 세션을 들었습니다.
그 분을 보니 vim 사용이 어떤 면에서 좋은지 느낌이 오더라고요.
<code>.vimrc</code> 파일을 개인에게 맞게 최적화 해서 테마, 플러그인, 단축키 등을 설정할 수 있는데 개인에게 어떻게 최적화 하는지에 따라서 생산성을 높일 수 있을 것 같았습니다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/feconf-24eb88fd5cf864a743506d87ca2eced9.jpg" alt="조성진님의 '저는 vim을 사용하는 프론트엔드 개발자 입니다.' 세션" loading="lazy"><p class="description_jZe6">조성진님의 '저는 vim을 사용하는 프론트엔드 개발자 입니다.' 세션</p></div>
<p>위의 사진은 배경화면 투명도를 줄여서 화면 전환 없이 코드 작성하며 결과물을 확인하도록 커스텀한 세팅입니다.
이런식으로 활용할 수 있다는 것이 신박했어요.
그리고 vim은 VSCode와 비교했을 때, 매우 가볍고 컴퓨터 리소스를 적게 사용하기 때문에 vim 사용으로 절약한 리소스로 로컬 LLM을 돌리는 등 컴퓨터 자원을 조금 더 효율적으로 사용할 수 있습니다.</p>
<p>이외에도 vim 사용에 익숙해지면 어느 OS 환경에서든 써먹을 수 있고, 손을 많이 움직일 필요없이 빠르게 작업할 수 있다는 장점이 있습니다.
여러모로 극한의 상황에서 개발을 할 때 유용할 것 같다는 생각이 들었습니다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="vim-정복에-실패한-개발자의-솔직한-고백">Vim 정복에 실패한 개발자의 솔직한 고백<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/vim#vim-%EC%A0%95%EB%B3%B5%EC%97%90-%EC%8B%A4%ED%8C%A8%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%EC%86%94%EC%A7%81%ED%95%9C-%EA%B3%A0%EB%B0%B1" class="hash-link" aria-label="Direct link to Vim 정복에 실패한 개발자의 솔직한 고백" title="Direct link to Vim 정복에 실패한 개발자의 솔직한 고백" translate="no">​</a></h2>
<p>글의 제목에 <code>:q!</code>를 적어놓은 이유는... Vim에 입문하자마자 강제 종료 해버렸다는 것을 표현하고 싶었습니다😅
vimtutor를 통해 기본적인 명령어를 익히고, 블로그 포스팅 할 때 사용중인 zed 에디터를 vim 모드로 설정해서 사용하는 중인데요.
매일 사용하는 게 아니면 금방 잊어버려서 매번 명령어를 검색해야하는 번거로움을 겪고 있습니다.
이걸로 개발하려면 한동안은 생산성은 오히려 저하되겠더라구요.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/cheatsheet-a3775713597bb06f260c0798df458c43.jpeg" alt="" loading="lazy"></div>
<br>
<p>엄청나게 많은 명령어들을 체화하고 익숙해질 자신이 없었습니다.
컴퓨터 리소스가 그렇게 아까운 환경도 아니고, 상당히 부지런한 성격이라 vim을 정복해서 효율성을 극대화 하겠다는 그런 간절함도 별로 없었던 게 vim과 다시 데면데면해진 주된 원인인 것 같아요.</p>
<p>같이 일하던 동료분 중에 엑셀 초고수 동료분이 있었는데 군대에서 행정업무를 하던 시절 온갖 단축키를 외운 것이 비결이라고 하시더라구요.
제가 Vim에 적응하려면 입대정도는 해야... 되지 않을까? 하는 생각이 들었습니다.</p>
<br>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/realProgrammer-b3e10d338ce414a9bd5384ff99a09b98.png" alt="그놈의 진짜 개발자" loading="lazy"><p class="description_jZe6">그놈의 진짜 개발자</p></div>
<p>웃자고 넣은 이미지인데, 제 마음속 한 구석에는 '진짜' 개발자 처럼 보이고 싶은 욕망이 있었던 것 같습니다.
나에게 맞게 최적화하고, 극한의 효율을 추구하는 그런 능력을 조금 더 키워보고 싶었었나봐요.
몇 달동안 묵혀두었던 Vim에 대한 글을 쓰게 되었는데요.
글을 쓰면서 어떤 기술을 사용하지 않는다고 스스로를 진짜가 아니라고 생각할 필요는 없다고 느꼈습니다.
오늘을 기점으로 Vim에 적응하지 못했다는 것을 시원하게 인정하고, 제 마음속의 짐을 내려놓아보려구요!</p>
<hr>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI sr-only" id="footnote-label">Footnotes<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/vim#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetHideOnScrollNavbar_vjPI" id="user-content-fn-1-181b13">
<p><a href="https://www.vim.org/" target="_blank" rel="noopener noreferrer" class="">Vim - the ubiquitous text editor</a> <a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/vim#user-content-fnref-1-181b13" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetHideOnScrollNavbar_vjPI" id="user-content-fn-2-181b13">
<p><a href="https://en.wikipedia.org/wiki/Vim_(text_editor)" target="_blank" rel="noopener noreferrer" class="">Vim - Wikipedia</a> <a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/vim#user-content-fnref-2-181b13" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>개발도구</category>
            <category>vim</category>
        </item>
        <item>
            <title><![CDATA[글또 10기 미리보기]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/10/preview</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/10/preview</guid>
            <pubDate>Tue, 01 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[어느 날 아침 문득, 정말이지 맹세코 아무런 계시나 암시도 없었는데 불현듯, 잠에서 깨어나는 순간 나는 이렇게 부르짖었다.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>어느 날 아침 문득, 정말이지 맹세코 아무런 계시나 암시도 없었는데 불현듯, 잠에서 깨어나는 순간 나는 이렇게 부르짖었다.
"그래, 이렇게 살아서는 안 돼! 내 인생에 나의 온 생애를 다 걸어야 해. 꼭 그래야만 해!"</p>
<p>모순, 양귀자</p>
</blockquote>
<p>요 근래에 정말 재미있게 읽었던 소설의 첫 문장입니다. 글또 10기 OT가 끝나고 문득, 정말이지 맹세코 아무런 계시나 암시도 없었는데 불현듯, '그래, 이렇게 살아서는 안 돼! 내 인생에 나의 온 생애를 다 걸어야 해. 꼭 그래야만 해!'라고 생각했어요. (부르짖지는 않았음...)</p>
<p>처음 개발자를 꿈꾼지 5년이 지났고, 프런트엔드 개발자로 봉급을 받은지 3년이라는 시간이 지났습니다. 사랑의 유효기간은 900일<sup><a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/10/preview#user-content-fn-1-3de6f7" id="user-content-fnref-1-3de6f7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetHideOnScrollNavbar_vjPI">1</a></sup>이라고 하죠? 요즘은 어쩐지 프로그래머로서의 열정도 사라지고, 커리어 권태기가 온 것 같아요. 그래서 '글또 10기 시작'이라는 핑계로 제 프로그래밍 인생에 저의 온 생애를 다 걸어보자는 비장한 다짐을 해보려고 합니다.
글또는 어쩌면 프로그래머로서 열심히 살아보기 위한 수단일지도 모르겠네요😁</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="글또-10기에-이루고-싶은-것">글또 10기에 이루고 싶은 것<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/10/preview#%EA%B8%80%EB%98%90-10%EA%B8%B0%EC%97%90-%EC%9D%B4%EB%A3%A8%EA%B3%A0-%EC%8B%B6%EC%9D%80-%EA%B2%83" class="hash-link" aria-label="Direct link to 글또 10기에 이루고 싶은 것" title="Direct link to 글또 10기에 이루고 싶은 것" translate="no">​</a></h2>
<ol>
<li class="">글을 매개로 한 공부 - 글을 쓰기 위해서라도 열심히 공부하고, 성장하는 제가 되고 싶어요</li>
<li class="">기술적 취향 및 관심사 찾기 - 제가 어떤 글을 쓰는지 살펴보다보면 제 기술적 취향과 관심사를 찾을 수 있을 것 같아요</li>
<li class="">다양한 사람들을 만나보면서 고정관념, 편견 부수기 혹은 강화하기</li>
</ol>
<p>저는 사실 제가 어떤 걸 좋아하는 개발자인지, 어떤 걸 잘할 수 있는 사람인지 잘 모르겠어요.
9기 활동하면서 다국어 시스템이나 조직문화 개선에 대한 글을 쓸 때 참 재미있었는데 10기에는 기술적인 글들을 좀 더 써보면서 내가 어떤 부분을 좋아하고, 잘할 수 있는지 찾아보고 싶습니다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="액션-아이템---활동-로그">액션 아이템 - 활동 로그<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/10/preview#%EC%95%A1%EC%85%98-%EC%95%84%EC%9D%B4%ED%85%9C---%ED%99%9C%EB%8F%99-%EB%A1%9C%EA%B7%B8" class="hash-link" aria-label="Direct link to 액션 아이템 - 활동 로그" title="Direct link to 액션 아이템 - 활동 로그" translate="no">​</a></h2>
<blockquote>
<p>지금부터라도 나는 내 생을 유심히 관찰하면서 살아갈 것이다.
되어 가는 대로 놓아두지 않고 적절한 순간, 내 삶의 방향키를 과감하게 돌릴 것이다.
인생은 그냥 받아들이는 것이 아니라 전 생애를 걸고라도 탐구하면서 살아가야 하는 무엇이다.
그것이 인생이다.......</p>
<p>모순, 양귀자</p>
</blockquote>
<p>소설 속 주인공은 '삶을 유심히 관찰하며 탐구하듯 살아야한다. 그것이 인생이다.' 라고 말하는데 저도 말뿐인 다짐이 아니라 실천하기 위해서 탐구적인 자세를 좀 더 가져가 볼까 합니다.
그래서 엉성하지만 앞으로 6개월간의 대략적인 계획을 미리 해볼 수 있는 템플릿을 만들어보았어요.</p>
<p><img decoding="async" loading="lazy" alt="활동로그" src="https://sewonkimm-github-io.vercel.app/en/assets/images/log-86ecba1738d87b049eaad544a3c1a3cc.png" width="971" height="523" class="img_ev3q"></p>
<p>소재가 없어서 패스를 쓰는 것만은 피하고 싶어서 '언젠간 쓰겠지...'하고 쌓아두었던 글 소재들을 일단 넣어놨어요.
계획대로 되지 않는 것이 인생이기 때문에 '꼭 해내고야 말겠다!'는 생각은 없고, 중간중간 열심히 살고 있는지 스스로를 독려해주기만 해도 큰 역할을 할 것 같습니다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="액션">액션<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/10/preview#%EC%95%A1%EC%85%98" class="hash-link" aria-label="Direct link to 액션" title="Direct link to 액션" translate="no">​</a></h2>
<p>목표와 액션 아이템까지 생각했습니다. 이제 할 일은 액션!</p>
<blockquote>
<p>인생은 탐구하면서 살아가는 것이 아니라, 살아가면서 탐구하는 것이다.
실수는 되풀이된다.
그것이 인생이다.......</p>
<p>모순, 양귀자</p>
</blockquote>
<p>이 소설을 읽은 분들이라면 아시겠지만 소설의 결말이 여느 K-드라마처럼 행복하고, 이상적으로 마무리되지 않아서 이런 다짐글에 인용하는 것이 맞나 싶은 생각이 듭니다.
하지만 뻔한 성공 스토리가 아니라서 더 마음에 깊이 와닿았어요.
저도 비장하고, 거창하게 다짐했지만 6개월 후에는 후회가 가득한 회고글을 작성하고 있을지도 모르지요.
설령 정해진 미래가 그렇다 하더라도, 실수를 되풀이 하는것... 그것이 인생이니까...</p>
<p>일단 고! 🚀🚀🚀</p>
<br>
<hr>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI sr-only" id="footnote-label">Footnotes<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/10/preview#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetHideOnScrollNavbar_vjPI" id="user-content-fn-1-3de6f7">
<p><a href="https://www.kpanews.co.kr/column/show_youth.asp?idx=849" target="_blank" rel="noopener noreferrer" class="">과학이 말하는 사랑이란</a> <a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/10/preview#user-content-fnref-1-3de6f7" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>글또</category>
            <category>글쓰기</category>
        </item>
        <item>
            <title><![CDATA[비전공자도 개발자가 될 수 있나요?]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/career/developer-without-degree</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/career/developer-without-degree</guid>
            <pubDate>Sun, 08 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[어제 2024 Women tech week에서 세미나를 듣고 왔습니다. '함께 그리는 커리어 성장 곡선'이라는 주제로 개발자로서의 커리어를 어떻게 쌓아나가야할지에 대한 이야기였는데 Q&A 시간에 어김없이 '비전공자도 개발자로 취업할 수 있을까요?'라는 질문이 나왔습니다.]]></description>
            <content:encoded><![CDATA[<p>어제 2024 Women tech week에서 세미나를 듣고 왔습니다. '함께 그리는 커리어 성장 곡선'이라는 주제로 개발자로서의 커리어를 어떻게 쌓아나가야할지에 대한 이야기였는데 Q&amp;A 시간에 어김없이 '비전공자도 개발자로 취업할 수 있을까요?'라는 질문이 나왔습니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="전공자도-비전공자도-아닌-나">전공자도 비전공자도 아닌 나<a href="https://sewonkimm-github-io.vercel.app/en/blog/career/developer-without-degree#%EC%A0%84%EA%B3%B5%EC%9E%90%EB%8F%84-%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EB%8F%84-%EC%95%84%EB%8B%8C-%EB%82%98" class="hash-link" aria-label="Direct link to 전공자도 비전공자도 아닌 나" title="Direct link to 전공자도 비전공자도 아닌 나" translate="no">​</a></h2>
<p>저는 '디지털콘텐츠학'을 전공했습니다. 이름만으로는 정확히 어떤 전공인지 알기 쉽지 않습니다. 사실 입학할 때, 포토샵이나 프리미어로 디지털콘텐츠를 만드는 방법을 배우는 곳이겠거니 싶어서 선택했는데 실제로는 포토샵이나 프리미어 같은 프로그램을 만드는 방법을 배우는 곳이었어요😅</p>
<p>1~2학년 때까지는 프로그래밍은 절대 하지 말아야겠다고 생각했었고, 운영체제나 네트워크 같은 전공 필수 수업은 듣지 않았습니다. 교내 방송국에서 일하면서 영상 편집을 배웠고, 대만으로 교환학생을 가서 중국어를 배우며 이리 저리 방황했더랬습니다.
어찌저찌 개발자로 취업했지만 스스로 '전공자'라고 하기에는 부끄러운 마음이 들 때가 많습니다.</p>
<blockquote>
<p>직장에서 만난 사람들의 실력은, 적어도 현재까지 나의 경험으로는, 대학의 전공과는 별로 상관이 없었다.
직장은 결과로 말하는 곳이며, 자신의 업무와 조직에 대한 정확한 이해와 통찰, 일을 완수하려는 성실성과 태도가 더 중요하다는 것을 이제 나는 안다.</p>
<p>다른 삶, 곽미성 저</p>
</blockquote>
<p>책을 읽다가 깊이 공감한 부분입니다. 저희 회사에도 직무와 무관한 전공을 가진 분들이 많은데, 전공과 업무 퍼포먼스는 별개인 경우가 많습니다.</p>
<p>비전공자도 무엇무엇을 할 수 있느냐는 질문에는 사실 두려운 마음이 깔려있는 것이겠지요. 정말 하고 싶은 일이라면 용기를 내어야한다고 생각합니다. 만약 학위때문에 개발자를 하지 못하게 된다고 하더라도 그 도전의 경험이 삶의 다른 길로 이끌어 줄 거라고 믿어요.</p>
<blockquote>
<p>애초에 마음을 따랐다면 남편에게 적성에 맞지 않는 학과에 들어갔다가 자괴감으로 방황하는 시간도 없었을 것이고, '해야만 한다'는 생각으로 되고 싶지도 않은 교수직을 위해 허비하는 시간도 없었을 테니까.
하지만, 그걸 처음부터 알았다면 우리는 젊은이가 아니었겠지.
이게 아니면 안되는 인생은 없다.</p>
<p>다른 삶, 곽미성 저</p>
</blockquote>]]></content:encoded>
            <category>커리어</category>
        </item>
        <item>
            <title><![CDATA[애자일 하기]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/review/agile</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/review/agile</guid>
            <pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[이전 글 어느 날, 회사에서 서비스 개발을 멈추기로 했다.에서는 회사에서 2개월 간 서비스 개발을 멈추고, 개발 프로세스 개선하는 TF에 참여하면서 느낀 점을 정리했습니다.]]></description>
            <content:encoded><![CDATA[<p>이전 글 <a class="" href="https://sewonkimm-github-io.vercel.app/en/blog/review/processTF">어느 날, 회사에서 서비스 개발을 멈추기로 했다.</a>에서는 회사에서 2개월 간 서비스 개발을 멈추고, 개발 프로세스 개선하는 TF에 참여하면서 느낀 점을 정리했습니다.
TF가 마무리 되고, 회사에서 서비스 개발에 애자일 프로세스를 적용한 지 6개월이 지났습니다
6개월의 시간 동안, 1번의 마이너 업데이트와 2번의 핫픽스를 진행는데요.
이번 글에서는 제가 생각한 애자일한 조직의 모습, 조직에서 애자일 프로세스를 적용한 방법, 겪었던 시행착오 등을 기록 해보려고 합니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="애자일-하다는-착각">애자일 하다는 착각<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#%EC%95%A0%EC%9E%90%EC%9D%BC-%ED%95%98%EB%8B%A4%EB%8A%94-%EC%B0%A9%EA%B0%81" class="hash-link" aria-label="Direct link to 애자일 하다는 착각" title="Direct link to 애자일 하다는 착각" translate="no">​</a></h2>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/asis-71d9ff0be4b34dac66c30c3eb24c78e7.png" alt="뉴로클의 개발 문화" loading="lazy"><p class="description_jZe6">뉴로클의 개발 문화</p></div>
<p>회사 채용페이지의 개발 문화에 대한 내용은 제가 작성했는데요.
작성할 때만해도 저는 저희 조직이 애자일하게 개발하고 있다고 생각했습니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="착각-요소">착각 요소<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#%EC%B0%A9%EA%B0%81-%EC%9A%94%EC%86%8C" class="hash-link" aria-label="Direct link to 착각 요소" title="Direct link to 착각 요소" translate="no">​</a></h3>
<ol>
<li class="">스프린트를 진행한다.</li>
<li class="">Jira를 사용한다.</li>
<li class="">프로젝트가 끝나면 회고한다.</li>
</ol>
<p>생각해보면 이 두 가지 요소 때문에 애자일하다고 착각하고 있었던 것 같습니다.
'워터폴이 아니니까 애자일인거 아니야...?'라고 대충 생각했던 것 같아요.</p>
<p>우리 조직은 애자일하게 하고 있는데 기획을 수정하는 게 왜 이렇게 힘든 걸까요?
왜 개발자들이 릴리즈 날에 밤새면서 버그를 고치는 걸까요?
애자일이란 과연 무엇일까요?</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="어떤-부분이-문제-였을까">어떤 부분이 문제 였을까?<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#%EC%96%B4%EB%96%A4-%EB%B6%80%EB%B6%84%EC%9D%B4-%EB%AC%B8%EC%A0%9C-%EC%98%80%EC%9D%84%EA%B9%8C" class="hash-link" aria-label="Direct link to 어떤 부분이 문제 였을까?" title="Direct link to 어떤 부분이 문제 였을까?" translate="no">​</a></h2>
<p>약 2개월 동안 팀원들과 애자일을 공부하고, 치열하게 토론하며 저희 프로세스의 문제점을 찾아내고 새로운 프로세스를 만들었습니다.
진짜 애자일한 조직이 되기 위해 크게 2가지를 바꾸었는데요.</p>
<ol>
<li class=""><strong>스프린트 기간을 2주로 줄임</strong></li>
<li class=""><strong>스토리 포인트 도입</strong></li>
</ol>
<br>
<p><img decoding="async" loading="lazy" alt="새로운 업무 프로세스" src="https://sewonkimm-github-io.vercel.app/en/assets/images/newProcess-0314f1775bc7bef505437be69164b0b1.png" width="1200" height="569" class="img_ev3q"></p>
<p>결과적으로 이런 사이클을 계속 반복하게 되었어요!
업무 프로세스를 변경한다고 했을 때, 너무 복잡해져서 적응하지 못하는 것 아닌지에 대한 걱정이 많았는데 사실 핵심은 이 2가지였고, 나머지는 저희가 늘 해왔던 일들이라 실제로 수행하는 데 어려움은 적었습니다.</p>
<br>
<table><thead><tr><th></th><th>AS-IS</th><th>TO-BE</th></tr></thead><tbody><tr><td>스프린트 기간</td><td>1개월</td><td>2주</td></tr><tr><td>스토리 포인트</td><td>X</td><td>O</td></tr></tbody></table>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-스프린트-기간을-2주로-줄임">1. 스프린트 기간을 2주로 줄임<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#1-%EC%8A%A4%ED%94%84%EB%A6%B0%ED%8A%B8-%EA%B8%B0%EA%B0%84%EC%9D%84-2%EC%A3%BC%EF%BF%BD%EB%A1%9C-%EC%A4%84%EC%9E%84" class="hash-link" aria-label="Direct link to 1. 스프린트 기간을 2주로 줄임" title="Direct link to 1. 스프린트 기간을 2주로 줄임" translate="no">​</a></h3>
<blockquote>
<p>1개월 단위로 진행했던 <strong>스프린트 기간을 2주로 줄이고, 스프린트 전후로 킥오프와 회고를 진행</strong>했습니다.</p>
</blockquote>
<p>예를 들어 메이저 업데이트를 6개월 간 개발한다고 가정해 보겠습니다.
기존에는 스프린트 1개의 기간을 1개월로 잡아서 총 6개의 스프린트를 진행하던 것을 2주로 줄여 12개의 스프린트를 진행하였습니다.</p>
<p>스프린트가 끝날 때마다 스프린트 회고를 진행하는데 짧은 간격으로 일정을 점검하게 되면서 문제점을 비교적 초기에 발견하고, 대처할 수 있었습니다.
더불어 스프린트 기간이 짧아지면서 개발의 속도감도 높아지는 장점도 있었습니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-스토리-포인트-도입">2. 스토리 포인트 도입<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#2-%EC%8A%A4%ED%86%A0%EB%A6%AC-%ED%8F%AC%EC%9D%B8%ED%8A%B8-%EB%8F%84%EC%9E%85" class="hash-link" aria-label="Direct link to 2. 스토리 포인트 도입" title="Direct link to 2. 스토리 포인트 도입" translate="no">​</a></h3>
<blockquote>
<p>모든 업무를 스토리로 만들고, <strong>각 스토리마다 스토리 포인트를 부여하여 피쳐의 크기를 수치화</strong> 했습니다.</p>
</blockquote>
<p>스토리란 <code>유저가 제품에서 사용해 볼 수 있는 변경사항</code>으로 정의했습니다.
기능을 유저관점에서 설명한 것으로 예를 들면 <code>유저가 OO버튼을 누르면 OO화면으로 이동하는 기능</code>이 될 수 있습니다.
이전에는 이런 기능을 <code>OO 기능 개발</code>이라고 크게 잡아서 진행했는데, 이를 스토리 범위로 작게 쪼개고 기능 하나의 크기를 상대적으로 비교할 수 있도록 스토리포인트를 계산하여 전체적인 피쳐의 크기를 수치화 했습니다.</p>
<p><code>스프린트 계획</code>단계 에서 스프린트에서 진행할 스토리를 산정하고, <code>스프린트 회고</code>에서는 완료된 스토리 포인트를 계산해 평균 속도를 측정했는데요.
<strong>팀의 개발 속도를 PM의 감성적 의견이 아닌 정량적인 수치로 파악할 수 있었어요.</strong>
남은 기간동안 우리가 목표했던 것들을 전부 개발할 수 있는지 없는지, 개발할 수 없다면 얼만큼의 시간이 더 필요한지에 대한 판단 근거가 되어주었습니다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/postit-c21609e22ada543b5cfdb2ca5ec67856.jpg" alt="포스트잇으로 시각화하면 훨씬 와닿더라구요!" loading="lazy"><p class="description_jZe6">포스트잇으로 시각화하면 훨씬 와닿더라구요!</p></div>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="그래서-좋아졌나요">그래서 좋아졌나요?<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%A2%8B%EC%95%84%EC%A1%8C%EB%82%98%EC%9A%94" class="hash-link" aria-label="Direct link to 그래서 좋아졌나요?" title="Direct link to 그래서 좋아졌나요?" translate="no">​</a></h2>
<p>저는 이 프로세스를 도입하고나서 크게 3가지 효과를 느꼈습니다.</p>
<ol>
<li class="">피쳐의 크기를 파악할 수 있다.</li>
<li class="">QA를 더 꼼꼼히 볼 수 있다.</li>
<li class="">큰 피쳐에서도 각 기능마다 우선순위를 고려할 수 있다.</li>
</ol>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-피쳐의-크기를-파악할-수-있다">1. 피쳐의 크기를 파악할 수 있다.<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#1-%ED%94%BC%EC%B3%90%EC%9D%98-%ED%81%AC%EA%B8%B0%EB%A5%BC-%ED%8C%8C%EC%95%85%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8B%A4" class="hash-link" aria-label="Direct link to 1. 피쳐의 크기를 파악할 수 있다." title="Direct link to 1. 피쳐의 크기를 파악할 수 있다." translate="no">​</a></h3>
<p>초반 1~2개월은 버전에 들어갈 메인 피쳐를 선정하는 데 소비합니다.
우선순위와 대략적인 마감 날짜를 정하기 위해 피쳐 목록들을 쭉 보면서 기획이 없는 항목에 대해서도 주 단위로 공수를 산정해야 했습니다.
기획자도 모르는 피쳐에 대한 공수를 산정하는 것이 너무 어렵기도하고, 각 팀이 생각하는 기능이 동상이몽입니다.
초반에 대충 계산한 공수가 기획이 구체화 되면서 불어나는 경우가 많이 있었고, 이로 인해 릴리즈 날짜가 미뤄지는 경우가 종종 있었어요.</p>
<p>스토리가 없었을 때에는 한 스프린트를 끝내고 진행도를 체크할 때, 피쳐의 완성도를 수치화하기 어렵고 '<em>큰 피쳐들을 열심히 개발중</em>'이라고 밖에 말할 수 없었습니다.</p>
<p>스토리 포인트가 도입 된 후에는 <code>전체 100 스토리 포인트 중 n 스토리 포인트 완료</code>처럼 완성도 파악이 쉬워졌고, 각 기능 개발에 걸리는 시간을 상대적으로 비교할 수 있게 되었어요!</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/storyExample-88a9374862e8659da60ace54ac6b27a6.png" alt="하나의 피쳐에 대해 각 팀이 상의하여 합리적인 스토리 포인트를 산정합니다." loading="lazy"><p class="description_jZe6">하나의 피쳐에 대해 각 팀이 상의하여 합리적인 스토리 포인트를 산정합니다.</p></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-qa를-더-꼼꼼히-볼-수-있다">2. QA를 더 꼼꼼히 볼 수 있다.<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#2-qa%EB%A5%BC-%EB%8D%94-%EA%BC%BC%EA%BC%BC%ED%9E%88-%EB%B3%BC-%EC%88%98-%EC%9E%88%EB%8B%A4" class="hash-link" aria-label="Direct link to 2. QA를 더 꼼꼼히 볼 수 있다." title="Direct link to 2. QA를 더 꼼꼼히 볼 수 있다." translate="no">​</a></h3>
<p>이전에는 스프린트가 끝날 때마다 어떤 기능이 완성되었는지 확인하는 것이 어려웠습니다.
크기가 큰 피쳐같은 경우에는 2~3개월에 걸쳐 개발이 진행되는 경우가 많아서 스프린트가 끝날 때마다 QA를 진행하기가 불가능했어요.
릴리즈 직전 3주동안 QA 스프린트를 진행하면서 QA의 부담이 커지고, 제품의 안정성도 떨어지는 상황이었습니다.</p>
<p>스토리로 피쳐를 작게 쪼개고, 스토리를 완료하면 2주마다 해당 스토리에 대한 QA를 진행하게 되면서 릴리즈 직전의 QA 부담을 많이 줄일 수 있게 되었어요.
유저의 입장을 기준으로 정리된 스토리로 QA 포인트도 좀 더 정확하게 잡아낼 수 있었습니다.
<code>OO 기능에 대한 QA</code> 보다는 <code>OO 버튼을 누르면 OO 화면으로 이동하는 기능에 대한 QA</code> 가 훨씬 구체적이고, 놓치기 어렵거든요.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-큰-피쳐에서도-각-기능마다-우선순위를-고려할-수-있다">3. 큰 피쳐에서도 각 기능마다 우선순위를 고려할 수 있다.<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#3-%ED%81%B0-%ED%94%BC%EC%B3%90%EC%97%90%EC%84%9C%EB%8F%84-%EA%B0%81-%EA%B8%B0%EB%8A%A5%EB%A7%88%EB%8B%A4-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84%EB%A5%BC-%EA%B3%A0%EB%A0%A4%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8B%A4" class="hash-link" aria-label="Direct link to 3. 큰 피쳐에서도 각 기능마다 우선순위를 고려할 수 있다." title="Direct link to 3. 큰 피쳐에서도 각 기능마다 우선순위를 고려할 수 있다." translate="no">​</a></h3>
<p>스토리를 구체적으로 뽑아낼 수 없는 기획은 더 잘게 쪼개게 되면서 MVP를 더 빨리 도출할 수 있었습니다.
중요한 기능을 먼저 개발하고, 나머지는 시간이 남을 때 개발하는 방식으로 진행할 수도 있었어요.
시장에 임팩트가 있을 기능이 무엇인지 더 자주 고민하게 되고, 야근을 하더라도 의미있는 야근을 했다고 느껴져서 정신적으로도 덜 힘들었습니다.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="pm의-후기">PM의 후기<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#pm%EC%9D%98-%ED%9B%84%EA%B8%B0" class="hash-link" aria-label="Direct link to PM의 후기" title="Direct link to PM의 후기" translate="no">​</a></h3>
<p>프로젝트 관리의 주체였던 PM분께 애자일 프로세스 도입 후기에 대해 여쭤봤는데요.
이전에는 스프린트 2~3개에 걸쳐서 '진행중'이던 피쳐가 스토리로 작게 쪼개진 덕분에 관리 리소스가 크게 줄었고, 명확해졌다고 말씀해주셨습니다.
그럼에도 불구하고 스토리를 만드는 것은 각 팀마다 이해도 차이가 있어서 아직은 조금 더 연습이 필요한 것 같다고 하셨어요.
아직 개선할 점들이 있지만 충분히 만족스러운 애자일 첫걸음 이었다고 생각해요🎉</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="혼자서는-바꿀-수-없는-것">혼자서는 바꿀 수 없는 것<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#%ED%98%BC%EC%9E%90%EC%84%9C%EB%8A%94-%EB%B0%94%EA%BF%80-%EC%88%98-%EC%97%86%EB%8A%94-%EA%B2%83" class="hash-link" aria-label="Direct link to 혼자서는 바꿀 수 없는 것" title="Direct link to 혼자서는 바꿀 수 없는 것" translate="no">​</a></h2>
<p>애자일 프로세스를 도입하면서 가장 크게 느낀 점은 '혼자서는 바꿀 수 없다'는 것이었습니다.
나만 스토리를 잘 뽑고, 나만 스토리 포인트를 잘 산정하고, 나만 스프린트 목표를 이룬다고 해서 조직이 애자일해지는 것은 아닙니다.
팀원 모두의 이해도를 올리는 것이 중요했고, 이를 위해서 많은 노력이 필요했습니다.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/workshop-45b988a08cafadc4622dd5c4e23fdf8d.png" alt="태어나서 처음으로 업무 워크샵을 기획하고 진행해보았습니다" loading="lazy"><p class="description_jZe6">태어나서 처음으로 업무 워크샵을 기획하고 진행해보았습니다</p></div>
<p>애자일 워크샵을 진행해서 스토리를 어떻게 만들어야 하는지, 스토리 포인트는 어떻게 산정해야 하는지에 대해 설명하고 실습을 통해 익히는 시간을 가졌습니다.
그 과정에서 각자의 이해 수준을 맞추고, 각 팀이 느끼는 어려운 점을 함께 공유할 수 있었어요.</p>
<p>이 워크샵을 진행하기 위한 자료를 2개월 동안 정말 치열하게 연구하고, 토론해서 만들어 냈는데 이 과정이 팀을 더 단단하게 만들어 주기도 했습니다.</p>
<p>가장 중요한 건 팀원 모두가 이 모든 프로세스를 그저 생각없이 따르거나, 최대한 덜 일하려고 이용하는 것이 아니라 <strong>더 나은 제품을 만들기 위한 과정, 완성도를 높이기 위한 시간을 확보하는 수단으로 생각해야</strong> 한다는 것입니다.
그렇지 않다면 큰 의미가 없고, 워터폴 방식으로 하는 것이 나쁜 방식이 아니라고 생각하거든요.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="애자일이-만병통치약은-아니에요">애자일이 만병통치약은 아니에요!<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#%EC%95%A0%EC%9E%90%EC%9D%BC%EC%9D%B4-%EB%A7%8C%EB%B3%91%ED%86%B5%EC%B9%98%EC%95%BD%EC%9D%80-%EC%95%84%EB%8B%88%EC%97%90%EC%9A%94" class="hash-link" aria-label="Direct link to 애자일이 만병통치약은 아니에요!" title="Direct link to 애자일이 만병통치약은 아니에요!" translate="no">​</a></h2>
<p>조직에 애자일 프로세스를 적용한다고 해서 모든 문제가 해결되는 것은 아닙니다.
각 팀의 성격, 규모, 상황마다 적절한 프로세스가 있는 것 같아요.
때로는 워터폴 방식이 훨씬 더 효율적일 수 있어요.</p>
<p>사실, 처음 이 프로세스를 도입한 마이너 버전 릴리즈 날도 새벽에 퇴근 했습니다.
노력했지만 한 번에 모든 문제를 해결할 수는 없더라고요.</p>
<div class="root_P5tw"><img src="https://sewonkimm-github-io.vercel.app/en/assets/images/book-90c87dd4cb19a57e6ee874d8560e4a94.jpg" alt="<애자일 개발이 처음인 내가 출근했더니 스크럼 마스터가 된 건에 관하여> 중에서..." loading="lazy"><p class="description_jZe6">&lt;애자일 개발이 처음인 내가 출근했더니 스크럼 마스터가 된 건에 관하여&gt; 중에서...</p></div>
<p>책의 한 페이지가 너무 와닿아서 찍어두었습니다. (책에 실제로 겪을 법한 상황들이 많이 묘사되어있어서 재미있었어요. 추천!)
애자일을 처음 도입한 팀의 이야기인데 이 팀도 결국 릴리즈 당일에는 새벽 2시까지 일하더군요...ㅎㅎ
애자일의 진정한 의미는 '카이젠(개선)'에 있으니까! 다음 릴리즈에는 더 나은 방향으로 개선 되기를 바라고 있습니다.</p>
<br>
<p>그리고 아직도 해결되지 않은 문제 중, 가장 큰 문제는 기획과 디자인이 완성되는 시점이 너무 늦는 것입니다.
책에서도 나오지 않는 문제인데요.<br>
<!-- -->가장 좋은 시나리오는 다음 버전의 기획이 미리 완료되어있고, 스토리와 스토리포인트까지 산정되어있는건데 현재 리소스로는 불가능에 가까운 일이네요.
기획자, 디자이너가 많은 조직은 이런 문제가 없을까... 궁금한 점이 많습니다.
일단 와이어프레임으로 MVP 개발과 검증을 진행하면서 완성도를 올리는 방식을 지향하고 있지만, 모든 피쳐의 성격이 MVP 기획이 가능한 형태는 아니라서 현실과 타협할 수밖에 없는 상황입니다.
책이나 컨퍼런스에 참가할 기회가 있다면 이런 문제들에 대한 해결책들을 찾아보고 싶어요.</p>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="중요한-것은-꺾이지-않는-마음">중요한 것은 꺾이지 않는 마음<a href="https://sewonkimm-github-io.vercel.app/en/blog/review/agile#%EC%A4%91%EC%9A%94%ED%95%9C-%EA%B2%83%EC%9D%80-%EA%BA%BE%EC%9D%B4%EC%A7%80-%EC%95%8A%EB%8A%94-%EB%A7%88%EC%9D%8C" class="hash-link" aria-label="Direct link to 중요한 것은 꺾이지 않는 마음" title="Direct link to 중요한 것은 꺾이지 않는 마음" translate="no">​</a></h3>
<p>처음 개선된 프로세스를 소개할 때, 사내 발표에서 썼던 장표 중 하나입니다.</p>
<p><img decoding="async" loading="lazy" alt="expectation" src="https://sewonkimm-github-io.vercel.app/en/assets/images/expectation-c27545497a964c233d84751bc58622a2.png" width="1200" height="636" class="img_ev3q"></p>
<p>이런 것들을 기대했는데 완벽하진 않지만 어느정도 변화를 이끌어 낸 것 같아서 굉장히 뿌듯하네요.
가장 긍정적으로 생각되는 건 <strong>일하고 싶은 환경을 스스로 만들어 갈 수 있다는 희망</strong>이 생겼다는 것입니다.
이 글을 읽고 계신 분들은 애자일 하고 계시는지, 어떤 방식으로 일하고 싶은 환경을 가꾸고 계신지 궁금하네요!</p>
<p>긴 글 읽어주셔서 감사합니다!🙏</p>]]></content:encoded>
            <category>회고</category>
            <category>함께자라기</category>
            <category>애자일</category>
        </item>
        <item>
            <title><![CDATA[팀 업무 배분의 딜레마]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/work/allotment</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/work/allotment</guid>
            <pubDate>Tue, 06 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[회사에서는 혼자 일할 수 없다.]]></description>
            <content:encoded><![CDATA[<p>회사에서는 혼자 일할 수 없다.
3~4명으로 이루어진 팀이 하나의 목표를 가지고 일하는 경우가 많다.
내가 어떤 일을 하고 싶어도, 팀원들과 협의하여 업무를 배분해야 한다.
팀은 프로젝트 초기에 업무 담당자를 배분하는데 이 때, 모두가 만족할 업무 배분의 기준을 선택하는 것은 항상 어려운 일이다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="업무-배분-기준">업무 배분 기준<a href="https://sewonkimm-github-io.vercel.app/en/blog/work/allotment#%EC%97%85%EB%AC%B4-%EB%B0%B0%EB%B6%84-%EA%B8%B0%EC%A4%80" class="hash-link" aria-label="Direct link to 업무 배분 기준" title="Direct link to 업무 배분 기준" translate="no">​</a></h2>
<ol>
<li class="">담당자가 이전에 담당했던 부분을 계속 개발한다.</li>
<li class="">담당자가 이전에 담당하지 않았던 부분을 개발한다.</li>
</ol>
<p>1번을 선택하면 효율적이고, 빠르게 개발할 수 있는 대신 유지보수가 어려워질 수 있다.
신규 입사자에게는 성과를 낼 기회가 없을 수도 있고, 오래 일한 사람 혹은 손이 빠른 사람에게 일이 몰리기기도 한다.</p>
<p>2번을 선택하면 모든 팀원의 프로젝트 이해도가 높아지는 대신 개발 속도가 떨어질 수 있다.
기존 코드를 이해하는 데 시간이 필요하지만, 그 과정에서 개개인의 능력이 향상 될 수도 있다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="어떤-기준을-선택해야-할까">어떤 기준을 선택해야 할까?<a href="https://sewonkimm-github-io.vercel.app/en/blog/work/allotment#%EC%96%B4%EB%96%A4-%EA%B8%B0%EC%A4%80%EC%9D%84-%EC%84%A0%ED%83%9D%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C" class="hash-link" aria-label="Direct link to 어떤 기준을 선택해야 할까?" title="Direct link to 어떤 기준을 선택해야 할까?" translate="no">​</a></h2>
<p>팀원 전체가 프로젝트에 익숙해지기 전까지는 2번 방식으로 업무를 배분해야 <strong>소수의 슈퍼 개발자에게 의존하지 않는 지속 가능한 팀을 만들 수 있다</strong>고 생각한다.
비즈니스 상황을 고려해 1번 기준으로 1개, 2번 기준으로 1개씩 업무를 배분하는 하이브리드 방식도 좋을 것 같다.(현재 팀은 이렇게 하고 있다.)</p>
<p>두 개의 기준을 적절히 섞어야 개인과 조직의 성장을 동시에 이룰 수 있지 않을까?
업무 배분의 딜레마를 언젠가는 해결할 수 있을까?</p>]]></content:encoded>
            <category>함께자라기</category>
        </item>
        <item>
            <title><![CDATA[데스크 셋업]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/life/desk</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/life/desk</guid>
            <pubDate>Mon, 29 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[3년차 웹 프론트엔드 개발자의 흔한 데스크 셋업]]></description>
            <content:encoded><![CDATA[<p>3년차 웹 프론트엔드 개발자의 흔한 데스크 셋업</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>TMI</div><div class="admonitionContent_BuS1"><ul>
<li class="">코로나 시절 집에서 공부하며 소소하게 데스크 셋업을 하게되었습니다.</li>
<li class="">지금은 주 5일 사무실 출근 중입니다.</li>
</ul></div></div>
<p><img decoding="async" loading="lazy" alt="책상" src="https://sewonkimm-github-io.vercel.app/en/assets/images/deskSetup-93549441f3533d620ce9eb05130b468d.jpeg" width="1200" height="919" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="장비-목록">장비 목록<a href="https://sewonkimm-github-io.vercel.app/en/blog/life/desk#%EC%9E%A5%EB%B9%84-%EB%AA%A9%EB%A1%9D" class="hash-link" aria-label="Direct link to 장비 목록" title="Direct link to 장비 목록" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="모니터---lg-34인치-360-모니터-34wn780-wqhd">모니터 - LG 34인치 360 모니터 34WN780 WQHD<a href="https://sewonkimm-github-io.vercel.app/en/blog/life/desk#%EB%AA%A8%EB%8B%88%ED%84%B0---lg-34%EC%9D%B8%EC%B9%98-360-%EB%AA%A8%EB%8B%88%ED%84%B0-34wn780-wqhd" class="hash-link" aria-label="Direct link to 모니터 - LG 34인치 360 모니터 34WN780 WQHD" title="Direct link to 모니터 - LG 34인치 360 모니터 34WN780 WQHD" translate="no">​</a></h3>
<p>34인치 울트라 와이드 모니터. 가격은 약 65만원.</p>
<p>원래 <code>듀얼 모니터 + 모니터 받침대</code> 조합으로 사용중이었는데 책상 공간을 너무 많이 차지하는 단점이 있었습니다. 모니터를 하나로 줄이고, 모니터 암으로 책상 공간을 확보한 덕분에 책상을 넓게 쓸 수 있게되었는데 이 점이 제일 만족스럽습니다. 내장 스피커가 있어 스피커를 따로 구매하지 않아도 되고, HDMI도 2개 연결할 수 있어서 맥북과 데스크탑 화면을 전환하며 사용중입니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="키보드---키크론-k6">키보드 - 키크론 K6<a href="https://sewonkimm-github-io.vercel.app/en/blog/life/desk#%ED%82%A4%EB%B3%B4%EB%93%9C---%ED%82%A4%ED%81%AC%EB%A1%A0-k6" class="hash-link" aria-label="Direct link to 키보드 - 키크론 K6" title="Direct link to 키보드 - 키크론 K6" translate="no">​</a></h3>
<p>키크론 K6 블루투스 키보드. 가격은 약 10만원.</p>
<p>맥북 키보드와 윈도우 키보드를 모두 지원하고, 무선으로 사용할 수 있어서 선택했습니다. 숫자키를 쓸 일이 많이 없어서 아주 미니멀한 스타일로 골랐는데 아직까지 큰 불편함은 없습니다. 휴대성이 좋지만 외출할 땐 잘 안들고 나가는 편이에요.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="키보드-트레이">키보드 트레이<a href="https://sewonkimm-github-io.vercel.app/en/blog/life/desk#%ED%82%A4%EB%B3%B4%EB%93%9C-%ED%8A%B8%EB%A0%88%EC%9D%B4" class="hash-link" aria-label="Direct link to 키보드 트레이" title="Direct link to 키보드 트레이" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="키보드 트레이" src="https://sewonkimm-github-io.vercel.app/en/assets/images/keyboardTray-4d075070041c1257e4d2b232b145f474.png" width="1200" height="638" class="img_ev3q"></p>
<p>책상에 설치할 수 있는 키보드 트레이. 가격은 약 4만원.</p>
<p>손목을 보호하기 위해 책상 아래에 키보드 트레이를 설치했습니다.</p>
<p><img decoding="async" loading="lazy" alt="자세" src="https://sewonkimm-github-io.vercel.app/en/assets/images/posture-596a4168805f5433736cccfe7dc2508a.png" width="1200" height="906" class="img_ev3q"></p>
<p>팔꿈치를 직각으로 두고, 손목은 꺾이지 않도록 해야 어깨나 손목에 무리가 덜 가는데 책상 위에 키보드를 놓으면 도저히 그 각도가 나오지 않아서 찾아보니 키보드 트레이라는 것이 있더라구요. 덕분에 책상 위 공간을 더 넓게 사용할 수 있게 되어 좋습니다. 키보드 트레이를 구입하니 손목을 받칠 수 있는 팜레스트도 같이 사은품으로 챙겨줘서 더 좋았습니다 :-)</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="마우스---애플-트랙패드">마우스 - 애플 트랙패드<a href="https://sewonkimm-github-io.vercel.app/en/blog/life/desk#%EB%A7%88%EC%9A%B0%EC%8A%A4---%EC%95%A0%ED%94%8C-%ED%8A%B8%EB%9E%99%ED%8C%A8%EB%93%9C" class="hash-link" aria-label="Direct link to 마우스 - 애플 트랙패드" title="Direct link to 마우스 - 애플 트랙패드" translate="no">​</a></h3>
<p>트랙패드 1세대. 중고로 구입.</p>
<p>맥북을 좀 사용하다보면 일반 마우스를 쓰는게 불편해집니다. 1세대는 충전식이 아니라 건전지를 사용하는데 매번 충전하는 게 귀찮을 것 같아서 일부러 1세대로 구입했습니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="맥북-아이패드-듀얼-거치대">맥북 아이패드 듀얼 거치대<a href="https://sewonkimm-github-io.vercel.app/en/blog/life/desk#%EB%A7%A5%EB%B6%81-%EC%95%84%EC%9D%B4%ED%8C%A8%EB%93%9C-%EB%93%80%EC%96%BC-%EA%B1%B0%EC%B9%98%EB%8C%80" class="hash-link" aria-label="Direct link to 맥북 아이패드 듀얼 거치대" title="Direct link to 맥북 아이패드 듀얼 거치대" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="거치대" src="https://sewonkimm-github-io.vercel.app/en/assets/images/stand-e6d8209a1ad7a4578fcec854498a81df.png" width="1200" height="1044" class="img_ev3q"></p>
<p>아이패드와 맥북을 동시에 사용할 수 있는 거치대. 가격은 약 4만원.</p>
<p>모니터 암을 사용하면서 확보한 책상 공간을 더 넓게 사용하기 위해 세로로 거치할 수 있는 모니터 거치대를 구입했습니다. 맥북을 거치해두고 클램쉘 모드로 사용 중인데, 무선 블루투스 키보드와 트랙패드의 조합으로 책상 공간을 넓게 유지하며 깔끔한 생활이 가능해집니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="의자---일룸">의자 - 일룸<a href="https://sewonkimm-github-io.vercel.app/en/blog/life/desk#%EC%9D%98%EC%9E%90---%EC%9D%BC%EB%A3%B8" class="hash-link" aria-label="Direct link to 의자 - 일룸" title="Direct link to 의자 - 일룸" translate="no">​</a></h3>
<p>당시 코로나 보조금으로 구입. 약 30만원.</p>
<p>오래 앉아있어야하므로 그래도 꽤 거금을 들였으나 조금 무겁고, 매쉬 재질이 아니라서 여름에 사용감이 썩 좋지 않습니다. 더워요...</p>
<br>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="셋업은-아직-끝나지-않았다">셋업은 아직 끝나지 않았다...<a href="https://sewonkimm-github-io.vercel.app/en/blog/life/desk#%EC%85%8B%EC%97%85%EC%9D%80-%EC%95%84%EC%A7%81-%EB%81%9D%EB%82%98%EC%A7%80-%EC%95%8A%EC%95%98%EB%8B%A4" class="hash-link" aria-label="Direct link to 셋업은 아직 끝나지 않았다..." title="Direct link to 셋업은 아직 끝나지 않았다..." translate="no">​</a></h2>
<p>재택이 가능한 데스크 셋업을 마련하는 데에만 100만원이 넘게 썼네요. 건강하고 즐겁게 일하기 위해 투자하는 것이라고 생각하고 있습니다. 애석하게도 아직 꿈의 데스크 셋업은 완성되지 않았습니다.</p>
<ol>
<li class="">서서 일할 수 있는 모션 데스크</li>
<li class="">통풍이 잘되는 허먼밀러 의자</li>
<li class="">공간을 많이 차지하지 않으면서 음질이 좋은 사운드바</li>
</ol>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[글또 9기, 5개월 동안 경험한 4가지]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/9/review</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/9/review</guid>
            <pubDate>Thu, 23 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[2023년 12월부터 2024년 4월까지 총 5개월간의 글또 활동이 끝났습니다. 글또 9기를 마치며 5개월동안 이룬 것과 느낀 점을 정리해보고자 합니다.]]></description>
            <content:encoded><![CDATA[<p>2023년 12월부터 2024년 4월까지 총 5개월간의 글또 활동이 끝났습니다. 글또 9기를 마치며 5개월동안 이룬 것과 느낀 점을 정리해보고자 합니다.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>글또란 무엇인가요?</div><div class="admonitionContent_BuS1"><p>글또는 '글 쓰는 또라이가 세상을 바꾼다'라는 이름의 개발자 글쓰기 모임입니다. 블로그에 2주 간격으로 글을 작성합니다. 자세한 정보는 <a href="https://geultto.github.io/blog/geultto-summary/" target="_blank" rel="noopener noreferrer" class="">글또 홈페이지</a>에서 확인할 수 있습니다.</p></div></div>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="글또에서-생긴-일">글또에서 생긴 일<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/9/review#%EA%B8%80%EB%98%90%EC%97%90%EC%84%9C-%EC%83%9D%EA%B8%B4-%EC%9D%BC" class="hash-link" aria-label="Direct link to 글또에서 생긴 일" title="Direct link to 글또에서 생긴 일" translate="no">​</a></h2>
<p>옛날부터 글또의 존재를 알고 있었지만 지원서를 작성할 용기가 생기기까지는 2~3년이 걸렸습니다. 제 삶에 꾸준히 긍정적 영향을 주는 친구가 있는데 그 친구가 꽤 오래전부터 글또 활동을 하고 있었더라구요.(심지어 운영진😮!!!) 덕분에 용기내어 글또 9기 활동을 시작 할 수 있었고, 글또를 통해 많은 것을 얻었습니다. 커뮤니티의 규칙은 단순히 '<em>2주에 한 번 글을 제출</em>'하는 것이지만 그것보다 더 많은 것을 해낸 5개월 이라고 생각합니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-8편의-글-작성">1. 8편의 글 작성<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/9/review#1-8%ED%8E%B8%EC%9D%98-%EA%B8%80-%EC%9E%91%EC%84%B1" class="hash-link" aria-label="Direct link to 1. 8편의 글 작성" title="Direct link to 1. 8편의 글 작성" translate="no">​</a></h3>
<p>2022년 회고 글에, '개발 블로그를 개편했지만 글 작성을 하지 않은' 반성 항목이 있었습니다. 글또에 지원한 목적도 더 많은 글을 써보기 위해서 였는데 5개월 동안 총 8편의 글을 작성해냈습니다! 작년에 총 6편의 글을 작성한 것에 비하면 괄목할만한 성과라고 생각합니다!</p>
<p><img decoding="async" loading="lazy" alt="제출내역" src="https://sewonkimm-github-io.vercel.app/en/assets/images/%EC%A0%9C%EC%B6%9C%EB%82%B4%EC%97%AD-022dfed4544b2f24335f5a28d9c74065.png" width="1024" height="1104" class="img_ev3q"></p>
<p>매번 회고글만 쓰는 것 같아서 기술적인 글을 쓰고 싶었는데 총 3편의 기술적인 글을 작성했습니다. 입사 후 가장 열심히 했던 다국어 관리 시스템에 대해 언젠가 한 번은 정리해보고 싶었는데 2주라는 마감시간을 갖게 되어 더이상 미루지 않고 글을 작성할 수 있었어요.</p>
<br>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-큐레이션-2픽">2. 큐레이션 2픽!!<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/9/review#2-%ED%81%90%EB%A0%88%EC%9D%B4%EC%85%98-2%ED%94%BD" class="hash-link" aria-label="Direct link to 2. 큐레이션 2픽!!" title="Direct link to 2. 큐레이션 2픽!!" translate="no">​</a></h3>
<p>글또에서 첫 활동이기도하고, 막상 들어와보니 활동 인원이 많아서(452명) 기대도 안했는데 <a class="" href="https://sewonkimm-github-io.vercel.app/en/blog/dev/i18n/tips">첫 회차에 제출한 글</a>이 큐레이션에 뽑혀서 정말 기분이 좋았습니다~</p>
<p><img decoding="async" loading="lazy" alt="큐레이션1" src="https://sewonkimm-github-io.vercel.app/en/assets/images/curation-9322f7a3134035ddedc44357ceff7575.png" width="1200" height="262" class="img_ev3q"></p>
<p>크리스마스날 큐레이션에 뽑혀서 선물같고, 더 좋았어요. '내 글을 다른 사람들이 재미있게 읽어주었구나'하는 보람이 있었습니다.</p>
<p><img decoding="async" loading="lazy" alt="큐레이션2" src="https://sewonkimm-github-io.vercel.app/en/assets/images/%ED%81%90%EB%A0%88%EC%9D%B4%EC%85%982-17c171af3934c36d3b701e051a6461ea.png" width="1200" height="261" class="img_ev3q"></p>
<p>그리고 <a class="" href="https://sewonkimm-github-io.vercel.app/en/blog/article/90percent">8회차에 제출한 번역글</a>이 큐레이션에 뽑혀서 놀랐습니다. 단순 번역만 하지 않고, 제가 느꼈던 점을 덧붙였는데 큐레이션 이유에도 짤막하게 쓰여있듯 공감할 수 있는 부분이 많았던 것 같아요.</p>
<p>활동 전에는 큐레이션의 존재를 몰랐기 때문에 별 생각이 없었는데 제가 쓴 글이 큐레이션에 뽑히면서 글쓰는 재미를 좀 더 느끼게 되었습니다. (인정하긴 싫지만 인정받는 건 너무 달콤하네요...🍬)</p>
<br>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-글쓰기-세미나">3. 글쓰기 세미나<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/9/review#3-%EA%B8%80%EC%93%B0%EA%B8%B0-%EC%84%B8%EB%AF%B8%EB%82%98" class="hash-link" aria-label="Direct link to 3. 글쓰기 세미나" title="Direct link to 3. 글쓰기 세미나" translate="no">​</a></h3>
<p>성윤님께서 몇 년간 쌓아온 노하우를 2회에 걸쳐 세미나로 공유해주신 글쓰기 세미나에 참석했습니다. 세미나를 듣고 <a class="" href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/9/review">과제</a>를 수행하면서 제 글쓰기 프로세스를 되돌아보고, 글 작성을 위한 환경을 조성할 수 있었어요. 안타깝게도 글쓰기 습관을 들이는 것에는 실패했지만 그래도 무기한으로 미루는 나쁜 습관은 조금씩 개선되는 것 같습니다.</p>
<br>
<br>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="4-커뮤니티-활동">4. 커뮤니티 활동<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/9/review#4-%EC%BB%A4%EB%AE%A4%EB%8B%88%ED%8B%B0-%ED%99%9C%EB%8F%99" class="hash-link" aria-label="Direct link to 4. 커뮤니티 활동" title="Direct link to 4. 커뮤니티 활동" translate="no">​</a></h3>
<p>글또 슬랙에는 생각보다 많은 채널이 있습니다. 달리기 모임이나 독서모임 같은 제너럴한 모임부터 강아지 모임 같은 귀여운 모임도 있어요. 여러 채널에서 적극적으로 활동하지는 못했지만 몇 몇 커뮤니티 활동이 기억에 남습니다.</p>
<p><strong>리액트 훅을 활용한 마이크로 상태관리 스터디</strong></p>
<p><code>리액트 훅을 활용한 마이크로 상태관리</code> 라는 책을 번역해주신 분께서 글또에 홍보 글을 작성해주신 덕분에, 그리고 그 글을 보고 스터디를 모집해주신 분 덕분에 글또 활동기간 중 개발 서적 한 권을 찐하게 읽을 수 있었습니다. 책을 읽다가 궁금한 부분에 대해서 사소한 거라도 깊게 파보고, 라이브러리 코드를 파헤쳐보면서 이해하려고 노력하시는 스터디원분들을 보면서 개발 서적을 대하는 자세에 대해 배울 수 있었어요.</p>
<br>
<p><strong>4번의 커피챗 ☕️☕️☕️☕️</strong></p>
<p>'커피챗'이라는 용어는 많이 들어봤지만 실제로 진행해 본 것은 글또를 통해서가 처음이었습니다. 제가 먼저 신청한 적도 있고, 다른 분이 먼저 제안해주신 적도 있고, 글또에서 엮어준 기회도 있었는데 4번 모두 기억에 남는 시간이었습니다. 같은 프론트엔드 직군의 개발자들을 만나서 다양한 이야기를 나눈 것도 좋았고, 다른 직군 개발자분들은 어떤 고민을 하는지 들어보는 것도 좋았습니다. 한두시간의 대화에서도 인사이트를 얻을 수 있고, 또 제가 다른 분에게 인사이트를 줄 수 있다는 것도 즐거운 경험이었어요.</p>
<br>
<p><strong>독서모임</strong></p>
<p>다양한 커뮤니티 활동 중에 독서모임에도 참여했습니다. 책을 좋아하시고, 같은 개발직군이라 그런지 다른 독서모임보다 훨씬 공감가는 이야기를 나눌 수 있었어요. 서로 다른 책을 읽고 이야기를 나눴지만 전체적으로 같은 결의 이야기를 하게 되는 것이 신기했습니다. 확실히 비슷한 결의 사람들이 모여있는 커뮤니티라는 생각이 들었어요.</p>
<br>
<p><strong>반상회</strong></p>
<p><img decoding="async" loading="lazy" alt="반상회" src="https://sewonkimm-github-io.vercel.app/en/assets/images/%EB%B0%98%EC%83%81%ED%9A%8C-1071a0a733c5f70569651c08a0ebef17.jpg" width="1200" height="1200" class="img_ev3q"></p>
<p>글또 활동 막바지에 진행된 반상회도 재미있었습니다. 뭔가 연예인처럼 느껴지는 분들도 실제로 볼 수 있었어요.(쑥쓰러워 대화는 못해보았습니다만...) 블로그 SEO 향상에 관한 발표를 들으며 제 블로그에 google search console을 연결해놓아야겠다는 다짐을 했습니다. 그리고 1시간 정도 4명정도의 인원으로 네트워킹을 할 수 있는 시간도 정말 재미있었습니다. 같은 업계 사람들을 만나 네트워킹 할 수 있다는 것도 글또 활동의 큰 장점이라고 생각합니다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="before--after">Before &amp; After<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/9/review#before--after" class="hash-link" aria-label="Direct link to Before &amp; After" title="Direct link to Before &amp; After" translate="no">​</a></h2>
<p>지원서에 적었던 목표를 돌아보았습니다.</p>
<table><thead><tr><th>목표</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>주기적으로 글 쓰기</td><td>글을 쓰고 싶은 마음은 있으나, 미루는 습관이 있었습니다.(저항이 큰 사람ㅠㅠ)</td><td>글또 9기가 마무리 된 지금, 글 쓰기에 대한 저항은 여전히 있지만 그래도 그동안 미뤄왔던 글을 작성했습니다! 날씨가 좋아지면서 글 쓰기보다는 나가서 놀고 싶은 마음이 생겨서... 저항을 이겨내느라 힘들었지만 그래도 전반적으로 만족스럽습니다</td></tr><tr><td>글쓰는 노하우 배우기</td><td>그냥 썼습니다.</td><td>성윤님의 글쓰기 세미나를 통해 글쓰기에 대한 노하우를 배웠습니다. (역시 일단 쓰는 게 답이긴 합니다만) 좋은 글을 쓰려면 좋은 글을 많이 보아야겠다는 생각을 했는데 다른 분들의 글도 많이 볼 수 있는 환경이라 좋았습니다.</td></tr><tr><td>글쓰기를 좋아하는 친구를 만들어 더 즐겁게 글쓰기</td><td>몰래 글을 씁니다. 글쓰기를 주제로 이야기하고, 제 글을 피드백 받아본 경험이 없습니다.</td><td>글또 내에서 '친구'라고 부를 만한 관계를 형성하지는 못했지만 글쓰기에 대한 열정을 가진 분들을 만날 수는 있었습니다. 글쓰기 자체에 대해서 이야기해본 적은 없는 것 같아서 아쉽네요.</td></tr></tbody></table>
<p>목표하지 않은 항목에서도 큰 성과가 있었습니다. 주기적으로 블로그를 관리하게 되면서 GA를 연결하고, docusaurus 버전 업데이트와 플러그인을 추가했습니다. 블로그 버그들을 글또를 통해 발견하고 수정할 수 있었어요. 뜻밖의 순기능입니다!</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="방학이다-놀자">방학이다! 놀자(?)<a href="https://sewonkimm-github-io.vercel.app/en/blog/writing/geultto/9/review#%EB%B0%A9%ED%95%99%EC%9D%B4%EB%8B%A4-%EB%86%80%EC%9E%90" class="hash-link" aria-label="Direct link to 방학이다! 놀자(?)" title="Direct link to 방학이다! 놀자(?)" translate="no">​</a></h2>
<p>글또 9기가 끝나고 방학이 시작되었습니다. 요즘은 퇴근 후 자기계발은 싹 잊고 각종 콘텐츠에 빠져 즐겁게 살고 있는데요. 일단 짧고 소중한 봄은 신나게 즐기고, 다시 글쓰기에 도전해보려고 합니다. 제 삶에 변화를 이끌어 준 글또에 감사하고, 덕분에 만난 모든 인연에게도 감사드립니다. 글또 10기에서 또 만나요!👐</p>]]></content:encoded>
            <category>글또</category>
            <category>글쓰기</category>
            <category>회고</category>
        </item>
        <item>
            <title><![CDATA[Snackbar 컴포넌트 디자인; callback ref 활용법]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/dev/react/callback-ref</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/dev/react/callback-ref</guid>
            <pubDate>Sun, 31 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[최근 Snackbar 컴포넌트를 만들면서 callback ref를 사용하게 되었습니다. callback ref는 함수를 ref로 전달하는 방식입니다. 이 글에서는 callback ref를 사용하게 된 이유와 사용 사례를 컴포넌트 개발 사례를 통해 소개하고자 합니다.]]></description>
            <content:encoded><![CDATA[<p>최근 Snackbar 컴포넌트를 만들면서 <code>callback ref</code>를 사용하게 되었습니다. <code>callback ref</code>는 함수를 ref로 전달하는 방식입니다. 이 글에서는 <code>callback ref</code>를 사용하게 된 이유와 사용 사례를 컴포넌트 개발 사례를 통해 소개하고자 합니다.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>참고하세요</div><div class="admonitionContent_BuS1"><ul>
<li class=""><a href="https://react.dev/reference/react-dom/components/common#ref-callback" target="_blank" rel="noopener noreferrer" class="">ref callback function 에 대한 React 공식문서</a></li>
</ul></div></div>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="quest-snackbar-컴포넌트-제작하기">Quest! Snackbar 컴포넌트 제작하기<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/react/callback-ref#quest-snackbar-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%A0%9C%EC%9E%91%ED%95%98%EA%B8%B0" class="hash-link" aria-label="Direct link to Quest! Snackbar 컴포넌트 제작하기" title="Direct link to Quest! Snackbar 컴포넌트 제작하기" translate="no">​</a></h2>
<p>Snackbar 컴포넌트는 사용자에게 메시지를 보여주는 컴포넌트입니다. 사용자가 어떤 작업을 했을 때, 성공했는지 실패했는지 등을 알려주는 데 사용합니다.</p>
<p><img decoding="async" loading="lazy" alt="Snackbar" src="data:image/png;base64,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" width="411" height="113" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="말줄임표-처리-문제">말줄임표 처리 문제<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/react/callback-ref#%EB%A7%90%EC%A4%84%EC%9E%84%ED%91%9C-%EC%B2%98%EB%A6%AC-%EB%AC%B8%EC%A0%9C" class="hash-link" aria-label="Direct link to 말줄임표 처리 문제" title="Direct link to 말줄임표 처리 문제" translate="no">​</a></h3>
<p>제가 맞닥뜨린 문제는 Snackbar 컴포넌트의 내부 텍스트의 말줄임표 처리였습니다. 단순히 Snackbar 컴포넌트의 내부 메세지 텍스트에 max width값을 설정해 주어 ellipsis로 말 줄임 처리하면 해결되는 문제가 아니었기 때문입니다. Snackbar 컴포넌트 내부에 액션버튼이 있을 때, <strong>액션 버튼의 길이에 따라 내부 메세지 텍스트의 max width값이 동적으로 변경되어야 했습니다.</strong></p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:#d73a49">Snackbar</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter punctuation" style="color:#393A34">{</span><span class="token parameter"> message</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> action </span><span class="token parameter punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> classes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useStyles</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">root</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">width</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"fit-content"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">maxWidth</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"300px"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">message</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">width</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"fit-content"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// maxWidth: 'calc(100% - action 버튼의 크기에 따라 동적으로 변경)',</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">overflow</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"hidden"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">textOverflow</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ellipsis"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">whiteSpace</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"nowrap"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">action</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">maxWidth</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"100px"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">overflow</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"hidden"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">textOverflow</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ellipsis"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">whiteSpace</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"nowrap"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">classes</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">root</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">classes</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">message</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">classes</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">action</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">action</span><span class="token punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="시도-1-useeffect-의존성에-ref-객체를-주입하기">시도 1) useEffect 의존성에 ref 객체를 주입하기<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/react/callback-ref#%EC%8B%9C%EB%8F%84-1-useeffect-%EC%9D%98%EC%A1%B4%EC%84%B1%EC%97%90-ref-%EA%B0%9D%EC%B2%B4%EB%A5%BC-%EC%A3%BC%EC%9E%85%ED%95%98%EA%B8%B0" class="hash-link" aria-label="Direct link to 시도 1) useEffect 의존성에 ref 객체를 주입하기" title="Direct link to 시도 1) useEffect 의존성에 ref 객체를 주입하기" translate="no">​</a></h2>
<p>처음 생각했던 방법은 button 노드를 ref에 등록한 후, useEffect에 의존성을 주어서 액션 버튼의 크기가 변경될 때마다 버튼의 width값을 전달 받는 방법이었습니다.</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:#d73a49">Snackbar</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter punctuation" style="color:#393A34">{</span><span class="token parameter"> message</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> action </span><span class="token parameter punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> buttonRef </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useRef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">buttonWidth</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> setButtonWidth</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useState</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">useEffect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">buttonRef</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">current</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> width </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> buttonRef</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">current</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getBoundingClientRect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">width</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">setButtonWidth</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">buttonRef</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">classes</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">root</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">classes</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">message</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag script language-javascript" style="color:#00009f">          </span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag script language-javascript" style="color:#00009f">            </span><span class="token tag script language-javascript literal-property property" style="color:#36acaa">maxWidth</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript template-string template-punctuation string" style="color:#e3116c">`</span><span class="token tag script language-javascript template-string string" style="color:#e3116c">calc(100% - </span><span class="token tag script language-javascript template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token tag script language-javascript template-string interpolation" style="color:#00009f">buttonWidth</span><span class="token tag script language-javascript template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript template-string string" style="color:#e3116c">px)</span><span class="token tag script language-javascript template-string template-punctuation string" style="color:#e3116c">`</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag script language-javascript" style="color:#00009f">            </span><span class="token tag script language-javascript comment" style="color:#999988;font-style:italic">// action 버튼의 크기에 따라 동적으로 변경</span><span class="token tag script language-javascript" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag script language-javascript" style="color:#00009f">          </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag script language-javascript" style="color:#00009f">        </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">      </span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">buttonRef</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">classes</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">action</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">action</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="리렌더링-문제">리렌더링 문제<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/react/callback-ref#%EB%A6%AC%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%AC%B8%EC%A0%9C" class="hash-link" aria-label="Direct link to 리렌더링 문제" title="Direct link to 리렌더링 문제" translate="no">​</a></h3>
<p>이때의 렌더링 순서는 다음과 같습니다.</p>
<ol>
<li class="">buttonWidth state가 0인 상태로 컴포넌트 렌더링</li>
<li class="">buttonRef가 등록되면서 useEffect가 실행되어 buttonWidth를 계산</li>
<li class="">buttonWidth state가 변경되면서 컴포넌트 리렌더링</li>
</ol>
<p>이런 동작 방식 때문에 컴포넌트가 두 번 렌더링 되는 문제가 발생했습니다. 그래서 useEffect의 의존성에 ref 객체를 주입하는 것은 올바른 해결책이 아니라는 생각이 들었고, 이 문제를 해결하기 위해 <code>callback ref</code>를 사용하게 되었습니다.</p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="시도-2-callback-ref-사용한-usedimension-hook">시도 2) callback ref 사용한 useDimension hook<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/react/callback-ref#%EC%8B%9C%EB%8F%84-2-callback-ref-%EC%82%AC%EC%9A%A9%ED%95%9C-usedimension-hook" class="hash-link" aria-label="Direct link to 시도 2) callback ref 사용한 useDimension hook" title="Direct link to 시도 2) callback ref 사용한 useDimension hook" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="callback-ref">callback ref<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/react/callback-ref#callback-ref" class="hash-link" aria-label="Direct link to callback ref" title="Direct link to callback ref" translate="no">​</a></h3>
<p><code>callback ref</code>는 함수를 ref로 전달하는 방식입니다. ref 객체를 생성하고, 해당 ref 객체를 컴포넌트의 ref 속성에 전달하는 대신, 함수를 ref 속성에 전달합니다. DOM 노드가 화면에 추가되면 ref 속성은 전달된 callback 함수를 호출하고, DOM 노드를 인수로 전달합니다.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="usedimension-hook">useDimension hook<a href="https://sewonkimm-github-io.vercel.app/en/blog/dev/react/callback-ref#usedimension-hook" class="hash-link" aria-label="Direct link to useDimension hook" title="Direct link to useDimension hook" translate="no">​</a></h3>
<p>DOM 노드가 화면에 추가될 때, width 값을 업데이트해주면 컴포넌트가 리렌더링 되는 문제를 해결할 수 있을 것이라고 생각했습니다. 그래서 인수로 전달받은 DOM 노드의 width와 height를 반환하는 <code>useDimension</code> hook을 만들었습니다.</p>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token class-name">useDimensionReturn</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  width</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> nullableNumber</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  height</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> nullableNumber</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function-variable function" style="color:#d73a49">ref</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">HTMLElement</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> useDimension </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> useDimensionReturn </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> setWidth</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:#d73a49">useState</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name builtin">number</span><span class="token generic-function generic class-name"> </span><span class="token generic-function generic class-name operator" style="color:#393A34">|</span><span class="token generic-function generic class-name"> </span><span class="token generic-function generic class-name keyword" style="color:#00009f">null</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">height</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> setHeight</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:#d73a49">useState</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name builtin">number</span><span class="token generic-function generic class-name"> </span><span class="token generic-function generic class-name operator" style="color:#393A34">|</span><span class="token generic-function generic class-name"> </span><span class="token generic-function generic class-name keyword" style="color:#00009f">null</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// useCallback을 사용한 ref 함수</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ref </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useCallback</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">HTMLElement</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">setWidth</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getBoundingClientRect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">width</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">setHeight</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getBoundingClientRect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">height</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> width</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ref </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token plain"> useDimension</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<br>
<p>Snackbar 컴포넌트에는 다음과 같이 사용할 수 있습니다.</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:#d73a49">Snackbar</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter punctuation" style="color:#393A34">{</span><span class="token parameter"> message</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> action </span><span class="token parameter punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">width</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> buttonWidth</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">ref</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> buttonRef </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useDimension</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">classes</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">root</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">classes</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">message</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag script language-javascript" style="color:#00009f">          </span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag script language-javascript" style="color:#00009f">            </span><span class="token tag script language-javascript literal-property property" style="color:#36acaa">maxWidth</span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript template-string template-punctuation string" style="color:#e3116c">`</span><span class="token tag script language-javascript template-string string" style="color:#e3116c">calc(100% - </span><span class="token tag script language-javascript template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token tag script language-javascript template-string interpolation" style="color:#00009f">buttonWidth</span><span class="token tag script language-javascript template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript template-string string" style="color:#e3116c">px)</span><span class="token tag script language-javascript template-string template-punctuation string" style="color:#e3116c">`</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag script language-javascript" style="color:#00009f">          </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag script language-javascript" style="color:#00009f"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token tag script language-javascript" style="color:#00009f">        </span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span><br></div><div class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">      </span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">buttonRef</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">classes</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">action</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">action</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>이렇게 하면 ref가 변경되어도 컴포넌트가 리렌더링 되지 않아서 불필요한 리렌더링을 방지할 수 있습니다.</p>
<hr>
<p>ref를 단순히 DOM 노드에 접근하는 변수, 컴포넌트 렌더링에 영향을 미치지 않는 변수로만 생각했었는데, Snackbar 컴포넌트를 구현하며 ref를 활용하는 방법에 대해 배울 수 있었습니다. 이 글이 ref의 활용을 배우는 데에 많은 도움이 되었으면 좋겠습니다. 감사합니다.</p>]]></content:encoded>
            <category>개발</category>
            <category>React</category>
        </item>
        <item>
            <title><![CDATA[끝날 때까지 끝난 게 아니다]]></title>
            <link>https://sewonkimm-github-io.vercel.app/en/blog/article/90percent</link>
            <guid>https://sewonkimm-github-io.vercel.app/en/blog/article/90percent</guid>
            <pubDate>Fri, 15 Mar 2024 01:50:00 GMT</pubDate>
            <description><![CDATA[릴리즈를 하면 개발자의 일이 끝난 걸까요? 지난 3년 간 10여 번의 크고 작은 릴리즈를 경험하면서 느낀 점은 '끝날 때까지 끝난 게 아니다'였습니다.]]></description>
            <content:encoded><![CDATA[<p>릴리즈를 하면 개발자의 일이 끝난 걸까요? 지난 3년 간 10여 번의 크고 작은 릴리즈를 경험하면서 느낀 점은 '끝날 때까지 끝난 게 아니다'였습니다.</p>
<p><img decoding="async" loading="lazy" alt="끝날 때까지 끝난 게 아니다" src="https://sewonkimm-github-io.vercel.app/en/assets/images/end-883d44a66c5d6c204f7c2c8a4a92beb0.jpg" width="1200" height="786" class="img_ev3q"></p>
<p>어찌 보면 당연한(?) 말인데요. 처음에는 <code>릴리즈 === 끝</code>이라고 생각했습니다. 개발 기간 동안 야근한 나를 위로하기 위해 긴 휴가를 보내거나 하릴없이 월급 루팡을 하기도 했고요. 하지만 정말 프로젝트를 매조지기 위해서 해야 할 일들이 있고, 코드 개발에 비해 개발자들이 놓치기 쉽고 귀찮은 작업들이 많습니다.</p>
<p>우연히 읽게 된 <code>Stopping at 90%</code>라는 글에 굉장히 공감했고, 이것이 비단 개발자들만의 문제는 아니라는 점도 흥미로웠습니다. 글을 소개하며 저도 지금까지 프로젝트들을 잘 마무리해왔는지 되돌아보려고 하는데요. 이 글을 읽는 분들도 하고 계신 일을 완전히 매듭짓는 데 이 글이 도움이 되었으면 좋겠습니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="stopping-at-90">Stopping at 90%<a href="https://sewonkimm-github-io.vercel.app/en/blog/article/90percent#stopping-at-90" class="hash-link" aria-label="Direct link to Stopping at 90%" title="Direct link to Stopping at 90%" translate="no">​</a></h2>
<blockquote>
<p>이 글은 Austin Z. Henley의 포스트 <a href="https://austinhenley.com/blog/90percent.html" target="_blank" rel="noopener noreferrer" class="">Stopping at 90%</a>을 번역한 글입니다.</p>
</blockquote>
<p>프로젝트를 막 마무리 했습니다.</p>
<p>4개월 동안 소프트웨어 시스템을 구축하고, 실험을 진행하고, 논문을 작성해 저널에 출판을 위해 제출하였습니다. 이제 할 일이 끝났습니다. 끝. 그렇죠?</p>
<p>아니요! 저는 이것을 <strong>90%에서 멈추기</strong>라고 합니다.</p>
<p>핵심 프로젝트는 완료되었지만 아직 할 일이 많이 남아 있습니다. 아무도 남은 할 일에 대해 모르거나 하려고 하지 않는다면 절대 일어나지 않을 일들입니다. 이렇게 마무리된다면 그것은 잘못된 마무리입니다.</p>
<p>이것은 비단 연구 논문 작성에만 발생하는 문제가 아닙니다. 당신이 출시한 iOS 앱, GitHub에 올린 개인 레포지토리, 회사에 제출할 보고서, 귀여운 강아지 그림을 그리는 사이드 프로젝트 등 모든 프로젝트에서 발생할 수 있습니다.</p>
<p>저는 이 현상을 어디에서나 발견했고, 어느 누구도 문제 발생에서 자유로울 수 없습니다.</p>
<p>핵심 프로젝트는 쉽게 측정할 수 있는 구체적인 결과물이 있는 반면, 나머지 10%의 할 일은 추적이 어렵고 명확한 중단 지점이 없는 경우가 많기 때문에 90%에서 멈추는 경우가 많습니다. (쉽게 측정할 수 있는 구체적인 결과물에는 예를 들어, 시스템 성능을 개선, 논문 제출 등이 있습니다.)</p>
<p>90%에서 100%로 가려면 무엇을 해야 할까요?</p>
<ul>
<li class="">다른 팀에게 한 일을 발표합니다.</li>
<li class="">조직 내의 다른 사람들이 알 수 있도록 요점을 정리한 이메일을 발송합니다.</li>
<li class="">동료들이 나중에 활용할 수 있도록 코드를 저장합니다.</li>
<li class="">블로그 게시물을 작성합니다. 트위터, HN, Reddit에 글을 올립니다.</li>
<li class="">계속 진행할 계획이 없더라도 다음에 무엇을 할 것인지, 그 이유는 무엇인지 설명하는 문서를 작성합니다.</li>
<li class="">도움이 될 수 있는 비슷한 프로젝트를 찾아봅니다.</li>
<li class="">본인의 작업물에 허점을 찾아낼 수 있는 사람을 찾습니다. 그리고 그 문제를 해결하세요.</li>
</ul>
<p>전파, 문서화, 고도화는 핵심 프로젝트만큼이나 중요합니다.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="나는-95쯤">나는 95%쯤...?<a href="https://sewonkimm-github-io.vercel.app/en/blog/article/90percent#%EB%82%98%EB%8A%94-95%EC%AF%A4" class="hash-link" aria-label="Direct link to 나는 95%쯤...?" title="Direct link to 나는 95%쯤...?" translate="no">​</a></h2>
<p>저는 문서화와 전파를 중요하게 생각합니다. 일하는 인원에 교체가 있더라도 문제없이 잘 돌아갈 수 있는 시스템을 만들어 놓아야 한다고 생각합니다. 그러기 위해서는 이런 문서화 작업들이 필수적이라고 생각해서 몇 가지 작업들을 해놓았습니다.</p>
<p><img decoding="async" loading="lazy" alt="체크 리스트" src="https://sewonkimm-github-io.vercel.app/en/assets/images/checkList-a9de851f5c79e2e5f42fc9b31c1df6cb.png" width="1200" height="760" class="img_ev3q"></p>
<p>먼저 릴리즈가 끝나면 체크리스트를 보며 빠뜨린 것이 없는지 확인합니다.</p>
<p><img decoding="async" loading="lazy" alt="작성중 문서 체크" src="https://sewonkimm-github-io.vercel.app/en/assets/images/ingList-aa86a181515e22e624a76fcad2cd4819.jpg" width="1200" height="312" class="img_ev3q"></p>
<p>그리고 작성중인 글들을 확인하고, 문서화를 마무리합니다. 노션에 작성하는 문서는 하나의 데이터베이스에만 작성해서 관리하기 때문에 '상태' 값을 통해 작성중인 문서를 쉽게 확인할 수 있습니다.</p>
<p><img decoding="async" loading="lazy" alt="리마인더" src="https://sewonkimm-github-io.vercel.app/en/assets/images/updateList-8a3133ca6c692a33501a5905b9c817db.jpg" width="1200" height="763" class="img_ev3q"></p>
<p>작성 중인 글들을 완성하고 나면, 이전에 작성 완료된 문서들을 쭉 돌아보며 갱신이 필요한 부분이 있는지 확인합니다. 노션 데이터베이스의 '수식' 기능을 사용해 얼마나 방치된 문서인지 확인합니다.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>사용한 노션 수식</div><div class="admonitionContent_BuS1"><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">dateBetween(now(), prop("마지막 업데이트"), "days")</span><br></div></code></pre></div></div></div></div>
<p>위와 같은 나머지 10%에 해당하는 작업은 개발에 비해 우선순위가 떨어집니다. 그리고 당장하지 않아도 크게 문제되지 않아요. 굉장히 귀찮습니다. 하지만 이런 작업들을 릴리즈가 끝난 시점에 하지 않으면 다음 기회는 없습니다.</p>
<p>그래도 릴리즈 이후 이런 작업들을 하는 버릇이 들어 완성도가 95%정도는 되지 않나...라고 생각해봅니다. 앞으로는 문서화 외에도 다른 팀과 작업 내용에 대한 기술적 교류, 비슷한 프로젝트를 탐구해보고 비교하기, 작업물 개선 등을 시도해서 나머지 5%를 채워보아야겠습니다.</p>]]></content:encoded>
            <category>번역</category>
        </item>
    </channel>
</rss>