<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>강승현입니다</title>
    <link>https://code1995.tistory.com/</link>
    <description>개발과 관련된 다양한 정보를 몰입감있게 전달합니다.</description>
    <language>ko</language>
    <pubDate>Sun, 14 Jun 2026 17:20:06 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>CODe_</managingEditor>
    <image>
      <title>강승현입니다</title>
      <url>https://tistory1.daumcdn.net/tistory/1819996/attach/ff5c0db2815d4490aac352c6414806b5</url>
      <link>https://code1995.tistory.com</link>
    </image>
    <item>
      <title>개떡같이 말해도 찰떡같이 답변하는 RAG - 한글 문서는 왜 파싱부터 다른가</title>
      <link>https://code1995.tistory.com/137</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TL;DR:&amp;nbsp;RAG&amp;nbsp;파이프라인에서&amp;nbsp;파싱은&amp;nbsp;문서를&amp;nbsp;깨끗한&amp;nbsp;텍스트로&amp;nbsp;바꾸는&amp;nbsp;첫&amp;nbsp;단계다.&amp;nbsp;영어는&amp;nbsp;공백으로&amp;nbsp;단어가&amp;nbsp;나뉘지만,&amp;nbsp;한글은&amp;nbsp;조사와&amp;nbsp;어미가&amp;nbsp;어근에&amp;nbsp;달라붙어&amp;nbsp;형태소&amp;nbsp;분석&amp;nbsp;없이는&amp;nbsp;제대로&amp;nbsp;된&amp;nbsp;토큰화가&amp;nbsp;불가능하다.&amp;nbsp;파싱을&amp;nbsp;대충&amp;nbsp;넘기면&amp;nbsp;한&amp;nbsp;문단&amp;nbsp;중간에서&amp;nbsp;청크가&amp;nbsp;잘려&amp;nbsp;맥락이&amp;nbsp;끊기고,&amp;nbsp;조사가&amp;nbsp;붙은&amp;nbsp;채로&amp;nbsp;임베딩되어&amp;nbsp;벡터&amp;nbsp;거리가&amp;nbsp;벌어지며,&amp;nbsp;&quot;배포&quot;를&amp;nbsp;검색해도&amp;nbsp;&quot;배포를&quot;이&amp;nbsp;포함된&amp;nbsp;문서가&amp;nbsp;누락된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;파싱, 대충 해도 되지 않을까&quot; data-ke-size=&quot;size26&quot;&gt;파싱, 대충 해도 되지 않을까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG를&amp;nbsp;처음&amp;nbsp;만들&amp;nbsp;때,&amp;nbsp;대부분의&amp;nbsp;튜토리얼은&amp;nbsp;영어&amp;nbsp;PDF&amp;nbsp;몇&amp;nbsp;장을&amp;nbsp;LangChain에&amp;nbsp;넣는&amp;nbsp;것으로&amp;nbsp;시작한다.&amp;nbsp;코드&amp;nbsp;몇&amp;nbsp;줄이면&amp;nbsp;문서가&amp;nbsp;벡터로&amp;nbsp;변환되고,&amp;nbsp;질문을&amp;nbsp;던지면&amp;nbsp;답이&amp;nbsp;나온다.&amp;nbsp;&quot;생각보다&amp;nbsp;쉬운데?&quot;&amp;nbsp;싶다.&lt;br /&gt;&lt;br /&gt;그런데&amp;nbsp;사내&amp;nbsp;위키를&amp;nbsp;넣으려고&amp;nbsp;하면&amp;nbsp;이야기가&amp;nbsp;달라진다.&amp;nbsp;Confluence에서&amp;nbsp;가져온&amp;nbsp;문서에는&amp;nbsp;HTML&amp;nbsp;태그가&amp;nbsp;잔뜩&amp;nbsp;섞여&amp;nbsp;있고,&amp;nbsp;표는&amp;nbsp;파싱&amp;nbsp;과정에서&amp;nbsp;행&amp;middot;열&amp;nbsp;구조가&amp;nbsp;사라지고&amp;nbsp;셀&amp;nbsp;안의&amp;nbsp;숫자만&amp;nbsp;나열된다.&amp;nbsp;거기에&amp;nbsp;한글이라는&amp;nbsp;변수가&amp;nbsp;더해진다.&amp;nbsp;&quot;배포&amp;nbsp;절차&quot;를&amp;nbsp;검색하면&amp;nbsp;&quot;배포를&quot;,&amp;nbsp;&quot;배포에서&quot;,&amp;nbsp;&quot;배포했던&quot;&amp;nbsp;같은&amp;nbsp;조사&amp;nbsp;붙은&amp;nbsp;표현은&amp;nbsp;매칭이&amp;nbsp;안&amp;nbsp;되는&amp;nbsp;상황이&amp;nbsp;벌어진다.&lt;br /&gt;&lt;br /&gt;결국&amp;nbsp;파싱은&amp;nbsp;RAG&amp;nbsp;파이프라인에서&amp;nbsp;가장&amp;nbsp;먼저&amp;nbsp;마주하는&amp;nbsp;단계이면서,&amp;nbsp;가장&amp;nbsp;과소평가되는&amp;nbsp;단계이기도&amp;nbsp;하다.&amp;nbsp;이&amp;nbsp;글에서는&amp;nbsp;파싱이&amp;nbsp;왜&amp;nbsp;중요한지,&amp;nbsp;한글에서는&amp;nbsp;왜&amp;nbsp;유독&amp;nbsp;까다로운지,&amp;nbsp;그리고&amp;nbsp;어떤&amp;nbsp;도구를&amp;nbsp;쓸&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;정리한다.&lt;/p&gt;
&lt;h2 data-heading=&quot;RAG 파이프라인에서 파싱의 위치&quot; data-ke-size=&quot;size26&quot;&gt;RAG 파이프라인에서 파싱의 위치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG의&amp;nbsp;오프라인&amp;nbsp;인덱싱&amp;nbsp;파이프라인은&amp;nbsp;다섯&amp;nbsp;단계로&amp;nbsp;나뉜다.&lt;br /&gt;&lt;br /&gt;문서&amp;nbsp;수집&amp;nbsp;&amp;rarr;&amp;nbsp;파싱&amp;nbsp;&amp;rarr;&amp;nbsp;청킹&amp;nbsp;&amp;rarr;&amp;nbsp;임베딩&amp;nbsp;&amp;rarr;&amp;nbsp;벡터&amp;nbsp;저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RMYFs/dJMcajhjHu6/1NHCH0d8gjMIGk6CAytQw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RMYFs/dJMcajhjHu6/1NHCH0d8gjMIGk6CAytQw1/img.png&quot; data-alt=&quot;그림 1 : RAG 오프라인 인덱싱 파이프라인에서 파싱의 위치. 파싱은 문서 수집 직후, 청킹 직전에 위치한다. 비정형 문서(HTML, PDF 등)를 깨끗한 텍스트로 변환하는 역할이며, 이 단계의 품질이 후속 단계 전체에 영향을 준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RMYFs/dJMcajhjHu6/1NHCH0d8gjMIGk6CAytQw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRMYFs%2FdJMcajhjHu6%2F1NHCH0d8gjMIGk6CAytQw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;309&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 1 : RAG 오프라인 인덱싱 파이프라인에서 파싱의 위치. 파싱은 문서 수집 직후, 청킹 직전에 위치한다. 비정형 문서(HTML, PDF 등)를 깨끗한 텍스트로 변환하는 역할이며, 이 단계의 품질이 후속 단계 전체에 영향을 준다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파싱(Parsing)이 하는 일은 비정형 문서에서 깨끗한 텍스트를 뽑아내는 것이다. 다만 문서를 가져오는 방식에 따라 파싱의 무게가 달라진다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사내 위키를 예로 들면, HTML을 통째로 가져오는 방법만 있는 것은 아니다. Confluence REST API는 storage format(XHTML 기반)이나 렌더링된 본문을 직접 반환하고, Notion API는 블록 단위의 JSON 구조를 준다. API로 가져오면 네비게이션이나 푸터 같은 노이즈가 애초에 포함되지 않기 때문에 HTML 태그를 일일이 걷어내는 작업이 크게 줄어든다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다고 파싱이 필요 없어지는 것은 아니다. API 응답이든 HTML이든, 텍스트를 정제하는 과정은 공통으로 필요하다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;0&quot;&gt;&lt;b&gt;문서 구조 처리&lt;/b&gt;: HTML이면 태그를 정리하고, API 응답이면 JSON/XHTML에서 본문을 추출한다. 어느 쪽이든 제목 계층(&amp;lt;h1&amp;gt;~&amp;lt;h6&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는 heading 블록)은 보존해야 한다&lt;/li&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;1&quot;&gt;&lt;b&gt;노이즈 필터링&lt;/b&gt;: HTML 경로에서는 네비게이션, 광고, 푸터를 제거한다. API 경로에서는 이 작업이 대부분 불필요하다&lt;/li&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;2&quot;&gt;&lt;b&gt;인코딩 처리&lt;/b&gt;: 깨진 문자, 특수 문자를 정규화한다. 특히 레거시 한국어 문서에서 흔한 EUC-KR 인코딩은 UTF-8로 변환하지 않으면 파싱 전체가 깨진다&lt;/li&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;3&quot;&gt;&lt;b&gt;텍스트 정제&lt;/b&gt;: 연속 공백 제거, 줄바꿈 정리 등 텍스트를 깔끔하게 만든다&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점이 하나 있다. HTML 태그를 무분별하게 제거하면 오히려 문맥이 깨진다는 것이다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;h2&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;태그를 제거하면 제목과 본문이 뒤섞여 &quot;배포 절차&quot;라는 제목 아래의 내용이 다른 섹션의 내용과 합쳐져버린다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;제목 태그를 마크다운 헤딩(##)으로 변환하는 것이 단순 제거보다 낫다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파싱이 엉망이면 이후 과정도 엉망이 된다. 제목과 본문이 하나로 합쳐진 텍스트를 청킹하면 한 청크 안에 서로 다른 주제가 섞이고, 그 상태로 임베딩하면 &quot;배포 절차&quot;와 &quot;모니터링 설정&quot;이 같은 벡터 공간에 놓인다. 검색할 때 &quot;배포&quot;를 입력해도 모니터링 문서가 함께 올라오는 식이다. 파이프라인에서 가장 앞에 있기 때문에, 여기서 생긴 오류는 뒤에서 복구할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점이 하나 있다. HTML 태그를 무분별하게 제거하면 오히려 문맥이 무너진다는 것이다. &amp;lt;h2&amp;gt; 태그를 제거하면 제목과 본문이 뒤섞여 &quot;배포 절차&quot;라는 제목 아래의 내용이 다른 섹션의 내용과 합쳐져버린다. 제목 태그를 마크다운 헤딩(##)으로 변환하는 것이 단순 제거보다 낫다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암튼 그래서 파싱이 엉망이면 이후에 기대하는 결과가 나오지 않을 것이다. 청킹 경계가 의미 단위와 맞지 않게 되고, 임베딩 벡터가 왜곡되며, 검색 결과는 쓸모없어진다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt;(AI가 그림에서 쓰레기라고 표현했다..)&lt;/s&gt;&lt;/span&gt; 파이프라인에서 가장 앞에 있기 때문에, 여기서 생긴 오류는 뒤에서 복구할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-heading=&quot;영어와 한글, 토큰화부터 다르다&quot; data-ke-size=&quot;size26&quot;&gt;영어와 한글, 토큰화부터 다르다&lt;/h2&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파싱의 핵심 단계 중 하나가 토큰화(Tokenization)다. 텍스트를 의미 있는 단위로 쪼개는 것이다. 여기서 영어와 한글의 근본적인 차이가 드러난다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어는 단순하다. 공백으로 자르면 된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&quot;I read a book&quot; &amp;rarr; [&quot;I&quot;, &quot;read&quot;, &quot;a&quot;, &quot;book&quot;]&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단어 사이에 공백이 있고, 공백이 곧 토큰 경계다. 물론 영어에도 복수형(-s), 과거형(-ed) 같은 변화가 있지만, 공백 분리만으로도 대부분의 NLP 태스크에서 충분히 작동한다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글은 다르다. 공백으로 자르면 이런 결과가 나온다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&quot;나는 책을 읽었다&quot; &amp;rarr; [&quot;나는&quot;, &quot;책을&quot;, &quot;읽었다&quot;]&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼핏 보면 괜찮아 보인다. 하지만 &quot;나는&quot;은 &quot;나&quot;(대명사) + &quot;는&quot;(조사)이 합쳐진 것이고, &quot;책을&quot;은 &quot;책&quot;(명사) + &quot;을&quot;(조사), &quot;읽었다&quot;는 &quot;읽&quot;(어간) + &quot;었&quot;(과거 시제 선어말어미) + &quot;다&quot;(종결어미)다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글은 교착어(Agglutinative Language)다. 어근에 조사와 어미가 결합해서 하나의 어절을 이룬다. &quot;책&quot;이라는 단어 하나가 &quot;책이&quot;, &quot;책을&quot;, &quot;책에&quot;, &quot;책으로&quot;, &quot;책에서&quot;, &quot;책이었던&quot;, &quot;책이라면&quot;, &quot;책에서부터&quot; 등 수많은 표면형으로 변한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;875&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Zhtt/dJMcagLI1QX/kPVGP3Z86zkKRfTkkkrvK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Zhtt/dJMcagLI1QX/kPVGP3Z86zkKRfTkkkrvK0/img.png&quot; data-alt=&quot;그림 2: 영어와 한글의 토큰화 차이. 영어는 공백 분리만으로 의미 단위가 나뉘지만, 한글은 공백으로 나눠도 조사와 어미가 어근에 붙어 있다. 형태소 분석을 거쳐야 &amp;quot;나/는&amp;quot;, &amp;quot;책/을&amp;quot;, &amp;quot;읽/었/다&amp;quot;처럼 의미 단위로 분리된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Zhtt/dJMcagLI1QX/kPVGP3Z86zkKRfTkkkrvK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Zhtt%2FdJMcagLI1QX%2FkPVGP3Z86zkKRfTkkkrvK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;492&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;875&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 2: 영어와 한글의 토큰화 차이. 영어는 공백 분리만으로 의미 단위가 나뉘지만, 한글은 공백으로 나눠도 조사와 어미가 어근에 붙어 있다. 형태소 분석을 거쳐야 &quot;나/는&quot;, &quot;책/을&quot;, &quot;읽/었/다&quot;처럼 의미 단위로 분리된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이가 RAG에서 실제로 문제를 일으킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;먼저 BM25 검색을 보자. BM25(Best Matching 25)는 단어의 출현 빈도와 문서 길이를 기반으로 관련도를 계산하는 키워드 검색 알고리즘이다. &lt;b&gt;벡터 검색과 함께 RAG에서 가장 많이 쓰이는 검색 방식&lt;/b&gt;이기도 하다. 문제는 BM25가 토큰 단위로 매칭한다는 것이다. 사용자가 &quot;배포&quot;를 검색하면, 문서에 있는 &quot;배포를&quot;, &quot;배포에서&quot;, &quot;배포했던&quot;은 다른 토큰으로 취급되어 매칭이 안 된다. 형태소 분석 없이 공백 기반으로 BM25를 돌렸을 때와 형태소 분석기를 적용했을 때 검색 F1 점수가 0.667에서 0.798로 올라간다(공개 한국어 QA 벤치마크 기준이며, 도메인에 따라 편차가 있다).&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;여기서 놓치기 쉬운 점이 하나 있다. 검색 쿼리에도 동일한 형태소 분석기를 적용해야 인덱스와 매칭이 일관된다는 것이다. 문서만 분석하고 쿼리는 공백으로 자르면 효과가 반감된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;임베딩에서도 문제가 있다. 현대 임베딩 모델은 서브워드 토큰화(Subword Tokenization)를 쓰기 때문에 공백 분리에 직접 의존하지는 않는다. 하지만 한글에서는 BPE(Byte Pair Encoding) 과분절 문제가 발생한다. &quot;우두머리&quot;가 &quot;우두&quot;+&quot;머리&quot;로 쪼개져 의미가 파괴되는 식이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;형태소 경계를 미리 알려주면 이 문제를 완화할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;물&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;론 text-embedding-3 같은 최신 임베딩 모델은 한국어를 이전보다 훨씬 잘 처리한다. 벡터 검색만 사용하는 소규모 RAG라면 형태소 분석 없이도 어느 정도 작동하는 경우가 있다. 하지만 BM25를 함께 쓰는 하이브리드 검색에서는 형태소 분석이 여전히 필수이고, 임베딩에서도 정제된 텍스트를 넣는 것이 노이즈가 섞인 원문을 그대로 넣는 것보다 결과가 안정적이다. 벡터 검색 단독으로 시작하고, BM25를 추가하는 시점에 형태소 분석을 도입하는 것도 합리적인 접근이다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-heading=&quot;다른 언어는 어떨까&quot; data-ke-size=&quot;size26&quot;&gt;다른 언어는 어떨까&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글만 유독 까다로운 것은 아니다. 다른 언어들도 각자의 파싱 난이도를 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일본어&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;는 세 가지 문자 체계(히라가나, 가타카나, 한자)가 섞여 있고, 단어 사이에 공백이 거의 없다. &quot;東京タワーに行きました&quot;처럼 한자와 가나가 연속으로 이어진다. 별도의 분절기(MeCab-IPAdic 등)가 필수다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중국어&lt;/b&gt;도 단어 사이에 공백이 없다. &quot;我去北京了&quot;에서 &quot;我/去/北京/了&quot;로 분절해야 한다. jieba 같은 분절 라이브러리를 쓴다. 다만 한 글자가 독립적 의미를 가지는 경우가 많아 분절 실패의 영향이 한글보다는 적다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;독일어&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;는 복합어가 유명하다. &quot;Donaudampfschifffahrtsgesellschaft&quot;(도나우 증기 선박 항해 회사)처럼 단어를 끝없이 붙여 쓴다. 복합어 분해(decompounding)가 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;한글의 특수한 점은 공백은 존재하지만, 공백 단위가 의미 단위가 아니라는 것이다. 일본어와 중국어는 공백 자체가 없어서 분절이 필요하다는 게 명확하다. 독일어는 복합어를 제외하면 공백 분리가 잘 작동한다. 반면 한글은 공백이 있어서 &quot;그냥 공백으로 자르면 되겠지&quot;라는 착각을 유발한다. 결국 형태소 분석이라는 추가 단계를 거쳐야 한다는 점을 인식하는 것 자체가 첫 번째 과제다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-heading=&quot;한글 파싱을 위한 도구들&quot; data-ke-size=&quot;size26&quot;&gt;한글 파싱을 위한 도구들&lt;/h2&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글 RAG 파이프라인에서 파싱은 크게 두 레이어로 나뉜다. 문서에서 텍스트를 추출하는 문서 파싱 레이어와, 한국어 텍스트를 정제하는 형태소 분석 레이어다.&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-heading=&quot;문서 파싱&quot; data-ke-size=&quot;size23&quot;&gt;문서 파싱&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서를 가져오는 경로에 따라 도구가 달라진다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;API 기반 (Confluence, Notion 등)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;위키 플랫폼이 API를 제공한다면 가장 깔끔한 경로다. LangChain의 &lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;ConfluenceLoader는 Confluence REST API를 통해 페이지 본문을 직접 가져온다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;NotionDBLoader도 마찬가지다. API 응답은 이미 구조화되어 있어서 HTML 태그를 직접 다룰 일이 줄어든다. 다만 Confluence Cloud와 Server/DC는 API 엔드포인트가 다르므로 환경에 맞게 설정해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;b&gt;HTML 직접 파싱&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;API가 없거나 HTML을 직접 처리해야 하는 경우에는&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;BeautifulSoup4&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;가 기본이다.&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;lxml&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;파서를 쓰면 빠르고,&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;html5lib을 쓰면 브라우저와 동일하게 해석한다. 주의할 점은 동일한 잘못된 HTML에 대해 파서마다 다른 결과를 만든다는 것이다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;# pip install beautifulsoup4 lxml
from bs4 import BeautifulSoup

html = &quot;&amp;lt;h2&amp;gt;배포 절차&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;서버에 접속하여...&amp;lt;/p&amp;gt;&quot;
soup = BeautifulSoup(html, &quot;lxml&quot;)
# 태그를 전부 제거하지 말고, 구조를 보존하면서 텍스트를 추출한다
for tag in soup.find_all([&quot;h1&quot;, &quot;h2&quot;, &quot;h3&quot;]):
    tag.string = f&quot;\n## {tag.get_text()}\n&quot;
text = soup.get_text(separator=&quot;\n&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비정형 문서 (PDF, DOCX 등)&lt;/b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Unstructured.io&lt;/b&gt;는 PDF, 이미지, DOCX 등 다양한 포맷을 파싱하는 라이브러리다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;partition_html(url=&quot;...&quot;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;하나로 웹 페이지를 구조화된 요소(제목, 본문, 목록 등)로 분해한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;다만 오픈소스 버전의 한국어 지원 완성도는 영어보다 낮다. 특히 스캔 PDF에서는 OCR 품질을 별도로 검증해야 한다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다이어그램과 구조화된 비텍스트 데이터&lt;/b&gt;. 텍스트와 HTML만 파싱하면 끝이 아니다. 사내 위키에는 Mermaid, PlantUML, draw.io 같은 다이어그램이 포함되어 있는 경우가 많고, 이 안에 담긴 정보가 오히려 핵심인 경우도 있다. 아키텍처 구조도, 배포 흐름도, 시스템 간 연결 관계 같은 내용이 텍스트가 아닌 다이어그램에만 존재하는 경우다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 데이터는 100% 원본 그대로 저장하기 어렵지만, 검색 대상으로 포함시키려면 텍스트로 변환하는 과정이 필요하다. 접근 방식은 포맷에 따라 다르다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;0&quot;&gt;&lt;b&gt;Mermaid, PlantUML&lt;/b&gt;: 코드 기반 다이어그램이라 원본 코드 자체를 텍스트로 보존하면 된다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;graph TD; A--&amp;gt;B&lt;span&gt;&amp;nbsp;&lt;/span&gt;같은 코드에 노드명과 관계가 그대로 담겨 있어서 별도 변환 없이도 검색에 걸린다&lt;/li&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;1&quot;&gt;&lt;b&gt;draw.io&lt;/b&gt;: XML 기반이라 다른 접근이 필요하다. Confluence에서는 API로&lt;span&gt;&amp;nbsp;&lt;/span&gt;.drawio&lt;span&gt;&amp;nbsp;&lt;/span&gt;첨부파일을 다운로드한 뒤, XML을 파싱하여 노드 목록과 연결 관계를 텍스트로 추출한다. 이때 draw.io 특유의 플레이스홀더(%name%&lt;span&gt;&amp;nbsp;&lt;/span&gt;등)를 실제 텍스트로 치환하는 과정을 거쳐야 의미 있는 결과가 나온다&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다이어그램 파싱은 일반 텍스트 파싱과 달리 표준 도구가 거의 없다. 포맷별로 파서를 직접 구현해야 하는 경우가 대부분이다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-heading=&quot;형태소 분석이란&quot; data-ke-size=&quot;size23&quot;&gt;형태소 분석이란&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML에서 텍스트를 추출한 다음, 한국어에서는 형태소 분석(Morphological Analysis)이라는 추가 단계가 필요하다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형태소는 의미를 가지는 가장 작은 언어 단위다. &quot;읽었다&quot;를 예로 들면, &quot;읽&quot;(동사 어간) + &quot;었&quot;(과거 시제) + &quot;다&quot;(종결어미)로 나뉜다. 이 세 조각 중 하나라도 빠지면 원래 의미가 달라지거나 성립하지 않는다. 형태소 분석기는 이 작업을 자동으로 해주는 도구다. 어절을 입력하면 형태소 단위로 쪼개고, 각 조각이 명사인지 조사인지 어미인지 품사 태그를 붙여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1774612196437&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from kiwipiepy import Kiwi

kiwi = Kiwi()
tokens = kiwi.tokenize(&quot;나는 책을 읽었다&quot;)
for token in tokens:
    print(f&quot;{token.form}/{token.tag}&quot;)
# 나/NP  는/JX  책/NNG  을/JKO  읽/VV  었/EP  다/EF&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 결과에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;NNG는 일반 명사,&lt;span&gt;&amp;nbsp;&lt;/span&gt;JKO는 목적격 조사,&lt;span&gt;&amp;nbsp;&lt;/span&gt;VV는 동사 어간이다. 이렇게 품사가 분리되면 조사를 떼어내고 &quot;나&quot;, &quot;책&quot;, &quot;읽&quot; 같은 핵심 의미만 뽑아낼 수 있다. RAG에서 형태소 분석이 필요한 이유가 여기에 있다. &quot;배포를&quot;, &quot;배포에서&quot;, &quot;배포했던&quot;이 전부 &quot;배포&quot;라는 같은 어근을 공유한다는 걸 알아야 검색에서 매칭이 된다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-heading=&quot;형태소 분석기 선택&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;/span&gt;형태소 분석기 선택&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형태소가 뭔지, 왜 필요한지 알았으면 이제 도구를 고를 차례다. Python에서 쓸 수 있는 한국어 형태소 분석기는 여러 개가 있고, 속도&amp;middot;설치 난이도&amp;middot;정확도에 차이가 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Kiwi(kiwipiepy)&lt;/b&gt;는 C++ 기반으로 빠르고, 대부분의 환경(Python 3.8~3.11)에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;pip install kiwipiepy로 설치된다. 오타 교정, 사용자 사전 추가도 지원한다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Mecab-ko&lt;/b&gt;는 속도가 가장 빠르다. 10만 건 처리 시 약 6초로, Kkma의 432초와 비교하면 72배 차이가 난다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;단, Windows에서 설치가 까다롭고 Java가 아닌 C++ 기반이라 별도 바이너리가 필요하다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Okt(Open Korean Text)&lt;/b&gt;는 KoNLPy 패키지에 포함되어 있어 접근성이 좋다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;stem=True&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션으로 어간 추출도 가능하다. 다만 JVM이 필요하다는 점이 걸린다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-heading=&quot;형태소 분석 결과를 검색에 쓰려면&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;/span&gt;형태소 분석 결과를 검색에 쓰려면&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제, 분석 결과를 검색에 쓸 수 있는 형태로 가공해야 한다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 핵심 키워드 추출을 해야한다. 형태소 분석 결과에서 의미를 담고 있는 품사만 골라낸다. 명사(NNG, NNP), 동사 어간(VV), 형용사 어간(VA) 정도를 추출하고, 조사(JKS, JKO 등)와 어미(EP, EF 등)는 버린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774612183398&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from kiwipiepy import Kiwi

kiwi = Kiwi()

def extract_keywords(text):
    &quot;&quot;&quot;의미 있는 품사만 추출하여 키워드 리스트를 반환한다.&quot;&quot;&quot;
    keep_tags = {&quot;NNG&quot;, &quot;NNP&quot;, &quot;NNB&quot;, &quot;VV&quot;, &quot;VA&quot;, &quot;SL&quot;}  # 일반적인 시작점. 도메인에 따라 조정 필요
    tokens = kiwi.tokenize(text)
    return [t.form for t in tokens if t.tag in keep_tags]

extract_keywords(&quot;배포 절차를 확인하고 서버에 접속했다&quot;)
# &amp;rarr; [&quot;배포&quot;, &quot;절차&quot;, &quot;확인&quot;, &quot;서버&quot;, &quot;접속&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;배포 절차를 확인하고 서버에 접속했다&quot;에서 조사(&quot;를&quot;, &quot;하고&quot;, &quot;에&quot;)와 어미(&quot;했다&quot;)가 빠지고, &quot;배포&quot;, &quot;절차&quot;, &quot;확인&quot;, &quot;서버&quot;, &quot;접속&quot;만 남는다. 이 키워드로 BM25 인덱스를 만들면 &quot;배포&quot;를 검색했을 때 &quot;배포를&quot;이 포함된 문서도 매칭된다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 텍스트 정규화다.&amp;nbsp;검색 결과의 일관성을 위해 불필요한 공백, 문장부호 주변 공백, 연속된 특수문자를 정리한다.&lt;/p&gt;
&lt;pre id=&quot;code_1774612173208&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import re

def normalize_text(text):
    &quot;&quot;&quot;검색 품질을 위한 텍스트 정규화.&quot;&quot;&quot;
    text = re.sub(r&quot;\s+&quot;, &quot; &quot;, text)           # 연속 공백 &amp;rarr; 단일 공백
    text = re.sub(r&quot;\s*([.,!?;:])\s*&quot;, r&quot;\1 &quot;, text)  # 문장부호 주변 정리
    text = text.strip()
    return text&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-heading=&quot;형태소 분석기도 만능은 아니다&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;/span&gt;형태소 분석기도 만능은 아니다&lt;/h2&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형태소 분석기를 붙이면 모든 문제가 해결될 것 같지만, 실무에서는 형태소 분석기 자체가 문제를 일으키는 경우도 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요기요는 가게명 검색에 형태소 분석기를 적용했다가 &quot;형태소 분석기가 답이 아니다&quot;라는 결론에 도달했다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;원인은 세 가지였다. 첫째, 형태소 분석기는 문법에 맞는 텍스트에 특화되어 있어서 &quot;맛닭꼬&quot; 같은 가게명을 제대로 분석하지 못했다. 둘째, 형태소 분석은 서로소 분할(disjoint segmentation)이라서 음절을 공유하는 패턴을 잡지 못했다. 셋째, 사전에 없는 외래어, 줄임말, 신조어에 대응이 불가능했다. 요기요는 결국 N-gram 방식으로 전환했다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사내 위키에서도 비슷한 문제가 생길 수 있다. 팀명(&quot;플랫폼TF&quot;), 프로젝트명(&quot;마이그레이션v2&quot;), 내부 약어(&quot;PGW&quot;, &quot;CS팀&quot;)는 형태소 분석기의 사전에 없다. 사용자 사전을 추가하면 어느 정도 대응 가능하지만, 조직이 바뀔 때마다 사전을 갱신해야 하는 운영 부담이 생긴다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다고 형태소 분석을 안 하면 되느냐 하면, 그것도 아니다. 앞서 본 것처럼 BM25 검색 품질이 20% 가까이 차이 난다. 결국 형태소 분석은 기본으로 적용하되, 고유명사와 내부 용어에 대해서는 사용자 사전이나 N-gram을 병행하는 것이 현실적인 접근이다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속도도 고려해야 한다. 문서가 수만 건이라면 Kkma는 현실적으로 쓸 수 없다. Mecab이나 Kiwi처럼 빠른 분석기를 쓰되, 정확도가 아쉬운 부분은 하이브리드 검색(BM25 + 벡터 검색)으로 보완하는 전략이 실무에서 많이 쓰인다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-heading=&quot;마무리&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;/span&gt;마무리&lt;/h2&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 RAG 파이프라인에서 &quot;파싱&quot;이라는 단계를 짚어보기 위해 쓴 글이다. 처음에는 대충 이해하고 넘어갔던 부분인데, 정리하면서 한글 문서가 왜 영어와 다른 접근이 필요한지 명확해졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;실제로 직접 구현하면서 느낀 점은, 텍스트 파싱보다 다이어그램 파싱이 더 까다롭다는 것이다. Confluence 위키에는 draw.io 도면이나 Mermaid 흐름도가 곳곳에 있었는데, 버리기엔 핵심 정보가 너무 많았다. 앞서 정리한 방식대로 포맷별 파서를 직접 만들었고, 추출한 텍스트에 형태소 분석까지 적용해서 BM25 검색 대상에 포함시켰다. 100% 완벽한 변환은 아니지만, &quot;이런 다이어그램이 있었다&quot;는 것을 검색으로 찾을 수 있게 된 것만으로도 충분한 가치가 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-heading=&quot;참고자료&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;/span&gt;참고자료&lt;/h2&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li id=&quot;fn-1-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-1-fe7d300313a58ae4&quot; data-line=&quot;-11&quot;&gt;kt cloud, &quot;AI RAG 파싱 전처리 최적화&quot;, kt cloud 기술 블로그, 2025.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://tech.ktcloud.com/entry/2025-09-ktcloud-ai-rag-parsing&quot;&gt;https://tech.ktcloud.com/entry/2025-09-ktcloud-ai-rag-parsing&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn-2-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-2-fe7d300313a58ae4&quot; data-line=&quot;-10&quot;&gt;Park et al., &quot;An Empirical Study of Tokenization Strategies for Various Korean NLP Tasks&quot;, AACL, 2020.&lt;/li&gt;
&lt;li id=&quot;fn-3-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-3-fe7d300313a58ae4&quot; data-line=&quot;-9&quot;&gt;Marker Inc. Korea, &quot;Korean BM25 Tokenizer Benchmark with AutoRAG&quot;, GitHub, 2024.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/Marker-Inc-Korea/AutoRAG-example-korean-embedding-benchmark&quot;&gt;https://github.com/Marker-Inc-Korea/AutoRAG-example-korean-embedding-benchmark&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn-4-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-4-fe7d300313a58ae4&quot; data-line=&quot;-8&quot;&gt;Lee et al., &quot;MoB: Morphological Boundary-aware Subword Tokenization&quot;, EACL, 2026.&lt;/li&gt;
&lt;li id=&quot;fn-5-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-5-fe7d300313a58ae4&quot; data-line=&quot;-6&quot;&gt;LangChain, &quot;BSHTMLLoader&quot;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://python.langchain.com/docs/integrations/document_loaders/bshtml&quot;&gt;https://python.langchain.com/docs/integrations/document_loaders/bshtml&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn-6-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-6-fe7d300313a58ae4&quot; data-line=&quot;-7&quot;&gt;BeautifulSoup4, &quot;Differences between parsers&quot;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.crummy.com/software/BeautifulSoup/bs4/doc/&quot;&gt;https://www.crummy.com/software/BeautifulSoup/bs4/doc/&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn-7-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-7-fe7d300313a58ae4&quot; data-line=&quot;-5&quot;&gt;Unstructured.io, &quot;Partitioning&quot;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.unstructured.io/open-source/core-functionality/partitioning&quot;&gt;https://docs.unstructured.io/open-source/core-functionality/partitioning&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn-8-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-8-fe7d300313a58ae4&quot; data-line=&quot;-4&quot;&gt;Kiwi, &quot;kiwipiepy 공식 문서&quot;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://bab2min.github.io/kiwipiepy/&quot;&gt;https://bab2min.github.io/kiwipiepy/&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn-9-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-9-fe7d300313a58ae4&quot; data-line=&quot;-3&quot;&gt;Ahn et al., &quot;Benchmarking Korean Morphological Analyzers&quot;, Applied Sciences, 2023.&lt;/li&gt;
&lt;li id=&quot;fn-10-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-10-fe7d300313a58ae4&quot; data-line=&quot;-2&quot;&gt;KoNLPy, &quot;API Reference, konlpy.tag&quot;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://konlpy.org/ko/stable/api/konlpy.tag/&quot;&gt;https://konlpy.org/ko/stable/api/konlpy.tag/&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn-11-fe7d300313a58ae4&quot; style=&quot;text-align: start;&quot; data-footnote-id=&quot;fn-11-fe7d300313a58ae4&quot; data-line=&quot;-1&quot;&gt;정승한, &quot;요기요 검색에서 형태소 분석기의 한계와 극복&quot;, 요기요 기술블로그, 2024.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://techblog.yogiyo.co.kr/요기요-검색에서-형태소-분석기의-한계와-극복-3da53beb6ea5&quot;&gt;https://techblog.yogiyo.co.kr/요기요-검색에서-형태소-분석기의-한계와-극복-3da53beb6ea5&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Tech</category>
      <category>AI</category>
      <category>LLM</category>
      <category>Rag</category>
      <category>한글</category>
      <category>형태소</category>
      <author>CODe_</author>
      <guid isPermaLink="true">https://code1995.tistory.com/137</guid>
      <comments>https://code1995.tistory.com/137#entry137comment</comments>
      <pubDate>Fri, 27 Mar 2026 20:43:12 +0900</pubDate>
    </item>
    <item>
      <title>개떡같이 말해도 찰떡같이 답변하는 RAG - 텍스트 임베딩 이해하기</title>
      <link>https://code1995.tistory.com/136</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;TL;DR: 임베딩은 텍스트에 의미 좌표를 부여하는 기술이다. 문서를 통째로 넣지 않고 청킹으로 잘라야 검색 품질이 올라가며, 차원은 높다고 무조건 좋은 것이 아니다. 768~1,024차원에서도 최신 모델은 충분히 강력하고, MRL로 차원을 유연하게 조절할 수 있다&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;벡터 DB에 텍스트를 넣으려면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사내 위키를 기반으로 RAG(Retrieval-Augmented Generation) 시스템을 처음 만들 때, 첫 번째 관문은 임베딩이었다. &quot;텍스트를 벡터로 바꾼다&quot;는 설명은 이해했지만, 실제로 어떤 모델을 써야 하는지, 문서를 어떻게 자르는지, 차원은 얼마로 설정해야 하는지 물음표가 줄줄이 이어졌다.&lt;br /&gt;&lt;br /&gt;RAG 파이프라인의 구조는 단순하다. 문서를 적당한 크기로 자르고(청킹), 각 청크를 벡터로 변환해(임베딩) 벡터 DB에 저장한다. 사용자가 질문을 던지면 질문도 같은 방식으로 임베딩(Embedding)한 뒤, 벡터 DB에서 가장 가까운 청크들을 꺼내 LLM (Large Language Model)에 전달한다.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;글에서는&amp;nbsp;&lt;b&gt;임베딩이&amp;nbsp;어떤&amp;nbsp;원리로&amp;nbsp;작동하는지,&amp;nbsp;청킹&amp;nbsp;전략은&amp;nbsp;어떻게&amp;nbsp;선택하는지,&amp;nbsp;차원&amp;nbsp;선택에&amp;nbsp;어떤&amp;nbsp;함정이&amp;nbsp;있는지,&amp;nbsp;그리고&amp;nbsp;2026년&amp;nbsp;기준&amp;nbsp;주요&amp;nbsp;모델을&amp;nbsp;어떻게&amp;nbsp;비교할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;정리&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;코사인 유사도나 벡터 같은 개념은 머리 아프니까 다음 게시물에서 좀 더 자세히 이야기하고, 이번 글에선 임베딩에 대해 이야기한다.&lt;/u&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;텍스트를 숫자로 바꾸는 기술&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;컴퓨터는 텍스트를 모른다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터는&amp;nbsp;텍스트&amp;nbsp;자체를&amp;nbsp;이해하지&amp;nbsp;못한다.&amp;nbsp;텍스트를&amp;nbsp;숫자로&amp;nbsp;변환해야만&amp;nbsp;연산이&amp;nbsp;가능하다.&amp;nbsp;가장&amp;nbsp;단순한&amp;nbsp;방법은&amp;nbsp;원-핫&amp;nbsp;인코딩&amp;nbsp;(One-Hot&amp;nbsp;Encoding)이다.&amp;nbsp;어휘&amp;nbsp;사전에&amp;nbsp;있는&amp;nbsp;단어&amp;nbsp;수만큼&amp;nbsp;차원을&amp;nbsp;만들고,&amp;nbsp;그&amp;nbsp;단어의&amp;nbsp;번호&amp;nbsp;위치에만&amp;nbsp;1을&amp;nbsp;채운다.&lt;br /&gt;&lt;br /&gt;원-핫&amp;nbsp;인코딩을&amp;nbsp;풀어서&amp;nbsp;설명하면&amp;nbsp;이렇다.&amp;nbsp;어휘&amp;nbsp;사전에&amp;nbsp;10만&amp;nbsp;개의&amp;nbsp;단어가&amp;nbsp;있을&amp;nbsp;때,&amp;nbsp;&quot;고양이&quot;가&amp;nbsp;사전의&amp;nbsp;7,302번째&amp;nbsp;단어라면&amp;nbsp;10만&amp;nbsp;개짜리&amp;nbsp;배열에서&amp;nbsp;7,302번&amp;nbsp;위치만&amp;nbsp;1이고&amp;nbsp;나머지는&amp;nbsp;전부&amp;nbsp;0이다.&amp;nbsp;&lt;b&gt;단어&amp;nbsp;하나를&amp;nbsp;표현하는&amp;nbsp;데&amp;nbsp;10만&amp;nbsp;개&amp;nbsp;숫자를&amp;nbsp;쓰는&amp;nbsp;셈이다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;방식의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;문제는&amp;nbsp;공간&amp;nbsp;낭비다.&amp;nbsp;단어&amp;nbsp;하나에&amp;nbsp;10만&amp;nbsp;차원&amp;nbsp;벡터가&amp;nbsp;필요하다.&amp;nbsp;두&amp;nbsp;번째,&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;문제는&amp;nbsp;의미를&amp;nbsp;담지&amp;nbsp;못한다는&amp;nbsp;것이다.&amp;nbsp;&quot;고양이&quot;와&amp;nbsp;&quot;강아지&quot;의&amp;nbsp;벡터&amp;nbsp;거리가&amp;nbsp;&quot;고양이&quot;와&amp;nbsp;&quot;냉장고&quot;의&amp;nbsp;거리와&amp;nbsp;같다.&amp;nbsp;어느&amp;nbsp;자리에&amp;nbsp;1이&amp;nbsp;있느냐만&amp;nbsp;다를&amp;nbsp;뿐,&amp;nbsp;비슷한&amp;nbsp;의미라는&amp;nbsp;정보가&amp;nbsp;숫자에&amp;nbsp;전혀&amp;nbsp;반영되지&amp;nbsp;않는다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;임베딩이란 의미 좌표다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베딩은 이 한계를 극복하기 위해 등장했다. 고차원 희소 벡터 대신, 수백~수천 차원의 밀집 벡터(Dense Vector)로 텍스트를 표현한다. 핵심은 의미가 비슷한 텍스트를 벡터 공간에서 가깝게 배치한다는 것이다.&lt;br /&gt;&lt;br /&gt;GPS&amp;nbsp;좌표로&amp;nbsp;비유하면&amp;nbsp;이해하기&amp;nbsp;쉽다.&amp;nbsp;서울(37.56,&amp;nbsp;126.97)과&amp;nbsp;인천(37.45,&amp;nbsp;126.70)은&amp;nbsp;좌표가&amp;nbsp;가깝기&amp;nbsp;때문에&amp;nbsp;지리적으로도&amp;nbsp;가깝다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;임베딩도&amp;nbsp;마찬가지다.&amp;nbsp;&quot;배포&amp;nbsp;롤백&quot;과&amp;nbsp;&quot;서비스&amp;nbsp;되돌리기&quot;는&amp;nbsp;임베딩&amp;nbsp;공간에서&amp;nbsp;가까이&amp;nbsp;위치한다.&amp;nbsp;좌표만&amp;nbsp;봐도&amp;nbsp;의미의&amp;nbsp;근접성을&amp;nbsp;계산할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;두 벡터가 얼마나 가까운지는 코사인 유사도(Cosine Similarity)로 측정한다. -1부터 1까지 값을 가지며, 1에 가까울수록 의미가 비슷하고 -1에 가까울수록 반대 의미다. 0은 연관성이 없음을 뜻한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원-핫에서 문장 임베딩까지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베딩 기술은 빠르게 진화했다. 2013년 &lt;a href=&quot;https://ko.wikipedia.org/wiki/Word2vec&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Word2Vec&lt;/a&gt;이 등장하면서 단어 수준의 의미 임베딩이 가능해졌다. &quot;왕 - 남성&quot;, &quot;여성 = 여왕&quot;이라는 벡터 연산이 실제로 작동하는 것을 보여줬다.&lt;br /&gt;&lt;br /&gt;2018년&amp;nbsp;BERT가&amp;nbsp;등장하면서&amp;nbsp;문맥을&amp;nbsp;고려한&amp;nbsp;임베딩이&amp;nbsp;본격화됐다.&amp;nbsp;같은&amp;nbsp;&quot;배&quot;라는&amp;nbsp;단어도&amp;nbsp;&quot;배가&amp;nbsp;아프다&quot;와&amp;nbsp;&quot;배를&amp;nbsp;탄다&quot;에서&amp;nbsp;다른&amp;nbsp;벡터를&amp;nbsp;가지게&amp;nbsp;됐다.&amp;nbsp;현대&amp;nbsp;임베딩&amp;nbsp;모델들은&amp;nbsp;단어&amp;nbsp;수준을&amp;nbsp;넘어&amp;nbsp;문장&amp;nbsp;전체,&amp;nbsp;혹은&amp;nbsp;여러&amp;nbsp;문장으로&amp;nbsp;이루어진&amp;nbsp;청크를&amp;nbsp;하나의&amp;nbsp;벡터로&amp;nbsp;표현한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;API로 임베딩 생성하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI의&amp;nbsp;text-embedding-3-small&amp;nbsp;모델로&amp;nbsp;임베딩을&amp;nbsp;생성하는&amp;nbsp;방법은&amp;nbsp;간단하다.&lt;br /&gt;&lt;br /&gt;아래&amp;nbsp;코드는&amp;nbsp;두&amp;nbsp;텍스트를&amp;nbsp;임베딩하고&amp;nbsp;코사인&amp;nbsp;유사도를&amp;nbsp;계산하는&amp;nbsp;예시다.&amp;nbsp;결과를&amp;nbsp;보면&amp;nbsp;의미가&amp;nbsp;비슷한&amp;nbsp;텍스트끼리는&amp;nbsp;높은&amp;nbsp;유사도&amp;nbsp;점수가&amp;nbsp;나오고,&amp;nbsp;무관한&amp;nbsp;텍스트와는&amp;nbsp;낮은&amp;nbsp;점수가&amp;nbsp;나오는&amp;nbsp;것을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;pre id=&quot;code_1774274166638&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from openai import OpenAI
import numpy as np

client = OpenAI()

def get_embedding(text: str, model: str = &quot;text-embedding-3-small&quot;) -&amp;gt; list[float]:
    response = client.embeddings.create(input=text, model=model)
    return response.data[0].embedding

def cosine_similarity(a: list[float], b: list[float]) -&amp;gt; float:
    a, b = np.array(a), np.array(b)
    return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))

emb1 = get_embedding(&quot;배포 롤백&quot;)
emb2 = get_embedding(&quot;서비스를 이전 버전으로 되돌리기&quot;)
emb3 = get_embedding(&quot;오늘 점심 메뉴&quot;)

print(cosine_similarity(emb1, emb2))  # 예: 0.87 (유사)
print(cosine_similarity(emb1, emb3))  # 예: 0.12 (무관)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환된&amp;nbsp;벡터&amp;nbsp;길이는&amp;nbsp;1,536개의&amp;nbsp;부동소수점&amp;nbsp;숫자다.&amp;nbsp;이&amp;nbsp;숫자들이&amp;nbsp;텍스트의&amp;nbsp;의미&amp;nbsp;좌표가&amp;nbsp;된다.&lt;br /&gt;&lt;br /&gt;중요한&amp;nbsp;제약이&amp;nbsp;하나&amp;nbsp;있다.&amp;nbsp;문서를&amp;nbsp;저장할&amp;nbsp;때와&amp;nbsp;검색&amp;nbsp;쿼리를&amp;nbsp;임베딩할&amp;nbsp;때&amp;nbsp;반드시&amp;nbsp;같은&amp;nbsp;모델을&amp;nbsp;써야&amp;nbsp;한다.&amp;nbsp;모델마다&amp;nbsp;벡터&amp;nbsp;공간이&amp;nbsp;다르기&amp;nbsp;때문에,&amp;nbsp;다른&amp;nbsp;모델로&amp;nbsp;만든&amp;nbsp;벡터는&amp;nbsp;비교가&amp;nbsp;불가능하다.&amp;nbsp;모델을&amp;nbsp;바꾸면&amp;nbsp;저장된&amp;nbsp;모든&amp;nbsp;벡터를&amp;nbsp;재임베딩해야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1323&quot; data-origin-height=&quot;841&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wrKQF/dJMcagkyliy/m6YXF35s3xKSbEAeEg9cTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wrKQF/dJMcagkyliy/m6YXF35s3xKSbEAeEg9cTk/img.png&quot; data-alt=&quot;임베딩 공간에서의 텍스트 배치. 의미가 비슷한 텍스트(배포 롤백, 서비스 되돌리기)는 벡터 공간에서 가깝고, 무관한 텍스트(오늘 점심 메뉴)는 멀리 위치한다. 실제로는 1,536차원 이상이지만 이해를 위해 2D로 단순화했다. 코사인 유사도가 높을수록 두 점 사이의 각도가 작아진다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wrKQF/dJMcagkyliy/m6YXF35s3xKSbEAeEg9cTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwrKQF%2FdJMcagkyliy%2Fm6YXF35s3xKSbEAeEg9cTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;381&quot; data-origin-width=&quot;1323&quot; data-origin-height=&quot;841&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;임베딩 공간에서의 텍스트 배치. 의미가 비슷한 텍스트(배포 롤백, 서비스 되돌리기)는 벡터 공간에서 가깝고, 무관한 텍스트(오늘 점심 메뉴)는 멀리 위치한다. 실제로는 1,536차원 이상이지만 이해를 위해 2D로 단순화했다. 코사인 유사도가 높을수록 두 점 사이의 각도가 작아진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문서를 임베딩하기 전에, 자른다&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 자르는가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 문서를 통째로 하나의 벡터로 만들면 두 가지 문제가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째,&amp;nbsp;모델의&amp;nbsp;토큰&amp;nbsp;제한이&amp;nbsp;있다.&amp;nbsp;text-embedding-3-small의&amp;nbsp;최대&amp;nbsp;입력&amp;nbsp;길이는&amp;nbsp;8,191&amp;nbsp;토큰이다.&amp;nbsp;수백&amp;nbsp;페이지짜리&amp;nbsp;문서는&amp;nbsp;물리적으로&amp;nbsp;들어가지&amp;nbsp;않는다.&lt;br /&gt;&lt;br /&gt;둘째, 문서 전체를 하나의 벡터로 압축하면 특정 주제의 신호가 희석된다. &quot;시스템 배포 절차&quot;와 &quot;장애 대응 매뉴얼&quot;이 섞인 긴 문서를 하나의 벡터로 만들면, &quot;배포 오류 처리&quot; 같은 쿼리에 이 벡터가 적절히 응답하지 못한다.&lt;br /&gt;&lt;br /&gt;청킹&amp;nbsp;(Chunking)은&amp;nbsp;문서를&amp;nbsp;검색에&amp;nbsp;적합한&amp;nbsp;크기로&amp;nbsp;분할하는&amp;nbsp;과정이다.&amp;nbsp;어떻게&amp;nbsp;자르느냐에&amp;nbsp;따라&amp;nbsp;RAG&amp;nbsp;검색&amp;nbsp;품질이&amp;nbsp;크게&amp;nbsp;달라진다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 전략&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 고민 했던 전략은 크게 3가지였다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 58px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;전략&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;특징&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;적합한 상황&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;고정 크기&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;단순하고&amp;nbsp;빠름.&amp;nbsp;문장&amp;nbsp;경계를&amp;nbsp;무시할&amp;nbsp;수&amp;nbsp;있음&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;빠른&amp;nbsp;프로토타입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px;&quot;&gt;재귀적&amp;nbsp;분할&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px;&quot;&gt;문단,&amp;nbsp;문장,&amp;nbsp;단어&amp;nbsp;순서로&amp;nbsp;경계를&amp;nbsp;지키며&amp;nbsp;분할&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 18px;&quot;&gt;범용적으로 쓰임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;의미적&amp;nbsp;청킹&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;ML&amp;nbsp;모델로&amp;nbsp;의미&amp;nbsp;경계를&amp;nbsp;탐지해&amp;nbsp;분할&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;주제&amp;nbsp;전환이&amp;nbsp;잦은&amp;nbsp;문서&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 그림을 보고 좀 더 이해를 도울 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;얼마나 잘라야 하나&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;청크&amp;nbsp;크기를&amp;nbsp;너무&amp;nbsp;작게&amp;nbsp;잡으면&amp;nbsp;검색&amp;nbsp;정밀도는&amp;nbsp;높아지지만&amp;nbsp;맥락이&amp;nbsp;부족해&amp;nbsp;단편적인&amp;nbsp;답변이&amp;nbsp;나온다.&amp;nbsp;반대로&amp;nbsp;너무&amp;nbsp;크게&amp;nbsp;잡으면&amp;nbsp;여러&amp;nbsp;주제가&amp;nbsp;하나의&amp;nbsp;청크에&amp;nbsp;섞여&amp;nbsp;검색&amp;nbsp;정밀도가&amp;nbsp;떨어진다.&lt;br /&gt;&lt;br /&gt;오버랩(Overlap)은 인접 청크가 일부 텍스트를 공유하도록 겹치는 설정이다. 청크 경계에서 문장이 끊겨 맥락이 손실되는 문제를 완화한다.&lt;br /&gt;&lt;br /&gt;실무에서 권장하는 시작점은 400~512 토큰 청크 크기에 10~20% 오버랩이다. &lt;b&gt;도메인과 문서 특성에 따라 조정이 필요하므로 실제 쿼리로 검색 품질을 측정하면서 튜닝하는 것이 맞다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;재귀적 분할 코드 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LangChain의 RecursiveCharacterTextSplitter는 범용적으로 쓰기 좋다. 분할 우선순위는 단락(\n\n) &amp;rarr; 줄바꿈(\n) &amp;rarr; 문장(. ) &amp;rarr; 단어 순서다. &lt;b&gt;각 청크가 chunk_size를 넘지 않을 때까지 더 세밀한 구분자로 재귀적으로 시도한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774277951652&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=512,        # 최대 토큰 수 (문자 기준이므로 조정 필요)
    chunk_overlap=64,      # 인접 청크 간 겹치는 문자 수
    separators=[&quot;\n\n&quot;, &quot;\n&quot;, &quot;. &quot;, &quot; &quot;, &quot;&quot;],
)

docs = splitter.create_documents([long_document_text])

for i, doc in enumerate(docs[:3]):
    print(f&quot;[청크 {i+1}] 길이: {len(doc.page_content)}자&quot;)
    print(doc.page_content[:100])
    print(&quot;---&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위&amp;nbsp;코드를&amp;nbsp;실행하면&amp;nbsp;각&amp;nbsp;청크의&amp;nbsp;길이와&amp;nbsp;앞부분을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;실제로&amp;nbsp;돌려보면서&amp;nbsp;문장이&amp;nbsp;어색하게&amp;nbsp;잘리지&amp;nbsp;않는지,&amp;nbsp;한&amp;nbsp;청크에&amp;nbsp;너무&amp;nbsp;많은&amp;nbsp;주제가&amp;nbsp;담기지&amp;nbsp;않는지&amp;nbsp;눈으로&amp;nbsp;확인하는&amp;nbsp;과정이&amp;nbsp;중요하다.&lt;br /&gt;&lt;br /&gt;wiki-rag를&amp;nbsp;만들&amp;nbsp;때는&amp;nbsp;프로토타이핑&amp;nbsp;속도를&amp;nbsp;우선했다.&amp;nbsp;어떤&amp;nbsp;전략이&amp;nbsp;최적인지&amp;nbsp;비교할&amp;nbsp;여유&amp;nbsp;없이,&amp;nbsp;문서당&amp;nbsp;약&amp;nbsp;400자&amp;nbsp;단위로&amp;nbsp;분할하고&amp;nbsp;오버랩&amp;nbsp;구간을&amp;nbsp;넣는&amp;nbsp;방식으로&amp;nbsp;시작했다.&amp;nbsp;문장이&amp;nbsp;청크&amp;nbsp;경계에서&amp;nbsp;잘릴&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;오버랩은&amp;nbsp;필수였다.&amp;nbsp;완벽한&amp;nbsp;전략은&amp;nbsp;아니었지만,&amp;nbsp;빠르게&amp;nbsp;동작하는&amp;nbsp;파이프라인을&amp;nbsp;먼저&amp;nbsp;만들고&amp;nbsp;이후에&amp;nbsp;검색&amp;nbsp;결과를&amp;nbsp;보면서&amp;nbsp;조정하는&amp;nbsp;접근이&amp;nbsp;실무에서는&amp;nbsp;더&amp;nbsp;현실적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czgwza/dJMcacCtYVO/8zhD6iL1TcE5IkifoClht1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czgwza/dJMcacCtYVO/8zhD6iL1TcE5IkifoClht1/img.png&quot; data-alt=&quot;배포와 롤백 두 주제가 섞인 문서를 세 전략으로 나눈 결과. 고정 크기는 &amp;quot;CI에서&amp;quot;처럼 문장 중간을 자르고 주제 경계도 무시한다. 재귀적 분할은 문장이 끝나는 지점에서 자르고 오버랩으로 경계 맥락을 보존한다. 의미적 청킹은 주제가 바뀌는 지점을 감지해서 각 청크가 하나의 주제를 온전히 담도록 나눈다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czgwza/dJMcacCtYVO/8zhD6iL1TcE5IkifoClht1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fczgwza%2FdJMcacCtYVO%2F8zhD6iL1TcE5IkifoClht1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;952&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;952&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;배포와 롤백 두 주제가 섞인 문서를 세 전략으로 나눈 결과. 고정 크기는 &quot;CI에서&quot;처럼 문장 중간을 자르고 주제 경계도 무시한다. 재귀적 분할은 문장이 끝나는 지점에서 자르고 오버랩으로 경계 맥락을 보존한다. 의미적 청킹은 주제가 바뀌는 지점을 감지해서 각 청크가 하나의 주제를 온전히 담도록 나눈다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;차원이 높으면 무조건 좋을까&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;차원이 높은 것만 쓰면 되겠다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 이 개념을 공부할 때 이런 생각을 했다. 물리적으로 시스템 리소스만 문제 없다면 계속 차원을 늘려도 되지 않을까? 차원이 높을수록 더 세밀한 표현이 가능하고, 그러면 검색 성능도 높아질 것이다. text-embedding-3-small(1,536차원)보다 text-embedding-3-large(3,072차원)가 당연히 좋을 것이다.&lt;br /&gt;&lt;br /&gt;하지만 이 생각은 부분적으로만&amp;nbsp;맞다.&amp;nbsp;실제로&amp;nbsp;차원이&amp;nbsp;다른&amp;nbsp;모델을&amp;nbsp;비교해보면&amp;nbsp;유의미한&amp;nbsp;차이가&amp;nbsp;있긴&amp;nbsp;하다.&amp;nbsp;하지만&amp;nbsp;그&amp;nbsp;차이가&amp;nbsp;차원&amp;nbsp;자체에서&amp;nbsp;오는지,&amp;nbsp;모델&amp;nbsp;아키텍처와&amp;nbsp;훈련&amp;nbsp;데이터에서&amp;nbsp;오는지를&amp;nbsp;구분하지&amp;nbsp;않으면&amp;nbsp;잘못된&amp;nbsp;결론에&amp;nbsp;이른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;차원을 올려도 성능은 안 따라온다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 성능 비교 표를 보면 자주 마주할 수 있는 단어가 있다. MTEB(Massive Text Embedding Benchmark)는 검색, 분류, 클러스터링 등 다양한 태스크를 종합 평가하는 벤치마크다. &lt;b&gt;MTEB 점수를 보면 차원 증가에 따른 성능 향상이 일정하지 않다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;384차원에서 768차원으로 올라가는 구간에서는 성능이 눈에 띄게 향상된다. 하지만 1,024차원에서 3,072차원, 4,096차원으로 올라가는 구간에서는 같은 차원 증가 대비 향상이 급격히 줄어든다.&lt;br /&gt;&lt;br /&gt;더&amp;nbsp;주목할&amp;nbsp;만한&amp;nbsp;사실이&amp;nbsp;있다.&amp;nbsp;BAAI의&amp;nbsp;BGE-base&amp;nbsp;모델은&amp;nbsp;768차원이지만,&amp;nbsp;OpenAI&amp;nbsp;ada-002(1,536차원)보다&amp;nbsp;MTEB&amp;nbsp;점수가&amp;nbsp;높다.&amp;nbsp;&lt;b&gt;차원이&amp;nbsp;아니라&amp;nbsp;훈련&amp;nbsp;품질과&amp;nbsp;아키텍처가&amp;nbsp;성능을&amp;nbsp;결정한다는&amp;nbsp;뜻이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;차원이 두 배면 비용도 두 배다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원이&amp;nbsp;두&amp;nbsp;배가&amp;nbsp;되면&amp;nbsp;비용도&amp;nbsp;두&amp;nbsp;배가&amp;nbsp;된다.&lt;br /&gt;&lt;br /&gt;저장&amp;nbsp;비용부터&amp;nbsp;보면,&amp;nbsp;Float32&amp;nbsp;기준&amp;nbsp;벡터&amp;nbsp;하나의&amp;nbsp;크기는&amp;nbsp;차원&amp;nbsp;수&amp;nbsp;&amp;times;&amp;nbsp;4&amp;nbsp;바이트다.&amp;nbsp;100만&amp;nbsp;개&amp;nbsp;벡터를&amp;nbsp;저장할&amp;nbsp;때&amp;nbsp;차원별&amp;nbsp;메모리는&amp;nbsp;다음과&amp;nbsp;같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 90px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;차원&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;100만 벡터 메모리(Float32)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;384&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;약 1.5G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;1,536&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;약 6GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;3,072&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;약 12GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;4,096&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;약 16GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색&amp;nbsp;속도도&amp;nbsp;차원에&amp;nbsp;비례한다.&amp;nbsp;쿼리&amp;nbsp;벡터와&amp;nbsp;저장된&amp;nbsp;벡터&amp;nbsp;간&amp;nbsp;거리&amp;nbsp;계산은&amp;nbsp;O(N&amp;nbsp;&amp;times;&amp;nbsp;D)&amp;nbsp;복잡도를&amp;nbsp;가진다.&amp;nbsp;차원(D)이&amp;nbsp;두&amp;nbsp;배면&amp;nbsp;계산량도&amp;nbsp;두&amp;nbsp;배다.&amp;nbsp;수백만&amp;nbsp;건&amp;nbsp;이상의&amp;nbsp;벡터를&amp;nbsp;다루는&amp;nbsp;환경에서는&amp;nbsp;무시할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;차이다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모든 문서가 비슷하게 멀어진다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원이 높아질수록 모든 점 간 거리가 비슷해지는 현상이 있다. 이를 고차원에서 거리가 무의미해지는 현상(차원의 저주, Curse of Dimensionality)이라 부른다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;저차원에서는&amp;nbsp;가장&amp;nbsp;가까운&amp;nbsp;이웃과&amp;nbsp;가장&amp;nbsp;먼&amp;nbsp;이웃&amp;nbsp;사이의&amp;nbsp;거리&amp;nbsp;차이가&amp;nbsp;뚜렷하다.&amp;nbsp;하지만&amp;nbsp;차원이&amp;nbsp;높아질수록&amp;nbsp;모든&amp;nbsp;점이&amp;nbsp;서로&amp;nbsp;비슷한&amp;nbsp;거리에&amp;nbsp;위치하게&amp;nbsp;되고,&amp;nbsp;&quot;가장&amp;nbsp;가까운&amp;nbsp;문서&quot;를&amp;nbsp;찾는&amp;nbsp;의미가&amp;nbsp;흐려진다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;단, 임베딩 벡터는 실제로 저차원 다양체(Manifold) 위에 분포한다고 알려져 있다. 텍스트의 의미 공간 자체가 저차원이기 때문에, 고차원 벡터로 표현하더라도 실질적인 정보는 저차원 구조에 집중된다. 이론적 최악보다는 실무에서 양호하게 작동하는 이유다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;차원을 줄여도 성능을 지키는 법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마트료시카 표현 학습(MRL, Matryoshka Representation Learning)은 큰 임베딩 안에 작은 임베딩이 중첩된 구조로 모델을 훈련하는 방식이다. 러시아 전통 인형 마트료시카에서 이름을 따왔다.&lt;br /&gt;&lt;br /&gt;앞쪽&amp;nbsp;차원일수록&amp;nbsp;더&amp;nbsp;중요한&amp;nbsp;정보를&amp;nbsp;담도록&amp;nbsp;훈련하기&amp;nbsp;때문에,&amp;nbsp;전체&amp;nbsp;벡터의&amp;nbsp;앞부분만&amp;nbsp;잘라&amp;nbsp;사용해도&amp;nbsp;품질이&amp;nbsp;크게&amp;nbsp;떨어지지&amp;nbsp;않는다.&amp;nbsp;OpenAI의&amp;nbsp;text-embedding-3&amp;nbsp;시리즈가&amp;nbsp;MRL을&amp;nbsp;적용한&amp;nbsp;대표적인&amp;nbsp;모델이다.&lt;br /&gt;&lt;br /&gt;text-embedding-3-large를 256차원으로 줄여 사용해도 이전 세대 모델 ada-002의 1,536차원보다 성능이 높다는 것이 OpenAI의 발표다. MRL 덕분에 비용과 성능 사이의 균형을 유연하게 조정할 수 있다.&lt;br /&gt;&lt;br /&gt;아래&amp;nbsp;코드는&amp;nbsp;API에서&amp;nbsp;dimensions&amp;nbsp;파라미터로&amp;nbsp;차원을&amp;nbsp;직접&amp;nbsp;지정하는&amp;nbsp;예시다.&amp;nbsp;같은&amp;nbsp;모델을&amp;nbsp;쓰되&amp;nbsp;차원만&amp;nbsp;줄이면&amp;nbsp;저장&amp;nbsp;비용을&amp;nbsp;낮추면서&amp;nbsp;의미&amp;nbsp;품질은&amp;nbsp;상당&amp;nbsp;부분&amp;nbsp;유지할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774278282077&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from openai import OpenAI

client = OpenAI()

# 기본 1,536차원
full_emb = client.embeddings.create(
    input=&quot;배포 롤백 절차&quot;,
    model=&quot;text-embedding-3-small&quot;
)

# MRL로 256차원으로 축소
small_emb = client.embeddings.create(
    input=&quot;배포 롤백 절차&quot;,
    model=&quot;text-embedding-3-small&quot;,
    dimensions=256   # 앞쪽 256차원만 사용
)

print(f&quot;전체 차원: {len(full_emb.data[0].embedding)}&quot;)   # 1536
print(f&quot;축소 차원: {len(small_emb.data[0].embedding)}&quot;)  # 256&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;895&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c27tka/dJMcadg4NNQ/dsa0hNVe4PveXC1cxMbfPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c27tka/dJMcadg4NNQ/dsa0hNVe4PveXC1cxMbfPK/img.png&quot; data-alt=&quot;차원 증가에 따른 성능(로그형 곡선)과 비용(선형 증가) 비교. 384차원에서 768차원 구간에서 성능 향상이 크고, 이후 성능 향상이 크게 둔화된다. 비용은 차원에 비례해 선형으로 증가하기 때문에, 768~1,024차원이 성능 대비 비용의 적정 구간으로 알려져 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c27tka/dJMcadg4NNQ/dsa0hNVe4PveXC1cxMbfPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc27tka%2FdJMcadg4NNQ%2Fdsa0hNVe4PveXC1cxMbfPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;378&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;895&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;차원 증가에 따른 성능(로그형 곡선)과 비용(선형 증가) 비교. 384차원에서 768차원 구간에서 성능 향상이 크고, 이후 성능 향상이 크게 둔화된다. 비용은 차원에 비례해 선형으로 증가하기 때문에, 768~1,024차원이 성능 대비 비용의 적정 구간으로 알려져 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;어떤 모델을 고를 것인가&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MTEB 벤치마크 읽는 법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MTEB는 검색, 분류, 클러스터링, 재순위 등 다양한 태스크를 종합 평가한다. 종합 점수를 보면 전반적인 품질을 파악할 수 있지만, RAG를 만든다면 Retrieval(검색) 태스크 점수를 더 중요하게 봐야 한다.&lt;br /&gt;&lt;br /&gt;한국어&amp;nbsp;문서를&amp;nbsp;다룬다면&amp;nbsp;MIRACL,&amp;nbsp;MKQA&amp;nbsp;같은&amp;nbsp;다국어&amp;nbsp;벤치마크&amp;nbsp;점수도&amp;nbsp;확인하는&amp;nbsp;것이&amp;nbsp;좋다.&amp;nbsp;영어&amp;nbsp;기준&amp;nbsp;MTEB&amp;nbsp;점수가&amp;nbsp;높아도&amp;nbsp;한국어&amp;nbsp;성능이&amp;nbsp;낮은&amp;nbsp;모델이&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상용 API 비교(2026. 03 기준)&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 164px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 20px;&quot;&gt;모델&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 20px;&quot;&gt;제공사&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 20px;&quot;&gt;차원&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 20px;&quot;&gt;MTEB 점수&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 20px;&quot;&gt;가격 ($/100만 토큰)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;text-embedding-3-small&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;OpenAI&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;1,536&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;62.3&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;$0.02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;text-embedding-3-large&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;OpenAI&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;3,072&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;64.6&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;$0.13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;gemini-embedding-001&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;Google&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;3,072&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;68.3&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 36px;&quot;&gt;별도&amp;nbsp;과금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 18px;&quot;&gt;Cohere&amp;nbsp;Embed&amp;nbsp;v4&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px;&quot;&gt;Cohere&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px;&quot;&gt;1,024&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px;&quot;&gt;65.2&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px;&quot;&gt;$0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 18px;&quot;&gt;Voyage-3-large&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px;&quot;&gt;Voyage&amp;nbsp;AI&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px;&quot;&gt;1,536&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px;&quot;&gt;66.8&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 18px;&quot;&gt;$0.06&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오픈소스 모델 비교&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;모델&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;제공사&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;차원&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;MTEB 점수&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;라이선스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;BGE-M3&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;BAAI&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1,024&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;63.0&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;Qwen3-Embedding-8B&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;Alibaba&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;4,096&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;70.6&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;E5-Mistral-7B&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;Microsoft&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;4,096&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;66.6&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Qwen3-Embedding-8B의&amp;nbsp;70.6은&amp;nbsp;2026년&amp;nbsp;3월&amp;nbsp;기준&amp;nbsp;오픈소스&amp;nbsp;모델&amp;nbsp;중&amp;nbsp;최상위&amp;nbsp;수준이다.&amp;nbsp;다만&amp;nbsp;8B&amp;nbsp;파라미터&amp;nbsp;모델을&amp;nbsp;자체&amp;nbsp;서빙하려면&amp;nbsp;GPU&amp;nbsp;인프라&amp;nbsp;비용과&amp;nbsp;운영&amp;nbsp;부담을&amp;nbsp;함께&amp;nbsp;고려해야&amp;nbsp;한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;text-embedding-3-small을&amp;nbsp;선택하는&amp;nbsp;이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음&amp;nbsp;RAG를&amp;nbsp;구현하는&amp;nbsp;상황이라면&amp;nbsp;text-embedding-3-small을&amp;nbsp;권장한다.&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;이유가&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;첫째, $0.02/100만 토큰이라는 가격은 경쟁 모델 대비 압도적이다. text-embedding-3-large와 비교해 약 6.5배 저렴하면서 MTEB 점수 차이는 2.3점에 불과하다. 근데 회사에서 구현한다면, 회사에서 지원 해주는 모델인지 확인부터 해보자. 내 경우엔 선택지가 많지 않았다.&lt;br /&gt;&lt;br /&gt;둘째, 한국어 성능이 이전 세대 ada-002 대비 크게 향상됐다. MIRACL 한국어 벤치마크에서 ada-002 대비 두 자릿수 이상 향상됐다고 알려져 있다.&lt;br /&gt;&lt;br /&gt;셋째,&amp;nbsp;MRL&amp;nbsp;지원으로&amp;nbsp;256차원부터&amp;nbsp;1,536차원까지&amp;nbsp;자유롭게&amp;nbsp;조절할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;프로토타입에서는&amp;nbsp;작은&amp;nbsp;차원으로&amp;nbsp;빠르게&amp;nbsp;실험하고,&amp;nbsp;프로덕션에서&amp;nbsp;필요한&amp;nbsp;차원으로&amp;nbsp;확장하는&amp;nbsp;방식이&amp;nbsp;가능하다.&lt;br /&gt;&lt;br /&gt;프로토타이핑 과정에서 로컬 모델을 직접 돌려보기도 하고 OpenAI 모델을 사용해보기도 했다. 로컬 모델은 리소스를 너무 많이 차지해서 부담스러웠고, 임베딩 API 비용 자체가 그렇게 비싸지 않았기 때문에 결국 OpenAI를 선택했다. MTEB 같은 정량 지표와 다국어 지원 여부를 우선 기준으로 삼았다.(로컬에서 돌릴 땐 노트북 쿨러 소리 때문에 날아가는 줄 알았다..)&lt;br /&gt;&lt;br /&gt;다만,&amp;nbsp;모델을&amp;nbsp;고르는&amp;nbsp;것보다&amp;nbsp;중요한&amp;nbsp;것이&amp;nbsp;있었다.&amp;nbsp;아무리&amp;nbsp;좋은&amp;nbsp;모델을&amp;nbsp;써도&amp;nbsp;문서의&amp;nbsp;품질&amp;nbsp;자체가&amp;nbsp;낮으면&amp;nbsp;검색&amp;nbsp;결과도&amp;nbsp;낮다.&amp;nbsp;&lt;b&gt;AI가&amp;nbsp;이해하기&amp;nbsp;쉬운&amp;nbsp;구조의&amp;nbsp;문서를&amp;nbsp;작성하는&amp;nbsp;것이&amp;nbsp;모델&amp;nbsp;선택보다&amp;nbsp;더&amp;nbsp;직접적으로&amp;nbsp;검색&amp;nbsp;품질에&amp;nbsp;영향을&amp;nbsp;줬다.&lt;/b&gt;&amp;nbsp;결국&amp;nbsp;임베딩&amp;nbsp;모델은&amp;nbsp;문서의&amp;nbsp;의미를&amp;nbsp;추출하는&amp;nbsp;도구일&amp;nbsp;뿐,&amp;nbsp;&lt;b&gt;의미&amp;nbsp;자체는&amp;nbsp;문서에&amp;nbsp;있어야&amp;nbsp;한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wiki-rag를 만들면서 생긴 질문들에서 혼자 공부하다가 글을 발행하게 됐다. 앞으로 순차적으로 포스팅을 할텐데 청킹, 차원, 모델 선택까지 각 단계에서 선택이 필요하다는 것을 알게 됐다.&lt;br /&gt;&lt;br /&gt;임베딩은&amp;nbsp;텍스트에&amp;nbsp;의미&amp;nbsp;좌표를&amp;nbsp;부여하는&amp;nbsp;기술이다.&amp;nbsp;그리고&amp;nbsp;그&amp;nbsp;좌표&amp;nbsp;위에&amp;nbsp;RAG&amp;nbsp;검색의&amp;nbsp;나머지가&amp;nbsp;세워진다.&amp;nbsp;&lt;b&gt;어떤 LLM을 쓰느냐보다, 문서를 어떻게 자르고 어떤 임베딩 모델을 고르느냐가 검색 품질을 더 직접적으로 결정한다.&amp;nbsp;&lt;/b&gt;난 요즘 한 사람이 작성하는 문서가 아니라 다양한 사람이 다양한 도구(draw.io, mermaid...)를 사용해서 작성하는 문서를 어떻게 RAG에서 검색이 잘 되게 할 지 고민하고 있다.&lt;br /&gt;&lt;br /&gt;차원에&amp;nbsp;대한&amp;nbsp;막연한&amp;nbsp;불안이&amp;nbsp;있다면&amp;nbsp;한&amp;nbsp;가지만&amp;nbsp;기억하면&amp;nbsp;된다.&amp;nbsp;좋은&amp;nbsp;모델은&amp;nbsp;낮은&amp;nbsp;차원에서도&amp;nbsp;충분히&amp;nbsp;강력하고,&amp;nbsp;MRL로&amp;nbsp;차원을&amp;nbsp;줄여도&amp;nbsp;품질이&amp;nbsp;크게&amp;nbsp;떨어지지&amp;nbsp;않는다.&amp;nbsp;768~1,024차원에서&amp;nbsp;시작해서&amp;nbsp;실제&amp;nbsp;검색&amp;nbsp;결과를&amp;nbsp;보며&amp;nbsp;조정하는&amp;nbsp;것이&amp;nbsp;가장&amp;nbsp;실용적인&amp;nbsp;접근이다.&lt;br /&gt;&lt;br /&gt;다음 단계는 검색된 청크를 얼마나 잘 쓰느냐다. 코사인 유사도 검색 이후에 Reranking을 적용하거나, 하이브리드 검색으로 키워드 기반 검색을 결합하는 방법이 실무에서 자주 쓰인다는 점을 알아두자.&lt;/p&gt;</description>
      <category>Tech</category>
      <author>CODe_</author>
      <guid isPermaLink="true">https://code1995.tistory.com/136</guid>
      <comments>https://code1995.tistory.com/136#entry136comment</comments>
      <pubDate>Tue, 24 Mar 2026 00:12:46 +0900</pubDate>
    </item>
    <item>
      <title>카드 정지는 성공했는데, 고객에게 알림이 안 갔다고요? &amp;ndash; MSA 환경의 설계 딜레마</title>
      <link>https://code1995.tistory.com/135</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7tJI9/btsMKQqHfsR/Ys8l9pQkKisaJ7wvRiYEk1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7tJI9/btsMKQqHfsR/Ys8l9pQkKisaJ7wvRiYEk1/img.webp&quot; data-alt=&quot;나무위키 - 딜레마&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7tJI9/btsMKQqHfsR/Ys8l9pQkKisaJ7wvRiYEk1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7tJI9%2FbtsMKQqHfsR%2FYs8l9pQkKisaJ7wvRiYEk1%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;263&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;나무위키 - 딜레마&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;금융 시스템에서 알림 발송 실패 시 어떻게 해야 할까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금융권 시스템에서 카드 분실 및 정지 프로세스처럼 &lt;b&gt;고객에게 필수 알림을 전달하는 상황이 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 카드 결제 시스템을 설계하며 흥미로운 고민을 마주하게 되었는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카드 도난 분실 신고 및 카드 정지 또는 해제와 같은 프로세스는 고객 보호와 금융 사고 예방을 위해 필수적으로 빠르게 처리되어야 하는 업무입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;또한, 고객에게 처리 결과에 대한 알림이 발송되지 않으면 금융 감독원 민원 등 중요한 규제 이슈로 이어질 수 있기에 알림의 중요성이 높습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 알림 발송을 처리하는 UMS는 별도의 시스템으로, &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;발송 성공을 항상 보장하지는 않습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때 메시지 발송 실패가 메인 비즈니스 처리에도 영향을 줘야 하는지 고민하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #666666;&quot;&gt;(ex. 중요한 알림이 발송 실패하면 비즈니스도 실패하게 할 것인가?)&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;왜 카드 정지 알림이 중요한 걸까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카드 분실이나 도난 시, 고객은 매우 불안한 상황에 처합니다. 이때 카드가 즉시 정지되었다는 알림 메시지를 받으면 고객은 안심할 수 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 알림을 받지 못했다면 고객은 실제 카드가 제대로 정지되었는지 의심하게 되고, 결국 불안감 때문에 고객센터로 직접 전화하거나 민원을 제기할 가능성이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최악의 경우, 금융감독원 민원으로까지 이어져 회사 차원에서 부담이 되는 상황도 생길 수 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 금융권에서는 고객 알림을 단순한 안내 메시지가 아니라 고객과의 신뢰 및 규제 기관 대응이라는 중요한 문제로 바라봅니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;메시지 발송 실패를 시스템 처리 실패로 봐야 할까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무를 하다 보면 이런 고민이 꽤 자주 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 설명한 이유처럼 고객에게 메시지가 전달되는 것은 중요하기에 비즈니스가 실패했다고 봐야 하는 입장도 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로, 핵심 업무의 중요성을 고려하면 알림 발송 실패 때문에 카드 정지 처리 자체가 실패해서는 안 된다는 의견이 대다수일겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 메시지 발송 시스템 장애로 인해 카드가 즉시 정지되지 않으면, 훨씬 더 심각한 피해가 발생할 수 있기 때문이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 카드 도난 사고가 발생한 상황에서 메시지 발송 실패로 정지가 되지 않으면 고객의 피해뿐 아니라, 회사에 매우 큰 법적, 재정적 책임 문제로 돌아올 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉, 알림 발송 실패로 정지 프로세스 자체를 실패로 처리하는 로직은 오히려 더 큰 문제를 발생시킬 위험이 크죠.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;이 문제는 결국, &lt;b&gt;업무 로직과 부가 로직의 결합도를 어떻게 관리해야 하는지에 대한 본질적인 문제&lt;/b&gt;로 바라볼 수 있습니다.&lt;/u&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;의견 충돌 사례&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UMS 발송 관련 로직은 모든 클라이언트에서 필요한 부분이기에 공통 라이브러리에서 관리하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 주제로 공통 라이브러리(유틸 클래스)를 관리하는 두 동료의 견해 차이가 뚜렷했고 두 의견에 모두 공감되어 정말 난처했었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동료A&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;금융 시스템은 메시지 발송 실패 상황을 대비해야 한다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;재발송 로직을 마련하고, 필요시 수동 발송까지 가능한 백오피스도 필요하다&lt;/li&gt;
&lt;li&gt;금융감독원 민원 발생 시 소명 가능한 자료가 필요하기에 재처리를 했다는 것을 남겨두는 것이 중요하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동료B&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 요구사항은 서비스마다 중요도가 달라 마이너한 문제다&lt;/li&gt;
&lt;li&gt;발송 재시도 여부나 허용 지연 시간이 비즈니스마다 다르기 때문에 공통 라이브러리에 구현하면 복잡성이 증가한다(이미 너무 많은 것들을 공통화했기에 좀 더 신중해져야 한다)&lt;/li&gt;
&lt;li&gt;모든 상황을 커버하기 위해 공통 유틸로 관리하면, 설정과 관리 비용이 지나치게 높아질 수 있다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;알림 발송에 실패하면 실패한대로 두고 대응하면 된다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 가지 입장 모두 현실적이고 합리적이라고 느꼈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 동료A가 말한 내용은 현실적인 금융 시스템의 상황과 매우 밀접한 의견이었는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금융 산업은 안정성과 신뢰성은 물론이고, 특히 규제기관(금융감독원) 대응이라는 비즈니스적인 문제까지 고려해야 하기에 재발송 로직과 백오피스를 준비해야 한다는 주장이 설득력 있다고 느꼈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 동료B가 말한 부분도 공감이 됐습니다. 공통 유틸이 너무 많은 부분까지 공통화하거나 지나치게 복잡해지면 결국 서비스마다 불필요한 옵션까지 고민하게 되는 오버헤드를 유발할 수 있으니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 모든 서비스를 하나의 공통 규격으로 해결하기 어렵고, 서비스마다 민감도와 긴급성이 다르기 때문에 공통화된 접근이 지나치게 복잡성을 높일 수도 있지요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 생각은, &lt;b&gt;업무 로직과 부가 로직을 철저히 분리하되, 최소한의 공통 대응을 가능하게 하는 구조로 결론 내는 게 가장 현실적이고 이상적인 설계&lt;/b&gt;라고 생각이 들었고 결국 이 문제는 &lt;b&gt;기술적 설계 문제일 뿐만 아니라, 금융권 특유의 비즈니스 리스크 관리 측면에서도 중요하게 다뤄야 하는 이슈&lt;/b&gt;라는 생각도 들었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;기존의 공통 유틸 상황과 현실적인 고민&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용하고 있는 공통 유틸인 UmsSendUtil.send() 메서드는 메시지 발송을 1회만 간편하게 처리할 수 있게 제공하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발송에 실패하면 클라이언트에서 간단한 예외 처리만 할 수 있도록 CheckedException을 구현하게 해두었어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 재처리까지 공통으로 지원하려면 복잡성이 크게 증가하게 되죠.&lt;/p&gt;
&lt;pre id=&quot;code_1742023214572&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기존 공통 유틸 사용법
public void doSomething() {
  try {
    UmsSendUtil.send(message);
  } catch (UmsException e) {
    // 실패 시, 예외 처리
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, 재처리 옵션을 공통 유틸에서 제공해 준다면 아래와 같이 바뀔 수 있겠네요.&lt;/p&gt;
&lt;pre id=&quot;code_1742023291912&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void doSomething() {
  // 개선된 옵션 제공 예시
  UmsSendOptions options = UmsSendOptions.builder()
    .retryEnabled(true)             // 자동 재발송 여부
    .maxRetryCount(3)               // 최대 재발송 횟수
    .retryInterval(Duration.ofMinutes(1)) // 재발송 간격
    .alertOnFinalFailure(true)      // 최종 실패 시 담당자 알림
    .businessCritical(true)         // 업무 긴급성 설정
    .build();

  UmsSendUtil.send(message, options);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 옵션을 제공하면, 각 마이크로서비스(클라이언트)에서는 자신들의 업무 성격과 상황에 맞게 알림 발송 로직을 유연하게 선택할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;하지만 동시에, 이러한 옵션 제공으로 인해 서비스별로 알림 발송 실패에 대한 고민의 폭이 더 넓어질 수도 있습니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;/u&gt;이러한 고민들 말이죠.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;재처리가 필요한 비즈니스인가?&lt;/li&gt;
&lt;li&gt;몇 번 재시도할까?&lt;/li&gt;
&lt;li&gt;수동 처리는 누가, 언제 하지?&lt;/li&gt;
&lt;li&gt;재시도하게 되면 지연 발송이 될 수 있을 텐데, 지연발송 되어도 괜찮은가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;재처리 로직이 쉽지 않은 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동료B의 부담도 쉽게 공감할 수 있었던 이유가, &lt;b&gt;UMS 발송 실패 시 재처리 기능은 간단해 보이지만, 실제로 아키텍처적으로는 생각보다 쉽지 않은 문제이기 때문입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재발송 기능을 구현할 때 반드시 고민해야 하는 &lt;b&gt;복잡성이 존재&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가령, 재발송 기능을 구현하려면 &lt;u&gt;&lt;b&gt;어떤 방식으로든 메시지를 다시 처리할 수 있는 메커니즘이 필요합니다.&lt;/b&gt;&lt;/u&gt; 단순히 메소드 호출을 반복하면 자칫 시스템 부하나 장애 확산 위험도 생기기에, 보통은 메시지 큐나 이벤트 드리븐을 하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 아래와 같은 고민을 필수적으로 거쳐야만 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원자성을 보장하려면 어떻게 해야 할까?&lt;/li&gt;
&lt;li&gt;이벤트가 유실되지 않게 하는 방법은 뭐가 있을까?&lt;/li&gt;
&lt;li&gt;재처리를 시도하다가 장애가 발생하면 해당 이벤트는 어디다 쌓아야 할까?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 아웃박스 패턴도 사용해 볼 것이고, 에러 로깅이나 담당자가 즉각 대응할 수 있도록 알림 프로세스도 설계해야 하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이러한 기술적이고 아키텍처적인 운영적인 고민들이 동반되기에, 재처리 기능은 단순히 &quot;옵션 하나 추가&quot;의 문제가 아니라 시스템의 복잡성 증가로 이어질 수 있다는 점을 분명히 인지해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;(주된 주제는 아니기에 여기서는 짧게 설명했지만 하나하나 규모가 큰 것들이죠..)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;제 생각은요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지&amp;nbsp;이야기를&amp;nbsp;기술적&amp;nbsp;관점으로만&amp;nbsp;좁혀서&amp;nbsp;바라보면,&amp;nbsp;발송&amp;nbsp;실패&amp;nbsp;시의&amp;nbsp;재처리,&amp;nbsp;장애&amp;nbsp;대응과&amp;nbsp;같은&amp;nbsp;기술적인&amp;nbsp;접근에만&amp;nbsp;머무를&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 좀 더 넓은 시각에서 바라보면 기술적 고려 이전에 더 중요한 아래의 질문들을 던져야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 알림 발송 재처리 기능이 과연 우리 비즈니스에 정말로 중요한가?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐면 각 마이크로서비스마다 제공하는 업무의 성격과 중요도가 근본적으로 다르기 때문이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;첫째, 이 알림 메시지는 정말 긴급한 업무인가?&lt;/b&gt;&lt;br /&gt;예컨대&amp;nbsp;카드&amp;nbsp;도난&amp;nbsp;분실과&amp;nbsp;같이&amp;nbsp;즉각적인&amp;nbsp;처리가&amp;nbsp;중요한&amp;nbsp;경우에는&amp;nbsp;재처리와&amp;nbsp;즉시&amp;nbsp;알림이&amp;nbsp;필요합니다.&amp;nbsp;그러나&amp;nbsp;단순히&amp;nbsp;안내성&amp;nbsp;메시지라면&amp;nbsp;재발송이&amp;nbsp;필요하지&amp;nbsp;않을&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;둘째, 발송 실패 시 업무를 중단할 만큼 중요한 메시지인가?&lt;/b&gt;&lt;br /&gt;만약&amp;nbsp;발송이&amp;nbsp;지연되는&amp;nbsp;경우&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;피해를&amp;nbsp;초래할&amp;nbsp;위험이&amp;nbsp;있다면&amp;nbsp;재처리&amp;nbsp;로직이&amp;nbsp;필수겠죠.&amp;nbsp;하지만&amp;nbsp;마케팅&amp;nbsp;메시지와&amp;nbsp;같은&amp;nbsp;알림은&amp;nbsp;단순히&amp;nbsp;실패로&amp;nbsp;끝내도&amp;nbsp;업무에&amp;nbsp;큰&amp;nbsp;영향이&amp;nbsp;없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;셋째, 지연 발송이 허용 가능한가? 허용한다면 얼마나?&lt;/b&gt;&lt;br /&gt;긴급성이&amp;nbsp;높은&amp;nbsp;알림은&amp;nbsp;1분&amp;nbsp;이내&amp;nbsp;재발송을&amp;nbsp;요구할&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;그렇지&amp;nbsp;않은&amp;nbsp;업무는&amp;nbsp;몇&amp;nbsp;시간&amp;nbsp;이후&amp;nbsp;발송되어도&amp;nbsp;문제가&amp;nbsp;없을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;지연&amp;nbsp;발송을&amp;nbsp;허용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;기준이&amp;nbsp;명확히&amp;nbsp;정의되어야&amp;nbsp;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국&amp;nbsp;더 넓은 관점에서는&amp;nbsp;모든&amp;nbsp;서비스를&amp;nbsp;하나의&amp;nbsp;기술적&amp;nbsp;해결책으로&amp;nbsp;접근하는&amp;nbsp;것이&amp;nbsp;아니라,&amp;nbsp;서비스마다&amp;nbsp;메시지&amp;nbsp;발송&amp;nbsp;실패가&amp;nbsp;미치는&amp;nbsp;비즈니스적&amp;nbsp;영향과&amp;nbsp;민원&amp;nbsp;대응&amp;nbsp;가능성,&amp;nbsp;고객&amp;nbsp;만족도와&amp;nbsp;리스크&amp;nbsp;수준까지도&amp;nbsp;모두&amp;nbsp;함께&amp;nbsp;고려하여&amp;nbsp;최적의&amp;nbsp;설계를&amp;nbsp;결정해야&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하자면, 업무 프로세스는 명확하게 핵심 로직과 부가 로직을 나누고, 공통 유틸에서는 최소한의 옵션과 로그를 제공하는 방식으로 지원해야 한다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&amp;nbsp;&lt;u&gt;&lt;b&gt;공통&amp;nbsp;유틸에서 재처리 옵션을&amp;nbsp;제공하는&amp;nbsp;이유는&amp;nbsp;기술적&amp;nbsp;편리함&amp;nbsp;때문이&amp;nbsp;아니라,&amp;nbsp;각&amp;nbsp;서비스가&amp;nbsp;자신들의&amp;nbsp;비즈니스&amp;nbsp;성격과&amp;nbsp;현실적인&amp;nbsp;요구사항에&amp;nbsp;따라&amp;nbsp;메시지&amp;nbsp;처리&amp;nbsp;방식을&amp;nbsp;자유롭게&amp;nbsp;선택하고,&amp;nbsp;그&amp;nbsp;결과에&amp;nbsp;책임질&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하기&amp;nbsp;위함&lt;/b&gt;&lt;/u&gt;입니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무를 하다 보면 이와 같은 딜레마(트레이드오프) 상황에 종종 노출되곤 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서 말씀드리고 싶었던 것은, 작은 기술적 이슈가 결국 프로젝트 전체의 비즈니스 리스크나 고객 신뢰도 문제로 확대될 수 있다는 것이며, 중요한 건 기술적 완벽성이 아니라, 기술이 비즈니스에 어떤 가치를 줄 수 있는지를 명확히 바라보는 넓은 시각이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #666666;&quot;&gt;종종 기술에만 매몰되는 제 자신을 보며 아직 갈 길이 멀다는 것을 체감합니다.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번&amp;nbsp;글이&amp;nbsp;여러분이&amp;nbsp;시스템&amp;nbsp;설계&amp;nbsp;시&amp;nbsp;더&amp;nbsp;넓은&amp;nbsp;시야와&amp;nbsp;현실적인&amp;nbsp;판단력을&amp;nbsp;가질&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;작은&amp;nbsp;도움이&amp;nbsp;되었으면&amp;nbsp;좋겠습니다.&lt;/p&gt;</description>
      <category>후기/경험</category>
      <author>CODe_</author>
      <guid isPermaLink="true">https://code1995.tistory.com/135</guid>
      <comments>https://code1995.tistory.com/135#entry135comment</comments>
      <pubDate>Sat, 15 Mar 2025 17:26:47 +0900</pubDate>
    </item>
    <item>
      <title>영어 공부하다 딴짓하기</title>
      <link>https://code1995.tistory.com/134</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_barbell-1839086_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y48a2/btsMBdYBj5m/88NVUgnw9P14Yk6kGEQ3y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y48a2/btsMBdYBj5m/88NVUgnw9P14Yk6kGEQ3y0/img.png&quot; data-alt=&quot;출처 픽사베이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y48a2/btsMBdYBj5m/88NVUgnw9P14Yk6kGEQ3y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY48a2%2FbtsMBdYBj5m%2F88NVUgnw9P14Yk6kGEQ3y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;400&quot; data-filename=&quot;edited_barbell-1839086_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 픽사베이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프롤로그&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://imksh.com/132&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.02 - [Degrees] - 심장뛰는 석사 입학 준비&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740895261525&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;심장뛰는 석사 입학 준비&quot; data-og-description=&quot;프롤로그:&amp;nbsp; 인생에서 석사라는 학위가 필요할까?저는 공부에 흥미도 없었고 딱히 잘하지도 못했습니다. 겨우 대학에 진학하고 나서야 공부에 재미를 느끼기 시작했고, 제가 좋아하는 분야가 무&quot; data-og-host=&quot;imksh.com&quot; data-og-source-url=&quot;https://imksh.com/132&quot; data-og-url=&quot;https://imksh.com/132&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/m03ir/hyYmI6TlOb/OnKVMSN0TDAl4ZL091kZNk/img.jpg?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/dnTI9B/hyYmOMObGL/FzywI3cPOsRuAHTRNCipjK/img.jpg?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/QaD6F/hyYjzqcjVZ/nR3mDn2VKPDcFTUFKEr7Tk/img.jpg?width=750&amp;amp;height=499&amp;amp;face=0_0_750_499&quot;&gt;&lt;a href=&quot;https://imksh.com/132&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://imksh.com/132&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/m03ir/hyYmI6TlOb/OnKVMSN0TDAl4ZL091kZNk/img.jpg?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/dnTI9B/hyYmOMObGL/FzywI3cPOsRuAHTRNCipjK/img.jpg?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/QaD6F/hyYjzqcjVZ/nR3mDn2VKPDcFTUFKEr7Tk/img.jpg?width=750&amp;amp;height=499&amp;amp;face=0_0_750_499');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;심장뛰는 석사 입학 준비&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;프롤로그:&amp;nbsp; 인생에서 석사라는 학위가 필요할까?저는 공부에 흥미도 없었고 딱히 잘하지도 못했습니다. 겨우 대학에 진학하고 나서야 공부에 재미를 느끼기 시작했고, 제가 좋아하는 분야가 무&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;imksh.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 글에 이은 두번째 글입니다.&amp;nbsp;어느덧 영어를 준비한 지 1개월이 되었고, 그동안 느낀 솔직한 후기를 남겨봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 개발자가 영어 공부를 하면 이 능력을 어떤식으로 활용하는지 들려드리겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토플 준비에 관심이 있거나, 그저 개발자가 영어 공부 할 때 어떤 식으로 능력을 활용하는지 궁금하신 분들께 후루룩 읽기 쉬운 글이 되길 바랍니다.&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;다시 바빠진 일상&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토플 현강에 1개월 동안 참여했고, 월/수/금 강남에 위치한 영어 학원을 다니고 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;학원을 가는 날엔 오후 6시 20분쯤 퇴근하여 오후 7시에 시작하는 수업에 참여합니다. 그리고 10시쯤 수업이 끝나면 집으로 돌아가 늦은 저녁을 먹습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;평소 같았으면 야근을 하고 퇴근할 시간인데, 그 시간 동안 영어 수업을 듣다 보니 업무에 쏟는 시간이 줄어들었어요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;절대적으로 투자하는 시간이 줄다보니, 업무에 대한 압박이 높아졌고 학원을 가지 않는 날에 더 몰입해서 일하기도 하고 더 오래 야근을 하기도 합니다. 하지만 여전히 시간이 부족해서 주말을 활용해서 업무를 해야겠다는 생각을 했습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한 &lt;b&gt;출근, 퇴근 길, 화장실에 머무르는 시간에 항상 휴대폰으로 단어를 외우기 시작&lt;/b&gt;했습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;인스타그램과 같은 &lt;b&gt;SNS 앱에 사용제한을 걸어두고 일상생활에 영어를 공부하는 비중을 올려갔어요.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dv2TEq/btsMBhT6xue/dyCER4wMfnIltkixMMKGO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dv2TEq/btsMBhT6xue/dyCER4wMfnIltkixMMKGO1/img.png&quot; data-alt=&quot;일상 스케줄 표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dv2TEq/btsMBhT6xue/dyCER4wMfnIltkixMMKGO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdv2TEq%2FbtsMBhT6xue%2FdyCER4wMfnIltkixMMKGO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;299&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;일상 스케줄 표&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주말에는 미뤄진 일들을 처리해야 합니다. 블로그 글도 써야 하고, 커뮤니티 운영, 회의, 커피챗, 헬스 등 평일에 소화하지 못한 일들을 쳐내기에 바쁘죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주변 동료들은 저를 보고 &quot;고시생&quot;이라고 부르기 시작했습니다. 시도 때도 없이 계속 단어를 외우고 있거든요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학원 수업은 어땠나?&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;수업 후기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 첫 수업부터 막막함을 느꼈습니다. 이미 기초(문법)가 되어 있다는 가정 하에 진행된다는 느낌이 강했어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 회사에서 출발하기 전 10~15분 정도 간식을 섭취하고 수업을 듣는데, 졸음이 밀려와 화가 날 때도 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명확한 목표가 있어서 그런지, 스스로 조는 모습을 마주할 때면 수업에 집중하지 못해서 답답했거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토플은 총 4과목으로 구성되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토익과 동일하게 Reading, Listening을 비롯해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Speaking, Writing 과목도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Speaking, Writing 과목이 단순히 말하고 쓰는 것이 아니라 Reading과 Listening 실력이 뒷받침되지 않으면 무조건 실패할 수밖에 없다고 생각됐어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;말하기 위해 수십줄의 지문을 읽어야 하고, 그 지문을 기반으로 토론하는 두 사람의 대화를 듣고, 말을 하거나 글로 써야 하거든요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;영알못인 제겐 &quot;와.. 이걸 어떻게 해..?&quot;라는 생각이 들게 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 5분이 넘어가는 리스닝을 듣다 보면 집중력이 흐려지고 정신이 혼미해지기 시작합니다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그래도 선생님께서 재밌게 수업을 해주셔서 중간중간 몰입되게 만들어 주셨어요. 농담하는 시간마저도 수업에 포함된 것처럼 스토리텔링이 되었고, &quot;역시 1타 강사는 다르구나&quot;라는 생각이 들었어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;수강생 나이대&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;연령대는 얼핏 액면가로 봤을 땐, 제가 제일 나이가 많아 보였어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다들 대학생 느낌이 물씬 났습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;각자의 다른 목표와 이유로 학원에 왔겠지만, 상대 평가로 점수를 매기는 과목에선 모두 경쟁자이기에 제 승부욕을 자극하기도 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;그리고 저는 부모님 돈이 아니라 &lt;u&gt;제 돈으로 결제&lt;/u&gt;했잖아요? 제가 제일 강할 겁니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개인 공부&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개발자가 개발이나 해야지&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;단어 암기 페이지 제작&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학원에서는 매일 50개의 영어단어 시험을 치릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[영어단어 - 뜻]으로 구성된 단어장을 보고 단어와 뜻을 외우기만 했었는데요, 시대가 변한 건지 토플이 이런 건지는 모르겠으나 아래 사진처럼 [영어단어 - 뜻 - 유사어] 형태로 구성된 단어장이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;934&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eFe4lx/btsMAMAhTae/35wK7N9jCJTKzq5OaOI2N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eFe4lx/btsMAMAhTae/35wK7N9jCJTKzq5OaOI2N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eFe4lx/btsMAMAhTae/35wK7N9jCJTKzq5OaOI2N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeFe4lx%2FbtsMAMAhTae%2F35wK7N9jCJTKzq5OaOI2N1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;393&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;934&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단어 시험은 &lt;b&gt;문제에 나오는 영어 단어만 보고 유사한 뜻을 가진 영어단어를 고르는 방식&lt;/b&gt;으로 시험을 칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;학창 시절에는 그냥 선생님이 제공해 주는 단어장을 보고 쓰고, 말하고, 눈으로 보며 단어를 외웠어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 하나의 영어 단어에 엮여있는 모든 유사어를 다 외웠는지 스스로도 알기 어려웠기에 &lt;u&gt;&lt;b&gt;빠르게 외울 수 있고, 확실하게 외울 수 있는 나만의 단어 외우는 방식이 필요했어요.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 어엿한 개발자가 되어 간단한 웹페이지 정도는 AI를 이용해 20분이면 배포까지 할 수 있는 시대가 되었죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서, &quot;단어를 효율적으로 외우는 페이지를 만들자&quot;라는 생각을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별다른 설계 없이 아래처럼 무작정 페이지를 만들었어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;1496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DAycE/btsMAizwNfe/kRTSi4l4ydQ9JQtMcZcbf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DAycE/btsMAizwNfe/kRTSi4l4ydQ9JQtMcZcbf1/img.png&quot; data-alt=&quot;유사어를 외우기 위한 웹페이지 제작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DAycE/btsMAizwNfe/kRTSi4l4ydQ9JQtMcZcbf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDAycE%2FbtsMAizwNfe%2FkRTSi4l4ydQ9JQtMcZcbf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;457&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;1496&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유사어를 외우기 위한 웹페이지 제작&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 단어 시험처럼 4지선다 중에서 유사한 단어를 고르는 페이지를 만들었어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데, 스스로 기능을 테스트하며 신기한 점이 있었습니다. 처음 보는 단어의 경우, 해당 영어 단어를 먼저 보지 않고, &lt;b&gt;본능적으로 의미를 보고 정답을 선택&lt;/b&gt;하더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;u&gt;&lt;b&gt;첫 사이클은 한글 뜻과 영어 단어를 매칭시키는 암기를 진행하게 됩니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;1496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjDCAM/btsMzqSgUkw/G0NXkHvaB8kfE3C9TAlkY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjDCAM/btsMzqSgUkw/G0NXkHvaB8kfE3C9TAlkY0/img.png&quot; data-alt=&quot;오답인 경우 정답이 노출됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjDCAM/btsMzqSgUkw/G0NXkHvaB8kfE3C9TAlkY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjDCAM%2FbtsMzqSgUkw%2FG0NXkHvaB8kfE3C9TAlkY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;480&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;1496&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오답인 경우 정답이 노출됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오답의 경우 정답이 노출되고 그 단어를 한번 더 기억할 수 있게 구현했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답을 한 번 맞힌 단어라면 두 번째 사이클로 들어가게 되는데요, 두번째 사이클에는 한글 뜻이 노출되지 않도록 만들었어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;1522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgBl2N/btsMyCslzvs/AGqOc8K0SjEM4mBpWau2AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgBl2N/btsMyCslzvs/AGqOc8K0SjEM4mBpWau2AK/img.png&quot; data-alt=&quot;두번째 사이클은 한글 뜻이 노출되지 않음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgBl2N/btsMyCslzvs/AGqOc8K0SjEM4mBpWau2AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgBl2N%2FbtsMyCslzvs%2FAGqOc8K0SjEM4mBpWau2AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;489&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;1522&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두번째 사이클은 한글 뜻이 노출되지 않음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 &lt;b&gt;영어 단어만 보고 유사한 단어를 선택해야 하죠.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 두 번째 사이클까지 정답을 맞히면 그 단어는 초기화하기 전까지 더 이상 노출되지 않습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;암기 프로세스&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 여러 테스트를 거친 후, 이러한 프로세스로 정착하게 하게 됩니다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mmpLj/btsMylK4c4U/2yPFRNKKQoOGEk7PTM6rT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mmpLj/btsMylK4c4U/2yPFRNKKQoOGEk7PTM6rT0/img.png&quot; data-alt=&quot;영어단어 암기 프로세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mmpLj/btsMylK4c4U/2yPFRNKKQoOGEk7PTM6rT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmmpLj%2FbtsMylK4c4U%2F2yPFRNKKQoOGEk7PTM6rT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2116&quot; height=&quot;265&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;영어단어 암기 프로세스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;외운 단어는 먼저 암기 완료 사이클로 진입하여 더 이상 노출되지 않게 되고, &lt;b&gt;외우지 못한 단어는 계속 첫 번째 또는 두 번째 사이클에 남게 되겠죠.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;구현과 배포는 어떻게?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발자라면 가장 궁금해할 부분&lt;/b&gt;이 아닐까 생각이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python3, Flask, Html/CSS, Javascript를 활용했고, 뼈대가 되는 스켈레톤 코드는 ChatGPT 4o를 활용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포의 경우 &lt;a href=&quot;https://vercel.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;vercel&lt;/a&gt;을 이용했고 github에 커밋푸시를 하게 되면 &lt;b&gt;vercel에 자동 배포하는 파이프라인&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커밋 룰, 클린코드.. 등 다 좋지만 누군가에게 공개할 것도 아니고, 극한의 시간 활용을 위해 이런 부분까진 신경쓰지 않기로 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vc6Nl/btsMAuzU9HF/AdCs9xVdDYqI2NZAmySx40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vc6Nl/btsMAuzU9HF/AdCs9xVdDYqI2NZAmySx40/img.png&quot; data-alt=&quot;단어 페이지 Github&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vc6Nl/btsMAuzU9HF/AdCs9xVdDYqI2NZAmySx40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvc6Nl%2FbtsMAuzU9HF%2FAdCs9xVdDYqI2NZAmySx40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;259&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;948&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;단어 페이지 Github&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형상 관리는 Github에서 private-repository로 관리하고 있구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;욕심내서 신기능을 적용하다가 버그가 발견되어 롤백하기도 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로 &lt;u&gt;&lt;b&gt;영어 발음을 해주는 기능&lt;/b&gt;&lt;/u&gt;이 정말 좋았는데요. 아래와 같은 코드를 구현했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1740897459398&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function playPronunciation(word) {
    const utterance = new SpeechSynthesisUtterance(word);
    utterance.lang = 'en-US';
    speechSynthesis.speak(utterance);
}

    // ✅ 페이지 로드 시 자동으로 유사어 발음 실행
window.onload = function() {
    setTimeout(function() {
        playPronunciation('{{ question.synonym }}');
    }, 300); // 0.3초 딜레이 후 실행
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토플은 &lt;b&gt;스피킹 과목도 있기 때문에 영어 발음도 중요&lt;/b&gt;한데요, 처음 보는 단어를 읽을 때 잘못 발음하여 외울 수 있는데 위 코드를 이용해 영어 발음을 들으며 암기할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단어가 노출될 때, 보기에 나와있는 단어 버튼을 클릭했을 때, 의도적으로 발음 버튼을 눌렀을 때 해당 함수를 호출하여 영어 발음을 들려줍니다. &lt;b&gt;개인적으로 정말 마음에 드는 기능 중 하나라고 생각합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나 귀찮은 점은 아직 스프레드파일을 직접 추출해서 repository에 넣어줘야 한다는 점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간적 여유가 생기면, 스프레드시트 API를 활용해 입력한 값을 읽어와 처리할 생각입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 저는 단어를 스프레드시트에 입력하기만 하고 특정 API를 호출해 단어 목록을 다시 읽어오기만 하면 되겠죠.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;다시 구현한다면?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python, Flask 없이 그냥 html, css, javascript만 활용할 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼭 서버를 띄우지 않아도 &lt;b&gt;정적 파일만으로 작동시키는 거죠.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 Flask를 이용하고 있고, 최소한의 서버 통신을 하고 있긴 하지만..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가끔 연결이 끊기면 다시 로딩하는 부분이 불편하다고 느꼈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특별히 거창한 기능이 없기에 기존 기능을 javascript만으로도 대체할 수 있을 것 같네요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;하여간, 개발자들이란..&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r4mO1/btsMALIcQ93/qd9VKAQboOlD3kBxSiJKXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r4mO1/btsMALIcQ93/qd9VKAQboOlD3kBxSiJKXK/img.png&quot; data-alt=&quot;개발자들이란..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r4mO1/btsMALIcQ93/qd9VKAQboOlD3kBxSiJKXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr4mO1%2FbtsMALIcQ93%2Fqd9VKAQboOlD3kBxSiJKXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;416&quot; height=&quot;370&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개발자들이란..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 이 페이지를 만들었을 타이밍에 &lt;b&gt;저와 함께 토플을 준비하고 계시는 분도 똑같이 뭔갈 만들었더라구요.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1911&quot; data-origin-height=&quot;920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boqV9I/btsMA8wm3U6/Oevok3c9pXm3NPn8giG4Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boqV9I/btsMA8wm3U6/Oevok3c9pXm3NPn8giG4Vk/img.png&quot; data-alt=&quot;토플 Writing 과목을 위한 훈련 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boqV9I/btsMA8wm3U6/Oevok3c9pXm3NPn8giG4Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboqV9I%2FbtsMA8wm3U6%2FOevok3c9pXm3NPn8giG4Vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1911&quot; height=&quot;920&quot; data-origin-width=&quot;1911&quot; data-origin-height=&quot;920&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토플 Writing 과목을 위한 훈련 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python, &lt;a href=&quot;https://streamlit.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Streamlit&lt;/a&gt;을 이용해 빠르게 UI를 구성하고 기능을 만드셨습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토플 Writing에서는 사용한 단어 갯수도 중요한데요, 보통 150개 이상의 단어를 사용해야 하기에 내가 작문할 때 몇 개의 단어를 사용했는지 카운팅 하는 기능과 문제를 랜덤 하게 출제하는 기능을 구현하셨어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 시간도 중요하기에 타이머 기능을 함께 넣어 실제 시험과 같은 환경에서 훈련할 수 있도록 디테일한 구현을 해뒀습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 똑같은 이야길 했는데,&lt;b&gt;&amp;nbsp;역시 영어보다 개발이 더 재밌다는 말을 남겼습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;부족한 어휘력 보충하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학원에서 시험을 위한 단어를 외우고 있긴 하지만, 저는&lt;b&gt; 더 많은 어휘를 습득해야 한다고 생각했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 말해보카라는 어플을 사용하며 프리미엄 회원을 결제했고 매일매일 단어를 습득하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 어플에 대한 설명은 이미 너무나 많은 글이 있고, 글을 보는것보다 체험판 기간을 활용해 직접 사용해보는 것을 권장드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백번 말로 듣는 것 보다 직접 해보는 게 빠를 거예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZF8SB/btsMAEh16px/WFKwRJirphQDbqK3p7fDgk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZF8SB/btsMAEh16px/WFKwRJirphQDbqK3p7fDgk/img.webp&quot; data-alt=&quot;말해보카 4인팟 추천드립니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZF8SB/btsMAEh16px/WFKwRJirphQDbqK3p7fDgk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZF8SB%2FbtsMAEh16px%2FWFKwRJirphQDbqK3p7fDgk%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;200&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;말해보카 4인팟 추천드립니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말해보카 어플에는 사용자의 학습 데이터 기반으로 다양한 시각 자료를 보여주는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진처럼 제 어휘력이 어느 정도인지 보여주기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WlsrW/btsMyITtB5O/BW9in0eRWQyUiQsnXdKNwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WlsrW/btsMyITtB5O/BW9in0eRWQyUiQsnXdKNwK/img.png&quot; data-alt=&quot;어휘력은 실제 영어 실력과 무관합니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WlsrW/btsMyITtB5O/BW9in0eRWQyUiQsnXdKNwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWlsrW%2FbtsMyITtB5O%2FBW9in0eRWQyUiQsnXdKNwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;443&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1593&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;어휘력은 실제 영어 실력과 무관합니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토플을 공부하면서 가장 크게 느낀 것은, 단순히 어휘를 암기했다에서 끝나는 게 아니라 직접 입 밖으로 그 단어를 내뱉어야 한다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 암기만 해두면, 그 단어를 리딩이나 리스닝할 때 이해할 수야 있겠지만 &lt;b&gt;작문을 하거나 스피킹을 할 때는 전혀 활용하지 못한다는 치명적인 약점이 있었거든요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 한글로 된 문장을 보고, &lt;b&gt;내가 번역가가 됐다는 느낌으로 영어 문장을 내뱉는 것을 계속 연습하고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어 공부를 빙자한 개발자들의 토이 프로젝트 아티클일지도 모르겠네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무튼, 개발을 전혀 몰랐더라면 지금처럼 효율적으로 공부하지 못했을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무와 동시에 학원도 다니고 과제에 치여 살다 보니, 곧 번아웃이 올 것 같은 조짐이 보이네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 문제를 풀다 보니 이거 &lt;b&gt;2개월 준비로는 어림도 없겠다는 생각이 듭니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주변 이야기를 들어보니 유학을 다녀오셨거나, 이미 영어가 익숙하신 분들은 짧게는 며칠, 길게는 한 달 정도 공부하면서 100점 이상을 받았다고 하더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 해당되지 않는 제겐 최소 4개월은 필요하겠다고 생각이 들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 제일 어려운 것은 멘탈싸움이라고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;계속 공부하며 체력적으로 정신적으로 지치다 보니, &quot;내가 석사를 그렇게 원했던가?&quot; 하는 생각도 문득문득 들곤 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span&gt;해보고 후회하는 것이&lt;br /&gt;안해보고 후회하는 것보다 낫다&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 딱 이 말만 다시 새기고, 오늘 하루도 힘겹게 넘겨보려 합니다.&lt;/p&gt;</description>
      <category>Degrees</category>
      <author>CODe_</author>
      <guid isPermaLink="true">https://code1995.tistory.com/134</guid>
      <comments>https://code1995.tistory.com/134#entry134comment</comments>
      <pubDate>Sun, 2 Mar 2025 22:19:22 +0900</pubDate>
    </item>
    <item>
      <title>제네릭이 작동하지 않는다</title>
      <link>https://code1995.tistory.com/133</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;building-5676506_1280.jpg&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MFapm/btsMlnmLv5u/aGB1d8VcWuVnKLfba34XFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MFapm/btsMlnmLv5u/aGB1d8VcWuVnKLfba34XFk/img.jpg&quot; data-alt=&quot;출처 픽사베이 - 글과 관련 없음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MFapm/btsMlnmLv5u/aGB1d8VcWuVnKLfba34XFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMFapm%2FbtsMlnmLv5u%2FaGB1d8VcWuVnKLfba34XFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;523&quot; data-filename=&quot;building-5676506_1280.jpg&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 픽사베이 - 글과 관련 없음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 글에서 등장하는 코드는 &lt;a href=&quot;https://github.com/CODe5753/playgroundddd/tree/main/notifier&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github&lt;/a&gt;에서 확인할 수 있습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1765123149931&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;playgroundddd/notifier at main &amp;middot; CODe5753/playgroundddd&quot; data-og-description=&quot;sample. Contribute to CODe5753/playgroundddd development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/CODe5753/playgroundddd/tree/main/notifier&quot; data-og-url=&quot;https://github.com/CODe5753/playgroundddd/tree/main/notifier&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cUhBKI/hyZOGgbFcm/h4tKDaqvGh1i8SUV4nvpo1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/JfZZa/hyZO4oLpwo/VSKc0FThhHt4sEvxQnfMs1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/CODe5753/playgroundddd/tree/main/notifier&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/CODe5753/playgroundddd/tree/main/notifier&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cUhBKI/hyZOGgbFcm/h4tKDaqvGh1i8SUV4nvpo1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/JfZZa/hyZO4oLpwo/VSKc0FThhHt4sEvxQnfMs1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;playgroundddd/notifier at main &amp;middot; CODe5753/playgroundddd&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;sample. Contribute to CODe5753/playgroundddd development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프롤로그&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 하다 보면 제네릭(Generic)과 다형성(Polymorphism)을 자연스럽게 조합해 사용하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, Spring 환경에서는 제네릭을 사용한 의존성 주입(DI)을 활용하여 다양한 객체를 동적으로 주입할 수 있는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 여기에는 예상치 못한 제네릭과 런타임 타입 매칭의 충돌이 발생할 수 있습니다.&lt;br /&gt;&lt;br /&gt;이번 글에서는 실무에서 겪었던 일이며, &quot;Notifier라는 인터페이스를 제네릭하게 만들었는데, 왜 자식 DTO를 처리하지 못할까?&quot;라는 문제를 해결하는 과정을 살펴보면서, &lt;b&gt;유연한 설계를 어떻게 할 수 있는지&lt;/b&gt; 고민해 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이번 아티클은 아래 독자에게 유용할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring Boot에서 타입 기반 매칭을 활용하는 분&lt;/li&gt;
&lt;li&gt;유지보수성이 높은 코드 구조를 고민하는 분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확한 타입 매칭과 유연한 타입 매칭의 차이를 이해하고, &lt;b&gt;적절한 구현 방식을 선택하는 과정&lt;/b&gt;을 배우고 싶은 분들에게 추천합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제상황&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  문제가 발생했던 AS-IS 코드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J6NM5/btsMiZIkmAj/NkmMDJ1kA7nNUpJoPRdtu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J6NM5/btsMiZIkmAj/NkmMDJ1kA7nNUpJoPRdtu0/img.png&quot; data-alt=&quot;카드 결제가 발생하면 받는 문자메세지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J6NM5/btsMiZIkmAj/NkmMDJ1kA7nNUpJoPRdtu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ6NM5%2FbtsMiZIkmAj%2FNkmMDJ1kA7nNUpJoPRdtu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;142&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카드 결제가 발생하면 받는 문자메세지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진처럼, 고객의 결제가 발생하고 결제가 완료되면 완료되었다는 알림을 고객에게 보내는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 결제 방식이나 기능에 따라 UMS인지 어플을 통한 알림인지가 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;UMS(Unified Messaging System)는 통합메시징 서비스를 뜻합니다. SMS, MMS, 이메일, 카톡 알림 등을 포함하여 이야기합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 하나씩 살펴볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;제네릭을 이용한 Notifier 인터페이스와 구현체&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1739586386701&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface Notifier&amp;lt;T&amp;gt; {
    void send(T request);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 인터페이스는 특정 타입의 DTO를 처리하는 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 고객에게 UMS던 앱 알림이던, 알림을 보내는 기능을 구현하려는거라 Notifier라는 인터페이스와 발송이라는 기능을 명시해 두었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알림을 보내기 위한 &lt;u&gt;&lt;b&gt;DTO는 자체적으로 구현하는 것이 아니라 라이브러리에서 제공받아 사용하기 때문에 유연한 구조 설계가 필요&lt;/b&gt;&lt;/u&gt;했거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알림을 보내는 &lt;b&gt;구조가 다른&amp;nbsp;새로운 DTO가 추가되더라도 구현체만 구현하기 위함&lt;/b&gt;이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739586518325&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@Component
public class UmsNotifier implements Notifier&amp;lt;UmsReqDto&amp;gt; {

    @Override
    public void send(UmsReqDto request) {
        log.info(&quot;[UMS Notifier] Sending message: &quot; + request.getMessage());
        // 문자 발송 로직
    }
}

@Slf4j
@Component
public class AppNotifier implements Notifier&amp;lt;AppNotiReqDto&amp;gt; {

    @Override
    public void send(AppNotiReqDto request) {
        log.info(&quot;[App Notifier] Sending message: &quot; + request.getMessage());
        // 앱 알림 발송 로직
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 구현해 두면, UMS 발송을 위해서는 &lt;b&gt;Notifier의 구현체를 호출하지 않아도 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;메서드 파라미터로 넘기는 객체의 타입에 따라 알아서 클래스가 지정이 될 거거든요.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에 &lt;b&gt;코디네이터&lt;/b&gt;를 보여드리면서 설명을 이어갈게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Notifier 빈을 주입해서 호출해 주는 유연한 코디네이터&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1739587171145&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class NotifierCoordinator {
    private final Map&amp;lt;Class&amp;lt;?&amp;gt;, Notifier&amp;lt;?&amp;gt;&amp;gt; notifierMap;

    // 빈에 등록된 Notifier 구현체를 Map에 등록
    public NotifierCoordinator(List&amp;lt;Notifier&amp;lt;?&amp;gt;&amp;gt; notifiers) {
        this.notifierMap = notifiers.stream()
                .collect(Collectors.toMap(
                        this::getGenericType, // 제네릭 타입 자동 추출
                        Function.identity()
                ));
    }

    @SuppressWarnings(&quot;unchecked&quot;)
    public &amp;lt;T&amp;gt; void send(T request) {
        Notifier&amp;lt;?&amp;gt; notifier = notifierMap.get(request.getClass());

        if (notifier != null) {
            Notifier&amp;lt;T&amp;gt; selectedNotifier = (Notifier&amp;lt;T&amp;gt;) notifier;
            selectedNotifier.send(request);
            return;
        }

        throw new IllegalArgumentException(&quot;No suitable notifier found for &quot; + request.getClass().getSimpleName());
    }

    
    private Class&amp;lt;?&amp;gt; getGenericType(Notifier&amp;lt;?&amp;gt; notifier) {
        // Notifier의 제네릭 타입을 가져옴
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NotifierCoordinator는 &lt;u&gt;&lt;b&gt;다양한 DTO 타입을 처리할 수 있도록 Notifier를 동적으로 매칭하는 역할&lt;/b&gt;&lt;/u&gt;을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DTO 타입에 관계없이 Notifier를 찾아 실행할 수 있는 구조에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실제 사용은 이렇게&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등록된 Dto라면 아래 코드처럼 &lt;u&gt;&lt;b&gt;코디네이터의 send만 호출하면 서비스 코드에서는 어떤 Notifier를 호출해야 하는지 신경 쓰지 않아도 됩니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739594802557&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@Service
@RequiredArgsConstructor
public class PaymentService {

    private final NotifierCoordinator notifierCoordinator;

    public void payment() {
        log.info(&quot;payment method&quot;);

        // Do something...

        notifierCoordinator.send(new UmsReqDto(&quot;memberId&quot;, &quot;message&quot;));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 발생: 라이브러리의 업데이트, 그리고 새롭게 생성된 DTO&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 날, 평화로운 오후였던 것 같아요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알림 발송을 위한 DTO는 자체적으로 구현하는 것이 아니라 &lt;b&gt;라이브러리에서 구현되어 오는 것&lt;/b&gt;이라 말씀드렸는데요, 얼마 전 &lt;b&gt;새로운 DTO가 추가되며 새로 애플리케이션을 구동할 때 런타임 에러가 발생&lt;/b&gt;했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로, UmsReqDto를 상속받는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt;자식 클래스&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;가 등장했거든요.&lt;/p&gt;
&lt;pre id=&quot;code_1739587446989&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SmsReqDto extends UmsReqDto {
    public SmsReqDto(String message, String recipient) {
        super(message, recipient);
    }
}

public class EmailReqDto extends UmsReqDto {
    private String emailSubject;

    public EmailReqDto(String message, String recipient, String emailSubject) {
        super(message, recipient);
        this.emailSubject = emailSubject;
    }

    public String getEmailSubject() {
        return emailSubject;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;코디네이터에서 부모인 Notifier&amp;lt;UmsReqDto&amp;gt;를 잘 찾아줄테니 작동 잘 되겠다~&quot; 라고 생각했었으나, 사실 그렇지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서 SmsReqDto를 사용하는 코드만 구현하고 앱을 구동했으나 Notifier에서 &lt;b&gt;&lt;/b&gt;&lt;u&gt;&lt;b&gt;빈을 찾지 못하는 문제&lt;/b&gt;&lt;/u&gt;가 있어 &lt;u&gt;&lt;b&gt;앱 자체가 실행이 안됐습니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제 분석&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;왜 Notifier&amp;lt;UmsReqDto(부모)&amp;gt;가 Notifier&amp;lt;SmsReqDto(자식)&amp;gt;를 처리하지 못할까?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 객체니까 당연히 처리되어야 하지 않나.. 라고 생각했고 제네릭의 공변&amp;amp;불변 문제인가? 라고 생각했었지만, 이건 크게 연관 없는 개념이었고, 결국 아래와 같은 이유라는 것을 알게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Map&amp;lt;Class&amp;lt;?&amp;gt;,&amp;nbsp;Notifier&amp;lt;?&amp;gt;&amp;gt;의&amp;nbsp;키&amp;nbsp;조회&amp;nbsp;방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 코디네이터의 notifierMap에서 클래스 타입(Class&amp;lt;?&amp;gt;)을 키로 사용하고 있기 때문에,&lt;br /&gt;자식 클래스가 부모 클래스로 처리되려면 부모-자식 관계를 고려한 탐색을 해야 하지만, Map.get()은 정확한 키 매칭만 수행하기 때문에 실패하는 거였어요.&lt;/p&gt;
&lt;pre id=&quot;code_1739595393377&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;notifierMap.get(request.getClass()); // 정확한 매칭만 가능 (부모-자식 관계 인식 불가)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코디네이터에는 위와 같은 코드로 클래스를 찾아서 가져오고 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;➡&amp;nbsp;SmsReqDto.class와&amp;nbsp;UmsReqDto.class는&amp;nbsp;&lt;b&gt;Map&amp;lt;Class&amp;lt;?&amp;gt;,&amp;nbsp;?&amp;gt;에서&amp;nbsp;별개의&amp;nbsp;키로&amp;nbsp;취급&lt;/b&gt;됨&lt;br /&gt;➡&amp;nbsp;SmsReqDto.class로&amp;nbsp;조회하면&amp;nbsp;UmsReqDto.class&amp;nbsp;키에&amp;nbsp;매핑된&amp;nbsp;Notifier를&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;없음&lt;br /&gt;&lt;br /&gt;즉, 유연성이 부족한 원인은 &lt;u&gt;&lt;b&gt;정확한 타입 매칭만 허용했기 때문&lt;/b&gt;&lt;/u&gt;이라고 볼 수 있어요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드 개선&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모-자식 관계의 클래스도 허용되도록 코드를 변경하여, &lt;b&gt;유연성을 확보해야겠다는 결론을 내렸습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 코드를 변경해 줬어요.&lt;/p&gt;
&lt;pre id=&quot;code_1739595544929&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@Component
public class NotifierCoordinator {

    // 생략

    @SuppressWarnings(&quot;unchecked&quot;)
    public &amp;lt;T&amp;gt; void send(T request) {
        for (Map.Entry&amp;lt;Class&amp;lt;?&amp;gt;, Notifier&amp;lt;?&amp;gt;&amp;gt; entry : notifierMap.entrySet()) {
            if (entry.getKey().isAssignableFrom(request.getClass())) {
                Notifier&amp;lt;T&amp;gt; selectedNotifier = (Notifier&amp;lt;T&amp;gt;) entry.getValue();
                selectedNotifier.send(request);
                return;
            }
        }
        throw new IllegalArgumentException(&quot;No suitable notifier found for &quot; + request.getClass().getSimpleName());
    }
    
    // 생략
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;isAssignableFrom()의 동작 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isAssignableFrom() 메서드는 클래스 간의 상속 관계를 활용하여 타입을 비교하는 기능을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739595864054&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.out.println(UmsReqDto.class.isAssignableFrom(SmsReqDto.class)); // true
System.out.println(SmsReqDto.class.isAssignableFrom(UmsReqDto.class)); // false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;A.class.isAssignableFrom(B.class)는 &lt;b&gt;B가 A의 하위 클래스라면&lt;/b&gt; &lt;b&gt;true를 반환&lt;/b&gt;하는 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, UmsReqDto.class.isAssignableFrom(SmsReqDto.class)는 true가 되어 SmsReqDto를 UmsReqDto의 Notifier로 매칭할 수 있는 거죠.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 개선을 통해, 타입 매칭을 보다 유연하게 만들면서도 유지보수성을 높이는 방향으로 수정할 수 있었습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.31%;&quot;&gt;비교 항목&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%;&quot;&gt;정확한 타입 매칭&lt;/td&gt;
&lt;td style=&quot;width: 46.7054%;&quot;&gt;유연한 타입 매칭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.31%;&quot;&gt;요청 객체 타입&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%;&quot;&gt;Map.get()으로&amp;nbsp;정확히&amp;nbsp;일치하는&amp;nbsp;타입만&amp;nbsp;조회&lt;/td&gt;
&lt;td style=&quot;width: 46.7054%;&quot;&gt;isAssignableFrom()을&amp;nbsp;사용하여&amp;nbsp;부모-자식&amp;nbsp;관계까지&amp;nbsp;탐색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.31%;&quot;&gt;자식 클래스 지원&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%;&quot;&gt;❌&amp;nbsp;(자식&amp;nbsp;클래스는&amp;nbsp;부모&amp;nbsp;Notifier를&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;없음)&lt;/td&gt;
&lt;td style=&quot;width: 46.7054%;&quot;&gt;✅&amp;nbsp;(부모&amp;nbsp;Notifier를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.31%;&quot;&gt;성능&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%;&quot;&gt;O(1) 조회 (빠름)&lt;/td&gt;
&lt;td style=&quot;width: 46.7054%;&quot;&gt;O(N) 탐색 (느릴 가능성 있음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.31%;&quot;&gt;유지보수성&lt;/td&gt;
&lt;td style=&quot;width: 37.9845%;&quot;&gt;제한적&amp;nbsp;(각&amp;nbsp;타입별&amp;nbsp;Notifier가&amp;nbsp;필요)&lt;/td&gt;
&lt;td style=&quot;width: 46.7054%;&quot;&gt;유연함 (부모 타입 Notifier로 범용 적용 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능적 관점에서는 사실 서비스에 영향을 줄만한 정도는 아니어서 크게 고려하진 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국, 수많은 사람과 협업하고 하나의 레포에서 코드를 구현하는 입장에서, 의도한 DTO에 맞게 코디네이터에서 Notifier를 유연하게 찾으면 되는 것이고, Notifier가 올바른 메시지를 발송하기만 하면 되니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 제 업무는 같은 회사 개발자뿐 아니라, 다양한 회사의 개발자(SI 업체)와 협업하고 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Java, SpringBoot가 생소한 동료들부터 개발보다는 도메인 지식이 뛰어난 분들도 계시거든요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 환경에서는 구체적으로 &quot;이 땐 이걸 호출하세요 저 땐 저걸 호출하세요&quot;라는 가이드를 드리는 것보다, &quot;&lt;u&gt;&lt;b&gt;DTO만 명시해두고 그냥 호출하세요!&lt;/b&gt;&lt;/u&gt;&quot; 라고 하는 것이 &lt;b&gt;문제가 발생해도 제가 직접 제어하기도 쉽고&lt;/b&gt;, &lt;b&gt;앞단 비즈니스에만 집중해서 구현할 수 있도록 환경을 마련&lt;/b&gt;해 주는 것이 프로덕트 런칭을 위해 빠른 길이라는 생각을 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 개선을 통해 단순히 코드의 동작 방식만이 아니라, 협업 환경에서 유지보수성과 확장성을 어떻게 고려해야 하는지도 다시 한번 고민해볼 수 있었던 계기였습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;</description>
      <category>Tech</category>
      <author>CODe_</author>
      <guid isPermaLink="true">https://code1995.tistory.com/133</guid>
      <comments>https://code1995.tistory.com/133#entry133comment</comments>
      <pubDate>Sat, 15 Feb 2025 14:24:53 +0900</pubDate>
    </item>
    <item>
      <title>석사 각</title>
      <link>https://code1995.tistory.com/132</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;graduation-2148715_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YzYVr/btsL3lR8cwi/1IsMvp9rsbqhQ1oHthgWM0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YzYVr/btsL3lR8cwi/1IsMvp9rsbqhQ1oHthgWM0/img.jpg&quot; data-alt=&quot;출처 픽사베이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YzYVr/btsL3lR8cwi/1IsMvp9rsbqhQ1oHthgWM0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYzYVr%2FbtsL3lR8cwi%2F1IsMvp9rsbqhQ1oHthgWM0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;400&quot; data-filename=&quot;graduation-2148715_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 픽사베이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프롤로그:&amp;nbsp; &lt;b&gt;인생에서 석사라는 학위가 필요할까?&lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 공부에 흥미도 없었고 딱히 잘하지도 못했습니다. 겨우 대학에 진학하고 나서야 공부에 재미를 느끼기 시작했고, 제가 좋아하는 분야가 무엇인지 알게 되며 흥미가 생겼어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 대학생때도 학문 자체를 이해하고 공부하기 보다는 성적 따내기에 급급해서 요령대로 암기하고 공부하고를 반복해서 결국, 나쁘지 않은 학점으로 졸업하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음&amp;nbsp;석사를&amp;nbsp;고민했던&amp;nbsp;건&amp;nbsp;2020년이었습니다.&amp;nbsp;졸업을&amp;nbsp;앞두고&amp;nbsp;더&amp;nbsp;깊이&amp;nbsp;공부하고&amp;nbsp;싶은&amp;nbsp;마음이&amp;nbsp;들었지만,&amp;nbsp;머릿속&amp;nbsp;계산기가&amp;nbsp;자동으로&amp;nbsp;돌아가기&amp;nbsp;시작했어요.&amp;nbsp;취업이&amp;nbsp;늦어지면&amp;nbsp;&lt;b&gt;돈을&amp;nbsp;버는&amp;nbsp;속도도&amp;nbsp;느려질&amp;nbsp;테고,&amp;nbsp;사회에&amp;nbsp;나가는&amp;nbsp;시기도&amp;nbsp;늦어지고,&amp;nbsp;결혼도,&amp;nbsp;커리어도,&amp;nbsp;계획했던&amp;nbsp;삶의&amp;nbsp;흐름도&amp;nbsp;달라질&amp;nbsp;수&amp;nbsp;있겠다는&amp;nbsp;생각이&amp;nbsp;들었습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서&amp;nbsp;현실적인&amp;nbsp;선택을&amp;nbsp;했습니다.&amp;nbsp;공부보다&amp;nbsp;일을&amp;nbsp;택했고,&amp;nbsp;석사보다는&amp;nbsp;경력을&amp;nbsp;쌓는&amp;nbsp;길을&amp;nbsp;걸어갔어요.&amp;nbsp;그리고&amp;nbsp;시간이&amp;nbsp;지나면서&amp;nbsp;알게&amp;nbsp;됐습니다.&amp;nbsp;선택을&amp;nbsp;미뤘다고&amp;nbsp;해서,&amp;nbsp;고민이&amp;nbsp;사라지는&amp;nbsp;건&amp;nbsp;아니라는&amp;nbsp;걸요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간이 지나면서 제 가치관도 변했습니다.&lt;/b&gt; 타인과 비교하는 삶보다는 그냥 내가 원하는 삶을 살기로 말이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;석사라는 학위가 제 삶에 얼마나 큰 영향을 미칠지 모르겠습니다.&lt;/b&gt; 시간도 노력도 들어가겠지만 그런거 신경 안쓰고 그냥 하고싶으니까 하기로 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 아티클까지 걸어오신 누군가를 이해시키고 납득시키고 싶지만.. 이번 글에서 만큼은 시작하게 된 논리가 없을 수도 있겠네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;살다 보면 그런 순간이 있지 않나요? &lt;b&gt;이게 득이 될지 실이 될지 그런 계산적인 사고를 하기도 전에 그냥 몸이 이끌려서 하는것들요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 적어도 지금 이 과정이 저한테는 그렇게 느껴집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로의 시리즈로 작성되는 아티클들은, 단순히 제 여정이 궁금하신 분들을 비롯해서 꼭 석사가 아니더라도 가슴뛰는 일들을 두고 어떻게 해야할지 고민중이신 분들께 조금이나마 희망과 열정을 줄 수 있는 글이 될 수도 있겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;지금이 맞는 타이밍일까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;석사를 하기로 결심한 순간, 모든 게 명확해질 줄 알았습니다. 그런데 현실은 그렇지 않았습니다. 마음을 정했지만, 여전히 고민은 남아 있었습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 선택이 정말 내 인생에 의미가 있을까?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;살면서 중요한 결정을 할 때마다 &lt;b&gt;불확실성은 따라오기 마련&lt;/b&gt;입니다. 그리고 불확실성이 커질수록 &amp;lsquo;지금이 과연 맞는 타이밍일까?&amp;rsquo;라는 고민은 점점 더 커졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;가장&amp;nbsp;큰&amp;nbsp;걱정은&amp;nbsp;&lt;b&gt;&quot;시간&quot;&amp;nbsp;&lt;/b&gt;이었습니다. 석사를 시작하면 최소 2~3년은 투자해야 하는데, 하루하루가 빠듯한 일상 속에서 공부를 위한 시간을 따로 확보할 수 있을지 자신이 없었습니다. 결국 퇴근 후나 주말을 활용해야 하는데, 그러다 보면 지칠 수도 있을 것이고, 끝까지 해낼 수 있을까 하는 불안도 컸습니다.&lt;br /&gt;&lt;br /&gt;&amp;lsquo;이걸 하는 게 맞을까?&amp;rsquo;라는 생각이 들 때마다, 반대로 &amp;lsquo;하지 않으면 어떨까?&amp;rsquo;라는 질문도 던져봤습니다. 석사를 하지 않는다면, 저는 지금처럼 현실과 타협하며 바쁜 일상 속에서 틈틈이 공부를 이어갈 것입니다. 하지만 그렇게 쌓아가는 배움은 체계적이지 않고, 제한적인 경험에 머물러 있을지도 모릅니다. 그리고 몇 년 후, &lt;b&gt;저는 여전히 같은 고민을 하고 있을 가능성이 높았습니다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;시간 외에도 현실적인 고민은 또 있었습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 과정이 나에게 실질적인 도움이 될까?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커리어적으로, 기술적으로, 혹은 삶의 방향에서 석사가 주는 이점이 확실할까? 석사 학위가 곧바로 제 가치를 증명해 주지는 않을 것입니다. 하지만 한 가지 확신할 수 있는 점은, 이 과정 자체가 저를 성장하게 만들 것이라는 사실이었습니다. 한국이라는 환경을 벗어났기에, 새로운 환경에서 배우고, 도전하고, 고민하는 경험이 쌓이면 결국 저의 깊이가 달라질 것이라 믿고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 다시 한 번 고민 끝에 내린 결론은 단순했고, 완벽한 타이밍은 없다는 것을 알게 되었습니다. 어떤 도전에서도 늘 불안하고, 부족하고, 망설여지기 마련입니다. 하지만 중요한 것은, &lt;b&gt;그럼에도 불구하고 한 걸음 내딛는 것입니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;가장 큰 걸림돌: 어학성적&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 해야 할 일은 지원 요건을 확인하는 것이었습니다. 저는 미국의 조지아 공대 OMSCS 과정을 목표로 삼았고, 학부 전공자라면 비교적 수월하게 지원할 수 있는 프로그램이지만, &lt;b&gt;외국인 지원자에게는 영어 성적이라는 필수 조건이 있었습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 기준은 &lt;b&gt;토플(TOEFL) 100점&lt;/b&gt;인데요, 숫자로&amp;nbsp;보면&amp;nbsp;단순한&amp;nbsp;기준일지도&amp;nbsp;모르지만,&amp;nbsp;저에게는&amp;nbsp;꽤&amp;nbsp;큰&amp;nbsp;벽처럼&amp;nbsp;느껴졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;사실 저는 영어를 그리 잘하는 편이 아닙니다. 학창 시절에는 시험을 위한 공부를 했고, 실무에서 영어를 쓸 일도 거의 없었습니다. 문서를 읽고 간단한 이메일을 작성하는 정도였지, 영어로 깊이 있는 논의를 해본 경험은 없었습니다. 하지만 석사를 하려면, 영어로 강의를 듣고, 과제를 수행하고, 토론을 해야할 수도 있습니다. 단순히 점수를 따는 것이 아니라, &lt;b&gt;이 환경에서 버틸 수 있을 만큼의 실력을 갖춰야 했습니다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;이전까지 고민하던 것과는 차원이 다른 현실적인 벽이었습니다. 이 학교를 목표로 삼고, 석사를 한다고 결심한 순간부터, 어학 성적을 만들기 전까지는 아무것도 시작할 수 없다는 사실이 와 닿았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고민할 시간도 아깝다는 생각이 들었습니다. 그렇게 석사를 결심한 지 이틀 만에 주말에 바로 학원을 찾아갔습니다. 상담을 받고, 학습 계획을 짰습니다. &lt;b&gt;제가 가진 유일한 장점은 행동력이거든요..&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;아무튼 그래서 다음&amp;nbsp;주부터&amp;nbsp;학원을&amp;nbsp;다닙니다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;사실&amp;nbsp;처음엔&amp;nbsp;&amp;lsquo;혼자&amp;nbsp;공부할&amp;nbsp;수&amp;nbsp;있지&amp;nbsp;않을까?&amp;rsquo;라는&amp;nbsp;생각도&amp;nbsp;들었습니다.&amp;nbsp;문제집을&amp;nbsp;사서&amp;nbsp;유형을&amp;nbsp;익히고,&amp;nbsp;인터넷&amp;nbsp;강의를&amp;nbsp;찾아보는&amp;nbsp;방식으로요.&amp;nbsp;하지만&amp;nbsp;현실적으로&amp;nbsp;제가&amp;nbsp;혼자&amp;nbsp;이&amp;nbsp;모든&amp;nbsp;걸&amp;nbsp;감당할&amp;nbsp;만큼의&amp;nbsp;노하우도&amp;nbsp;없었고,&amp;nbsp;그럴&amp;nbsp;자신도&amp;nbsp;없었습니다.&amp;nbsp;석사를&amp;nbsp;도전하기로&amp;nbsp;한&amp;nbsp;이상,&amp;nbsp;결과를&amp;nbsp;만들어야&amp;nbsp;하니까&amp;nbsp;제대로&amp;nbsp;된&amp;nbsp;방법을&amp;nbsp;선택하는&amp;nbsp;것이&amp;nbsp;맞다고&amp;nbsp;판단했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;아주 예전에 학창 시절엔, 이전까지 저는 늘 고민하고, 비교하고, 망설이면서 시간을 흘려보냈습니다. 하지만 이번만큼은 다르게 해보고 싶었습니다. 일단 시작하고, &lt;b&gt;과정 속에서 해결해 나가기로요.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;완벽한 준비가 끝난 다음에 움직이는 것이 아니라, 움직이면서 준비하는 것을 선택해봤습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;그럼에도 불구하고&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌면 이런 학위가 없어도, 영어 공부 없이도 살 수 있는 길이 있겠죠.. (지금 삶도 좋으니까요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥&amp;nbsp;지금처럼&amp;nbsp;실무에서&amp;nbsp;경험을&amp;nbsp;쌓고,&amp;nbsp;필요할&amp;nbsp;때마다&amp;nbsp;그때그때&amp;nbsp;배우면서&amp;nbsp;가는&amp;nbsp;것도&amp;nbsp;나쁘지&amp;nbsp;않을지도&amp;nbsp;모릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;생각해 보면, 저는 지금까지 늘 최소한의 노력으로 최대한의 결과를 내려는 태도로 살아왔을지도 모르겠네요. 대학 시절에도 성적을 따기 위한 공부에 집중했고, 실무에서도 당장 필요한 기술을 익히는 방식으로 해결해왔거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;석사가 단순히 학위 하나를 더 얻는 과정이라면, 저는 관심이 없었을 겁니다. 하지만 이 과정은 단순한 학위 이상의 의미를 가진다고 생각해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금껏 해보지 않았던 방식으로 도전해 보고 싶었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼자 할 수 없는 것들을 배우고, 익숙하지 않은 환경에서 살아남아 보고 싶었습니다. 그리고 그 과정에서 내가 어디까지 성장할 수 있는지 직접 확인해 보고 싶더라구요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 2개월간 근사치 점수에 도달할 수 있을지 확인해볼 생각입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희망이나 기대가 아니라, 객관적인 수치로 냉정하게 스스로를 평가할 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 기준을 넘지 못한다면, 그땐 인정하고 그에 맞는 현실적인 선택을 해야 할지도 모르겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 이 석사 카테고리가 졸업까지 끝까지 연재되길 바라고 있지만, 어이없게도 연재하지 못할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 늘 그래왔듯이, 일단 해보고, 안되면 그 때 가서 생각해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러분들도, &lt;b&gt;하고 싶은 일이 있다면, 망설이는 시간보다 부딪혀보는 시간이 조금이라도 더 많았으면 좋겠습니다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>Degrees</category>
      <author>CODe_</author>
      <guid isPermaLink="true">https://code1995.tistory.com/132</guid>
      <comments>https://code1995.tistory.com/132#entry132comment</comments>
      <pubDate>Sun, 2 Feb 2025 00:00:20 +0900</pubDate>
    </item>
    <item>
      <title>개발자를 꿈꾸는 예비 고등학생에게 감히 조언을 해보았다</title>
      <link>https://code1995.tistory.com/131</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_KakaoTalk_Photo_2025-01-19-15-36-56.jpeg&quot; data-origin-width=&quot;2665&quot; data-origin-height=&quot;1456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brNGCV/btsLRMvcBdz/CyjzrUMzKhCXKQtwAIMwJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brNGCV/btsLRMvcBdz/CyjzrUMzKhCXKQtwAIMwJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brNGCV/btsLRMvcBdz/CyjzrUMzKhCXKQtwAIMwJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrNGCV%2FbtsLRMvcBdz%2FCyjzrUMzKhCXKQtwAIMwJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2665&quot; height=&quot;1456&quot; data-filename=&quot;edited_edited_KakaoTalk_Photo_2025-01-19-15-36-56.jpeg&quot; data-origin-width=&quot;2665&quot; data-origin-height=&quot;1456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자분들이나&amp;nbsp;취준생분들이라면&amp;nbsp;한&amp;nbsp;번쯤&amp;nbsp;&quot;개발에&amp;nbsp;관심&amp;nbsp;많은&amp;nbsp;후배들에게&amp;nbsp;어떤&amp;nbsp;이야기를&amp;nbsp;해줄&amp;nbsp;수&amp;nbsp;있을까?&quot;&amp;nbsp;고민해본&amp;nbsp;적이&amp;nbsp;있을&amp;nbsp;거예요.&amp;nbsp;저도&amp;nbsp;비슷한&amp;nbsp;경험을&amp;nbsp;했어요.&lt;br /&gt;&lt;br /&gt;얼마&amp;nbsp;전,&amp;nbsp;&lt;b&gt;카카오뱅크에&amp;nbsp;특별한&amp;nbsp;손님들이&amp;nbsp;찾아왔습니다&lt;/b&gt;. 바로 이제 막 고등학교에 입학하는 SW마이스터고 학생들이었어요. 약 80명의 학생들 앞에서 20분간 발표를 하게 되었죠. &lt;b&gt;평소처럼 개발자나 취업 준비생을 대상으로 하는 발표와는 완전히 달랐어요.&lt;/b&gt; 아직 실무 경험이 없는 학생들에게 어떤 이야기를 전해야 할까? 어떤 방향으로 접근해야 더 의미 있는 시간이 될까? 짧은 시간 안에 고민이 많았어요.&lt;br /&gt;&lt;br /&gt;이 글에서는 발표 준비 과정에서 어떤 고민을 했는지, 눈높이를 맞추기 위해 어떤 노력을 했는지, 그리고 발표 이후 교장선생님의 후기까지 흥미로운 경험을 나누려고 합니다. 기술적인 내용이 아니라, 누구나 편하게 읽을 수 있는 이야기라서 부담 없이 읽으실 수 있을 거예요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2주 뒤에 발표 가능해요?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1월 2일, 연초의 바쁜 업무 속에서 한 통의 연락을 받았습니다. 카카오뱅크에&lt;b&gt; SW마이스터고 학생 80명이 견학을 온다는 소식&lt;/b&gt;이었어요. 행사를 주관하는 부서에서 20분짜리 발표를 맡아줄 수 있냐고 요청하셨죠.&lt;br /&gt;&lt;br /&gt;사실&amp;nbsp;저도&amp;nbsp;그때&amp;nbsp;알게&amp;nbsp;됐는데,&amp;nbsp;이&amp;nbsp;행사는&amp;nbsp;꽤&amp;nbsp;급하게&amp;nbsp;결정된&amp;nbsp;일정이었어요.&amp;nbsp;담당&amp;nbsp;부서에서도&amp;nbsp;행사&amp;nbsp;준비로&amp;nbsp;분주한&amp;nbsp;분위기였고,&amp;nbsp;저&amp;nbsp;역시&amp;nbsp;발표를&amp;nbsp;준비할&amp;nbsp;시간이&amp;nbsp;&lt;b&gt;고작&amp;nbsp;2주&lt;/b&gt;밖에&amp;nbsp;없었습니다.&amp;nbsp;게다가&amp;nbsp;행사일인&amp;nbsp;1월&amp;nbsp;17일은&amp;nbsp;목요일.&amp;nbsp;평소처럼&amp;nbsp;업무에&amp;nbsp;치이면서도&amp;nbsp;발표를&amp;nbsp;어떻게&amp;nbsp;준비해야&amp;nbsp;할지&amp;nbsp;고민이&amp;nbsp;많았어요.&lt;br /&gt;&lt;br /&gt;시간이&amp;nbsp;많다면&amp;nbsp;멋진&amp;nbsp;발표&amp;nbsp;자료를&amp;nbsp;만들&amp;nbsp;수도&amp;nbsp;있었겠지만,&amp;nbsp;현실적으로&amp;nbsp;새로운&amp;nbsp;걸&amp;nbsp;거창하게&amp;nbsp;만들&amp;nbsp;여유는&amp;nbsp;없었습니다.&lt;br /&gt;&quot;그럼,&amp;nbsp;최대한&amp;nbsp;짧은&amp;nbsp;시간&amp;nbsp;안에&amp;nbsp;준비할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;주제를&amp;nbsp;찾아야겠다.&quot;&lt;br /&gt;&lt;br /&gt;그렇게&amp;nbsp;떠오른&amp;nbsp;것이&amp;nbsp;제&amp;nbsp;학창&amp;nbsp;시절이었어요.&lt;br /&gt;&lt;br /&gt;중학생&amp;nbsp;때의&amp;nbsp;경험,&amp;nbsp;대학생&amp;nbsp;때의&amp;nbsp;고민들&amp;hellip;&amp;nbsp;&lt;b&gt;남들과&amp;nbsp;조금은&amp;nbsp;달랐던&amp;nbsp;제&amp;nbsp;학창&amp;nbsp;시절&lt;/b&gt;을&amp;nbsp;떠올리면서&amp;nbsp;&quot;이거라면&amp;nbsp;하루&amp;nbsp;안에&amp;nbsp;발표&amp;nbsp;준비가&amp;nbsp;가능하겠다!&quot;&amp;nbsp;싶었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그렇게 발표를 맡았고, 제 주말은 또다시 사라졌습니다.&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;내가 예비 고등학생이라면 뭘 듣고 싶을까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표&amp;nbsp;준비를&amp;nbsp;하면서&amp;nbsp;가장&amp;nbsp;먼저&amp;nbsp;떠오른&amp;nbsp;질문은&amp;nbsp;&quot;내가&amp;nbsp;예비&amp;nbsp;고등학생이라면&amp;nbsp;어떤&amp;nbsp;이야기를&amp;nbsp;듣고&amp;nbsp;싶을까?&quot;&amp;nbsp;였어요.&lt;br /&gt;여태까지 수십 번 발표를 해봤지만, 대상이 예비 고등학생이라는 점은 저에게도 새로운 도전이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;사실, 제 학창시절을 회상하기엔 꽤 오랜 시간이 흘러 희석되었고, 그리고 요즘 고등학생들이 어떤 관심사를 가지고 있는지, 어떤 세대인지 전혀 감이 오지 않더라고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;그렇다고, 제가 하고싶은 얘기만 하는 발표를 하고 싶진 않았어요.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한&amp;nbsp;SW마이스터고&amp;nbsp;출신의&amp;nbsp;개발자분들과&amp;nbsp;멘토링&amp;nbsp;경험이&amp;nbsp;있긴&amp;nbsp;했지만,&amp;nbsp;그&amp;nbsp;학교에&amp;nbsp;다니는&amp;nbsp;학생들이&amp;nbsp;실제로&amp;nbsp;어떤&amp;nbsp;고민을&amp;nbsp;하고,&amp;nbsp;어떤&amp;nbsp;환경에서&amp;nbsp;공부하는지에&amp;nbsp;대한&amp;nbsp;구체적인&amp;nbsp;정보는&amp;nbsp;없었어요.&lt;br /&gt;결국&amp;nbsp;학생들의&amp;nbsp;눈높이를&amp;nbsp;이해하기&amp;nbsp;위해&amp;nbsp;정보&amp;nbsp;조사가&amp;nbsp;필요하다고&amp;nbsp;판단했죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마침 평소 고등학생들과 교류가 많고 해커톤을 주최하는 대표님과 친분이 있어서 연락을 드렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 감사하게도, SW마이스터고 졸업생분의 현실적인 경험담을 들을 수 있었어요.&lt;br /&gt;저는&amp;nbsp;인문계&amp;nbsp;고등학교를&amp;nbsp;나왔기&amp;nbsp;때문에&amp;nbsp;마이스터고에&amp;nbsp;대한&amp;nbsp;이야기가&amp;nbsp;정말&amp;nbsp;생소했지만,&amp;nbsp;덕분에&amp;nbsp;학생들의&amp;nbsp;학업&amp;nbsp;방식,&amp;nbsp;학교&amp;nbsp;분위기,&amp;nbsp;국가지원&amp;nbsp;프로그램&amp;nbsp;등&amp;nbsp;다양한&amp;nbsp;이야기를&amp;nbsp;접할&amp;nbsp;수&amp;nbsp;있었죠.&lt;br /&gt;&lt;br /&gt;구체적인&amp;nbsp;내용은&amp;nbsp;주관적이라&amp;nbsp;모두&amp;nbsp;공개하긴&amp;nbsp;어렵지만,&amp;nbsp;&lt;b&gt;학생들이&amp;nbsp;어떤&amp;nbsp;상황에서&amp;nbsp;공부하고&amp;nbsp;있을지&amp;nbsp;어느&amp;nbsp;정도&amp;nbsp;감을&amp;nbsp;잡을&amp;nbsp;수&amp;nbsp;있었어요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이스터고 학생분들은 수능이라는 전국 고등학생들이 치뤄야하는 공통된 학업이 아닌, 소프트웨어라는 다소 구체적인 공부를 하게 되겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론적 지식뿐 아니라 다양한 실습을 통해 결과가 바로 나오는 분야이다 보니 누가 잘하는지가 더 돋보인다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 또한 학창 시절에 경험해 보았는데요, 부끄럽지만, 이때 &lt;b&gt;자만의 길로 빠져서 헤어나오는데 오래 걸렸던 경험&lt;/b&gt;도 있었답니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그들이 겪을지도 모르는 그 상황이나 감정, 어떻게 대처하면 좋을지에 대해 준비하게 되었고 제목은 &lt;b&gt;&quot;우리는 언젠가 개구리가 된다&quot;&lt;/b&gt;라는 제목으로 정했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;우는 페페.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9k3Mg/btsLS7SGvrm/BTVgKCJvrKdG7tYr1KTPLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9k3Mg/btsLS7SGvrm/BTVgKCJvrKdG7tYr1KTPLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9k3Mg/btsLS7SGvrm/BTVgKCJvrKdG7tYr1KTPLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9k3Mg%2FbtsLS7SGvrm%2FBTVgKCJvrKdG7tYr1KTPLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;221&quot; height=&quot;201&quot; data-filename=&quot;우는 페페.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;우리가 많이 들어본 &quot;우물 안 개구리&quot;에 대한 이야기이죠.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;공감대를 어떻게 형성하면 좋을까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;짧은 발표에도 유대감이 있다는 사실 알고 계신가요?&lt;/b&gt; 제 개인적인 생각입니다만, &lt;u&gt;&lt;b&gt;발표자와 발표를 듣는 청중 사이에 유대감이 높을수록 호응이나 집중력이 올라간다고 생각&lt;/b&gt;&lt;/u&gt;합니다. 그래서 와다다 하고 싶은 말을 쏟아내기보다는 도입부에서 발표에 좀 더 집중할 수 있도록 관심이 생길만한 키워드나 경험을 이야기하려고 준비했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 고1로 올라가던 시절에 게임을 정말 좋아했어요. 여러분도 그렇지 않았나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pdoAR/btsLSQqbmx9/Kch7bMVUGbdZ4vU3W7MCo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pdoAR/btsLSQqbmx9/Kch7bMVUGbdZ4vU3W7MCo0/img.png&quot; data-alt=&quot;메이플스토리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pdoAR/btsLSQqbmx9/Kch7bMVUGbdZ4vU3W7MCo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpdoAR%2FbtsLSQqbmx9%2FKch7bMVUGbdZ4vU3W7MCo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;566&quot; height=&quot;431&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메이플스토리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 그래서 게임 이야기를 꺼냈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;무슨 게임인지 아냐고 물었더니 모두가 알고 있더라구요..&lt;/b&gt; 역시 세대를 거스르는 메이플..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 게임을 잘하진 않았습니다. 지금도 그렇지만 정말 즐기기만 하는 즐겜유저거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중학교 1학년 때, 반복적인 사냥만 하던 방식에 지루함을 느꼈고 갑자기 매크로를 만들겠다는 생각을 합니다(?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그땐, 구글링이나 코딩, IDE라는 기본적인 용어도 모른 채 &quot;매크로를 만들래!&quot;라는 집념 하나로 help 파일 하나를 보고 공부를 하기 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마치 백과사전처럼 언어 사용법에 대한 help 파일이 있었고, 색인 기능으로 내가 필요한 기능을 찾고 Example을 보고 하나씩 테스트해가며 기능을 만들어갔어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 익숙한 이야기로 시작해서, &lt;b&gt;청중이 발표자의 이야기를 자신과 연결하여 듣게 되기 때문에 게임이라는 공통 관심사를 활용한 것이 긍정적인 효과를 발휘했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;우물에 빠졌던 중학생&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때 당시, &lt;b&gt; 중고등학교에서 개발을 할 줄 안다는 것은 엄청난 능력이었습니다.&lt;/b&gt; 친구가 거의 없다시피 했던 제게, 게임을 좋아하는 친구들이&amp;nbsp; 관심을 보였고, 누군가는 자기가 필요한 기능을 만들어 달라고 이야기하면서까지 말을 걸어왔습니다. 그렇게 친구들도 점점 많아졌고 말 없고 소심했던 제가 조금씩 변할 수 있는 계기가 되기도 했어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갑작스럽게 제 능력을 인정받은 탓이었을까요? 조금은 자만했던 시절이었던 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제대로 된 원리를 이해한 것이 아니라 툴에 의존하고 필요한 기능만 뽑아 쓰던 시절이었거든요.&amp;nbsp;&lt;/b&gt;친구들에겐 빈 껍데기였던 이 모습을 들키기 싫어서 할 줄 모르는 것도 할 줄 안다고 거짓말 쳤던 기억도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로, 원리를 이해하지 못하면 환경이 바뀌었을 때 아무것도 할 수 없게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응용을 전혀 할 수 없는 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 학생 여러분께 툴러(툴만 다루는 것)였던 제 과거를 이야기하면서 기초&amp;nbsp;학습의&amp;nbsp;중요성에&amp;nbsp;대해&amp;nbsp;이야기했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학생분들은 현재 학업을 통해 기본기를 다지고 있는 과정에 있기에, 눈에 보이는 성과를 내는 것도 중요하지만, 그보다 더 중요한 것은 언제 어디서든 흔들리지 않는 기초를 다지는 것이라고 말이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;학생분들이 단기적인 인정보다는 더 긴 호흡으로 성장할 수 있기를 바랐습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;다른 우물도 존재한다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결국 제가 계속해서 말하고자 했던 &quot;우물&quot;은 &quot;환경&quot;을 뜻했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학창 시절에 컴퓨터를 잘 다루기도 했고 모두가 저보고 잘한다고 말해서 제가 1등인 줄 알았지만, 환경이 달라지니 그렇지가 않더라구요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해커톤이나&amp;nbsp;각종&amp;nbsp;대회에&amp;nbsp;참가했지만,&amp;nbsp;입상조차&amp;nbsp;하지&amp;nbsp;못했던&amp;nbsp;순간&lt;/li&gt;
&lt;li&gt;프로젝트에서&amp;nbsp;능력&amp;nbsp;부족으로&amp;nbsp;기한&amp;nbsp;내에&amp;nbsp;구현을&amp;nbsp;마치지&amp;nbsp;못했던&amp;nbsp;순간&lt;/li&gt;
&lt;li&gt;대회장에서&amp;nbsp;옆&amp;nbsp;팀의&amp;nbsp;수준을&amp;nbsp;보고&amp;nbsp;감탄만&amp;nbsp;하고&amp;nbsp;있었던&amp;nbsp;순간&lt;/li&gt;
&lt;li&gt;대학생이&amp;nbsp;되어&amp;nbsp;나보다&amp;nbsp;훨씬&amp;nbsp;뛰어난&amp;nbsp;동기를&amp;nbsp;마주했던&amp;nbsp;순간&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경험을 하면서 처음으로 깨달았습니다.&amp;nbsp;&lt;b&gt;세상에 나보다 뛰어난 사람이 많다는 것을 느꼈던거죠.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때의 괴리감은 엄청났습니다. 갑자기 제가 바닥으로 추락한 기분이었거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 과정이 없었다면, 저는 여전히 작은 우물 안에서 스스로를 최고라고 착각한 채 머물러 있었을 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익숙한&amp;nbsp;환경에서&amp;nbsp;벗어나지&amp;nbsp;않으면,&amp;nbsp;자신의&amp;nbsp;실력을&amp;nbsp;객관적으로&amp;nbsp;볼&amp;nbsp;기회가&amp;nbsp;없습니다.&lt;br /&gt;늘&amp;nbsp;속해&amp;nbsp;있던&amp;nbsp;우물에서&amp;nbsp;한&amp;nbsp;걸음만&amp;nbsp;나와도,&amp;nbsp;&quot;내가&amp;nbsp;알고&amp;nbsp;있던&amp;nbsp;세계가&amp;nbsp;전부가&amp;nbsp;아니었구나&quot;&amp;nbsp;를&amp;nbsp;깨닫게&amp;nbsp;됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학생들도&amp;nbsp;지금은&amp;nbsp;&quot;고등학교라는&amp;nbsp;우물&quot;&amp;nbsp;안에서&amp;nbsp;성장하고&amp;nbsp;있을&amp;nbsp;것입니다.&lt;br /&gt;하지만&amp;nbsp;그&amp;nbsp;안에서만&amp;nbsp;머문다면,&amp;nbsp;실력이&amp;nbsp;성장할&amp;nbsp;기회를&amp;nbsp;놓칠&amp;nbsp;수도&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;그래서 저는 발표에서 &quot;스스로의 우물을 넓히는 방법&quot; 을 이야기했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해커톤, 개발 커뮤니티, 스터디 그룹을 활용해 더 넓은 세상을 경험할 것&lt;/li&gt;
&lt;li&gt;스스로의 실력을 객관적으로 바라보며 겸손한 태도를 가질 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지금 있는 환경에서 만족하지 않고, 계속해서 더 넓은 세계를 탐색해야 한다는 메시지를 전달하고 싶었습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;열등감이라는 감정에 솔직해지기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신보다&amp;nbsp;잘하는&amp;nbsp;사람을&amp;nbsp;보면&amp;nbsp;자연스럽게&amp;nbsp;&lt;b&gt;열등감&lt;/b&gt;을&amp;nbsp;느낍니다.&lt;br /&gt;때로는&amp;nbsp;&lt;b&gt;자격지심&lt;/b&gt;이&amp;nbsp;들고,&amp;nbsp;상대적으로&amp;nbsp;&lt;b&gt;박탈감&lt;/b&gt;을&amp;nbsp;느낄&amp;nbsp;때도&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그&amp;nbsp;감정이&amp;nbsp;든다고&amp;nbsp;해서&amp;nbsp;이상한&amp;nbsp;것이&amp;nbsp;아닙니다.&amp;nbsp;&lt;b&gt;오히려&amp;nbsp;너무나&amp;nbsp;당연한&amp;nbsp;감정&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만&amp;nbsp;중요한&amp;nbsp;것은,&amp;nbsp;그&amp;nbsp;감정을&amp;nbsp;어떻게&amp;nbsp;다루느냐입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는&amp;nbsp;발표에서&amp;nbsp;이런&amp;nbsp;이야기를&amp;nbsp;전했습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;열등감을 부정하지 말고, 성장의 원동력으로 삼으세요.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의&amp;nbsp;사람들은&amp;nbsp;자신만의&amp;nbsp;학습&amp;nbsp;방법이&amp;nbsp;있다고&amp;nbsp;생각합니다.&amp;nbsp;하지만&amp;nbsp;한&amp;nbsp;가지&amp;nbsp;방식만&amp;nbsp;고집하다&amp;nbsp;보면,&amp;nbsp;성장의&amp;nbsp;기회를&amp;nbsp;놓칠&amp;nbsp;수도&amp;nbsp;있습니다. 잘하는 사람을 보면 단순히 부러워하는 것이 아니라, 그들이 어떻게 공부하고, 어떻게 사고하는지 따라 해 보는 것이 중요합니다.&lt;br /&gt;&lt;b&gt;이건&amp;nbsp;과거의&amp;nbsp;저에게도&amp;nbsp;해주고&amp;nbsp;싶은&amp;nbsp;말이기도&amp;nbsp;합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 과거엔 저만의 방식으로 공부를 하다가 도저히 성적이 오르질 않아서 소위 잘하는 친구들의 학습 방식을 따라 해봤는데, 비로소 이렇게 공부하는 거였구나 하고 깨달았던 시절이 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;경험을&amp;nbsp;통해&amp;nbsp;저는&amp;nbsp;&lt;u&gt;&lt;b&gt;변화라는 것이 결국 내가 옳다고 믿는 것들을 하나씩 내려놓고, 다양한 시도를 할 때 찾아온다는 것을 배웠습니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 관계상 이렇게까지 구체적으로 전달드리진 못했지만, 핵심적인 내용은 전달드릴 수 있었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;지금의 우물을 발전시키는 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 주제는 새로운 하나의 발표가 될 정도로 방대한 내용이라 잠깐 언급만 하고 넘어갔어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표 내내 &quot;다른 우물도 보셔야 해요!&quot;라는 메세지를 전달했지만, 지금 속해있는 우물에서 다 같이 성장하는 방법도 있다는 걸 말씀드리고 싶었거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운&amp;nbsp;환경을&amp;nbsp;경험하는&amp;nbsp;것도&amp;nbsp;중요하지만,&amp;nbsp;현재&amp;nbsp;속한&amp;nbsp;환경을&amp;nbsp;더&amp;nbsp;나은&amp;nbsp;곳으로&amp;nbsp;만드는&amp;nbsp;것&amp;nbsp;역시&amp;nbsp;큰&amp;nbsp;의미가&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오히려, &lt;b&gt;다른 우물로 옮기는 것보다 훨씬 어려운 도전&lt;/b&gt;이라고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은&amp;nbsp;저&amp;nbsp;역시&amp;nbsp;고민하고&amp;nbsp;있는&amp;nbsp;과제입니다.&lt;br /&gt;더&amp;nbsp;넓은&amp;nbsp;시야를&amp;nbsp;가지는&amp;nbsp;것도&amp;nbsp;중요하지만,&amp;nbsp;현재&amp;nbsp;속한&amp;nbsp;환경을&amp;nbsp;성장의&amp;nbsp;발판으로&amp;nbsp;삼는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;늘&amp;nbsp;고민하고&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만&amp;nbsp;언젠가&amp;nbsp;&quot;지금&amp;nbsp;있는&amp;nbsp;우물을&amp;nbsp;어떻게&amp;nbsp;더&amp;nbsp;발전시킬&amp;nbsp;것인가&quot;&amp;nbsp;라는&amp;nbsp;주제로&amp;nbsp;더&amp;nbsp;깊이&amp;nbsp;이야기할&amp;nbsp;기회가&amp;nbsp;있으면&amp;nbsp;좋겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;발표가 끝나고&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표가 끝나고 교장선생님께서 발표자에게 찾아와 명함을 건네주셨습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;너무 좋은 내용을 전달 주셔서 감사하다&quot;며 학교 근처에 오거든 꼭 연락 달라고 하시더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제&amp;nbsp;기억&amp;nbsp;속&amp;nbsp;교장선생님은&amp;nbsp;늘&amp;nbsp;먼&amp;nbsp;존재였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학창&amp;nbsp;시절에는&amp;nbsp;단&amp;nbsp;한&amp;nbsp;번도&amp;nbsp;개인적으로&amp;nbsp;대화를&amp;nbsp;나눈&amp;nbsp;적이&amp;nbsp;없었고,&amp;nbsp;늘&amp;nbsp;무대&amp;nbsp;위에서만&amp;nbsp;보이는&amp;nbsp;분이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데&amp;nbsp;이번에는&amp;nbsp;조금&amp;nbsp;다르게&amp;nbsp;보였습니다.&lt;br /&gt;단순히 먼 존재가 아니라, &lt;b&gt;하나의 그룹을 이끄는 리더&lt;/b&gt;처럼 느껴졌습니다.&lt;br /&gt;학생들을&amp;nbsp;이끄는&amp;nbsp;사람으로서&amp;nbsp;많은&amp;nbsp;책임을&amp;nbsp;짊어진&amp;nbsp;분이라는&amp;nbsp;생각이&amp;nbsp;들었기&amp;nbsp;때문일까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&amp;nbsp;발표는&amp;nbsp;마무리되었습니다.&lt;br /&gt;&lt;br /&gt;주말&amp;nbsp;하루를&amp;nbsp;투자해&amp;nbsp;발표&amp;nbsp;자료를&amp;nbsp;만들었고,&amp;nbsp;시간이&amp;nbsp;촉박했던&amp;nbsp;만큼&amp;nbsp;자료의&amp;nbsp;완성도보다는&amp;nbsp;전달하고자&amp;nbsp;하는&amp;nbsp;메시지에&amp;nbsp;집중했습니다.&lt;br /&gt;&lt;br /&gt;연습할&amp;nbsp;시간도&amp;nbsp;없었고,&amp;nbsp;대본&amp;nbsp;없이&amp;nbsp;발표를&amp;nbsp;진행했기에&amp;nbsp;생각보다&amp;nbsp;매끄럽지&amp;nbsp;못했던&amp;nbsp;부분도&amp;nbsp;있었습니다.&lt;br /&gt;하지만&amp;nbsp;결국&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;학생들에게&amp;nbsp;무엇을&amp;nbsp;남길&amp;nbsp;수&amp;nbsp;있느냐라고&amp;nbsp;생각했습니다.&lt;br /&gt;&lt;br /&gt;부디&amp;nbsp;이번&amp;nbsp;발표가&amp;nbsp;예비&amp;nbsp;개발자로&amp;nbsp;성장할&amp;nbsp;학생들에게&amp;nbsp;작은&amp;nbsp;도움이&amp;nbsp;되었길&amp;nbsp;바랍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;여담&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 행사가 끝나고 돌아가는 길에 저와 함께 발표를 했던 분과 행사를 주관하신 부서의 동료께서, 제 블로그 글을 봤다며 먼저 인사해 주셔서 감사했습니다. 아마 아래의 글을 보신 것 같더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 최종 합격하신 분들 중에 아래의 글을 보고 오시는 분들이 꽤 계시는 것 같아 뿌듯하기도 하면서, 블로그 글을 작성할 때 신중히 작성해야겠다는 생각을 하게 된 하루였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://imksh.com/119&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.12.10 - [후기/경험] - 채용 한파에 카카오뱅크 최종 합격 후기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737269892144&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;채용 한파에 카카오뱅크 최종 합격 후기&quot; data-og-description=&quot;서론&amp;nbsp;2023년&amp;nbsp;12월,&amp;nbsp;카카오뱅크&amp;nbsp;결제코어개발팀&amp;nbsp;백엔드&amp;nbsp;개발자로&amp;nbsp;합류하게&amp;nbsp;되었습니다.넥슨&amp;nbsp;코리아&amp;nbsp;퇴사와&amp;nbsp;동시에&amp;nbsp;쉬는&amp;nbsp;기간&amp;nbsp;없이&amp;nbsp;입사를&amp;nbsp;결정했고,&amp;nbsp;이&amp;nbsp;아티클이&amp;nbsp;등록되는&amp;nbsp;시점엔&amp;nbsp;&quot; data-og-host=&quot;imksh.com&quot; data-og-source-url=&quot;https://imksh.com/119&quot; data-og-url=&quot;https://imksh.com/119&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0KqO0/hyX0tqnw4G/UVzw2xIoQzykjmMAPAsdOK/img.png?width=800&amp;amp;height=777&amp;amp;face=0_0_800_777,https://scrap.kakaocdn.net/dn/dFge2V/hyX0kz9GDp/PYbYo4ro5UfxTQk9WbMOQ0/img.png?width=800&amp;amp;height=777&amp;amp;face=0_0_800_777,https://scrap.kakaocdn.net/dn/iUliQ/hyX4tvsq5W/mDpdBEf27wJxXjS19GlKYK/img.png?width=677&amp;amp;height=679&amp;amp;face=0_0_677_679&quot;&gt;&lt;a href=&quot;https://imksh.com/119&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://imksh.com/119&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0KqO0/hyX0tqnw4G/UVzw2xIoQzykjmMAPAsdOK/img.png?width=800&amp;amp;height=777&amp;amp;face=0_0_800_777,https://scrap.kakaocdn.net/dn/dFge2V/hyX0kz9GDp/PYbYo4ro5UfxTQk9WbMOQ0/img.png?width=800&amp;amp;height=777&amp;amp;face=0_0_800_777,https://scrap.kakaocdn.net/dn/iUliQ/hyX4tvsq5W/mDpdBEf27wJxXjS19GlKYK/img.png?width=677&amp;amp;height=679&amp;amp;face=0_0_677_679');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;채용 한파에 카카오뱅크 최종 합격 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;서론&amp;nbsp;2023년&amp;nbsp;12월,&amp;nbsp;카카오뱅크&amp;nbsp;결제코어개발팀&amp;nbsp;백엔드&amp;nbsp;개발자로&amp;nbsp;합류하게&amp;nbsp;되었습니다.넥슨&amp;nbsp;코리아&amp;nbsp;퇴사와&amp;nbsp;동시에&amp;nbsp;쉬는&amp;nbsp;기간&amp;nbsp;없이&amp;nbsp;입사를&amp;nbsp;결정했고,&amp;nbsp;이&amp;nbsp;아티클이&amp;nbsp;등록되는&amp;nbsp;시점엔&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;imksh.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>후기/경험</category>
      <category>sw마이스터고</category>
      <author>CODe_</author>
      <guid isPermaLink="true">https://code1995.tistory.com/131</guid>
      <comments>https://code1995.tistory.com/131#entry131comment</comments>
      <pubDate>Sun, 19 Jan 2025 19:14:31 +0900</pubDate>
    </item>
    <item>
      <title>4가지 사건으로 바라본 2024년</title>
      <link>https://code1995.tistory.com/130</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;192A7938-2.jpg&quot; data-origin-width=&quot;6960&quot; data-origin-height=&quot;4640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pCTR3/btsLEXvTTCU/iLA9vYGHYlKwQaxBKdW0x1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pCTR3/btsLEXvTTCU/iLA9vYGHYlKwQaxBKdW0x1/img.jpg&quot; data-alt=&quot;교토 이네후나야 - 직접촬영&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pCTR3/btsLEXvTTCU/iLA9vYGHYlKwQaxBKdW0x1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpCTR3%2FbtsLEXvTTCU%2FiLA9vYGHYlKwQaxBKdW0x1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;459&quot; data-filename=&quot;192A7938-2.jpg&quot; data-origin-width=&quot;6960&quot; data-origin-height=&quot;4640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;교토 이네후나야 - 직접촬영&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년은&amp;nbsp;도전과&amp;nbsp;성찰,&amp;nbsp;그리고&amp;nbsp;성장으로&amp;nbsp;가득했던&amp;nbsp;한&amp;nbsp;해였습니다.&amp;nbsp;금융&amp;nbsp;도메인으로의&amp;nbsp;이직,&amp;nbsp;이력서&amp;nbsp;강의의&amp;nbsp;성공적인&amp;nbsp;런칭,&amp;nbsp;인간관계&amp;nbsp;속에서의&amp;nbsp;깨달음,&amp;nbsp;그리고&amp;nbsp;철학적&amp;nbsp;사고를&amp;nbsp;통해&amp;nbsp;제&amp;nbsp;자신을&amp;nbsp;더&amp;nbsp;깊이&amp;nbsp;들여다보는&amp;nbsp;과정을&amp;nbsp;거쳤습니다.&amp;nbsp;이&amp;nbsp;글에서는&amp;nbsp;제가&amp;nbsp;경험한&amp;nbsp;주요&amp;nbsp;사건들을&amp;nbsp;하나씩&amp;nbsp;돌아보며,&amp;nbsp;그&amp;nbsp;안에서&amp;nbsp;얻은&amp;nbsp;배움을&amp;nbsp;나누고자&amp;nbsp;합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;div class=&quot;intersub-subtitle-bar intersub-subtitle-bar-wrapper-plugin is-plugin-el-plugin detached&quot; style=&quot;display: none;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;경험 없던 금융권으로 경력 이직&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://imksh.com/119&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.12.10 - [후기/경험] - 채용 한파에 카카오뱅크 최종 합격 후기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736058725366&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;채용 한파에 카카오뱅크 최종 합격 후기&quot; data-og-description=&quot;서론&amp;nbsp;2023년&amp;nbsp;12월,&amp;nbsp;카카오뱅크&amp;nbsp;결제코어개발팀&amp;nbsp;백엔드&amp;nbsp;개발자로&amp;nbsp;합류하게&amp;nbsp;되었습니다.넥슨&amp;nbsp;코리아&amp;nbsp;퇴사와&amp;nbsp;동시에&amp;nbsp;쉬는&amp;nbsp;기간&amp;nbsp;없이&amp;nbsp;입사를&amp;nbsp;결정했고,&amp;nbsp;이&amp;nbsp;아티클이&amp;nbsp;등록되는&amp;nbsp;시점엔&amp;nbsp;&quot; data-og-host=&quot;imksh.com&quot; data-og-source-url=&quot;https://imksh.com/119&quot; data-og-url=&quot;https://imksh.com/119&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QOfTo/hyXWptNE0S/MxV4p4ercBNf2BDvfanp80/img.png?width=800&amp;amp;height=777&amp;amp;face=0_0_800_777,https://scrap.kakaocdn.net/dn/3pWqJ/hyXWtwaFmX/KcKfpzNpfcCkvg0AEEc6x0/img.png?width=800&amp;amp;height=777&amp;amp;face=0_0_800_777,https://scrap.kakaocdn.net/dn/uO3BB/hyXWsxgPOy/iaV1jtfTLRhPMadyveF901/img.png?width=750&amp;amp;height=728&amp;amp;face=0_0_750_728&quot;&gt;&lt;a href=&quot;https://imksh.com/119&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://imksh.com/119&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QOfTo/hyXWptNE0S/MxV4p4ercBNf2BDvfanp80/img.png?width=800&amp;amp;height=777&amp;amp;face=0_0_800_777,https://scrap.kakaocdn.net/dn/3pWqJ/hyXWtwaFmX/KcKfpzNpfcCkvg0AEEc6x0/img.png?width=800&amp;amp;height=777&amp;amp;face=0_0_800_777,https://scrap.kakaocdn.net/dn/uO3BB/hyXWsxgPOy/iaV1jtfTLRhPMadyveF901/img.png?width=750&amp;amp;height=728&amp;amp;face=0_0_750_728');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;채용 한파에 카카오뱅크 최종 합격 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;서론&amp;nbsp;2023년&amp;nbsp;12월,&amp;nbsp;카카오뱅크&amp;nbsp;결제코어개발팀&amp;nbsp;백엔드&amp;nbsp;개발자로&amp;nbsp;합류하게&amp;nbsp;되었습니다.넥슨&amp;nbsp;코리아&amp;nbsp;퇴사와&amp;nbsp;동시에&amp;nbsp;쉬는&amp;nbsp;기간&amp;nbsp;없이&amp;nbsp;입사를&amp;nbsp;결정했고,&amp;nbsp;이&amp;nbsp;아티클이&amp;nbsp;등록되는&amp;nbsp;시점엔&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;imksh.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023년&amp;nbsp;12월,&amp;nbsp;저는&amp;nbsp;카카오뱅크로&amp;nbsp;이직하며&amp;nbsp;금융&amp;nbsp;도메인이라는&amp;nbsp;새로운&amp;nbsp;환경에&amp;nbsp;발을&amp;nbsp;들였습니다.&amp;nbsp;금융은&amp;nbsp;다른&amp;nbsp;도메인과&amp;nbsp;달리&amp;nbsp;비즈니스&amp;nbsp;구조가&amp;nbsp;매우&amp;nbsp;복잡하고,&amp;nbsp;법적&amp;nbsp;규제와&amp;nbsp;개인&amp;nbsp;정보&amp;nbsp;관리&amp;nbsp;같은&amp;nbsp;요소까지&amp;nbsp;더해져&amp;nbsp;도메인&amp;nbsp;지식의&amp;nbsp;중요성이&amp;nbsp;업무&amp;nbsp;전반에&amp;nbsp;절실히&amp;nbsp;요구되는&amp;nbsp;분야였습니다.&lt;br /&gt;&lt;br /&gt;제가 맡은 역할은 새로운 기술을 도입하거나 설계된 시스템을 검토하며, 비즈니스 요건과 기술적 안정성이 조화를 이루는지를 판단하는 일이었습니다. 입사 당시, 약 100명이 참여하는 대규모 프로젝트가 설계를 마치고 개발 단계로 넘어가려는 상황이었습니다. 저는 입사 후 한 달 만에 기존 설계를 분석하며 구조적 오류를 발견했고, 유관 파트와 논의 끝에 설계를 재구성하는 과정에 기여했습니다. 이 과정에서 기존 설계에 담긴 구성원들의 노력을 존중하며, 동시에 제 논리가 맞는지 끊임없이 검증하고 증명해야 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;금융 개발의 기존 관습과 새로운 시도&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금융권&amp;nbsp;개발&amp;nbsp;환경에서는&amp;nbsp;SI(System&amp;nbsp;Integration)&amp;nbsp;프로젝트에서&amp;nbsp;자주&amp;nbsp;사용하는&amp;nbsp;비즈니스&amp;nbsp;흐름&amp;nbsp;중심의&amp;nbsp;개발&amp;nbsp;방식이&amp;nbsp;익숙하게&amp;nbsp;자리&amp;nbsp;잡고&amp;nbsp;있었습니다.&amp;nbsp;이러한&amp;nbsp;방식은&amp;nbsp;업무&amp;nbsp;프로세스나&amp;nbsp;요구사항에&amp;nbsp;따라&amp;nbsp;코드를&amp;nbsp;순차적으로&amp;nbsp;작성하는&amp;nbsp;형태로,&amp;nbsp;종종&amp;nbsp;복잡한&amp;nbsp;비즈니스&amp;nbsp;로직이&amp;nbsp;하나의&amp;nbsp;메서드에&amp;nbsp;밀집되거나&amp;nbsp;추상화가&amp;nbsp;부족한&amp;nbsp;경우가&amp;nbsp;많았습니다.&lt;br /&gt;&lt;br /&gt;이러한 관행 대신, 저는 Java와 Spring Boot 스택을 활용해 코드의 가독성과 유지보수성을 높이고자 고민했습니다. 코드를 더 직관적이고 명확하게 작성하는 방법을 도입하면서, 팀 내에서 효율적이고 표준화된 개발 방식을 구축하려 노력했고 지금도 구성원들과 함께 고민하고 적용하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코드리뷰 문화의 도입&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 입사했을 당시 팀에는 코드리뷰 문화가 전무했습니다.(여기서 말하는 코드리뷰는 PR, MR을 이용한 코드리뷰를 의미합니다) 코드리뷰 없이 작업이 진행되다 보니 코드 품질이나 팀원 간 코드 스타일의 일관성에 문제가 있었습니다. 저는 입사 직후부터 코드리뷰 문화를 도입해야 한다고 판단했고, 이를 직접 제안했습니다. 지금까지도 대부분의 소스코드를 제가 직접 리뷰하며 코드 수정 아이디어를 제시하고 있습니다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 코드리뷰와 새로운 개발 방식에 익숙하지 않았던 구성원들도 시간이 지나며 이를 점차 받아들였고, 서로의 작업을 피드백하며 배우는 문화를 형성할 수 있었습니다. 제 판단을 믿고 지지해준 구성원들 덕분에, 1년 전과는 비교할 수 없을 만큼 함께 성장했습니다.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;과정에서&amp;nbsp;가장&amp;nbsp;크게&amp;nbsp;깨달은&amp;nbsp;점은,&amp;nbsp;기술적인&amp;nbsp;변화는&amp;nbsp;결국&amp;nbsp;사람과의&amp;nbsp;신뢰&amp;nbsp;속에서&amp;nbsp;이뤄진다는&amp;nbsp;사실이었습니다.&amp;nbsp;새로운&amp;nbsp;방식을&amp;nbsp;도입할&amp;nbsp;때&amp;nbsp;가장&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;논리적으로&amp;nbsp;설득하는&amp;nbsp;것뿐만&amp;nbsp;아니라,&amp;nbsp;그&amp;nbsp;변화가&amp;nbsp;팀의&amp;nbsp;성장과&amp;nbsp;성공에&amp;nbsp;실질적인&amp;nbsp;도움이&amp;nbsp;될&amp;nbsp;것임을&amp;nbsp;모두가&amp;nbsp;체감하게&amp;nbsp;만드는&amp;nbsp;일이었습니다.&lt;br /&gt;&lt;br /&gt;또한, 코드리뷰를 통해 각자의 강점을 코드에 자연스럽게 녹여낼 수 있었고, 각 구성원이 &quot;더 나은 코드&quot;를 고민하며 지속적으로 성장할 수 있는 기반을 마련했다는 점에서 큰 보람을 느꼈습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인프런 이력서 강의 런칭&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년&amp;nbsp;4월,&amp;nbsp;저는&amp;nbsp;&lt;a href=&quot;https://inf.run/Zvsox&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;인프런에서&amp;nbsp;이력서&amp;nbsp;강의&lt;/a&gt;를 기획하고 준비하기 시작했습니다. 높은 업무 강도 속에서도 퇴근 후와 주말 시간을 활용해 강의를 제작하며, 번아웃이 두 번 이상 찾아올 정도로 힘든 시기를 겪었어요. 촬영 중에는 자신감이 떨어지고 흔들리는 순간도 많았습니다.&lt;br /&gt;&lt;br /&gt;그럼에도 포기하지 않고 끝까지 완성할 수 있었던 건 러닝메이트로 함께했던 세 분 덕분이었습니다. 그분들의 지지 덕분에 끝까지 포기하지 않고 강의를 완성할 수 있었습니다. 그렇게 만들어진 강의는 성공적으로 런칭되었고, 현재는 약 500명 이상의 수강생이 참여하며 평점 5.0을 유지할 수 있었습니다. 또한 운이 좋게도, 인프랩과의 협업을 통해 기존 강의들보다 더 많은 수강생을 유치할 수 있었고, 그 과정에서도 큰 보람을 느꼈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;영향력&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의를 시작하며 예상치 못했던 순간 중 하나는, 수강생들의 합격 소식을 들을 때 찾아오는 행복이었습니다. 어떤 수강생이 &quot;강의를 듣고 준비한 덕분에 원하는 회사에 합격했다&quot;는 소식을 전해왔을 때, 그 순간의 행복은 말로 표현하기 어려웠습니다. 단순히 강의를 만든 사람으로서가 아니라, 누군가의 인생에서 작은 도움을 줄 수 있었다는 사실이 큰 감동으로 다가왔거든요.&lt;br /&gt;이런 순간들은 강의를 준비하며 겪었던 어려움과 번아웃마저 잊게 만들 만큼 소중한 경험이라고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;책임감&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이&amp;nbsp;지나며&amp;nbsp;강의를&amp;nbsp;수강하는&amp;nbsp;분들이&amp;nbsp;점점&amp;nbsp;늘어나면서,&amp;nbsp;저에게는&amp;nbsp;책임감이라는&amp;nbsp;무게도&amp;nbsp;함께&amp;nbsp;커졌습니다.&amp;nbsp;수강생들이&amp;nbsp;기대하는&amp;nbsp;것은&amp;nbsp;단순히&amp;nbsp;정보&amp;nbsp;전달이&amp;nbsp;아니라,&amp;nbsp;실질적으로&amp;nbsp;도움이&amp;nbsp;되는&amp;nbsp;내용과&amp;nbsp;방향성입니다.&amp;nbsp;그&amp;nbsp;기대에&amp;nbsp;부응하기&amp;nbsp;위해&amp;nbsp;강의&amp;nbsp;내용을&amp;nbsp;꾸준히&amp;nbsp;점검하고,&amp;nbsp;추가적인&amp;nbsp;자료를&amp;nbsp;제작하며,&amp;nbsp;강의&amp;nbsp;이후에도&amp;nbsp;질문에&amp;nbsp;답변하며&amp;nbsp;소통하려고&amp;nbsp;노력했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rMzQZ/btsLEZUJcSf/RuWOhr6kCdAXRKCZYUKVkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rMzQZ/btsLEZUJcSf/RuWOhr6kCdAXRKCZYUKVkK/img.png&quot; data-alt=&quot;운영 중인 디스코드 채널&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rMzQZ/btsLEZUJcSf/RuWOhr6kCdAXRKCZYUKVkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrMzQZ%2FbtsLEZUJcSf%2FRuWOhr6kCdAXRKCZYUKVkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;164&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;운영 중인 디스코드 채널&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;수강생들의&amp;nbsp;성취와&amp;nbsp;만족도가&amp;nbsp;높아질수록&amp;nbsp;제가&amp;nbsp;해야&amp;nbsp;할&amp;nbsp;역할도&amp;nbsp;더욱&amp;nbsp;명확해졌습니다.&amp;nbsp;단순히&amp;nbsp;지식을&amp;nbsp;전달하는&amp;nbsp;것을&amp;nbsp;넘어,&amp;nbsp;&lt;u&gt;&lt;b&gt;각자가&amp;nbsp;더&amp;nbsp;나은&amp;nbsp;길을&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;돕는&amp;nbsp;길잡이&amp;nbsp;역할이&amp;nbsp;중요하다는&amp;nbsp;것을&amp;nbsp;깨달았습니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이력서&amp;nbsp;강의는&amp;nbsp;단순히&amp;nbsp;콘텐츠를&amp;nbsp;제작하는&amp;nbsp;과정이&amp;nbsp;아니었어요.&amp;nbsp;사람들과&amp;nbsp;연결되고,&amp;nbsp;그들의&amp;nbsp;성취를&amp;nbsp;함께&amp;nbsp;기뻐할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;너무도&amp;nbsp;소중한&amp;nbsp;시간이었답니다.&amp;nbsp;강의를&amp;nbsp;시작할&amp;nbsp;때는&amp;nbsp;번아웃과&amp;nbsp;불안감&amp;nbsp;속에서&amp;nbsp;힘들었던&amp;nbsp;순간도&amp;nbsp;많았지만,&amp;nbsp;수강생들의&amp;nbsp;합격&amp;nbsp;소식과&amp;nbsp;따뜻한&amp;nbsp;피드백은&amp;nbsp;제가&amp;nbsp;앞으로도&amp;nbsp;계속&amp;nbsp;이&amp;nbsp;길을&amp;nbsp;걸어가야&amp;nbsp;하는&amp;nbsp;이유가&amp;nbsp;되어&amp;nbsp;주었어요.&lt;br /&gt;&lt;br /&gt;지금은 기술적인 콘텐츠를 제작하기 위해 고민을 이어가고 있습니다. 앞으로도 이런 방식을 통해 더 많은 사람들에게 도움을 줄 수 있기를 기대하고 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;강의 런칭 이후, 강사로서의 활동&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의를&amp;nbsp;성공적으로&amp;nbsp;런칭한&amp;nbsp;이후,&amp;nbsp;제&amp;nbsp;삶은&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;방향으로&amp;nbsp;바쁘게&amp;nbsp;움직이기&amp;nbsp;시작했습니다.&amp;nbsp;부트캠프,&amp;nbsp;교육기관,&amp;nbsp;출판사&amp;nbsp;등&amp;nbsp;다양한&amp;nbsp;곳에서&amp;nbsp;협업&amp;nbsp;제안을&amp;nbsp;받으며&amp;nbsp;강사와&amp;nbsp;멘토로서의&amp;nbsp;활동이&amp;nbsp;본격화되었죠.&amp;nbsp;강의가&amp;nbsp;끝난&amp;nbsp;뒤에는&amp;nbsp;조금은&amp;nbsp;여유가&amp;nbsp;생길&amp;nbsp;거라&amp;nbsp;기대했지만,&amp;nbsp;실제로는&amp;nbsp;일정이&amp;nbsp;더&amp;nbsp;빽빽해졌습니다.&lt;br /&gt;&lt;br /&gt;때로는&amp;nbsp;번아웃의&amp;nbsp;경계에서&amp;nbsp;줄타기를&amp;nbsp;하는&amp;nbsp;것&amp;nbsp;같은&amp;nbsp;순간들도&amp;nbsp;있었지만,&amp;nbsp;그만큼&amp;nbsp;보람&amp;nbsp;있는&amp;nbsp;일들도&amp;nbsp;많았습니다.&amp;nbsp;무엇보다도&amp;nbsp;수강생들과의&amp;nbsp;만남과&amp;nbsp;소통이&amp;nbsp;저를&amp;nbsp;끊임없이&amp;nbsp;배우게&amp;nbsp;하고&amp;nbsp;성장하게&amp;nbsp;했어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의를&amp;nbsp;수강한&amp;nbsp;분들&amp;nbsp;중&amp;nbsp;일부는&amp;nbsp;구체적이고&amp;nbsp;열정적인&amp;nbsp;질문들을&amp;nbsp;보내오곤&amp;nbsp;했습니다.&amp;nbsp;&lt;b&gt;질문의&amp;nbsp;깊이나&amp;nbsp;방향은&amp;nbsp;모두&amp;nbsp;달랐지만,&amp;nbsp;그&amp;nbsp;안에는&amp;nbsp;각자&amp;nbsp;진지하게&amp;nbsp;고민하고&amp;nbsp;노력해온&amp;nbsp;흔적이&amp;nbsp;담겨&amp;nbsp;있었어요.&lt;/b&gt;&amp;nbsp;이런&amp;nbsp;질문들에&amp;nbsp;답을&amp;nbsp;하다&amp;nbsp;보면&amp;nbsp;저&amp;nbsp;자신도&amp;nbsp;다시금&amp;nbsp;배움을&amp;nbsp;정리하고,&amp;nbsp;때로는&amp;nbsp;새로운&amp;nbsp;관점을&amp;nbsp;발견하게&amp;nbsp;되었습니다.&lt;br /&gt;&lt;br /&gt;특히,&amp;nbsp;수강생들의&amp;nbsp;질문을&amp;nbsp;통해&amp;nbsp;&quot;내가&amp;nbsp;놓치고&amp;nbsp;있던&amp;nbsp;부분은&amp;nbsp;무엇일까?&quot;를&amp;nbsp;자주&amp;nbsp;돌아보게&amp;nbsp;되었고,&amp;nbsp;&lt;b&gt;단순히&amp;nbsp;강사로서&amp;nbsp;지식을&amp;nbsp;전달하는&amp;nbsp;역할을&amp;nbsp;넘어&amp;nbsp;그들의&amp;nbsp;성장을&amp;nbsp;진심으로&amp;nbsp;응원하는&amp;nbsp;제&amp;nbsp;자신을&amp;nbsp;발견할&amp;nbsp;수&amp;nbsp;있었습니다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기관마다 다른 학습 분위기와 태도&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의를&amp;nbsp;통해&amp;nbsp;다양한&amp;nbsp;기관과&amp;nbsp;협업하면서,&amp;nbsp;기관마다&amp;nbsp;수강생들의&amp;nbsp;학습&amp;nbsp;태도나&amp;nbsp;분위기가&amp;nbsp;서로&amp;nbsp;다르다는&amp;nbsp;점도&amp;nbsp;흥미롭게&amp;nbsp;다가왔습니다.&amp;nbsp;어떤&amp;nbsp;곳에서는&amp;nbsp;수강생들이&amp;nbsp;서로&amp;nbsp;협력하며&amp;nbsp;적극적으로&amp;nbsp;질문을&amp;nbsp;주고받는&amp;nbsp;모습을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있었고,&amp;nbsp;또&amp;nbsp;어떤&amp;nbsp;곳에서는&amp;nbsp;조용하지만&amp;nbsp;내면적으로&amp;nbsp;깊이&amp;nbsp;고민하며&amp;nbsp;학습에&amp;nbsp;임하는&amp;nbsp;분위기가&amp;nbsp;느껴지기도&amp;nbsp;했습니다.&lt;br /&gt;&lt;br /&gt;이런&amp;nbsp;차이들을&amp;nbsp;경험하며,&amp;nbsp;저는&amp;nbsp;단순히&amp;nbsp;강의를&amp;nbsp;전달하는&amp;nbsp;방식뿐만&amp;nbsp;아니라,&amp;nbsp;각&amp;nbsp;기관과&amp;nbsp;수강생들의&amp;nbsp;특성에&amp;nbsp;맞춰&amp;nbsp;내용을&amp;nbsp;어떻게&amp;nbsp;조율해야&amp;nbsp;할지&amp;nbsp;고민하게&amp;nbsp;되었습니다.&amp;nbsp;앞으로는&amp;nbsp;이러한&amp;nbsp;경험을&amp;nbsp;바탕으로&amp;nbsp;더&amp;nbsp;시너지를&amp;nbsp;낼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;선택을&amp;nbsp;하고,&amp;nbsp;수강생들이&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;것을&amp;nbsp;얻어갈&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;환경을&amp;nbsp;만들어가고&amp;nbsp;싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;강사라는 역할에 대한 깨달음&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강사로서의&amp;nbsp;활동은&amp;nbsp;단순히&amp;nbsp;지식을&amp;nbsp;전달하는&amp;nbsp;것에&amp;nbsp;그치지&amp;nbsp;않는다는&amp;nbsp;점을&amp;nbsp;매&amp;nbsp;순간&amp;nbsp;느꼈습니다.&amp;nbsp;수강생들에게&amp;nbsp;필요한&amp;nbsp;것은&amp;nbsp;단순한&amp;nbsp;정보가&amp;nbsp;아니라,&amp;nbsp;&lt;b&gt;그들이&amp;nbsp;스스로&amp;nbsp;고민하고&amp;nbsp;성장할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;돕는&amp;nbsp;길잡이&amp;nbsp;역할이었어요.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;때로는&amp;nbsp;질문에&amp;nbsp;답을&amp;nbsp;주기보다,&amp;nbsp;&lt;b&gt;그들이&amp;nbsp;스스로&amp;nbsp;답을&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방향을&amp;nbsp;제시하는&amp;nbsp;것이&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;도움이&amp;nbsp;된다는&amp;nbsp;것을&amp;nbsp;깨달았습니다.&lt;/b&gt;&amp;nbsp;강사로서의&amp;nbsp;역할은&amp;nbsp;단순히&amp;nbsp;알려주는&amp;nbsp;사람이&amp;nbsp;아니라,&amp;nbsp;함께&amp;nbsp;고민하고&amp;nbsp;성장을&amp;nbsp;돕는&amp;nbsp;동반자와&amp;nbsp;같다는&amp;nbsp;생각이&amp;nbsp;들었어요.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼, 강사 활동은 제게 또 다른 배움과 성장의 시간이었습니다. 수강생들의 질문과 성장은 제가 다시 배우고 고민할 수 있는 계기가 되었고, 다양한 기관에서의 경험은 앞으로 더 나은 방향을 고민하게 만들었습니다.&lt;br /&gt;&lt;br /&gt;앞으로도 강사로서 수강생들이 더 나은 길을 찾고 성장할 수 있도록, 그 길의 동반자로 함께 걸어가고 싶습니다. 아직은, 이 경험들이 저 자신을 더 깊고 단단하게 만들어주는 과정이 되리라 생각합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인간관계에서 성숙해지기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년은&amp;nbsp;기술적인&amp;nbsp;성장뿐만&amp;nbsp;아니라,&amp;nbsp;&lt;b&gt;제&amp;nbsp;자신과&amp;nbsp;인간관계를&amp;nbsp;깊이&amp;nbsp;돌아볼&amp;nbsp;수&amp;nbsp;있었던&amp;nbsp;해였습니다.&lt;/b&gt;&amp;nbsp;그동안&amp;nbsp;바쁜&amp;nbsp;일상&amp;nbsp;속에서&amp;nbsp;기술에&amp;nbsp;대한&amp;nbsp;FOMO(Fear&amp;nbsp;of&amp;nbsp;Missing&amp;nbsp;Out)를&amp;nbsp;느끼며&amp;nbsp;끊임없이&amp;nbsp;공부를&amp;nbsp;이어왔지만,&amp;nbsp;정작&amp;nbsp;저&amp;nbsp;자신과&amp;nbsp;가치관에&amp;nbsp;대해&amp;nbsp;깊이&amp;nbsp;고민할&amp;nbsp;시간을&amp;nbsp;가지지&amp;nbsp;못했다는&amp;nbsp;것을&amp;nbsp;깨달았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P6uta/btsLEY2Bl0U/WyvyKhGC20UkgqkZ3NugU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P6uta/btsLEY2Bl0U/WyvyKhGC20UkgqkZ3NugU1/img.png&quot; data-alt=&quot;[가장 젊은 날의 철학] 목차&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P6uta/btsLEY2Bl0U/WyvyKhGC20UkgqkZ3NugU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP6uta%2FbtsLEY2Bl0U%2FWyvyKhGC20UkgqkZ3NugU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;276&quot; height=&quot;312&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[가장 젊은 날의 철학] 목차&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;그&amp;nbsp;계기&amp;nbsp;중&amp;nbsp;하나가&amp;nbsp;바로&amp;nbsp;&lt;b&gt;가장&amp;nbsp;젊은&amp;nbsp;날의&amp;nbsp;철학&lt;/b&gt;이라는&amp;nbsp;책이었습니다.&amp;nbsp;이&amp;nbsp;책은&amp;nbsp;나&amp;nbsp;자신,&amp;nbsp;인간관계,&amp;nbsp;그리고&amp;nbsp;삶의&amp;nbsp;방향성에&amp;nbsp;대한&amp;nbsp;질문을&amp;nbsp;던지며,&amp;nbsp;제가&amp;nbsp;스스로를&amp;nbsp;돌아보고&amp;nbsp;정리할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;기회를&amp;nbsp;제공해주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;인간관계와&amp;nbsp;나를&amp;nbsp;둘러싼&amp;nbsp;관계에&amp;nbsp;대해&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 몇 년간의 인간관계를 돌아보면, 저를 힘들게 하고 무너지게 했던 관계도 있었지만, 반대로 저를 성장시키고 의지할 수 있도록 해준 견고한 관계도 있었습니다. 또한, 이러한 경험 속에서 저는 &quot;사람은 바꿀 수 있다!&quot;라는 생각이 어쩌면 나의 오만일 수 있었다는 사실을 깨닫게 되었습니다. 사람은 강한 계기와 동기가 없다면 본성을 쉽게 바꾸지 않는다는 점을 다시금 확인하게 되었고, 동시에, 제가 얼마나 부족한 사람이었는지도 돌아보게 되었고, 결혼이라는 제도를 단순히 추상적으로만 생각했던 과거와 달리 더 구체적으로 고민해보는 계기가 되었습니다.&lt;br /&gt;&lt;br /&gt;커뮤니티에서 만난 분들 덕분에 저는 많은 응원과 격려를 받을 수 있었습니다. 강의를 SNS에 공유해주시거나 진심 어린 후기를 남겨주시며 저를 응원해주신 분들의 따뜻함이 정말 감동이었습니다. 그분들의 행동을 통해 &amp;ldquo;나도 과연 이렇게 행동할 수 있었을까?&amp;rdquo;라는 질문을 스스로에게 던지게 되었고, 감사함과 존경의 마음을 느낄 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올해&amp;nbsp;저는&amp;nbsp;내가&amp;nbsp;무엇을&amp;nbsp;좋아하고&amp;nbsp;싫어하는지,&amp;nbsp;어떤&amp;nbsp;방향으로&amp;nbsp;나아가고&amp;nbsp;싶은지&amp;nbsp;진지하게&amp;nbsp;고민하기&amp;nbsp;시작했습니다.&amp;nbsp;예전에는&amp;nbsp;단기적인&amp;nbsp;목표를&amp;nbsp;세우고,&amp;nbsp;눈앞의&amp;nbsp;성취를&amp;nbsp;이루는&amp;nbsp;데&amp;nbsp;집중했다면,&amp;nbsp;이제는&amp;nbsp;삶을&amp;nbsp;더&amp;nbsp;거시적으로&amp;nbsp;바라보려&amp;nbsp;합니다.&amp;nbsp;현실적인&amp;nbsp;여건을&amp;nbsp;고려하면서도,&amp;nbsp;나만의&amp;nbsp;방향성을&amp;nbsp;가지고&amp;nbsp;살아가기&amp;nbsp;위해&amp;nbsp;고민하는&amp;nbsp;시간이&amp;nbsp;많아졌습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;앞으로도&amp;nbsp;저는&amp;nbsp;저를&amp;nbsp;둘러싼&amp;nbsp;관계를&amp;nbsp;더&amp;nbsp;소중히&amp;nbsp;여기고,&amp;nbsp;함께&amp;nbsp;성장할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방향을&amp;nbsp;찾아가고&amp;nbsp;싶습니다.&amp;nbsp;아직&amp;nbsp;부족하지만,&amp;nbsp;조금씩&amp;nbsp;나아지는&amp;nbsp;모습을&amp;nbsp;통해&amp;nbsp;더&amp;nbsp;나은&amp;nbsp;관계와&amp;nbsp;삶을&amp;nbsp;만들어가길&amp;nbsp;기대합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년은 도전과 성취, 그리고 인간관계와 자기 성찰을 통해 많은 성장을 이룰 수 있었던 해였습니다.&lt;br /&gt;&lt;br /&gt;아직 저는 배워야 할 것도 많고, 성장해가야 할 길도 많이 남아있습니다. 그럼에도 지금까지 저와 함께해 주신 분들, 그리고 앞으로 인연을 맺게 될 분들께 미리 감사의 마음을 전하고 싶어요. 앞으로도 함께 할 수 있기를 바라며 한층 더 성숙해지도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;여러분의 2024년은 어떤 모습이었나요? 한 해를 돌아보며 감사했던 순간들과 배운 점들을 떠올려보시면 좋을 것 같아요. 내년에도 서로의 성장을 응원하며, 더 멋진 도전을 이어가길 진심으로 응원하겠습니다.&lt;/p&gt;</description>
      <category>후기/회고</category>
      <author>CODe_</author>
      <guid isPermaLink="true">https://code1995.tistory.com/130</guid>
      <comments>https://code1995.tistory.com/130#entry130comment</comments>
      <pubDate>Sun, 5 Jan 2025 16:24:41 +0900</pubDate>
    </item>
    <item>
      <title>퇴사를 고민하는 주니어에게,</title>
      <link>https://code1995.tistory.com/128</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;grain-field-7225738_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EWZOg/btsKZcWv0Bi/Cu7OeJqjnHhOw1mNgn92SK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EWZOg/btsKZcWv0Bi/Cu7OeJqjnHhOw1mNgn92SK/img.jpg&quot; data-alt=&quot;출처: 픽사베이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EWZOg/btsKZcWv0Bi/Cu7OeJqjnHhOw1mNgn92SK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEWZOg%2FbtsKZcWv0Bi%2FCu7OeJqjnHhOw1mNgn92SK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;364&quot; data-filename=&quot;grain-field-7225738_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: 픽사베이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프롤로그&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취업이 너무나도  어려운 시기에 개발자 취업을 꿈 꿔왔던 멘티가 있었습니다. 결국 치열한 노력 끝에 취업에 성공하여 기쁜 소식을 전해줬어요.&amp;nbsp;하지만 몇 개월 후, 제게 다시 연락을 해왔습니다. &quot;힘들다, 퇴사하고 싶다&quot;라는 지쳐있는 이야기를 말이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 몇 가지 제 경험과 가치관에 대해 이야기를 해주었습니다. 대기업 공채 &lt;u&gt;입사 이틀만에 퇴사를 결심한 이야기&lt;/u&gt;부터, 이직을 한 순간까지 어떻게 버텼는지, 그 과정에서 스스로 느낀 점들에 대해서요. 우리가 살아가는 길에는 많은 선택지가 있지만, 퇴사나 이직은 특히나 어렵고 고민되는 선택지 중 하나일 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 퇴사라는 단어와 가까워지기 시작한, 혹은 아직은 멀게 느껴지지만 언젠가는 퇴사를 고민하게 될지도 모를, 4년차 이하의 개발자들을 위해 썼습니다. 조금 철학적일 수 있지만, 고민의 순간마다 스스로의 감정을 조금 더 명확하게 바라보고, 스스로가 진정 원하는 것을 찾는 데에 이 글이 작은 도움이 되기를 바랍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;퇴사를 고민하는 이유들&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 역시 누구나 꿈에 그리던 대기업의 공채로 입사했지만, 단 이틀 만에 퇴사를 결심했던 경험이 있습니다. 많은 사람들이 대기업에서의 안정적인 커리어를 꿈꾸기에, 제 결정을 이해하지 못했지만, 그 때 당시 저에게는 나름대로의 이유가 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 일의 양이 많고 스스로 몰두할 수 있는 환경에서 성장을 느끼며 만족감을 얻는 사람이었어요. 그런데 입사했던 기업에서는 모든 것이 시스템적으로 잘 갖추어져 있었고, 퇴근 후에는 일에 대한 부담이 전혀 없었어요. 주변 사람들은 그것을 좋은 환경이라 이야기했지만, &quot;이러다 성장이 멈추는 것이 아닐까?&quot; 하는 두려움이 들었습니다. 그래서 저는 과감하게 퇴사(이직)를 결심했고, 2년 동안 이직을 준비하면서 진정 제가 원하는 환경을 찾아갔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경험을 통해 깨달은 것은, &lt;b&gt;퇴사를 고민하는 이유가 다른 사람들의 관점에서 쉽게 이해되지 않을 수 있다는 점 &lt;/b&gt;입니다. 그리고 자신의 가치관에 맞지 않는 환경에서 억지로 버티는 것이 결코 바람직하지 않다는 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주니어 개발자들이 퇴사하는 이유는 다양합니다. 저처럼 성장이 멈춘 것 같은 느낌을 받을 수도 있고, 기대와 다른 회사 문화나 업무 스타일에 부딪힐 수도 있을 것입니다. 혹은 사수의 부재처럼 적절한 피드백이나 지도가 부족해 막막함을 느낄 수도 있죠. 그 이유가 무엇이든, 여러분의 고민을 존중합니다. 이제, 여러분의 다양한 고민들을 조금 더 객관적으로 바라보고 분석해보려 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;감정을 분석하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퇴사를 고민하게 만드는 감정이나 사례들을 구체적으로 나열해 보세요. 단순히 피로감에서 오는 건지, 성장의 한계를 느끼는 것인지, 아니면 전혀 다른 문제 때문인지 알아보는 과정이 필요합니다. 이때 가장 중요한 것은 &lt;u&gt;&lt;b&gt;감정에 휘둘리지 않고 자신의 고민을 명확하게 바라보는 것&lt;/b&gt;&lt;/u&gt;입니다. 구체적인 질문을 스스로에게 던져보세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;어떤 순간에 퇴사하고 싶다고 느꼈지?&quot;&lt;/li&gt;
&lt;li&gt;&quot;내가 원하는 환경은 어떤 모습이지?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 질문을 던지다보면, 퇴사가 단지 감정에서 비롯된 결정인지, 진정한 욕구와 목표에서 비롯된 결정인지를 구분하게 됩니다. 퇴사가 근본적 해결책이 될지 아니면 다른 방향으로 해결할 수 있을지 판단할 수 있게 되죠. 결국, &quot;나는 어떻게 살고 싶은가?&quot;라는 질문에 이르게 될 겁니다. 나에게 진정한 행복과 의미를 주는 것은 무엇인지 찾아가는 과정을 피할 수 없게 돼요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;당신은, 어떻게 살고 싶은가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;어떻게 살고 싶은가?&quot;라는 질문에 저는 &quot;행복하게&quot;라고 답합니다. 이 대답은 사실 저의 &lt;u&gt;&lt;b&gt;퇴사 기준을 비롯한 많은 선택의 중심&lt;/b&gt;&lt;/u&gt;에 있습니다. 직장은 우리가 많은 시간을 보내는 곳이기에, 직장에서의 경험이 삶의 행복에 깊이 연결됩니다. 직장이 저의 행복 기준과 멀어진다면, 저는 퇴사를 고민할 수밖에 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금의 제 행복을 지키기 위한 필수 요소는 크게 3가지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;건강, 자기 효능감, 그리고 성장이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;건강을 해친다면&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어른들이&amp;nbsp;늘&amp;nbsp;&amp;ldquo;건강이&amp;nbsp;가장&amp;nbsp;중요하다&amp;rdquo;고&amp;nbsp;말할&amp;nbsp;때,&amp;nbsp;20대인&amp;nbsp;저는&amp;nbsp;그&amp;nbsp;중요성을&amp;nbsp;실감하지&amp;nbsp;못했습니다.&amp;nbsp;사실&amp;nbsp;20대는&amp;nbsp;누구나&amp;nbsp;비교적&amp;nbsp;건강하고,&amp;nbsp;제&amp;nbsp;몸이&amp;nbsp;튼튼하다는&amp;nbsp;믿음이&amp;nbsp;있었죠.&amp;nbsp;불과&amp;nbsp;몇&amp;nbsp;년&amp;nbsp;전까지만&amp;nbsp;해도&amp;nbsp;&amp;ldquo;한&amp;nbsp;살이라도&amp;nbsp;어릴&amp;nbsp;때&amp;nbsp;열심히&amp;nbsp;구르자!&amp;rdquo;라는&amp;nbsp;생각으로&amp;nbsp;살았습니다.&amp;nbsp;건강을&amp;nbsp;크게&amp;nbsp;신경&amp;nbsp;쓰지&amp;nbsp;않았고,&amp;nbsp;밤을&amp;nbsp;새워가며&amp;nbsp;일에&amp;nbsp;몰두하고,&amp;nbsp;몇&amp;nbsp;달간&amp;nbsp;수면을&amp;nbsp;줄여가며&amp;nbsp;필요한&amp;nbsp;공부를&amp;nbsp;이어갔습니다.&lt;br /&gt;&lt;br /&gt;그러나 반복되는 무리 속에서 신체뿐 아니라 정신도 지쳐가며 건강의 중요성을 새삼 깨달았습니다. 건강을 지키지 못한다면, 어떤 좋은 직장이나 커리어 목표도 의미가 없다는 것을요. 몸이 지치면 의욕을 잃기 쉽고, 정신적인 소진이 지속되면 자존감과 삶의 만족감 또한 떨어지게 됩니다. 만약 직장에서 과도한 스트레스나 정신적인 소진이 반복돼 건강이 위협받는다고 느껴진다면, 퇴사를 고려할 것입니다. 아직은 하루 12시간씩 일하거나 주말이 없어도 행복하지만요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;자기 효능감이 없다면&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;자기 효능감: 어떤 상황에서 적절한 행동을 할 수 있다는 기대와 신념 - &lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%9E%90%EA%B8%B0%ED%9A%A8%EB%8A%A5%EA%B0%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;출처 &lt;/a&gt;위키백과&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 일에서 가치와 의미를 찾고 싶습니다. 자기 효능감은 &lt;u&gt;&lt;b&gt;내가 중요하다고 느끼는 역할을 맡아 내 역량이 충분히 발휘되고 있다는 믿음에서 비롯&lt;/b&gt;&lt;/u&gt;됩니다. 이는 단순히 결과물로만 나타나는 것이 아니라, 나의 존재와 기여가 회사와 조직에 기여하고 있음을 느끼는 &lt;u&gt;&lt;b&gt;과정에서 얻어지는 것&lt;/b&gt;&lt;/u&gt;입니다. 자기 효능감이 살아 있는 환경에서 일할 때, 저는 &lt;b&gt;성장의 원동력을 얻게 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;성장이 없다면&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로,&amp;nbsp;저는&amp;nbsp;&lt;u&gt;&lt;b&gt;끊임없이&amp;nbsp;배우고&amp;nbsp;조금씩&amp;nbsp;나아가는&amp;nbsp;삶&lt;/b&gt;&lt;/u&gt;을&amp;nbsp;원합니다.&amp;nbsp;성장이라는&amp;nbsp;것은&amp;nbsp;눈에&amp;nbsp;보이지&amp;nbsp;않을&amp;nbsp;때도&amp;nbsp;많고,&amp;nbsp;당장&amp;nbsp;결과가&amp;nbsp;나오지&amp;nbsp;않아&amp;nbsp;답답하게&amp;nbsp;느껴질&amp;nbsp;때도&amp;nbsp;있습니다.&amp;nbsp;하지만&amp;nbsp;시간이&amp;nbsp;지나&amp;nbsp;돌아보면,&amp;nbsp;작은&amp;nbsp;노력들이&amp;nbsp;쌓여&amp;nbsp;어느새&amp;nbsp;성장한&amp;nbsp;자신을&amp;nbsp;발견하게&amp;nbsp;됩니다.&amp;nbsp;주니어&amp;nbsp;개발자라면&amp;nbsp;당장의&amp;nbsp;성장이&amp;nbsp;보이지&amp;nbsp;않아&amp;nbsp;고민할&amp;nbsp;수도&amp;nbsp;있지만,&amp;nbsp;&lt;b&gt;지금의&amp;nbsp;경험들이&amp;nbsp;쌓여&amp;nbsp;큰&amp;nbsp;성장을&amp;nbsp;이루게&amp;nbsp;될&amp;nbsp;것임을&amp;nbsp;믿고&amp;nbsp;나아가길&amp;nbsp;권합니다&lt;/b&gt;.&amp;nbsp;저는&amp;nbsp;이러한&amp;nbsp;성장의&amp;nbsp;과정이&amp;nbsp;저의&amp;nbsp;행복을&amp;nbsp;이루는&amp;nbsp;중요한&amp;nbsp;부분이라고&amp;nbsp;생각합니다.&lt;br /&gt;&lt;br /&gt;이  세 가지가 회사에서 모두 충족될 때, 저는 안정적인 삶을 살고 있다고 느낍니다. 회사가 이 기준을 충분히 충족하지 못하고 제 삶의 방향과 어긋난다면, 저는 퇴사를 고민할 수밖에 없습니다. &lt;u&gt;&lt;b&gt;퇴사는 단순히 어려움을 피하는 것이 아니라, 제가 원하는 삶과 가치를 지키기 위한 중요한 선택&lt;/b&gt;&lt;/u&gt;이기 때문입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;퇴사를 결심했다면&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깊은 고민 끝에 퇴사를 결심하게 됐다면, 그 결정이 진정한 자기 이해와 가치에 기반한 것인지 점검해 보는 과정이 필요합니다. 퇴사는 한 번 결정하면 되돌리기 어렵고, &lt;b&gt;새로운&amp;nbsp;환경도&amp;nbsp;항상&amp;nbsp;기대에&amp;nbsp;부응하지&amp;nbsp;않을&amp;nbsp;수&amp;nbsp;있습니다&lt;/b&gt;.&amp;nbsp;퇴사를&amp;nbsp;더욱&amp;nbsp;신중하고&amp;nbsp;후회&amp;nbsp;없는&amp;nbsp;선택으로&amp;nbsp;만들기&amp;nbsp;위해,&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;질문들을&amp;nbsp;스스로에게&amp;nbsp;던져보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;지금의&amp;nbsp;환경에서&amp;nbsp;내가&amp;nbsp;더&amp;nbsp;배울&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;것은&amp;nbsp;없는가?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;질문은&amp;nbsp;지금&amp;nbsp;직장에서&amp;nbsp;자신이&amp;nbsp;간과하고&amp;nbsp;있는&amp;nbsp;배움의&amp;nbsp;기회를&amp;nbsp;되돌아보게&amp;nbsp;합니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;현재&amp;nbsp;업무가&amp;nbsp;다소&amp;nbsp;단조롭다고&amp;nbsp;느낄&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;프로젝트를&amp;nbsp;다른&amp;nbsp;관점에서&amp;nbsp;접근하거나,&amp;nbsp;특정&amp;nbsp;기술을&amp;nbsp;더&amp;nbsp;깊이&amp;nbsp;파고들&amp;nbsp;기회로&amp;nbsp;삼을&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;만약&amp;nbsp;사수나&amp;nbsp;선배가&amp;nbsp;있다면,&amp;nbsp;그들의&amp;nbsp;노하우를&amp;nbsp;배우기&amp;nbsp;위해&amp;nbsp;&lt;b&gt;의도적으로&amp;nbsp;질문을&amp;nbsp;많이&amp;nbsp;던져보는&amp;nbsp;것도&amp;nbsp;하나의&amp;nbsp;방법&lt;/b&gt;입니다. 현재 회사에서 얻을 수 있는 마지막 배움이 무엇인지 탐색해 본다면, 떠나기 전 성장할 수 있는 기회를 최대한 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내가 퇴사를 통해 기대하는 변화는 무엇인가?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히&amp;nbsp;현재의&amp;nbsp;불만에서&amp;nbsp;벗어나기&amp;nbsp;위함인지,&amp;nbsp;아니면&amp;nbsp;새로운&amp;nbsp;기회를&amp;nbsp;통해&amp;nbsp;특정한&amp;nbsp;성장을&amp;nbsp;목표로&amp;nbsp;하는지&amp;nbsp;자신에게&amp;nbsp;물어보세요.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;만약&amp;nbsp;&quot;지금&amp;nbsp;회사에서&amp;nbsp;내가&amp;nbsp;성장하지&amp;nbsp;못하고&amp;nbsp;있다고&amp;nbsp;느낀다&quot;는&amp;nbsp;이유라면,&amp;nbsp;&lt;b&gt;구체적으로&amp;nbsp;어떤&amp;nbsp;성장을&amp;nbsp;기대하는지를&amp;nbsp;정리&lt;/b&gt;해보세요.&amp;nbsp;기술적&amp;nbsp;역량을&amp;nbsp;높이고&amp;nbsp;싶은지,&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;책임을&amp;nbsp;맡고&amp;nbsp;싶은지&amp;nbsp;등,&amp;nbsp;구체적인&amp;nbsp;목표를&amp;nbsp;세우면&amp;nbsp;이직할&amp;nbsp;회사에서&amp;nbsp;무엇을&amp;nbsp;중점적으로&amp;nbsp;찾아야&amp;nbsp;할지도&amp;nbsp;명확해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다음 회사에서도 비슷한 문제에 직면한다면, 나는 어떻게 대응할 것인가?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든&amp;nbsp;회사에는&amp;nbsp;어려움이&amp;nbsp;있으며,&amp;nbsp;새로운&amp;nbsp;곳에서도&amp;nbsp;예상치&amp;nbsp;못한&amp;nbsp;문제가&amp;nbsp;생길&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;현재&amp;nbsp;회사에서&amp;nbsp;상사와의&amp;nbsp;소통이&amp;nbsp;어려웠다면,&amp;nbsp;다음&amp;nbsp;회사에서도&amp;nbsp;비슷한&amp;nbsp;문제를&amp;nbsp;겪을&amp;nbsp;가능성을&amp;nbsp;염두에&amp;nbsp;두어야&amp;nbsp;합니다.&amp;nbsp;이때는&amp;nbsp;그저&amp;nbsp;&lt;b&gt;회피하기보다는,&amp;nbsp;다음&amp;nbsp;환경에서는&amp;nbsp;내가&amp;nbsp;어떻게&amp;nbsp;적극적으로&amp;nbsp;소통을&amp;nbsp;개선하고&amp;nbsp;갈등을&amp;nbsp;조율할&amp;nbsp;수&amp;nbsp;있을지&amp;nbsp;미리&amp;nbsp;대비&lt;/b&gt;해 보세요. 이렇게 하면 반복적인 문제에 더 성숙하게 대응할 수 있습니다. &lt;s&gt;마치 연애처럼요.&lt;/s&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;지금&amp;nbsp;떠나는&amp;nbsp;것이&amp;nbsp;나의&amp;nbsp;경력에&amp;nbsp;도움이&amp;nbsp;될까?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경력&amp;nbsp;초반에는&amp;nbsp;여러&amp;nbsp;회사를&amp;nbsp;경험하는&amp;nbsp;것도&amp;nbsp;좋지만,&amp;nbsp;너무&amp;nbsp;자주&amp;nbsp;이직하면&amp;nbsp;일관성이&amp;nbsp;떨어질&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;프로젝트가&amp;nbsp;끝나기&amp;nbsp;직전이라면,&amp;nbsp;&lt;b&gt;프로젝트를&amp;nbsp;완수하고&amp;nbsp;성과를&amp;nbsp;만들어&amp;nbsp;경력에&amp;nbsp;추가하는&amp;nbsp;것도&amp;nbsp;좋은&amp;nbsp;선택&lt;/b&gt;일&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;직장에서&amp;nbsp;한&amp;nbsp;경험이&amp;nbsp;경력에&amp;nbsp;어떤&amp;nbsp;식으로&amp;nbsp;도움이&amp;nbsp;되는지를&amp;nbsp;생각하고&amp;nbsp;떠날&amp;nbsp;시점을&amp;nbsp;조율해&amp;nbsp;보세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;퇴사의 달콤함&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이직할&amp;nbsp;회사가&amp;nbsp;정해지지&amp;nbsp;않은&amp;nbsp;상태에서&amp;nbsp;퇴사를&amp;nbsp;결심하는&amp;nbsp;것은,&amp;nbsp;특히&amp;nbsp;커리어&amp;nbsp;초반의&amp;nbsp;주니어&amp;nbsp;개발자들에게&amp;nbsp;큰&amp;nbsp;용기가&amp;nbsp;필요한&amp;nbsp;일입니다.&amp;nbsp;현재의&amp;nbsp;일을&amp;nbsp;내려놓고&amp;nbsp;잠시&amp;nbsp;쉬고&amp;nbsp;싶은&amp;nbsp;마음은&amp;nbsp;충분히&amp;nbsp;이해됩니다.&amp;nbsp;그동안&amp;nbsp;몰아쳤던&amp;nbsp;업무와&amp;nbsp;새로운&amp;nbsp;환경에&amp;nbsp;적응하느라&amp;nbsp;쌓인&amp;nbsp;피로를&amp;nbsp;떠올리면,&amp;nbsp;일단&amp;nbsp;쉬고&amp;nbsp;싶다는&amp;nbsp;생각이&amp;nbsp;자연스럽게&amp;nbsp;듭니다.&amp;nbsp;퇴사&amp;nbsp;후&amp;nbsp;잠시라도&amp;nbsp;아무런&amp;nbsp;부담&amp;nbsp;없이&amp;nbsp;쉴&amp;nbsp;수&amp;nbsp;있다면&amp;nbsp;그만큼&amp;nbsp;달콤한&amp;nbsp;휴식은&amp;nbsp;없을&amp;nbsp;겁니다.&lt;br /&gt;&lt;br /&gt;그러나&amp;nbsp;단지&amp;nbsp;&amp;lsquo;쉼&amp;rsquo;만을&amp;nbsp;위해&amp;nbsp;퇴사를&amp;nbsp;결정한다면,&amp;nbsp;그&amp;nbsp;달콤함이&amp;nbsp;영원히&amp;nbsp;지속되지는&amp;nbsp;않을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;시간이&amp;nbsp;지날수록&amp;nbsp;재취업에&amp;nbsp;대한&amp;nbsp;부담이&amp;nbsp;슬며시&amp;nbsp;다가오고,&amp;nbsp;점점&amp;nbsp;압박감으로&amp;nbsp;변할&amp;nbsp;가능성이&amp;nbsp;큽니다.&amp;nbsp;쉬는&amp;nbsp;동안&amp;nbsp;충분히&amp;nbsp;회복하더라도,&amp;nbsp;커리어&amp;nbsp;공백에&amp;nbsp;대한&amp;nbsp;불안과&amp;nbsp;경제적인&amp;nbsp;부담이&amp;nbsp;동시에&amp;nbsp;찾아오면서&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;스트레스를&amp;nbsp;유발할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문입니다.&lt;br /&gt;&lt;br /&gt;따라서&amp;nbsp;쉼이&amp;nbsp;필요하다고&amp;nbsp;느끼더라도,&amp;nbsp;&lt;b&gt;퇴사&amp;nbsp;후&amp;nbsp;어떤&amp;nbsp;방향으로&amp;nbsp;나아갈지&amp;nbsp;구체적인&amp;nbsp;목표와&amp;nbsp;계획을&amp;nbsp;세워보세요&lt;/b&gt;.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;퇴사&amp;nbsp;후&amp;nbsp;3개월&amp;nbsp;동안은&amp;nbsp;필요한&amp;nbsp;기술을&amp;nbsp;배우거나,&amp;nbsp;새로운&amp;nbsp;직장에&amp;nbsp;도전할&amp;nbsp;준비를&amp;nbsp;하며&amp;nbsp;자기계발에&amp;nbsp;집중할&amp;nbsp;수&amp;nbsp;있을&amp;nbsp;겁니다.&amp;nbsp;이렇게&amp;nbsp;단순한&amp;nbsp;휴식&amp;nbsp;이상의&amp;nbsp;계획을&amp;nbsp;세워두면,&amp;nbsp;잠시&amp;nbsp;멈추더라도&amp;nbsp;이후의&amp;nbsp;목표로&amp;nbsp;인해&amp;nbsp;막연한&amp;nbsp;불안감에서&amp;nbsp;벗어날&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;쉼은 나를 재정비하는 소중한 시간입니다. 다만, 그 시간이 나에게 어떤 의미로 남을지에 대한 고민이 없다면, 달콤했던 쉼은 곧 재취업에 대한 부담으로 바뀔 수 있다는 것을 명심하시기 바랍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;에필로그&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퇴사를&amp;nbsp;고민한다는&amp;nbsp;것은&amp;nbsp;어쩌면&amp;nbsp;지금의&amp;nbsp;자리에서&amp;nbsp;충분히&amp;nbsp;행복하지&amp;nbsp;않다고&amp;nbsp;느끼는&amp;nbsp;것일지도&amp;nbsp;모릅니다.&amp;nbsp;하지만&amp;nbsp;퇴사는&amp;nbsp;누구에게나&amp;nbsp;큰&amp;nbsp;결정이며,&amp;nbsp;특히&amp;nbsp;커리어&amp;nbsp;초반에&amp;nbsp;내리는&amp;nbsp;퇴사&amp;nbsp;결정은&amp;nbsp;그&amp;nbsp;무게가&amp;nbsp;더욱&amp;nbsp;크게&amp;nbsp;다가올&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;글을&amp;nbsp;통해&amp;nbsp;스스로의&amp;nbsp;감정을&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;명확히&amp;nbsp;바라보고,&amp;nbsp;내가&amp;nbsp;진정으로&amp;nbsp;원하는&amp;nbsp;것이&amp;nbsp;무엇인지&amp;nbsp;되돌아볼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;계기가&amp;nbsp;되었기를&amp;nbsp;바랍니다.&lt;br /&gt;&lt;br /&gt;앞으로도&amp;nbsp;길&amp;nbsp;위에서&amp;nbsp;수많은&amp;nbsp;선택지가&amp;nbsp;여러분&amp;nbsp;앞에&amp;nbsp;놓일&amp;nbsp;것입니다.&amp;nbsp;때로는&amp;nbsp;현재의&amp;nbsp;환경에서&amp;nbsp;스스로를&amp;nbsp;발견할&amp;nbsp;수&amp;nbsp;있을&amp;nbsp;것이고,&amp;nbsp;때로는&amp;nbsp;새로운&amp;nbsp;환경에서&amp;nbsp;진정한&amp;nbsp;성장을&amp;nbsp;이루게&amp;nbsp;될&amp;nbsp;것입니다.&amp;nbsp;어느&amp;nbsp;쪽이든,&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;스스로의&amp;nbsp;감정과&amp;nbsp;목표에&amp;nbsp;솔직하게&amp;nbsp;귀&amp;nbsp;기울이며&amp;nbsp;자신만의&amp;nbsp;방향을&amp;nbsp;찾아가는&amp;nbsp;것입니다.&amp;nbsp;자신을&amp;nbsp;이해하고,&amp;nbsp;그에&amp;nbsp;맞는&amp;nbsp;선택을&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;힘을&amp;nbsp;기르며&amp;nbsp;나아가는&amp;nbsp;그&amp;nbsp;여정&amp;nbsp;자체가&amp;nbsp;여러분의&amp;nbsp;커리어를&amp;nbsp;더욱&amp;nbsp;빛나게&amp;nbsp;할&amp;nbsp;겁니다.&lt;br /&gt;&lt;br /&gt;때로는 흔들리고, 때로는 불안해질 수도 있겠지만, 그 과정을 통해 자신이 원하는 삶과 커리어에 조금 더 가까워지길 응원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;&lt;b&gt;&quot;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://inf.run/Zvsox&quot;&gt;서류합격률 4%를 탈출하는 개발자 이력서 작성법&lt;/a&gt;&quot;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;강의를 출시했습니다. 신입, 경력 모두를 대상으로 강의가 제작되었으니 이력서 작성이 막막하거나 잦은 서류 탈락을 하고 계시다면 이 강의 수강을 추천드립니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732543693412&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;서류합격률 4%를 탈출하는 개발자 이력서 작성법 강의 | 강승현 - 인프런&quot; data-og-description=&quot;강승현 | 최근 개발자의 서류 합격률은 한 자릿수에 불과합니다. 100명 이상의 이력서를 멘토링한 경험을 바탕으로, 지원자들이 놓치고 있는 이력서 작성의 치명적 실수를 분석했습니다. 이제, &quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://inf.run/Zvsox&quot; data-og-url=&quot;https://www.inflearn.com/course/개발자-이력서-작성법-강승현&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qjXJu/hyXC9rcvpI/4AsUSk1bovWXK5kbOJZi31/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/cFfkCV/hyXDhCKK8x/cLYQb6nq5JmqgkMVKqskUk/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/Bvbos/hyXDnXhG5w/1kSuRr4MSEZ8GeNU4aEeA0/img.png?width=736&amp;amp;height=479&amp;amp;face=0_0_736_479&quot;&gt;&lt;a href=&quot;https://inf.run/Zvsox&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inf.run/Zvsox&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qjXJu/hyXC9rcvpI/4AsUSk1bovWXK5kbOJZi31/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/cFfkCV/hyXDhCKK8x/cLYQb6nq5JmqgkMVKqskUk/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/Bvbos/hyXDnXhG5w/1kSuRr4MSEZ8GeNU4aEeA0/img.png?width=736&amp;amp;height=479&amp;amp;face=0_0_736_479');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;서류합격률 4%를 탈출하는 개발자 이력서 작성법 강의 | 강승현 - 인프런&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;강승현 | 최근 개발자의 서류 합격률은 한 자릿수에 불과합니다. 100명 이상의 이력서를 멘토링한 경험을 바탕으로, 지원자들이 놓치고 있는 이력서 작성의 치명적 실수를 분석했습니다. 이제,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>후기/경험</category>
      <category>오블완</category>
      <category>이직</category>
      <category>퇴사</category>
      <category>티스토리챌린지</category>
      <author>CODe_</author>
      <guid isPermaLink="true">https://code1995.tistory.com/128</guid>
      <comments>https://code1995.tistory.com/128#entry128comment</comments>
      <pubDate>Sat, 9 Nov 2024 20:23:40 +0900</pubDate>
    </item>
    <item>
      <title>리더가 MSA 전환을 하자고 했다. 그리고 처참히 실패했다.</title>
      <link>https://code1995.tistory.com/127</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;risk-1945683_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be8RjT/btsKHeFemyX/YsefbR5Ppd5Csx0XYso3Z0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be8RjT/btsKHeFemyX/YsefbR5Ppd5Csx0XYso3Z0/img.jpg&quot; data-alt=&quot;출처 픽사베이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be8RjT/btsKHeFemyX/YsefbR5Ppd5Csx0XYso3Z0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe8RjT%2FbtsKHeFemyX%2FYsefbR5Ppd5Csx0XYso3Z0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;365&quot; data-filename=&quot;risk-1945683_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 픽사베이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 리더, 경영진, 그리고 실무 개발자들을 대상으로 합니다. MSA 전환을 고려하거나 이미 추진 중인 조직의 이해관계자들이, 전환 과정에서 발생할 수 있는 문제와 그 &lt;b&gt;해결 방안을 이해하는 데 도움이 되기를 기대&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로서비스 아키텍처(MSA)는 현재 많은 조직에서 주니어 개발자 채용 공고에도 우대사항으로 언급될 만큼 널리 채택되고 있는 아키텍처 패턴입니다. 그러나 MSA 전환은 단순한 기술 도입 이상의 도전으로, 조직 내 모든 구성원의 협력과 상당한 노력이 필요합니다. &lt;b&gt;기술적인 변화를 성공적으로 이루기 위해서는 단순히 시스템 구조를 변경하는 것만으로는 충분하지 않습니다.&lt;/b&gt; 조직의 문화, 비즈니스 전략, 그리고 운영 모델 전반에 걸친 변화가 필요하며, 이러한 변화는 경영진의 확고한 의지와 &lt;b&gt;실무진의 기술적 역량, 그리고 다양한 부서 간의 긴밀한 협력을 통해&lt;/b&gt;서만 이루어질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 MSA의 기본 개념에 대한 사전 지식이 필요하며, 기존 모놀리틱 아키텍처 기반의 대규모 시스템을 MSA로 전환하는 과정에서 발생할 수 있는 실패 요인들을 실무진과 경영진이 마주하는 기술적, 비즈니스적 난관을 중심으로 비판적으로  이야기합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;배경&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글에서 등장하는 배경은  픽션입니다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;회사의 기술 리더는 최신 기술 트렌드와 시스템의 확장성을 강조하며 MSA 전환을 추진했습니다. &lt;/span&gt;&lt;span&gt;기존의 모놀리틱 시스템은 유지보수가 어렵고 새로운 기능 추가 시 전체 애플리케이션을 재배포해야 하는 문제들이 있었습니다. &lt;/span&gt;&lt;span&gt;리더는 이러한 문제를 해결하고자 MSA로의 전환을 강력히 주장했고, 경영진도 이에 동의하여 전사적인 프로젝트가 시작되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그러나 프로젝트가 진행되면서 예상치 못한 여러 난관에 직면하게 되었습니다. 각 서비스 간의 의존성 관리 문제, 복잡한 트랜잭션 관리, 그리고 전사적인 협력이 부족해지는 등의 문제가 연이어 발생했습니다. 외부 부서의 지원은 불충분했고, 각 팀은 자신의 업무에만 집중하며 협업이 원활히 이루어지지 않았습니다. 또한, 기술적인 난이도와 학습 곡선이 높아 일부 팀원들은 새로운 기술 스택에 적응하기 어려움을 겪었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;경영진은 초기 계획보다 비용이 더 많이 들고 프로젝트가 지연되자 점차 불안해졌고, 이러한 불확실성은 실무진의 사기 저하로 이어졌습니다. 프로젝트 설계 전, MSA 전환 경험이 있는 SI 업체와도 계약했지만, 실제 코드 작성을 담당한 계약업체 실무진의 기술 수준이 기대에 미치지 못해 코드의 확장성과 유지보수성이 떨어지는 문제가 발생했습니다. 계약업체 &lt;/span&gt;&lt;span&gt;실무진들은 프로덕트를 완성하는 것에만 집중했기 때문에 코드의 품질이 낮아졌고, 이는 프로젝트의 장기적인 성공 가능성을 더욱 낮추는 요인이 되었습니다. 결국, 경영진은 프로젝트 중단을 고려하기에 이르렀고, 실무진은 계속되는 업무 변화와 과도한 요구, 데드라인 압박에 지쳐 퇴사를 선택하는 사람들도 생겨났습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이러한 가상의 시나리오를 바탕으로 MSA 전환에서 실패할 수 있는 다양한 요인들을 나열하고 구체적으로 어떤 상황인지 전달합니다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;MSA 한 입&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로서비스 아키텍처(Microservices Architecture)는 대형 애플리케이션을 여러 개의 독립적인 작은 서비스로 분리하여 관리하는 방식입니다. 각 서비스는 특정 기능을 수행하며, 독립적으로 개발, 배포, 확장이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 모놀리틱 아키텍처에서는 모든 기능이 하나의 거대한 애플리케이션에 통합되어 있어 새로운 기능 추가나 수정 시 전체 애플리케이션을 다시 배포해야 하는 비효율성이 존재했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면, MSA에서는 각 기능이 독립적인 서비스로 나뉘어 있어 개별적으로 개발 및 배포가 가능하여 확장성과 유지보수 측면에서 훨씬 유리합니다. 이러한 이점을 기대하며 많은 기업이 MSA를 도입하기 시작했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 MSA 전환은 단순한 기술 도입을 넘어, &lt;b&gt;조직 전반의 문화적 변화를 요구하기도 합니다.&lt;/b&gt; 팀 단위의 자율성과 책임감 강화, 서비스 간 &lt;b&gt;명확한 경계 설정(의존 분리)&lt;/b&gt;, 배포와 모니터링의 자동화 등 다양한 요소들이 함께 고려되어야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;설계부터 잘못된다면&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어? 순서 보장 안돼요?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/swSFA/btsKkZirAQy/QB75oUcGIxcrPAUoIKVEL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/swSFA/btsKkZirAQy/QB75oUcGIxcrPAUoIKVEL0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/swSFA/btsKkZirAQy/QB75oUcGIxcrPAUoIKVEL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FswSFA%2FbtsKkZirAQy%2FQB75oUcGIxcrPAUoIKVEL0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;335&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 모놀리틱 아키텍처에서는 트랜잭션 관리가 비교적 단순했지만, MSA로 전환하게 되면 분산된 서비스 간 트랜잭션 관리를 위한 부담이 증가합니다. 각 서비스가 독립적으로 운영되기 때문에 기존의 일관된 트랜잭션 관리가 어려워지고, 이를 해결하기 위해 분산 트랜잭션을 위한 SAGA 패턴, 이벤트 드리븐 아키텍처 등 복잡한 설계를 도입해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, 이러한 패턴들은 실시간으로 발생하는 대규모 트래픽에 대응할 수 있도록 충분히 성숙된 상태에서 적용되어야 하며, 이는 시스템의 신뢰성과 안정성을 보장하는 데 중요한 요소로 작용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 데이터 일관성 유지 역시 큰 도전 과제입니다. 모놀리틱 환경에서는 단일 데이터베이스를 사용하여 일관성을 유지하기가 상대적으로 용이했으나, MSA 환경에서는 각 서비스가 독립적인 데이터베이스를 가지므로 데이터 동기화와 일관성을 유지하기 위한 전략이 필수적입니다. 이를 해결하기 위해 데이터 이벤트 소싱이나 CQRS(Command Query Responsibility Segregation)와 같은 패턴을 적용할 수 있지만, 이러한 패턴의 적용에는 높은 기술적 이해와 경험이 요구됩니다. 더 나아가, 비즈니스에 대한 높은 이해만으로는 데이터 정합성 문제가 발생할 수 있는 리스크를 내포하고 있습니다. &lt;b&gt;기술적인 이해도가 부족할 경우 각 서비스 간 데이터 불일치나 동기화 실패로 인해 비즈니스적인 문제로 확산될 가능성도 존재&lt;/b&gt;합니다.&lt;br /&gt;&lt;br /&gt;또한, MSA 전환에 필요한 다양한 스택(Redis, Kafka, k8s 등)이 어떻게 작동하는지에 대한 이해도 필수적입니다. 각각의 특성과 사용 방법을 정확히 이해하고 있어야 효과적으로 설계를 진행할 수 있기 때문이죠. 그러나 이러한 기술을 단기간에 충분히 습득하고 응용하는 것은 쉽지 않으며, 이로 인해 설계 단계에서 결함이 발생할 위험이 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;캐시가 죽으면? 디비도 죽으면? 서버도 죽으면?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;쿠버네티스도 죽으면?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한,&amp;nbsp;&lt;b&gt;오버&amp;nbsp;엔지니어링&lt;/b&gt; 문제도 고려해야 합니다. MSA는 각 서비스의 독립성을 보장하기 위해 다양한 Fallback 메커니즘을 도입해야 할 때가 많습니다. 예를 들어, 서버가 다운되거나, 데이터베이스가 실패하거나, 캐시가 손실될 경우, 이벤트가 유실될 경우 등 이를 대비한 여러 계층의 Fallback을 설계하게 되는데, 이러한 과정을 &lt;u&gt;&lt;b&gt;적정선에서 절제하지 못하면 오버 엔지니어링으로 이어질 수 있습니다&lt;/b&gt;&lt;/u&gt;. 즉, 복잡성을 무작정 높이는 것이 아니라, 비즈니스 가치와 기술적 필요성을 균형 있게 고려하여 최적의 솔루션을 도출하는 것이 중요합니다. 이러한 역량 또한 결국 MSA에 대한 깊은 이해와 연관있죠.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;유관 부서가 협조를 안해준다&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;우리 팀도 바빠서요&lt;br /&gt;지금은 어렵네요&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;대규모 프로젝트일수록 유관 부서의 협조는 필수적&lt;/b&gt;&lt;/u&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 부서 간 의존성이 크기 때문에, MSA 전환 과정에서 다른 부서의 적극적인 지원이 없으면 프로젝트 성공 가능성이 낮아질 수밖에 없습니다. 특히, 부서 간 의사소통의 원활함이 전환의 성패에 큰 영향을 미칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA 전환은 단순히 개발 부서의 문제로 그치지 않고, 운영, 보안, 인프라, 코어 등 다양한 부서와의 긴밀한 협력이 요구됩니다. 만약 이러한 부서 간의 협업이 원활하지 않을 경우, 서비스의 독립성과 자율성이 오히려 프로젝트의 발목을 잡는 요인이 될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해, 우리에겐 당장 필요한 정보인데, 유관 부서에서는 중요 업무가 아니어서 제공 우선순위가 낮아지는 상황말이죠. (나만 급한 상황)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 외부 조직의 협조를 이끌어내기 위해서는 &lt;b&gt;그들에게도 동기를 부여하는 것이 중요&lt;/b&gt;합니다. 우리에게는 MSA 전환이 큰 성과일 수 있지만, 외부 조직에게는 그저 부가적인 업무로 인식될 수 있기 때문에 우선순위가 낮아질 가능성이 큽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 MSA 전환을 전사적인 목표로 설정하고, &lt;b&gt;서포트하는 조직에도 혜택이 돌아가도록 설계하는 방법을 고려&lt;/b&gt;해야 합니다. 이러한 역할은 주로 &lt;u&gt;&lt;b&gt;경&lt;/b&gt;&lt;b&gt;&lt;u&gt;영&lt;/u&gt;진의 적극적인 개입과 지원&lt;/b&gt;&lt;/u&gt;을 통해 이루어질 수 있으며, 이를 통해 조직 전체의 협력을 이끌어내는 것이 필수적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 조직 내에서 명확한 책임 분담과 협업 구조가 필요하며, 이를 위한 커뮤니케이션 도구와 절차를 마련해야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;다른 부서는 왜 공감하지 못하는가&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자들은 MSA의 장점인 독립적 배포와 확장성을 충분히 이해할 수 있지만, 비개발 부서에서는 이러한 기술적 이점을 쉽게 공감하지 못할 수 있습니다. &lt;u&gt;&lt;b&gt;특히 고객에게 가시적인 변화가 없는 상황&lt;/b&gt;&lt;/u&gt;에서는, &lt;u&gt;&lt;b&gt;신규 개발이 지연&lt;/b&gt;&lt;/u&gt;되거나 &lt;u&gt;&lt;b&gt;기존 업무가 지체&lt;/b&gt;&lt;/u&gt;될 경우 MSA 전환이 불필요한 업무로 인식될 가능성이 큽니다. MSA로의 전환은 비개발 부서에게는 비용 증가, 일정 지연, 복잡성 증가로 느껴질 수 있으며, 이러한 &lt;u&gt;&lt;b&gt;부정적 인식을 변화시키기 위해서는 경영진과 비개발 부서에게 기술적 전환이 가져올 장기적인 비즈니스 가치를 명확하게 전달&lt;/b&gt;&lt;/u&gt;해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국, 경영진의 지원이 필수적입니다. 경영진은 기술적 전환이 단기적인 비용 증가와 리소스 할당 문제를 수반할 수 있음을 이해하고, 이를 통해 얻을 수 있는 장기적인 비즈니스 이점에 대해 충분히 납득해야 합니다. 경영진 간에도 상호 설득이 필요하며, 특히 큰 규모의 전환일수록 &lt;b&gt;전사적인 협조가 중요&lt;/b&gt;합니다. 이러한 &lt;u&gt;&lt;b&gt;협조는 경영진이 직접 이끌어내야 하며&lt;/b&gt;&lt;/u&gt;, 이를 위해서는 MSA의 도입이 조직의 비즈니스 목표 달성에 어떻게 기여할 수 있는지에 대한 명확한 비전과 구체적인 계획을 제시할 필요가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 말이 쉽지 타 부서의 공감을 바라는 것은 현실적으로 많이 어렵습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고독한 싸움을 하는 여러분을 응원합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;비용 을 구체적으로 고려했는가&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;한 달에 5억이라고?&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존&amp;nbsp;모놀리틱&amp;nbsp;구조에서는&amp;nbsp;특정&amp;nbsp;서비스에&amp;nbsp;트래픽이&amp;nbsp;몰리더라도&amp;nbsp;전체&amp;nbsp;애플리케이션을&amp;nbsp;확장해야&amp;nbsp;했습니다.&amp;nbsp;반면,&amp;nbsp;MSA는&amp;nbsp;각&amp;nbsp;서비스를&amp;nbsp;개별적으로&amp;nbsp;확장할&amp;nbsp;수&amp;nbsp;있으므로&amp;nbsp;클라우드&amp;nbsp;환경에서의&amp;nbsp;비용&amp;nbsp;효율성을&amp;nbsp;기대할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;하지만&amp;nbsp;이러한&amp;nbsp;&lt;u&gt;&lt;b&gt;확장은&amp;nbsp;클라우드&amp;nbsp;서비스&amp;nbsp;사용에&amp;nbsp;따른&amp;nbsp;비용&amp;nbsp;관리의&amp;nbsp;복잡성을&amp;nbsp;수반&lt;/b&gt;&lt;/u&gt;합니다. &lt;span style=&quot;color: #666666;&quot;&gt;(AWS 비싸요)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA의 특성상 각 서비스가 별도의 인프라 자원을 필요로 하게 되고, 이는 곧 클라우드 자원 사용의 증가로 이어질 수 있습니다. 이러한 비용은 각 서비스의 사용 패턴, 스케일링 요구사항, 데이터 처리량 등에 따라 크게 달라질 수 있으며, 예측이 어려운 경우도 많습니다.&lt;br /&gt;&lt;br /&gt;또한, MSA는 각 서비스의 독립성을 보장하기 위해 여러 개의 데이터베이스와 네트워크 인프라를 필요로 하며, 이는 운영비용의 증가를 초래할 수 있습니다. 클라우드를 사용한다면 운영 비용 예측의 정확성을 높여야 하며, &lt;b&gt;온프레미스 환경도 함께 고려&lt;/b&gt;해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 비용을 정확히 예측하고 이를 경영진에게 설득하는 과정은 MSA 전환의 중요한 과제 중 하나입니다. 비용 절감이 아닌 비용 증가로 이어질 수 있는 부분을 간과한다면 경영진의 신뢰를 잃을 수 있으며, 이는 프로젝트의 중단으로 이어질 수 있습니다. 또한, Kubernetes(K8s)를 사용한다고 해서 &lt;u&gt;&lt;b&gt;무작정 확장하는 것은 &lt;a href=&quot;https://blog.speak.com/kr/in-english/expressions/%EC%95%8C%EC%95%84%EB%91%90%EB%A9%B4-%EC%A2%8B%EC%9D%80-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%ED%91%9C%ED%98%84-silver-bullet-%EB%9C%BB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Silver Bullet&lt;/a&gt;이 아닙니다&lt;/b&gt;&lt;/u&gt;. 확장 전략은 신중하게 계획되어야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;수레를 끌 힘이 있는 조직인가&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;MSA 전환의 성공 여부는 리더의 경험과 실무진의 기술적 역량에 크게 의존&lt;/b&gt;&lt;/u&gt;합니다. 일부 기업은 MSA 경험이 풍부한 리더를 TF 리더로 선출하고 소수의 숙련된 인원으로 TF 조직을 구성하여 성공적인 MSA 전환을 이끌어냅니다. 그러나 리더와 실무진 모두 경험이 부족하거나 외부 컨설팅에만 의존한다면 성공 가능성은 매우 낮다고 생각합니다. MSA 전환에는 기술적 지식뿐만 아니라, 팀원 간의 원활한 협력, 문제 해결을 위한 사고, 다양한 도구와 기술 스택의 이해 등 복합적인 역량이 요구되기 때문이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;SI와의 계약도 신중해야 합니다. 리더들이 아무리 경험이 풍부하고 솔루션 프로덕트가 많다고 해도, 실제 코드를 구현하는 실무진은 그렇지 않을 수 있거든요.&lt;br /&gt;시간이 지나 계약이 종료되고 SI는 떠나고, 유지보수나 기능 확장이 어려운 대환장 파티가 열릴 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무진은 대규모 프로젝트의 트래픽 처리, 트랜잭션 관리, 배포 전략, 모니터링 등 다양한 기술적 도전 과제를 해결할 수 있는 역량을 갖춰야 하며, 이를 위한 교육과 학습도 필수적입니다. 또한, 기술적 역량 외에도 각 서비스의 비즈니스 가치를 이해하고 이를 기반으로 최적의 기술적 결정을 내릴 수 있는 비즈니스적 역량도 중요합니다. 기본적으로, 실무진의 역량을 강화하고, 내부적으로 &lt;u&gt;&lt;b&gt;MSA 전환을 주도할 수 있는 전문가를 양성하는 것이 필요&lt;/b&gt;&lt;/u&gt;합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;구현 디펜던시&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아, 또 변경됐어요?&lt;br /&gt;아, 또 추가됐어요?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 하나의 서비스를 A와 B 두 개의 서비스로 나눈 상황을 가정해 봅시다. B 서비스는 &quot;회원이 보유한 카드 정보 조회&quot; API를 제공해야 하지만 아직 구현되지 않았고, A 서비스는 이 정보를 필요로 합니다. 따라서 A 서비스는 B 서비스가 완성되기 전까지 모킹된 응답을 사용하게 되며, 이후 요건이 변경되면 모킹을 수정하고 A 서비스도 다시 구현해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 의존성 문제는 서비스 간의 설계와 구현의 일관성을 유지하는 데 큰 도전 과제가 되죠. 서비스 간 의존성으로 인한 이러한 복잡성은 프로젝트 진행 속도를 크게 저하시킬 수 있으며, 서비스가 많아질수록 이러한 문제는 더 악화됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더욱이&amp;nbsp;서비스&amp;nbsp;간&amp;nbsp;의존성이&amp;nbsp;복잡해지면,&amp;nbsp;잦은&amp;nbsp;요건&amp;nbsp;변경과&amp;nbsp;의존성&amp;nbsp;문제로&amp;nbsp;인해&amp;nbsp;&lt;u&gt;&lt;b&gt;하나의&amp;nbsp;업무에&amp;nbsp;집중하기&amp;nbsp;어려운&amp;nbsp;환경이&amp;nbsp;조성&lt;/b&gt;&lt;b&gt;될&amp;nbsp;수&amp;nbsp;있습니다&lt;/b&gt;&lt;/u&gt;.&amp;nbsp; &lt;i&gt;(안그래도 바쁜데 여기저기서 업무들이 동시다발적으로 치고 들어오는 상황을 떠올려보세요)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현 중에도 새로운 요구사항을 반영하고, 모킹된 데이터를 실제 서비스로 변경하며 이를 조율해야 하는 등의 이슈가 발생할 수 있는거죠. 이를 해결하기 위해서는 서비스 간 명확한 역할 및 상호작용 규칙을 정의하고, 초기 설계 단계에서 잠재적인 비즈니스 변경 사항이나 미래 기능 확장 가능성을 고려하여 API 포맷을 신중하게 설정해야 합니다. 한 번 설계가 됐다면 추후에 &quot;아 나중에 이 상품이 추가된다면?&quot; 같은 생각은 하지 않는 것이 모두에게 행복한 길일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 리더는, 실무진들의 업무를 효과적으로 관리할 수 있는 체계를 구축해야 합니다. 또한, 설계 단계에서 실질적인 대안을 마련하여 &lt;u&gt;&lt;b&gt;변경이 필요할 때의 혼란을 줄이는 것이 중요&lt;/b&gt;&lt;/u&gt;합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;흔들리는 경영진, 퇴사하는 실무진&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;저도 실패할까 봐 무서워요&lt;br /&gt;(by. 경영진)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 이유들로.. MSA 전환 과정에서 리더는 예상치 못한 리스크에 직면할 수 있습니다. 리더의 불확실한 결정은 실무진의 불안감을 가중시키며, 이는 프로젝트의 사기 저하로 이어질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 MSA 전환은 초기 단계에서 비용과 복잡성이 증가할 수 있어 리더 또는 경영진이 기대한 성과를 단기간 내에 달성하기 어렵다는 점에서 불안감을 초래할 수 있죠. 이러한 상황에서 리더나 경영진이 명확한 비전과 일관된 지원을 제공하지 못한다면, &lt;u&gt;&lt;b&gt;실무진은 프로젝트의 방향성에 의문을 가지게 되고, 이는 사기 저하로 이어질 수 있습니다&lt;/b&gt;&lt;/u&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt;(좋게 표현해서 사기저하이고 퇴사할 수도 있습니다)&lt;/s&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;경영진의&amp;nbsp;확고한&amp;nbsp;지원과&amp;nbsp;실무진의&amp;nbsp;사기&amp;nbsp;유지는&amp;nbsp;프로젝트&amp;nbsp;성공의&amp;nbsp;중요한&amp;nbsp;요소&lt;/b&gt;&lt;/u&gt;입니다. 이를 위해 경영진은 MSA 전환의 장기적 목표와 이에 따른 성과를 명확히 제시하고, 실무진이 이를 달성하기 위한 명확한 역할과 책임을 부여해야 합니다. 또한, 실무진이 기술적 도전 과제를 해결할 수 있도록 필요한 리소스와 지원을 아끼지 않아야 하며, 이를 통해 실무진의 자율성과 책임감을 고취시켜야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;결론&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MSA 전환은 많은 장점을 제공하지만, 이를 성공적으로 이루기 위해서는 기술적 역량, 조직 내 협력, 명확한 비즈니스 목표 설정 등이 필수적입니다. &lt;b&gt;충분한 준비와 경험이 없다면 MSA 전환은 실패할 가능성이 높습니다&lt;/b&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;실무진의 기술적 역량&lt;/b&gt;&lt;/u&gt; 강화뿐 아니라, &lt;u&gt;&lt;b&gt;리더나 경영진의 명확한 지원, 부서 간 협력 강화가 필수적으로 뒷받침&lt;/b&gt;&lt;/u&gt;되어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또한, 기술적 도전 과제를 해결하기 위한 체계적인 계획 수립, 각 부서 간의 원활한 의사소통, 비용에 대한 명확한 이해와 관리 등 여러 요소들이 종합적으로 작용해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, &lt;u&gt;&lt;b&gt;단순히 기술적 전환을 넘어,&lt;/b&gt; &lt;b&gt;조직 문화와 운영 방식 전반에 걸친 변화를 수반&lt;/b&gt;&lt;/u&gt;해야 합니다. 성공적인 MSA 전환을 위해서는 조직 내 모든 구성원이 그 가치를 이해하고, 이를 달성하기 위해 함께 노력하는 환경이 조성되어야 할 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;지금도 어디선가 MSA 전환에 힘쓰고 있는 모든 실무진과 리더들을 응원합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;&lt;b&gt;&quot;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://inf.run/Zvsox&quot;&gt;서류합격률 4%를 탈출하는 개발자 이력서 작성법&lt;/a&gt;&quot;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;강의를 출시했습니다. 신입, 경력 모두를 대상으로 강의가 제작되었으니 이력서 작성이 막막하거나 잦은 서류 탈락을 하고 계시다면 이 강의 수강을 추천드립니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732543714656&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;서류합격률 4%를 탈출하는 개발자 이력서 작성법 강의 | 강승현 - 인프런&quot; data-og-description=&quot;강승현 | 최근 개발자의 서류 합격률은 한 자릿수에 불과합니다. 100명 이상의 이력서를 멘토링한 경험을 바탕으로, 지원자들이 놓치고 있는 이력서 작성의 치명적 실수를 분석했습니다. 이제, &quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://inf.run/Zvsox&quot; data-og-url=&quot;https://www.inflearn.com/course/개발자-이력서-작성법-강승현&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qjXJu/hyXC9rcvpI/4AsUSk1bovWXK5kbOJZi31/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/cFfkCV/hyXDhCKK8x/cLYQb6nq5JmqgkMVKqskUk/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/Bvbos/hyXDnXhG5w/1kSuRr4MSEZ8GeNU4aEeA0/img.png?width=736&amp;amp;height=479&amp;amp;face=0_0_736_479&quot;&gt;&lt;a href=&quot;https://inf.run/Zvsox&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inf.run/Zvsox&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qjXJu/hyXC9rcvpI/4AsUSk1bovWXK5kbOJZi31/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/cFfkCV/hyXDhCKK8x/cLYQb6nq5JmqgkMVKqskUk/img.png?width=1200&amp;amp;height=781&amp;amp;face=0_0_1200_781,https://scrap.kakaocdn.net/dn/Bvbos/hyXDnXhG5w/1kSuRr4MSEZ8GeNU4aEeA0/img.png?width=736&amp;amp;height=479&amp;amp;face=0_0_736_479');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;서류합격률 4%를 탈출하는 개발자 이력서 작성법 강의 | 강승현 - 인프런&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;강승현 | 최근 개발자의 서류 합격률은 한 자릿수에 불과합니다. 100명 이상의 이력서를 멘토링한 경험을 바탕으로, 지원자들이 놓치고 있는 이력서 작성의 치명적 실수를 분석했습니다. 이제,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Tech</category>
      <category>MSA</category>
      <author>CODe_</author>
      <guid isPermaLink="true">https://code1995.tistory.com/127</guid>
      <comments>https://code1995.tistory.com/127#entry127comment</comments>
      <pubDate>Sun, 27 Oct 2024 17:32:20 +0900</pubDate>
    </item>
  </channel>
</rss>