<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>낙관적 허무주의 개발자</title>
    <link>https://jun10920.tistory.com/</link>
    <description>문제 해결과 공유</description>
    <language>ko</language>
    <pubDate>Wed, 29 Jul 2026 22:51:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>겨울단추</managingEditor>
    <image>
      <title>낙관적 허무주의 개발자</title>
      <url>https://tistory1.daumcdn.net/tistory/6785934/attach/60f6f7a3addf40d49b891fb62dffa04b</url>
      <link>https://jun10920.tistory.com</link>
    </image>
    <item>
      <title>AI Native 시대에 개발자란?</title>
      <link>https://jun10920.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;br /&gt;&lt;b&gt;5줄 요약&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2025년, 갑자기 늘어난 인프라 업무를 감당하기 위해 Kiro와 MCP로 반복 업무를 자동화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사 환경은 회고록/ 장애 분석 자동화에 이어서 실제 보안 운영 자동화인 SIEM Bot Monitor 대응 체계 구축&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인 환경에서는 Claude가 구현하고 Codex가 독립적으로 검토하는 AI 작업 운영체제 생성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 방식으로 AI 서비스의 핵심 백엔드와 인프라를 재설계하고 실제 생성&amp;middot;과금&amp;middot;백업&amp;middot;복구 흐름을 검증.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;AI Native&lt;/b&gt;는 &lt;b&gt;도구를 많이 쓰는 사람이 아니라, AI가 안전하게 결과를 내도록 맥락&amp;middot;역할&amp;middot;검증을 설계하고 끝까지 책임지는 사람&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전 회고에서&lt;br /&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;2025년 회고에서 개인 AI 워크플로우를 소개하며 이런 문장을 썼다.&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;매주 급격하게 발전하는 ai 생태계처럼 내 워크플로우도 매주 새롭게 변화하는데, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;기회가 된다면 관련해서 글을 자세하게 써볼까 고민 중이다&lt;/span&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1783853764150&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;마중물에서 물줄기로, 2025년 회고&quot; data-og-description=&quot;마중물명사, '마중'과 물이 결합된 단어로, 물을 '마중' 나가는 물이라는 뜻에서 유래 올해는 블로그를 거의 쓰지 않아서 글 목록에서 조금만 내리다 보면 볼 수 있는 2024년 회고에서, 마중물 같&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/55&quot; data-og-url=&quot;https://jun10920.tistory.com/55&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bGmI1k/dJMb8RR33Xg/c6JaRZ61dFJBKcLR3ApRS1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/c6QHUW/dJMb8Rkefn4/heGVTMsBzuTRPR5UKQ2W1k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/55&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/55&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bGmI1k/dJMb8RR33Xg/c6JaRZ61dFJBKcLR3ApRS1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/c6QHUW/dJMb8Rkefn4/heGVTMsBzuTRPR5UKQ2W1k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;마중물에서 물줄기로, 2025년 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;마중물명사, '마중'과 물이 결합된 단어로, 물을 '마중' 나가는 물이라는 뜻에서 유래 올해는 블로그를 거의 쓰지 않아서 글 목록에서 조금만 내리다 보면 볼 수 있는 2024년 회고에서, 마중물 같&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&gt;그때는 Kiro에 역할과 컨텍스트를 부여하고, MCP를 연결하고, Codex에게 코드를 검토시키는 정도까지 와 있었다. &lt;br /&gt;당시에도 나름 열심히 만든 환경이었지만 지금 돌아보면 가능성을 확인한 초기 버전에 가까웠다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 뒤 반년 동안 꽤 많은 일이 있었다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사에서는 반복 업무를 처리하던 Kiro 환경이 실제 보안 운영 자동화로 이어졌고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인적으로는 Claude와 Codex를 함께 사용하는 하네스를 만들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 그리고 그 하네스를 이용해 AI 서비스의 백엔드와 인프라를 다시 설계했다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이번 글에서는 특정 AI 도구의 사용법보다, 내가 AI와 일하는 방식이 어떻게 바뀌었는지를 정리해 보려고 한다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;솔직히 처음부터 &quot;AI Native 인재가 되어야지&quot;라고 생각하며 거창한 시스템을 만든 것은 아니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시작은 훨씬 현실적이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해야 할 일은 계속 늘어나는데, 사람의 시간은 늘어나지 않았기 때문이다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시작은 AI 전략이 아니라, 일을 감당하기 위해서&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사에서 팀 내 인사 변동으로 인프라 담당 역할이 갑자기 커졌다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에는 내가 더 많이 일하는 방식으로 대응했다. 실제로 몇 주 동안 평일 밤, 주말내내 계속 일했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 처음 자동화한 것은, &lt;br /&gt;&lt;b&gt;반복해서 콘솔을 열고 -&amp;gt; 로그를 찾고 &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;-&amp;gt;&lt;/span&gt; 메일을 확인하고 &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;-&amp;gt;&lt;/span&gt;결과를 다시 문서로 옮기는 일&lt;/b&gt;을 줄이기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그때 만든 것이 &lt;b&gt;Dynatrace MCP&lt;/b&gt;와 회사 내부용&amp;nbsp;&lt;b&gt;Google Workspace MCP&lt;/b&gt;였다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MCP는 쉽게 말하면 AI가 외부 도구와 정해진 방식으로 대화할 수 있게 만드는 연결 규격이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존에는 사람이 Dynatrace 콘솔에 들어가 현재 장애를 확인하고, 관련 로그와 메트릭을 찾아야 했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MCP를 만든 뒤에는 Kiro에게 다음처럼 요청할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에는 Dynatrace API를 다루는 15개 도구로 시작했다. &lt;br /&gt;이후 실제 업무에서 사용하다 보니 이름으로 엔티티를 찾는 기능, 예외 분석, 쿼리 검증, 비용 확인처럼 부족한 부분이 계속 보였고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재는 32개 도구까지 확장했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Google Workspace도 같은 방식으로 연결했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;메일과 일정, 문서에 있는 맥락을 확인하고 코드와 운영 데이터를 함께 비교할 수 있게 하자, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서로 떨어져 있던 업무가 하나의 흐름으로 이어지기 시작했다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기서 중요한 것은 &quot;AI가 콘솔을 대신 봐준다&quot;는 점만은 아니었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;업무를 AI에게 맡기려면 먼저 사람이 하던 일을 단계로 설명해야 했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어떤 데이터를 먼저 보고, 무엇이 이상 신호이며, 어디까지 자동으로 처리하고 어느 시점에 사람에게 다시 물어야 하는지를 정리해야 했다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국 AI 자동화를 만들면서 오히려 내 업무를 더 정확하게 이해하게 됐다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일회성 프롬프트 to 자동화&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기에는 매번 긴 프롬프트로 상황을 설명했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;잘될 때는 놀라울 정도로 잘했지만, 세션이 바뀌면 같은 설명을 다시 해야 했고 가끔은 중요한 조건을 빼먹었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;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;가 대표적인 예다.&lt;/span&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;처음에는 하루 작업 중 주제가 바뀌거나 퇴근하기 전에 kwork save를 실행했다. &lt;/span&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;이 alias는 Kiro CLI의 세션 저장 명령을 클립보드에 준비해 주는 작은 셸 도구였다. &lt;/span&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;하루에 저장한 세션을 퇴근 전에 kwork end로 하나로 병합하고, 미리 정한 회고 템플릿과 프롬프트를 넣어 AI가 그날의 작업을 정리하게 했다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 방식은 분명 도움이 됐다. 사람이 기억에 의존하면 놓치기 쉬운 명령어, 문제를 푼 순서, 실패한 시도까지 세션에 남아 있었기 때문이다. 회고는 단순히 &amp;ldquo;오늘 무엇을 했다&amp;rdquo;가 아니라, 다음에 같은 일을 다시 할 때 참고할 수 있는 작업 기록이 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 세션이 쌓일수록 다른 문제가 생겼다. 세션을 병합한 원본이 6만 줄을 넘는 날도 있었고, 긴 기록을 구간별로 분석하려던 서브에이전트가 컨텍스트 한계로 실패하기도 했다. 저장된 대화를 모두 읽히는 방식은 기록을 많이 남길수록 비용과 시간이 커지는 구조였다. 프롬프트를 더 길게 쓰거나 더 큰 모델에 다시 맡기는 것으로는 해결되지 않는 문제였다.&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;그다음 kwork end를 다시 설계했다. 해당 날짜에 바뀐 작업문서를 먼저 찾고, 작업문서가 있으면 그것을 회고의 주 원본으로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션은 누락된 단발성 작업이나 명령어, 오류, 검증 근거를 보강하는 자료로만 쓴다. 작업문서만 있는 날, 세션과 작업문서가 모두 있는 날, 세션만 남아 있는 날, 둘 다 없는 날을 각각 처리하도록 분기했고, 네 가지 경우를 따로 테스트했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 변경 이후에는 세션을 저장하지 않은 날에도 회고를 만들 수 있게 됐고, 회고의 각 항목에서 원래 작업문서로 다시 돌아갈 수 있게 됐다. kwork save는 더 이상 매일 반드시 해야 하는 절차가 아니라, 세션 자체를 증거로 남겨야 할 때만 선택해서 쓰는 도구가 됐다.&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;AI에게 과거 대화를 전부 먹이는 것보다, 사람이 먼저 판단과 결과를 구조화해 두고 AI가 필요한 근거만 읽게 하는 편이 더 오래 간다.&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;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kiro의 컨텍스트도 비슷한 과정을 거쳤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI가 실수할 때마다 규칙을 추가하다 보니 핵심 규칙 파일이 어느 순간 458줄까지 늘어났다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;많이 알려주면 더 잘할 것 같았지만, 오래된 정보와 충돌하는 규칙이 섞이고 정작 중요한 지시를 놓치는 문제가 생겼다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국 핵심 규칙을 116줄로 줄이고, 세부 업무 지식은 필요할 때만 읽도록 분리했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제 업무 상황 20개와 위험하거나 애매한 상황 6개를 합쳐 총 26개의 평가 과제도 만들었다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;잘해 줘&quot;라고 부탁하는 대신, 실제 업무에서 올바르게 행동하는지 반복해서 시험할 수 있게 바꾼 것이다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kiro 업무 시스템이 SIEM Bot Monitor로 이어지다&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 Kiro가 회사의 맥락을 읽고, API와 로그를 조회하고, 반복 작업을 스킬로 실행하며, 결과를 검증하는 기반이 쌓였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 이 기반이 가장 크게 활용된 사례가&lt;b&gt; SIEM Bot Monitor&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당시 홈페이지를 공격하는 BOT 트래픽이 급증했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;겉으로 보면 단순한 보안 공격처럼 보이지만, 문제의 본질은 트래픽 양만이 아니었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BOT 공격은 실제 외부 예약 시스템을 호출한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BOT이 조회를 반복하면 홈페이지가 정상적으로 열리고 있어도 외부 시스템 사용량과 비용 위험은 계속 커질 수 있었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존에는&amp;nbsp;이를 막기 위해 &lt;b&gt;사람이 보안 로그를 확인&lt;/b&gt;하고, &lt;b&gt;공격 후보를 찾고&lt;/b&gt;, &lt;b&gt;차단 정책을 만든 뒤&lt;/b&gt;, &lt;b&gt;배포 결과를 다시 확인&lt;/b&gt;해야 했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 아래의 흐름을 하나의 보안 대응 체계를 구축하였다.&lt;/span&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;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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kiro는 API 연동 코드 초안, 원본 로그 구조 분석, 탐지 조건별 테스트, 긴 로그의 패턴 요약과 배포&amp;middot;롤백 과정의 예외 검토에 활용했다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;반대로 어떤 신호를 실제 차단 기준으로 사용할지, 정상 사용자가 함께 차단될 가능성은 없는지, 운영 환경에 반영하거나 되돌릴지는 내가 실제 로그와 콘솔을 확인하며 판단했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 방식으로 금요일부터 일요일까지 3일 동안 운영에 투입할 수 있는 초기 버전을 만들었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 결과 반복되던 수동 분석과 배포는 사람이 승인과 예외 판단에 집중하는 흐름으로 바뀌었고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 사례를 통해 AI Agent는 보안 판단을 대신하는 도구가 아니라, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운영자가 정의한 문제를 더 빠르게 구현하고 검증하게 해주는 도구라는 점을 체감했다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사에서 만든 습관을 개인 하네스로 옮기다&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사에서는 Kiro를 중심으로 업무 환경을 만들었다면, 개인 프로젝트에서는 Claude Code를 주로 사용하기 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에는 좋은 플러그인과 에이전트를 많이 설치하면 자연스럽게 생산성이 올라갈 것이라고 생각했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그런데 실제 사용량을 측정해 보니 서브에이전트 위임률이 5.2%에 불과했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기능은 많았지만 메인 에이전트가 대부분의 작업을 혼자 처리하고 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 개인 AI 하네스를 체계적으로 정리했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 하네스에는 다음과 같은 구조가 들어 있다.&lt;/span&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;작업 맥락에 따라 적절한 도구를 제안하는 25개의 라우팅 규칙&lt;/li&gt;
&lt;li&gt;Claude가 만든 변경을 Codex가 독립적으로 검토하는 교차 리뷰&lt;/li&gt;
&lt;li&gt;작업문서 &amp;rarr; 회고 &amp;rarr; 다음 자동화 후보로 이어지는 일상 루프&lt;/li&gt;
&lt;li&gt;한 번 발생한 실수를 다음 세션의 규칙으로 남기는 메모리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 환경을 만들면서 가장 아찔했던 일도 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시크릿 유출을 막기 위해 작성한 코드 한 줄에 오히려 명령어 삽입 취약점이 생겼다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;안전을 위해 만든 코드가 새로운 보안 문제를 만든 셈이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Claude의 현재 작업 맥락 안에서는 이 문제를 발견하지 못했지만, 별도의 입력으로 변경 내용을 검토한 Codex가 취약점을 찾아냈다. 이후 네 번의 수정과 재검토를 거치며 블로커를 8개에서 4개, 2개, 최종 0개로 줄였고 총 14개의 결함을 닫았다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 일을 겪고 나니 &quot;AI가 작성했다&quot;와 &quot;검증된 결과다&quot;는 완전히 다른 말이라는 게 더 명확해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI는 생각보다 자주, 그리고 꽤 자신 있게 틀린다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 지금은 한 모델에게 더 긴 프롬프트를 주는 것보다, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;역할이 다른 모델이 서로의 결과를 반박하고 실제 테스트와 실행 로그가 그 사이에서 판정하도록 만드는 편을 선호한다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI 서비스에서 백엔드와 인프라 전체 흐름을 다시 구축하다&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 하네스를 가장 크게 사용한 곳은 개발 중인&amp;nbsp; AI 서비스다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내가 맡은 기술 범위는 생성형 AI 작업을 처리하는 백엔드와 이를 안정적으로 운영하기 위한 인프라 전반이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에는 기능이 실제로 동작하고 있었기 때문에 겉으로 보기에는 큰 문제가 없어 보였다. 하지만 운영을 준비하며 구조를 자세히 살펴보니 개발 환경과 운영 환경이 충분히 분리되지 않았고, 작업 상태와 과금 규칙이 DB 함수, 생성 워커, 엣지 함수와 여러 프론트 경로에 흩어져 있었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 같은 요청이 두 번 들어왔을 때 결과와 비용이 중복 처리되지 않는다는 보장이 일부 구현에 의존하고 있었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI가 생성하는 서비스에서 재시도는 예외가 아니라 흔한 일이기 때문에 이 부분을 그대로 둘 수 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 Claude의 서브에이전트를 나누어 현재 구조와 과금 경로를 지도화했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그다음 상태 전이와 과금을 하나의 안전한 경로에서 처리하는 Command Core를 설계했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;쉽게 설명하면 다음의 과정을 각각 따로 처리하지 않도록 만든 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작업이 정말 완료됐는지 확인한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생성 결과를 사용자에게 공개한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용 금액을 정확히 한 번만 차감한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실패했다면 다시 실행할 수 있는 상태를 남긴다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 설계안은 검토에서 탈락했다. 문제를 고쳐 만든 두 번째 설계도 다른 모델의 공격적 리뷰를 통과하지 못했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빨리 구현하고 싶은 마음도 있었지만 결제와 상태를 다루는 구조였기 때문에 애매한 상태로 진행할 수는 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;백엔드 코드만 바꾼 것도 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운영 환경과 분리된 개발 환경을 만들고, 생성 워커와 저장소를 분리했으며, 코드 변경과 DB 변경이 안전한 순서로 배포되도록 CI/CD를 구성했다. AI 리뷰 결과와 현재 코드가 일치하지 않으면 머지를 막는 게이트도 추가했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모니터링과 백업도 같은 원칙으로 접근했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;백업 파일이 생성됐다는 로그만으로는 복구 가능하다고 볼 수 없었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 암호화 백업을 만든 뒤 일회용 DB에 직접 복원하고, 핵심 데이터가 원본과 일치하는지 확인하는 복구 리허설까지 자동화했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최근에는 운영 환경과 같은 조건의 개발 환경에서 실제 AI 생성 작업을 처음부터 끝까지 실행했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기서 개인적으로 가장 의미 있었던 것은 코드의 양이 아니었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제 조사, 아키텍처, 과금 정확성, 개발 환경, 배포 게이트, 모니터링, 백업과 복구까지 서비스가 운영되기 위해 필요한 전체 흐름을 AI와 함께 연결했다는 점이었다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI가 맡은 일과 내게 남겨 둔 일&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI를 적극적으로 사용한다고 말하면 가끔&lt;b&gt; &quot;그러면 실제로 본인이 한 일은 무엇인가&quot;&lt;/b&gt;라는 질문을 받는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 질문은 타당하다고 생각한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI가 만든 결과를 그대로 받아들이면 사용한 도구만 다를 뿐 책임 없는 외주와 크게 다르지 않을 수 있기 때문이다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 내가 나누는 기준은 아래와 같다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;AI가 주로 맡는 일 / 내가 직접 남겨 두는 일&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;긴 로그와 변경 내용 요약 / AI 제안의 채택&amp;middot;기각과 근거 기록&lt;/li&gt;
&lt;li&gt;다른 모델 결과의 적대적 검토 / 실제 배포&amp;middot;롤백&amp;middot;비용 결정 승인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 경계가 항상 완벽하게 나뉘는 것은 아니다. 나도 AI의 제안을 보고 생각을 바꾸고, AI도 내가 만든 기준의 모순을 찾아낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다만 &lt;b&gt;최종 결과에 대해 &quot;AI가 그렇게 했다&quot;고 말하지 않기 위해, 결정과 검증의 책임만큼은 사람에게 남겨 두려고 한다.&lt;/b&gt;&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내가 생각하는 AI Native&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에는 AI를 잘 쓰는 사람이 프롬프트를 잘 작성하는 사람이라고 생각했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI Native는 특정 모델의 숨겨진 명령어를 많이 아는 사람이 아니라, 아래의 질문에 답할 수 있는 사람에 가깝다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI가 일을 시작하기 전에 어떤 맥락을 줘야 하는가?&lt;/li&gt;
&lt;li&gt;큰 문제를 어떤 역할과 작업으로 나눌 것인가?&lt;/li&gt;
&lt;li&gt;어디까지 자동화하고 언제 사람에게 다시 물어야 하는가?&lt;/li&gt;
&lt;li&gt;AI가 만든 결과가 맞는지 무엇으로 검증할 것인가?&lt;/li&gt;
&lt;li&gt;이번 실수를 다음 작업에서 반복하지 않게 어떻게 남길 것인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2025년 회고에서 나는 작은 물줄기가 꾸준히 흐르다 보면 언젠가 강이 될 것이라고 썼다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그때 만든 AI 워크플로우도 비슷했던 것 같다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;처음에는 늘어난 일을 감당하기 위한 작은 자동화였다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;그 자동화가 회사의 운영 시스템이 됐고, 다시 개인 하네스로 이어졌으며, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;지금은 새로운 서비스의 백엔드와 인프라를 만드는 방식이 됐다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI가 내 일을 대신 책임지게 만든 것은 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI와 함께 내가 더 크고 복잡한 문제를 끝까지 책임질 수 있는 방식을 만들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아마 지금 내가 AI Native라는 표현에 가장 가깝다고 생각하는 이유도 여기에 있는 것 같다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&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;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;관련 링크&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;bull; 2025년 회고: &lt;a href=&quot;https://jun10920.tistory.com/55&quot;&gt;https://jun10920.tistory.com/55&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;bull; GitHub: &lt;a href=&quot;https://github.com/jun10920&quot;&gt;https://github.com/jun10920&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>회고</category>
      <category>AI Agent</category>
      <category>AI Native</category>
      <category>ai 워크플로우</category>
      <category>claude code</category>
      <category>devops</category>
      <category>Kiro CLI</category>
      <category>MCP</category>
      <category>OpenAI Codex</category>
      <category>업무 자동화</category>
      <category>컨텍스트 엔지니어링</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/56</guid>
      <comments>https://jun10920.tistory.com/56#entry56comment</comments>
      <pubDate>Sun, 12 Jul 2026 21:03:01 +0900</pubDate>
    </item>
    <item>
      <title>마중물에서 물줄기로, 2025년 회고</title>
      <link>https://jun10920.tistory.com/55</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마중물&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해는 블로그를 거의 쓰지 않아서 글 목록에서 조금만 내리다 보면 볼 수 있는 &lt;a href=&quot;https://jun10920.tistory.com/51&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024년 회고&lt;/a&gt;에서,&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1766924180248&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;마중물 같은 개발자의 2024년 회고&quot; data-og-description=&quot;마중물명사. 펌프질을 할 때 물을 끌어올리기 위하여 위에서 붓는 물- 표준국어대사전&amp;nbsp;2024년 상반기는 이미 아래 글에서 회고해서, 2024년 하반기의 회고를 작성할 예정이다.&amp;nbsp;잠은 죽어서 자는 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/51&quot; data-og-url=&quot;https://jun10920.tistory.com/51&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cYSm4R/hyZQxwAerX/K6bCe73sIXjwtD9I33dbc0/img.png?width=387&amp;amp;height=490&amp;amp;face=0_0_387_490,https://scrap.kakaocdn.net/dn/bvC4ed/hyZQyCeLQn/Suh3iTnX0bWId4ei2FTOwK/img.png?width=387&amp;amp;height=490&amp;amp;face=0_0_387_490,https://scrap.kakaocdn.net/dn/fD3gT/hyZPHzHpo3/dAWGtV3HkxBMYzRcLg7APk/img.png?width=1077&amp;amp;height=315&amp;amp;face=0_0_1077_315&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/51&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/51&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cYSm4R/hyZQxwAerX/K6bCe73sIXjwtD9I33dbc0/img.png?width=387&amp;amp;height=490&amp;amp;face=0_0_387_490,https://scrap.kakaocdn.net/dn/bvC4ed/hyZQyCeLQn/Suh3iTnX0bWId4ei2FTOwK/img.png?width=387&amp;amp;height=490&amp;amp;face=0_0_387_490,https://scrap.kakaocdn.net/dn/fD3gT/hyZPHzHpo3/dAWGtV3HkxBMYzRcLg7APk/img.png?width=1077&amp;amp;height=315&amp;amp;face=0_0_1077_315');&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;마중물 같은 개발자의 2024년 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;마중물명사. 펌프질을 할 때 물을 끌어올리기 위하여 위에서 붓는 물- 표준국어대사전&amp;nbsp;2024년 상반기는 이미 아래 글에서 회고해서, 2024년 하반기의 회고를 작성할 예정이다.&amp;nbsp;잠은 죽어서 자는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나를 '마중물 같은 개발자'라고 표현했다. 잠재성을 이끌어내는 계기를 만들어 내는,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2025년을 돌아보니, 이제는 마중물에서 시작된 물이 하나의 줄기가 되어 흐르기 시작한 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2025년 회고는&amp;nbsp;크게 주제를 &lt;b&gt;회사&lt;/b&gt;와 &lt;b&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입사와 적응 (4월~6월)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년 회고에서 '내년 상반기에도 내가 원하는 회사에 들어갈 때까지 끊임없이 도전할 것이다'라고 썼는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;감사하게도 그 도전이 &lt;a href=&quot;https://jun10920.tistory.com/53&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;결실을 맺었다. &lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;항공학부 출신이라 대한항공이라는 회사가 낯설지는 않았지만, 정비사가 아닌 개발자로 이 회사에 들어오게 될 줄은 몰랐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주변의 지인들도 정비사로 입사한 것인지 헷갈릴 정도였는데, 정말 인생은 어떻게 흘러갈지 알 수 없는 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;신갈연수원에서 보낸 시간은 당시에도 즐겁고 좋았는데, 지금 생각해보면 정말 그때가 제일 즐거운 때였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 이후 전체 교육 -&amp;gt; 직무 교육 -&amp;gt; 팀교육까지 받고 지금의 자리에 오게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본격적인 업무 시작 (7월~8월)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;7~8월에서 본격적으로 일에 투입되었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당시 팀에 Dynatrace 재계약 시점이 다가오면서,&amp;nbsp;Datadog으로&amp;nbsp;마이그레이션 할지&amp;nbsp;검토하는&amp;nbsp;PoC를&amp;nbsp;진행하게&amp;nbsp;되었다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;억 단위의 계약이 오가는 일이었고 타 업체의 임원분들과 직접 커뮤니케이션하면서 피드백을 주고받는 자리였는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;신입이 이런 자리에 있어도 되나 싶으면서도 배우는 게 많았다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장&amp;nbsp;어려웠던&amp;nbsp;건&amp;nbsp;이미&amp;nbsp;운영&amp;nbsp;중인&amp;nbsp;환경에&amp;nbsp;Datadog을&amp;nbsp;실제로&amp;nbsp;적용하는&amp;nbsp;것이었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ECS Task Definition에 Datadog Agent 사이드카를 붙이고, pidMode 설정하고, APM/LOG/RUM을 연계하고, FluentBit으로 multiline log 처리하고, trace_id로 로그와 트레이스를 연결하고... 문서대로 했는데 안 되는 것들이 많아서 하나씩 삽질하며 해결했다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러던 중 결정적인 사건이 터졌다. 새벽에 1A측 장애로 홈페이지가 먹통이었는데, Datadog은 이걸 장애로 감지하지 못했다. Anomaly Detection을 PRD 환경에서 평가하던 중에 정작 실제 장애는 놓친 것이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;반면 Dynatrace는 서드파티 장애까지 정확하게 root cause을 잡아내어 Problem으로 판단했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 사건을 계기로 Dynatrace 재계약으로 결정되었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 경험으로 억 단위 의사결정에 기여한 경험을 해보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 해당 PoC를 진행하면서 '모니터링 툴로서 다양한 신기능이 있어도 본질적으로 장애를 못 잡으면 무슨 소용인가'라는 질문을 던져보며 본질이 더 중요한 것을 깨닫게 된 계기였다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;교육의 연속 (9월)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;9월은 교육의 달이었다&amp;nbsp;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Datadog&amp;nbsp;실습&amp;nbsp;워크숍&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DevOps 교육 (IaC, EKS)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;if(kakao)&amp;nbsp;2025 참가&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Akamai University - Security Fraud&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사의 여러 조직마다 운영하는 방법이 다르지만, 우리 팀의 경우 당시 콘솔로 관리하고 있어 운영환경의 설정을 변경해야 할 때마다 불편함이 커서 이를 코드로 관리하고 싶은 마음이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그때 마침 좋은 기회로 회사와 정영진 멘토 형님에게 IaC 교육을 들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재는 여러 일들 때문에 미뤄지고 있지만, 순차적으로 Migration 할 예정인데 그때 큰 도움이 될 것 같다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 팀에서 CDN과 Security 쪽을 관리하는 솔루션인 Akamai의 대면 교육을 들었는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당시에는 외계어 수준으로 들렸던 관련 용어들이 몇 달 지난 지금은 대부분 내용을 이해하고 설정할 수 있으며 동시에 팀 내에서 내가 대표하여 운영까지 하게 되었다. 도리어보니&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;if(kakao)는 추첨에 당첨되어 갔는데, 당시 가장 인상 깊었던 세션이 있었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그것은 카카오에서 발표한 '국내 최초오픈소스 가드레일: Kanana-Safeguard'였는데, LLM 응답의 안전성을 검증하는 오픈소스 프로젝트였다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보안에 민감해진 최근 한국의 시류와 더불어 최근 팀에서 진행 중인 챗봇 프로젝트에 적용하면 좋겠다는 생각이 들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 바로 하루 만에 발표자료를 만들어 3분기 팀 발표 세션에서 팀원들에게 공유했다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;신입이 컨퍼런스에서 배운 걸 팀 전체 앞에서 발표한다는 게 떨렸지만 다행히 좋은 호응을 얻었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;배운&amp;nbsp;걸&amp;nbsp;바로&amp;nbsp;적용하려는&amp;nbsp;시도&amp;nbsp;자체가&amp;nbsp;의미&amp;nbsp;있었던&amp;nbsp;것&amp;nbsp;같다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실전 경험 (10월~12월)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;10월부터는&amp;nbsp;실전이었다.&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;예를&amp;nbsp;들자면,&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java Version Upgrade (8 to 17)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 첫 번째로 &lt;b&gt;Java 17 PRD 배포&lt;/b&gt;였다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전체 라이브러리와 마이크로서비스를 Java 17로 빌드하도록 옵션을 변경하고, base image도 업데이트했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;버전 업그레이드는 단순해 보이지만, 운영 환경에서는 수많은 검증이 필요하다. 실제로 Admin 서비스에서 한글 인코딩 문제가 발생했는데, 8에서와 달리 버전 17에서 빌드 옵션을 지정하지 않으면 task의 기본 인코딩 옵션으로 진행되는 문제였고 관리자 서비스를 통해서 사용하는 공항 담당자분들의 내부 고객 문의를 통해서 깨닫게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이처럼 사소해 보이는 이슈 하나가 실제 서비스에 큰 영향을 줄 수 있다는 걸 배웠다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;FluentBit 로그 아키텍처 개선&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내가 처음으로 메인으로 잡고 처음부터 끝까지 진행한 첫 작업이었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존에는&amp;nbsp;Task&amp;nbsp;안에서&amp;nbsp;Firehose&amp;nbsp;Appender를&amp;nbsp;통해&amp;nbsp;CloudWatch로&amp;nbsp;로그를&amp;nbsp;전송하는&amp;nbsp;구조였다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제는 로그가 과다하게 쌓이는 경우, 로깅 자체가 메인 Task에 과부하를 주는 상황이 종종 발생했다는 것이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사수도 이 문제를 인지하고 FluentBit 사이드카 방식으로 전환하려 했지만, 리소스 부족으로 미뤄지다가 내가 팀에 합류하면서 맡게 되었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;막상&amp;nbsp;파고들어 보니&amp;nbsp;문제가&amp;nbsp;하나가&amp;nbsp;아니었다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 로그 중복 저장 문제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마이크로서비스의 로그가 버킷 2개에 중복 적재되고 있었다. 원인을 추적하니 FluentBit OUTPUT 설정에서 Match 패턴이 문제였다. 이를 현재 로그 구조와 비교하여 변경해서 해결했는데, 간단해 보이지만 이 한 줄을 찾기까지 로그 흐름을 전부 추적해야 했다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. Task ID 추적 불가 문제&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장애가 발생했을 때 어떤 Task에서 문제가 생겼는지 추적이 안 됐다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ECS 메타데이터 API를 호출해서 Task ID를 추출하고, 이를 S3 경로에 포함시키는 작업을 했다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에는 Task ID를 파일명에 넣으려 했는데, Athena 파티션 구조와 충돌할 것 같아서 고민했다. &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;문서에는 '파티션 추가 필요'라고 되어 있었는데, &lt;/span&gt;실제로 테스트해 보니 Athena가 파티션 Location 하위를 재귀적으로 스캔해서 Task ID 폴더가 있어도 정상 조회됐다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과적으로, 아래의 성과를 얻었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;-&amp;nbsp;FluentBit&amp;nbsp;사이드카&amp;nbsp;구조로&amp;nbsp;전환&amp;nbsp;&amp;rarr;&amp;nbsp;메인&amp;nbsp;Task&amp;nbsp;과부하&amp;nbsp;해소&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;-&amp;nbsp;Match&amp;nbsp;패턴&amp;nbsp;수정&amp;nbsp;&amp;rarr;&amp;nbsp;로그&amp;nbsp;중복&amp;nbsp;저장&amp;nbsp;해결&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;-&amp;nbsp;Task&amp;nbsp;ID를&amp;nbsp;S3&amp;nbsp;경로에&amp;nbsp;포함&amp;nbsp;&amp;rarr;&amp;nbsp;장애&amp;nbsp;시&amp;nbsp;Task별&amp;nbsp;추적&amp;nbsp;가능&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 DEV 환경 15개 마이크로서비스에 모두 적용하고 Athena 쿼리와 WCM 플랫폼 정상 동작까지 확인했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음으로&lt;b&gt; '내가 온전히 진행한 첫 작업'&lt;/b&gt;이라 개인적으로 뜻깊었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Dynatrace MCP, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Google workspace MCP&lt;/span&gt; 개발&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;팀 내의 인사 변동으로 인해 갑자기 팀의 인프라 담당이 되어버렸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그중 하나가&lt;b&gt; Dynatrace MCP, Google workspace MCP&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 회사 내에서 사용하는 솔루션이 Dynatrace와 모든 업무 관련 &lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;SaaS&lt;/span&gt;인 Google Workspace의 api를 가지고, 사내에서 사용할 수 있는 Kiro CLI가 사용할 수 있는 MCP를 제작했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Dynatrace의 경우 API 공식 문서를 기반으로 제작해서, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;터미널에서 바로 Dynatrace를 조작할 수 있게 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;15개 도구를 TypeScript로 구현했다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Google Workspace는 이미 기존의 mcp 오픈소스들이 존재했지만 사내 환경에서 사용하기에는 보안을 완벽하게 보장할 수 없을 것 같아 Dynatrace와 같은 구조로 구현했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이제 터미널에서&amp;nbsp;AI Agent와 연동해서 &quot;현재 열린 Problem 있어?&quot;라고 물으면 바로 답변을 받을 수 있게 됐고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;덕분에 늘어난 업무량을 그나마 감당하게 되었는데, 업무 효율화를 위해 직접 도구를 만들어 쓰는 경험을 통해서 오랜만에 개발자로서 큰 즐거움을 얻었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스크럼 마스터&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DevOps 엔지니어 역할 외에도 &lt;b&gt;MY 페이지, 공항 페이지의 스크럼 마스터&lt;/b&gt;를 맡고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스크럼 마스터 역할을 하면 기획-개발-도급업체 사이에서 조율하고, 일정을 관리하고, 이슈를 해결하는 역할을 맡는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;와중에 대부분이 나보다 연차로나 직급으로나 윗사람들과 논의해야 하는 상황이 대부분이지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트 리딩을 많이 해봤던 과거의 경험 덕분에 다행히 잘 리딩하면서 넘어갈 수 있었던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그중 스크럼 마스터로서 가장 기억에 남는 업무는 &lt;b&gt;마일리지 캐시 불일치 VOC 분석&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고객이 메인페이지에서 보는 마일리지와 상세조회 페이지에서 보는 마일리지가 다르다는 민원이 들어왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원인을 파고들어 분석한 결과, 계약해서 사용 중인 솔루션이 제대로 캐시를 갱신하지 못해서 발생하는 문제였다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 과정에서 윗선까지 보고되어 여러 팀이 엮이게 되었는데, 당시 우리 팀은 괜히 도와줬다가 끼게 된 애매한 상황이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 성격상 내 일 아니어도 최대한 돕자는 마인드였는데, 이 일을 계기로 항상 좋은 마음으로 모든 일을 돕는 것이 능사는 아니라는 생각하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문서화의 힘&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해 가장 많이 한 일 중 하나가&amp;nbsp;&lt;b&gt;문서화&lt;/b&gt;다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;팀에 들어오니, 인프라 파트를 제외한 다른 부분에선 인수인계가 거의 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 맨 땅에 헤딩하는 식으로 직접 부딪히며 배워가보니, 다음 사람은 뭔가 배울 수 있는 가이드 문서가 있으면 좋을 것 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 김에 나도 잘 모르는 내용들에 대해서 같이 배우는 느낌으로 가이드 문서들을 비롯해서 많은 내용들을 문서화했다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;팀에 제대로 합류한 것이 6월이니, 약 6개월 동안 140+개의 문서를 문서화했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문서화를 하는 것 자체는 시간과 정성이 꽤나 드는 작업이지만 하고 난 이후에 다른 사람에게 내 지식과 경험을 공유할 때 훨씬 편리하고, 결론적으로 나뿐만 아니라 많은 사람들의 시행착오를 줄여준다는 점에서 조직적인 관점에서는 오히려 일하는 시간을 줄여주는 윈윈하는 수단이었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회고록 시스템 구축&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문서화의 일환으로, 10월 말부터 매일 회고록을 작성하기 시작했다. 처음에는 귀찮았지만 지금은 습관이 되어 꽤나 익숙해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;오늘 뭘 했는지, 뭘 배웠는지, 내일 뭘 해야 하는지를 정리하면 업무를 다시 시작할 때 몰입하는데 드는 시간이 줄어들고 &lt;/span&gt;장기간의 템포를 가지고 가는 작업을 할 때 계속 진행되는 듯한 느낌을 받을 수 있다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;또한 회고록을 작성하기 시작한 이유는 추후에 설명할 AI 워크플로우에서 핵심이 되는 '컨텍스트'를 유지하기 위함이었다.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;# YYYY-MM-DD 회고

## 진행한 업무
## 트러블슈팅
## 회의 및 커뮤니케이션
## 배운 점 / 궁금한 점
## 내일 할 일

&lt;/code&gt;&lt;/pre&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로 회고록을 쓰게 됨으로써,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 하루를 정리할 수 있게 되고&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 현재 일의 진행사항을 트래킹 할 수 있고&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. AI의 컨텍스트를 지속적으로 관리할 수 있으며&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 내 업무 성과를 증명할 자료를 만들 수 있었다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 이 회고록들이 모여서 지금 이 연말 회고를 쓸 수 있게 됐다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에 내용과 일부분 겹칠 수 있지만, 아래는 개인적으로 성장한 것에 대한 내용이다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인 AI 워크플로우 구축&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사 업무 외에도 개인적으로 jchat이라는 AI 개발 환경을 구축했다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666;&quot;&gt;(근데 지금은 또 opencode를 이용한 새로운 환경으로 이관 중이다ㅋ..)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666;&quot;&gt;(++ 글을 쓰는 와중에 opencode에서 또 opencode처럼 kiro cli를 wrapping 한 새로운 라이브러리를 tui 환경을 구축 중이다)&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순히 'AI를 사용했다'가 아니라, 최대한 AI의 구루들의 아이디어와 Open AI, Gemini, Antrophic 등의 회사에서 매주 발표하는 방법론들과 팁들을 녹여가며 나만의 AI 워크플로우 아키텍처를 구축하려고 노력했다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;핵심 철학은, 단순히 AI를 도구로만 사용하는 것이 아니라 하나의 팀원으로 두고 사용하려고 노력했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI를 단순 코드 생성기로 쓰면 한계가 명확하다.&amp;nbsp;맥락을 모르니까 엉뚱한 답을 하고, 같은 실수를 반복한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 AI에게 role과 context를 부여하는 시스템을 만들었다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 역할 기반 전환 시스템 (16개 역할)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작업 유형에 따라 AI가 자동으로 역할을 전환한다. architect, frontend, backend, reviewer, bug-fixer, security 등 16개 역할을 정의하고, 각 역할마다 체크리스트와 행동 규칙을 만들어뒀다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어 '설계해 줘'라고 하면 architect 역할로 전환되어 SOLID 원칙, 트레이드오프 분석, ADR 작성 등을 자동으로 고려한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. Scale Adaptive System&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모든 작업을 같은 프로세스로 처리하면 비효율적이다. 그래서 복잡도에 따라 워크플로우를 자동 선택하는 시스템을 만들었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Quick&amp;nbsp;Flow:&amp;nbsp;버그픽스,&amp;nbsp;소기능&amp;nbsp;&amp;rarr;&amp;nbsp;바로&amp;nbsp;개발&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Standard&amp;nbsp;Flow:&amp;nbsp;새&amp;nbsp;기능&amp;nbsp;&amp;rarr;&amp;nbsp;Tech&amp;nbsp;Spec&amp;nbsp;&amp;rarr;&amp;nbsp;TODO&amp;nbsp;&amp;rarr;&amp;nbsp;개발&amp;nbsp;&amp;rarr;&amp;nbsp;리뷰&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Full&amp;nbsp;Flow:&amp;nbsp;새&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;&amp;rarr;&amp;nbsp;배포&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 3단계 합의 프로세스&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI가 마음대로 파일을 수정하면 위험하다. 그래서 모든 생성/수정/삭제 작업에 3단계 합의를 적용했다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1)&amp;nbsp;Kiro&amp;nbsp;계획&amp;nbsp;수립&amp;nbsp;&amp;rarr;&amp;nbsp;사용자&amp;nbsp;승인&amp;nbsp;요청&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2)&amp;nbsp;Codex&amp;nbsp;리뷰&amp;nbsp;&amp;rarr;&amp;nbsp;피드백&amp;nbsp;수집&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3)&amp;nbsp;Kiro&amp;nbsp;+&amp;nbsp;Codex&amp;nbsp;+&amp;nbsp;사용자&amp;nbsp;합의&amp;nbsp;&amp;rarr;&amp;nbsp;실행&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. Compounding Engineering (실수 누적 방지)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI가&amp;nbsp;같은&amp;nbsp;실수를&amp;nbsp;반복하면&amp;nbsp;steering&amp;nbsp;문서에&amp;nbsp;기록해서&amp;nbsp;다음부터&amp;nbsp;같은&amp;nbsp;실수를&amp;nbsp;안&amp;nbsp;하도록&amp;nbsp;했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AI가&amp;nbsp;학습하는&amp;nbsp;게&amp;nbsp;아니라,&amp;nbsp;규칙&amp;nbsp;문서가&amp;nbsp;점점&amp;nbsp;정교해지는&amp;nbsp;방식이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5. MCP 서버 연동 (7개)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Kiro CLI에 MCP 서버 7개를 연동해서 AI의 능력을 확장했다. codex(코드 리뷰), github(이슈/PR 관리), notion(문서 연동), context7(라이브러리 문서 검색), memory(세션 간 기억), sequential-thinking(복잡한 작업 분해), playwright(브라우저 자동화) 등등이 있다. 여기에 필요한 경우 직접&amp;nbsp; mcp를 구축해서 더 하였다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이외에도 매주 AI 관련 소식을 아카이빙 하고, 주말마다 내 워크플로우에 반영할 부분들을 검토 후에 반영하는 등 끊임없이 개선하고 효율적으로 일을 하려고 노력한다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://karpathy.bearblog.dev/year-in-review-2025/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;안드레 카파시&lt;/a&gt;가 말한 것처럼, 프로그래밍이 점점 코드를 짜는 게 아니라 AI 도구를 엮어내는 능력의 싸움이 되고 있는 것을 느낀다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재도 구현하는 부분에서 많은 개발자들을 뛰어넘는 수준을 보이는데, 불과 몇 년 안에 구현하는 것은 아예 비교가 되지 않을 거라고 생각한다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다만 AI는 안드레 카파시의 비유처럼 AI는 '사용설명서 없는 외계 도구'와 같은 상태이고, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 잘 다루기 위해선 agent, tools, context 같은 새로운 추상화 계층을 다루는 방법을 배워야 한다.&amp;nbsp;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매주 급격하게 발전하는 ai 생태계처럼 내 워크플로우도 매주 새롭게 변화하는데, 기회가 된다면 관련해서 글을 자세하게 써볼까 고민 중이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운동&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해 운동 부분에선 큰 변화가 생겼다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년 회고에서 '내년 상반기부터는 헬스를 다시 제대로 시작해 볼 생각이다'라고 작성했고 실제로 이전의 고점인 450에 거의 근접한 440 정도까지 중량을 복구했었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다만 운동을 건강 관리의 목적보다는 순전히 재미 때문에 하였는데, 갑자기 어느 순간 얼굴에 실핏줄 터져가며 중량을 드는 게 말 그대로 재미 없어졌다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 그날 바로 회원권을 동생에게 넘기고, 운동 장비를 전부 처분했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;약 5년 넘게 꾸준히 해오던 헬스라서 나에게도 큰 변화였지만 즐거움 없이 파워리프팅을 하는 이유를 찾지 못한 게 컸다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 새로운 취미로 주짓수, 클라이밍, 러닝을 후보로 두고 고민하다가, &lt;b&gt;러닝&lt;/b&gt;으로 시작하였다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이유는 헬스와 마찬가지로 자세가 괜찮다면 나이가 들어서도 꾸준히 할 수 있는 운동이라는 것이고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기 비용이 들지 않으면서, 현재 체력이 부족해 하고싶은 게 많아도 못하는 이 상황을 타개할 수 있을 것이라 생각했다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 군대에서도 전부 특급이었지만 구보가 2급이어서 특급전사를 못했던 내가 달리기를 시작했고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에 3km 7분 페이스도 힘들었는데 한 달 만에 515 페이스로 10km를 달릴 수 있게 되어 큰 성취감을 느꼈다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 회사에서 점심에 요가 또는 간단한 맨몸운동을 하고, 퇴근 후에 러닝을 하는 게 내 새로운 운동루틴으로 자리 잡게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2026년 목표는&lt;b&gt; 풀마라톤 330&lt;/b&gt;이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생각만 해도 고되지만, 뭐 안되면 말고~&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;독서&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해 읽은 책은 많지 않다. 작년 회고에서 읽을 책 목록을 잔뜩 적어놨는데, 거의 못 읽었다. 이 부분은 좀 아쉽다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그나마 읽은 책:&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마법의 연금 굴리기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;행복의 기원&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자몽살구크럽&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2026년에는 월 1권이라도 읽는 것이 목표다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;재테크&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년에 부동산 공부를 시작하겠다고 했는데, 아직 시작 못 했지만 대신 주식 투자는 꾸준히 하고 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;연금저축펀드, ISA 계좌 등을 통해 세금 공제를 이용한 장기 투자를 진행하고, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적으로 자산 배분 + 계절성을 통한 안정성 포트폴리오와 공격적인 자산에 투자하는 투더문 포트폴리오로 나누어 진행하고 있다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 이를 매번 수동으로 관리하는 게 어려워,&amp;nbsp;12월에&amp;nbsp;&lt;b&gt;Folio&lt;/b&gt;라는 사이드 프로젝트를 시작했다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;노션에 정리해 둔 재테크 전략들을 자동으로 실행하고, 실제로 자산 관리를 자동화하는 개인 자산 관리 플랫폼이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 MVP 단계지만, 2026년에는 제대로 완성해 볼 예정이다.&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리하며&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년 회고에서 이렇게 썼다:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음에 회고할 때의 내가 지금의 나를 귀엽다 생각할 수 있도록 2025년도 열심히 살아볼 예정이다&lt;/span&gt;&lt;/blockquote&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;근데 취준 하는 당시에 너무 고생하며 열심히 했어서, 아직도 그때의 내가 귀여워 보이기는커녕 참 고생 많이 했다는 생각이 든다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지금도 열심히 자기 계발을 하지만 하기 싫은 걸 하는 능력이 정말 바닥을 치고 있다(예를 들어서 토익스피킹)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매일 번아웃이 오면서, 하기 싫은 것을 매일 했었던 과거의 나에게 위로를 보내고 싶다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그런 노력 끝에 시작된 마중물이 이제 하나의 줄기가 되어 흐르고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 작은 물줄기지만, 꾸준히 흐르다 보면 언젠가 강이 될 거라고 믿는다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2026년 목표는 아래 3가지다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;업무&lt;/b&gt;: 연차나 직급에 한계를 두지 않고 프로젝트를 제대로 책임지고 이끌기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기술&lt;/b&gt;: AI 워크플로우 지속적으로 발전시켜 사이드 프로젝트 하기, AWS SAA, SAP 자격증 취득&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개인&lt;/b&gt;: 풀마라톤 3시간 30분 / 영어회화 (비즈니스 활용) / Folio 프로젝트 완성 / 책 월 1권 이상 독서&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 목표를 성공하든 못하든, 내년에도 또 돌아와 회고 글을 남기기를~&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;긴 글 읽어주셔서 감사합니다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>회고</category>
      <category>개발자</category>
      <category>회고</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/55</guid>
      <comments>https://jun10920.tistory.com/55#entry55comment</comments>
      <pubDate>Wed, 7 Jan 2026 13:01:23 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps] Terraform 1차 멘토링 by 정영진님 - Terraform 기초 및 Atlantis</title>
      <link>https://jun10920.tistory.com/54</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;오랜만입니다. 회사에 입사해서 여러 교육을 받고 팀에 배치받아 열심히 회사생활에 적응 중입니다.&lt;br /&gt;여러 일을 병행하지만, 평소에도 관심 있었던 데브옵스를 주로 맡게 되었습니다.&lt;br /&gt;회사의 대규모 인프라를 테라폼으로 형상화시켜 관리하고 싶어, &lt;br /&gt;멘토이자 항상 감사한 형님이신 정영진 님께 공부법을 여쭤보던 중 좋은 기회로 멘토링을 받게 되었습니다.&lt;br /&gt;당분간 멘토링에서 배운 내용이나, 데브옵스에 대한 내용, 그리고 추가적으로 개발 고려 중인 사이드 프로젝트들을 위주로 블로그를 작성할 것 같습니다 :&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Assignment - Atlantis deploy&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 영진 님이 제공해 주신(다시 한번 감사 :&amp;gt;) 레포지토리를 클론 해서, atlantis를 배포하고 이를 이용해서 GitOps를 경험해 보았다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 HCL에 익숙하지 않기 때문에 코드를 하나씩 읽으며 VPC, ALB, ECS, IAM 등 주요 구성 요소를 파악을 먼저 했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 배운 것은, 코드를 이용해서 인프라 자원을 관리하기 때문에 인프라 상태 관리 파일(tfstate)을 주로 S3에서 관리하는 것이 글로벌 스탠더드이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 가지 방법이 있겠지만 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;DynamoDB를 이용해서 상태 파일을 Lock 걸어 동시 접근을 방지하고 일관성을 보장하게끔 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 테라폼에 명령을 내림(ex. apply, plan)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 테라폼에서 DynamoDB 테이블에 Lock 아이템 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-1. Lock이 없다면? -&amp;gt; Lock을 생성하고 작업을 시작&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2-2. Lock이 있다면? -&amp;gt; 다른 사람이 작업 중인 것으로, locked 에러를 발생하고 대기 또는 실패 처리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 작업이 끝난다면 Lock 아이템을 삭제&amp;nbsp;&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 2주 차가 지난 현재 시점에서는 provisioning을 다른 방식으로 진행해서 DynamoDB를 이용하지 않았지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이에 대해선 2주 차 멘토링 글에서 작성하도록 하겠다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과제를 하면서 발생한 문제는,&amp;nbsp;클론 하는 레포지토리를 실수로 atlantis-deploy 관련 레포지토리만 하는 것으로 오해하여&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과제에서 설정해야 하는 ACM과 DNS 관련 설정을 false(무효화) 처리하고 진행했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 실습용으로 로컬에서 작동하고 AWS에 띄워보는 정도라 문제는 없었지만, 이후 회사에서 실제로 사용해 보는 것을 목적으로 멘토링을 받는 상황에서 약식으로 진행한 것이라 이번 주에 다시 제대로 진행할 예정이다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이후에는 ACM 등을 제대로 구성하여 HTTPS로 통신하는 프로덕션 환경과 비슷하게 구성해 볼 예정이다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1차만 진행했던 당시에도, 영진님 실력의 깊이를 엿볼 수 있었고 위에 것들을 제외하고도 웹훅이나, 테라폼 등등 이외에도 많은 것을 배울 수 있었다.&lt;br /&gt;현재 2차 멘토링까지 받은 상태인데 이번에는 더욱 많은 것들을 배우고, 더 많은 것들을 공부해야 하는 상황이 되어서 즐겁다 :&amp;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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강연 이후에 여러 커피챗과 연락을 이어나가며 지속적으로 인연을 이어나가고 있는 영진님께,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&gt;꼭 성장한 이후에 누군가에게도 도움 되는 멘토링을 할 수 있을 때까지 열심히 하고 있고, 할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Mentoring Content&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;HCL&amp;nbsp;&lt;/b&gt;: 테라폼의 핵심 언어 / main.tf, variables.tf&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Provider&lt;/b&gt;&amp;nbsp;: AWS, GCP, Azure과 같은 플랫폼에 통신할 수 있게 해주는 플러그인&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Resource&lt;/b&gt;&amp;nbsp;: 실제로 관리할 인프라&amp;nbsp;(EC2, S3, VPC 등) - 코드로 관리하기 때문에 인프라 상태를 일관되게 재현 가능&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Data Source&amp;nbsp;&lt;/b&gt;: 이미 있는 리소스나, 정보(기존 VPC, 특정 태그를 가진 S3)를 읽어서 테라폼에서 활용할 때 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Variables&lt;/b&gt;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- input: 외부에서 입력받음 (var 플래그나 변수파일)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- output: 실행 후 결괏값 반환 (예: public IP)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- local: 디렉터리 범위에서만 쓰는 임시 변수 (함수와 결합해서 값 가공 가능)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Module&lt;/b&gt;&amp;nbsp;: VPC, ALB, EC2 등 자주 쓰는 패턴을 만든 형태, 환경 별로 변수만 기입하여 반복 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Plan&lt;/b&gt;&amp;nbsp;: 어떻게 변경되는지 미리 시뮬레이션(dry - run), 오류나 변경 사항을 미리 확인&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Apply&lt;/b&gt;&amp;nbsp;: Plan의 결과를 실제 클라우드에 생성 / 수정 / 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;State&lt;/b&gt;&amp;nbsp;:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp; 테라폼이 '현재 인프라가 어떤 상태인지' 추적하는 파일, 현업 시 S3 등 외부에 두고, 동시에 여러 명이 같은 인프라를 작업 못하게 lock 걸어둠&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- S3에 저장할 때 동시에 작업 못하게 lock 기능 지원 (보통 DynamoDB로 lock 관리)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- S3버킷에 bucket policy, IP 제한 등&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 직접 권한이 없어도 IAM Role - Assume Role을 통해서 필요한 작업만 수행 가능&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Atlantis와 GitOps (TACOS&amp;nbsp; :&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;T&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;erraform&amp;nbsp;&lt;/span&gt;A&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;utomation and&amp;nbsp;&lt;/span&gt;COllaboration&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;S&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;ofrware&lt;/span&gt;&amp;nbsp;)&lt;/span&gt;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Atlantis란?&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테라폼 작업을 Git PR(pull request) 기반으로 자동화해 주는 툴&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PR 올리면, Atlantis가 plan/apply를 자동 실행(혹은 승인 후 apply)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;IaC의&amp;nbsp;&lt;b&gt;GitOps(=모든 인프라 작업은 깃 PR로만!)&lt;/b&gt;&amp;nbsp;완성에 핵심&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Atlantis Workflow&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;dev가&amp;nbsp;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;http://main.tf&quot;&gt;main.tf&lt;/a&gt;,&amp;nbsp;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;http://variables.tf&quot;&gt;variables.tf&lt;/a&gt;&amp;nbsp;등 변경 &amp;rarr; PR 생성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PR에 코멘트로 /plan 입력 &amp;rarr; Atlantis가 terraform plan 자동 실행, 결과를 PR에 댓글로 남김&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리뷰어가 확인 후 /apply 입력 &amp;rarr; Atlantis가 terraform apply 실행, 실제 인프라 변경&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;webhook&lt;/b&gt;으로 Atlantis가 PR 알림 받음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Atlantis에게는 실제 인프라 리소스를 생성/변경할&amp;nbsp;&lt;b&gt;admin-level IAM 권한&lt;/b&gt;&amp;nbsp;필요&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Multi Account/Assume Role&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사에서 AWS 계정이 여러 개일 때, 각 계정별로 Atlantis가 필요한 리소스만 assume role로 들어가서 작업&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하나의 Atlantis가 여러 계정/환경 관리 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans 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;&lt;/p&gt;</description>
      <category>개발경험</category>
      <category>Atlantis</category>
      <category>devops</category>
      <category>GitOps</category>
      <category>HCL</category>
      <category>terraform</category>
      <category>데브옵스</category>
      <category>테라폼</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/54</guid>
      <comments>https://jun10920.tistory.com/54#entry54comment</comments>
      <pubDate>Mon, 21 Jul 2025 22:16:55 +0900</pubDate>
    </item>
    <item>
      <title>2025년 3월, 드디어 취업_당근 / 라인 / 대한항공 / 데브시스터즈</title>
      <link>https://jun10920.tistory.com/53</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2024년 하반기와 2025년 상반기 공채 사이에 라인과 대한항공, 당근 등에서 좋은 기회가 찾아왔습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;열심히 싸피에서 13기 동기들과 알고리즘 공부를 병행하면서, 취업 준비 활동을 병행했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해는 운좋게도 라인 최종 면접, 대한항공 최종면접, 당근 과제 전형, 데브시스터즈 코테를 진행하였고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그중에서 최종으로 합격하여 기나긴 취준 생활이 끝나게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당근&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대학생 윈터 인턴십 인프라 직군에 지원하여 서류를 합격하고, 이후 과제 전형을 진행하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당시 연휴와 겹쳐서 준비할 시간이 많아졌다고 좋아했습니다만,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;열심히 당근이랑 다른 IT회사의 테크 블로그를 참고해서 기획과 전반적인 구현을 하였지만&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;B형과 A형 독감이 모두 유행하던 2월에 저 역시 제대로 걸려서 한 일주일 간 거의 쓰러져있었던 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리를 완벽히 하고 Read.me 작성까지 확실히 했으면 면접까진 봤을 것 같은데, 건강 이슈로 못해서 아쉬웠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;라인&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;라인은 데브옵스 직무로, 현재 신입 공채를 뽑지 않고 수시 채용만 하기에 각 팀마다 채용 절차가 다릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 지원한 직무의 경우 &lt;b&gt;서류 - 1차 - 최종 면접 - 처우 협의 및 레퍼런스 체크&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년 12월 초쯤에 지원하였고, 1월 중순에 서류 합격 연락이 왔습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 1차 면접을 보았는데 다른 라인 면접 후기들을 보면 알 수 있듯이 정말 지구 내핵까지 파고드는 CS 질문들을 하셨습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 각 팀마다 사람을 뽑는 수시 채용이다 보니까 전반적인 CS에 대한 질문을 주시기보다는,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제 포트폴리오를 기반으로 해서 해당 직무와 연관된 기술질문으로 들어가 계속 깊어지는 방식으로 질문을 주셨습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다행히 그런 식으로 나올 것을 어느정도 예상하였고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GPT와 같은 방식으로 DFS 알고리즘처럼 면접 준비를 하여 1차 면접을 통과하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 1/3 정도는 대답을 제대로 못하거나, 경험이 없다고 했기 때문에 면접 통과를 못 할 것이라고 생각했는데 합격해서 놀랐습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 최종 면접도 라인은 더 깊은 CS 질문이 나온다고 해서, 훨씬 깊고 넓게 기술 면접 준비를 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;근데 의외로 한 80%정도 인성 위주로 질문이 들어왔습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3분 중에 2분은 우호적이셨는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1분은 처음부터 공격적으로 질문을 하셨고 해당 부분에 대해 면접관님이 만족할 수준으로 대답을 못 했던 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 전반적으로 분위기는 좋았고, 면접도 잘 마무리했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대한항공&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대한항공은 작년 11월에 시작한 2024 하반기 공채인데, 올해 3월이 되어서야 전형이 마무리되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원래 이렇게 절차가 느린지 타 직무의 지인들한테 물어봤는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전형은 &lt;b&gt;서류 - 1차 면접(화상) - 2차 면접(영어, PT, 기술) - 3차 면접(임원 면접) - 신체검사로&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서류 통과 후 1차 면접의 경우 약 10분에서 15분 정도 소모된다고 안내되었고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전 면접 후기들을 참고했을 때 인성 면접 질문이 나올 것으로 예상했는데 갑자기 기술 질문이 들어와서 당황했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2차 면접은 영어 면접과 PT면접 이후 기술면접이 이어서 진행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;영어 면접의 경우 오픽처럼 나온다고 해서 그렇게 준비했는데, 생각보다 대답하기 어려운 질문이 나와서 대답을 잘 못 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 PT와 기술 면접에서는 저랑 같이 본 조원들 중에서는 압도적으로 잘했다고 끝나고 판단해서, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 최종 면접은 임원 2분 : 지원자 5명씩 해서 저희 직무 같은 경우 총 10명이 최종으로 올라왔습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종임에도 불구하고 경쟁률이 5대 1에서 많으면 10대 1이었던 상황이었고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저처럼 쌩신입 말고 대부분이 중고신입이어서 나름 면접을 잘 마무리했음에도 합격을 확신하지 못했던 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데브시스터즈&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데브시스터즈의 서버 직군의 서류에 합격하게 되어 코딩테스트를 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 코딩테스트를 보았는데, 한참 싸피에서 알고리즘 공부를 많이 하던 때라 쉽게 풀었던 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 코딩테스트를 합격하고 면접을 준비하던 중에 다른 기업에서 최종합격을 하여 중도 포기 의사를 회사에게 전달하고 절차를 마무리했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로, 여러 상황과 제 성향을 고려했을 때 가장 가고 싶었던 기업에 최종 합격하게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;준사관을 준비했던 시절부터 개발자로 전향하고 취업하게 된 지금까지 거의 3년간 쉰 적이 거의 없어서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피에서 매 기수 취업과 관련한 설명회를 진행하는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매년 올해가 가장 힘들다고 하지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;12기까지는 그래도 도메인 별로 취업을 기대해 볼 만하다, 여긴 이번에 안 좋다 이런 지표를 보여주는데 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해 처음으로 모든 도메인의 취업시장이 동결이라 지표를 보여주지 못한다고 컨설턴트님께서 말씀하셨습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이밖에도 뉴스와 여러 기사에서 현재 IMF 시절만큼 취업률이 떨어진 굉장히 어려운 시기라고 여러 증거들을 제시합니다.&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이처럼 경제가 힘든 시기에는 어느 정도 대기업에 서류가 붙을 정도의 수준이 되었다면, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 이후부턴 운의 영역이니 떨어지더라도 실력이 부족해서 그런 것이 아니기 때문에 낙담하지 말고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정말 열심히 노력하긴 했지만, 저 역시 많은 분들께 조언을 구하며 도움을 받으며 준비했기 때문에 얻은 결과라고 생각합니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;피드백이나 취업과 관련해서 도움이 필요하신 분들은 편하게 연락 주시면, 도움드리겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;모든 취준생 분들 파이팅입니다  &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>회고</category>
      <category>IT</category>
      <category>개발</category>
      <category>개발자취준</category>
      <category>당근</category>
      <category>대한항공</category>
      <category>데브시스터즈</category>
      <category>라인</category>
      <category>취업</category>
      <category>취준</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/53</guid>
      <comments>https://jun10920.tistory.com/53#entry53comment</comments>
      <pubDate>Thu, 13 Mar 2025 11:37:06 +0900</pubDate>
    </item>
    <item>
      <title>[SSAFY] 알고리즘 역량 A+ 취득</title>
      <link>https://jun10920.tistory.com/52</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오랜만에 블로그 글이네요!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피에 들어오고 약 1.5개월 정도 지났습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최근엔 프로젝트보다는 실력 기복이 심한 알고리즘을 안정적으로 잘하기 위해서 알고리즘을 집중해서 공부하고 있어서 글을 자주 작성하지 못했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 최근에 어느정도 성과가 있어서 정리할 겸 글을 오랜만에 적습니다 :&amp;gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피를 시작하고 약 1.5개월 동안 스타트캠프, 자바, Js에 대한 학습과 평가시험 그리고 1번의 관통 프로젝트를 경험했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 입과할 때 코딩테스트를 좋은 성적으로 들어와, 입과생들 중에서 선발되어 &lt;b&gt;삼성 B형 취득을 위한 특강&lt;/b&gt;을 알고리즘 업계에서 유명한 &lt;b&gt;&lt;a title=&quot;류호석&quot; href=&quot;https://www.youtube.com/@hosseuk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;'류호석'&lt;/a&gt;&amp;nbsp;&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;추가로 &lt;b&gt;&lt;a href=&quot;https://github.com/ssafy16codingteststudy/1st_algorithm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;코딩테스트 스터디&lt;/a&gt;&lt;/b&gt;를 싸피 동기들과 진행하며, 특강 진도에 맞게 추가적으로 문제를 풀고 스터디원들과 공유하며 복습 및 실력을 기르는데 많은 도움을 받고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코테 스터디에서도, 동기중 백준에 문제도 출제하는 &lt;a href=&quot;https://www.acmicpc.net/user/aym506&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;알고리즘 고수 동기&lt;/a&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 싸피에서 진행한 첫 번째 삼성 알고리즘 A형 역량테스트에서 최고득점인 &lt;b&gt;A+&lt;/b&gt; 결과를 얻었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UCZ1C/btsMoFXgSYP/MnUD2M0k5KwzU6i0pu8Mak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UCZ1C/btsMoFXgSYP/MnUD2M0k5KwzU6i0pu8Mak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UCZ1C/btsMoFXgSYP/MnUD2M0k5KwzU6i0pu8Mak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUCZ1C%2FbtsMoFXgSYP%2FMnUD2M0k5KwzU6i0pu8Mak%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;508&quot; height=&quot;200&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파이썬으로만 코딩테스트를 풀다가, &lt;b&gt;자바로 보는 첫 번째 코딩테스트&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;왜 싸피 수료생들이 다른 건 몰라도 코딩테스트는 잘하는지 궁금했는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;직접 들어와서 알고리즘과 관련된 모든 활동들을 지원하고 진행하다 보니 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 &lt;b&gt;문제 푸는 것 자체에도 즐거움을&lt;/b&gt; 느끼기 시작해서, 추후에 취업을 하더라도 하루에 1문제씩은 꾸준히 풀고 싶네요.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로도 공유할만한 좋은 소식이 있으면 또 글 적으러 오도록 하겠습니다  &lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  글 읽어주셔서 감사합니다. 꽃샘 추위 때문에 감기 걸리시는 분들이 많은데 다들 감기 조심하세요~~!&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>PS</category>
      <category>a형 역량테스트</category>
      <category>SSAFY</category>
      <category>싸피</category>
      <category>알고리즘</category>
      <category>코딩테스트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/52</guid>
      <comments>https://jun10920.tistory.com/52#entry52comment</comments>
      <pubDate>Thu, 20 Feb 2025 16:42:17 +0900</pubDate>
    </item>
    <item>
      <title>마중물 같은 개발자의 2024년 회고</title>
      <link>https://jun10920.tistory.com/51</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마중물&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;명사. 펌프질을 할 때 물을 끌어올리기 위하여 위에서 붓는 물&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 표준국어대사전&lt;span style=&quot;color: #9d9d9d; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2024년 상반기는 이미 아래 글에서 회고해서, 2024년 하반기의 회고를 작성할 예정이다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735542260558&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;잠은 죽어서 자는 건가 싶었던 2024년 상반기 회고&quot; data-og-description=&quot;원래 회고를 1년 주기로 작성하려 했는데, 상반기만 해도 많은 일들을 해서 올해는 반년 단위로 회고를 하려고 합니다.과장하는 게 아니라, 정말 하루도 최선을 다하지 않은 날이 없는 것 같습니&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/33&quot; data-og-url=&quot;https://jun10920.tistory.com/33&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d35mzZ/hyXWs343ih/jYP9pkbbHDvkhJoRzVh7Z0/img.jpg?width=800&amp;amp;height=1297&amp;amp;face=0_0_800_1297,https://scrap.kakaocdn.net/dn/mwBjK/hyXWyXwKBo/3zuXK1RnY5nbuosRJXt13k/img.jpg?width=800&amp;amp;height=1297&amp;amp;face=0_0_800_1297,https://scrap.kakaocdn.net/dn/cIbOfF/hyXSFqs4Px/vM0m4kxLkHDV70okepyOb1/img.jpg?width=750&amp;amp;height=1216&amp;amp;face=0_0_750_1216&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/33&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d35mzZ/hyXWs343ih/jYP9pkbbHDvkhJoRzVh7Z0/img.jpg?width=800&amp;amp;height=1297&amp;amp;face=0_0_800_1297,https://scrap.kakaocdn.net/dn/mwBjK/hyXWyXwKBo/3zuXK1RnY5nbuosRJXt13k/img.jpg?width=800&amp;amp;height=1297&amp;amp;face=0_0_800_1297,https://scrap.kakaocdn.net/dn/cIbOfF/hyXSFqs4Px/vM0m4kxLkHDV70okepyOb1/img.jpg?width=750&amp;amp;height=1216&amp;amp;face=0_0_750_1216');&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;잠은 죽어서 자는 건가 싶었던 2024년 상반기 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;원래 회고를 1년 주기로 작성하려 했는데, 상반기만 해도 많은 일들을 해서 올해는 반년 단위로 회고를 하려고 합니다.과장하는 게 아니라, 정말 하루도 최선을 다하지 않은 날이 없는 것 같습니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;새로운 2025년을 시작하기 전에, 2024년을 되돌아보고 정리해야 활기찬 시작을 할 수 있다고 생각해 올해도 회고를 진행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px;&quot;&gt;글을 보다가&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;주황/파란색으로 표시된 부분&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px;&quot;&gt;은&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;링크가 포함되어 있는 부분이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #ffffff; color: #000000; text-align: left;&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;크게 주제를 &lt;b&gt;개발과 인생&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년&lt;a title=&quot;2023년 회고&quot; href=&quot;https://jun10920.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; 2023 회고&lt;/a&gt;의 말미에 언급했던 것처럼, 올해 2024년의 개발과 관련된 목표는 아래와 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;학교를 4점대 이상으로 졸업&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;하반기에 1순위 취업 / 2순위 메이저 부트캠프 합격&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;졸업프로젝트 + 괜찮은 프로젝트 2개&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;SQLD 취득&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;정보처리기사 취득&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 중에서 의문의 5번 빼고는, 전부 달성했다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;취업&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해 가장 열심히 한 활동을 꼽자면 취업이라고 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대해서 KPT로 회고를 해보자면,&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;KEEP&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2023년에 취업 준비한 친구들도 취업 시장이 너무 혹한기라 힘들다고 했는데, 올해 2024년엔 TO가 더 줄어들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(참고 기사 링크: &lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://www.mk.co.kr/news/world/11120521&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.mk.co.kr/news/world/11120521)&lt;/a&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: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 취업시장 한파에도 불구하고 아직도 수많은 개발자 지망생들이 몰려오고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPgdi6/btsLCrKqQ87/DRDpkPZGXZeR6FKNU4vnpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPgdi6/btsLCrKqQ87/DRDpkPZGXZeR6FKNU4vnpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPgdi6/btsLCrKqQ87/DRDpkPZGXZeR6FKNU4vnpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPgdi6%2FbtsLCrKqQ87%2FDRDpkPZGXZeR6FKNU4vnpK%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;1077&quot; height=&quot;315&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 많은 블로그 조회수를 기록했던 9월의 TOP5를 보면, &lt;b&gt;개발자 취업을 위한&lt;/b&gt; 부트캠프인 SSAFY와 Ureka 관련 글이 1, 2등이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실제로 이번에 유플러스 백엔드 개발자와 데브옵스 개발자의 TO가 1명이었다는 걸 보면, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수천 명이 지원해도 1명 뽑는 요즘 시장인데 내년엔 더욱 힘들어질 것 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 나 같은 신입 개발자 말고 경력이 있는 개발자들도 100곳 넘게 써야 서류 합격을 조금이라도 하는 상황이라&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;200곳 넘게 도전해 본 것이 잘한 일이라고 생각된다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이만큼 &lt;b&gt;서류 작성 - 코테 - 면접&lt;/b&gt; 등을 경험해 보면서 점점 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나의 컨셉이 확실한 Resume도 작성하게 되고, 주로 나오는 코테 유형, 면접 질문 등도 파악하게 된 것 같다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해 하반기에 남은 곳들이 모두 떨어지게 되더라도 내년 상반기에도 내가 원하는 회사에 들어갈 때까지 끊임없이 도전할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PROBLEM&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 여름방학 시기에 처음 서류를 넣자마자 면접을 본 곳이 &lt;a href=&quot;https://jun10920.tistory.com/37&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;카카오&lt;/a&gt;였고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 상시채용에서도 이 정도 성적인데, 하반기 공채는 생각보다 수월하겠다는 안일한 생각을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인적으로 생각한 원인은, 너무 자소서가 개발과 관련된 얘기 위주이기에 실무진이 바로 서류를 검토하는 상시채용이 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정리한 내용을 보면 주로 붙은 곳들도 서비스 IT나 대기업 SI이고, 금융권은 거의 붙지 못했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 역시 위에 언급한,&amp;nbsp; 내 이력서와 자소서가 성장과 개발에 초점이 맞춰져 있어서 인 것 같다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 도메인을 다양하게 준비하다 보니&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필기에서만 코딩테스트, NCS, 전산 필기, CS면접, 잡다 역검 등 다양한 종류의 시험을 준비했었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 전부 적당히는 하는데, TO가 1~2명인 요즘 채용 시장에서 그 1~2명에 들어갈 정도의 수준인 것은 없어 불합격한 적이 많다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;TRY&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 대학교 졸업도 했고 대외활동과 프로젝트에서는 부족하지 않을 만큼 경험을 쌓은 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 내년 상반기에는 주로&amp;nbsp;&lt;b&gt;코딩테스트, NCS, 전산 필기&lt;/b&gt; 이렇게 3개에 집중해서 준비할 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;교육&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;교육은 크게 유레카, 싸피, 오픈소스 멘토링, 오픈소스 컨트리뷰션 아카데미 4개로 분류했다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유레카&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuCNFF/btsLB1L66Lb/DzQD7rbBI6nHSTeZEyKcBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuCNFF/btsLB1L66Lb/DzQD7rbBI6nHSTeZEyKcBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuCNFF/btsLB1L66Lb/DzQD7rbBI6nHSTeZEyKcBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuCNFF%2FbtsLB1L66Lb%2FDzQD7rbBI6nHSTeZEyKcBk%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;370&quot; height=&quot;493&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4학년 1학기를 마치고 싸피 12기와 유레카 합격을 했지만, 졸업 예정자가 아니었기 때문에 유레카에 입과했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좋은 강사님과 학생들과 함께 해서 즐겁게 했던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 비대면 과정이라 강사님께서 배려해 주셔서, 하반기 공채가 시작한 시점부터는 학업과 취준 생활을 병행할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 과정 동안 프로젝트를 여러 번 진행했는데, 그중 의미 있던 프로젝트는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 프로젝트인 &lt;a href=&quot;https://jun10920.tistory.com/48&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Filmeet&lt;/a&gt;과 종합 프로젝트인 &lt;a href=&quot;https://jun10920.tistory.com/47&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Naviya&lt;/a&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Filmmet에서는 보통 나와 비슷한 실력을 가진 개발자와 프로젝트를 진행하다가, 처음으로 나보다 개발을 더 잘하는 백엔드 개발자들과 프로젝트를 진행하면서 많은 인사이트를 얻었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;거기에 더해 개인적으로 DevOps 역할을 맡아&lt;a href=&quot;https://jun10920.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; 인프라 경험&lt;/a&gt;도 쌓고, 멘토님들의 조언을 통해 이전의 성능테스트 경험보다 발전하여 &lt;a href=&quot;https://jun10920.tistory.com/48&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pinpoint와 Query Plan 분석을 통한 최적화&lt;/a&gt;도 진행했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Naviya에서는 과제 조건이었던 대규모 트래픽 응모 시스템 구축을 맡아, Redis와 Redis Streams를 이용해 해당 시스템을 구축했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 안정성 있게 기능 구축을 했지만, 짧은 기간 안에 구축하느라 Redis에 대해 깊이 있는 이해를 하지 못하고 기능 구현 위주로 진행해서 약간은 아쉽다. 그랬기에 Redis에 대해서 추가로 더 학습할 생각이다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;12기 엠배서더, 12기 코테까지 합격, &lt;a href=&quot;https://jun10920.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;13기 최종합격&lt;/a&gt;까지 어쩌다 보니 많은 인연이 있는 싸피다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;졸업 전 취업이 최우선 목표였기 때문에,&amp;nbsp; 13기에 최종합격할 때는 기쁨보다는 안심이 컸던 거 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하반기에 모두 떨어지더라도, 100만 원씩 받으면서 1년간 더 취업에 도전할 수 있다는..?&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2025년 1월 7일부터 시작하기 때문에 활동에 대해서는 적을 게 없지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피를 시작하기 앞서 왕복 3시간이 넘는 본가에서 다니는 것은 시간이 금인 취준생에게 너무 손해인 것 같아,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 자취방을 구하면서 개발자답게 정보를 입력하면 내가 원하는 조건의 가중치 로직을 바탕으로 랭킹을 짜는 DB를 노션에 구현해서 랭킹을 매겼다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;855&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNM7zf/btsLA6mVmBH/ggcKqlcEAp16eKjTtBy0vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNM7zf/btsLA6mVmBH/ggcKqlcEAp16eKjTtBy0vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNM7zf/btsLA6mVmBH/ggcKqlcEAp16eKjTtBy0vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNM7zf%2FbtsLA6mVmBH%2FggcKqlcEAp16eKjTtBy0vK%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;660&quot; height=&quot;403&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;855&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 랭킹 상위권들에 대해서 같이 조사해 준 희준이와 토론하고, 부동산들에 전화해서 직접 임장을 다녔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 하루에 12곳 이상의 매물을 확인하고, 계약하면서 배운 것들이 많다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주식 투자에 관심이 많아 군대를 가기 전부터 공부했던 나에게, 부동산 투자 또한 재밌을 것 같다는 생각이 들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 내 집 장만을 위해서 알아야 하는 최소한의 부동산 지식의 필요성을 느껴, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;취업을 하고 나서 안정이 되면 부동산 공부를 시작하겠다는 다짐을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오픈소스 멘토링&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;김인제 님이 진행하는 오픈소스 멘토링의 6기에서 활동했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오픈소스 라이브러리인&lt;a href=&quot;https://jun10920.tistory.com/39&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; Spring AI&lt;/a&gt;에 기여하였는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로 메인테이너와 토론 끝에 좀 더 나은 방안을 가져온 중국 컨트리뷰터가 Merged 되긴 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 해당 경험을 하면서 우매함의 봉우리를 느끼고 오픈소스 기여의 심리적 장벽을 무너뜨리는데 좋은 경험이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자세한 얘기는 링크된 글을 읽어보길 바란다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오픈소스 컨트리뷰션 아카데미&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과학기술정보통신부가 주최하는 오픈소스 컨트리뷰션 아카데미(체험형)에 참여하고 수료하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2N80Q/btsLAgw4ReI/spp3cBYV2ZKOUdvR1tuTXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2N80Q/btsLAgw4ReI/spp3cBYV2ZKOUdvR1tuTXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2N80Q/btsLAgw4ReI/spp3cBYV2ZKOUdvR1tuTXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2N80Q%2FbtsLAgw4ReI%2Fspp3cBYV2ZKOUdvR1tuTXK%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;681&quot; height=&quot;328&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;OKKY 제작자이신 최광모 멘토님께 교육을 받았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;학생들의 발표 위주로 멘토링이 진행되어 사실 역량 발달에는 큰 도움이 되지 않았지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;멘토님과 더불어 같이 수강하는 멘티들의 수준이 높아 좋은 개발자 분들과의 네트워킹이 좋았던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 같이 함께 했던 멘티 분들 중에서는 이런 취업한파 속에서도 카카오 헬스케어와 금융결제원에 이번 하반기에 취업하셨다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유레카에서 진행한 프로젝트와 별개로, 직접 실제 유저들에게 쓰임 받는 프로덕트를 만들고 싶어 기획하고, 팀원을 모아 서비스를 운영했던 Now, Here 프로젝트를 진행했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #9d9d9d;&quot;&gt;프로젝트 링크 : &lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://www.now-here.site/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.now-here.site/&lt;/a&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 프로젝트를 진행하면서 고객 중심의 가치 실현과 깊이 있는 고민을 통한 개발을 경험해 본 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 유저들에게 서비스하면서 개발자가 고려했을 때 좋은 것이 아니라, 유저가 원하는 것들을 직접 피드백받아 반영해 보면서 관점의 차이를 느끼게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 수많은 로그를 처리하는 방법이나, 다양한 클라우드 서비스를 이용하면서 어떻게 하면 비용 절감을 할 수 있는지 고민하는 등&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 한정된 프리티어 자원을 최대한 사용하려다 보니, 최소한의 자원에서 착즙 해보는 경험을 해보면서 깊이 있는 고민을 통해서 개발을 하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 실시간으로 유저들의 활동을 기반으로 한 데이터 기반 매칭 알고리즘을 구축하거나, 고가용성 보장을 위한 M-S 아키텍처 설계, 성능 테스트 이후 단계별 최적화 등을 의미한다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 노력한 과정 중에 디스콰이엇에 개발기를 작성하고 디스콰이엇 이번주 뉴스레터에도 뽑혔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(관련 글)&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735549667350&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;Log.info(&amp;rdquo;Now, Here BE 난중일기&amp;rdquo;) | Disquiet*&quot; data-og-description=&quot;들어가며세상에 좋은 프로젝트는 많지만, 실제로 쓰이는 프로젝트가 더 유의미하다고 판단하기에 유저가 실제로 사용하는 프로젝트를 만들기 위해서 Now, Here 프로젝트를 기획했습니다.이번 서&quot; data-og-host=&quot;disquiet.io&quot; data-og-source-url=&quot;https://disquiet.io/@1nnsuu12/makerlog/log-info-now-here-be-%EB%82%9C%EC%A4%91%EC%9D%BC%EA%B8%B0&quot; data-og-url=&quot;https://disquiet.io/@1nnsuu12/makerlog/log-info-now-here-be-난중일기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5yBBf/hyXWAOAqgH/SZrrKA28auHuNxziPzaIZ0/img.jpg?width=1269&amp;amp;height=463&amp;amp;face=0_0_1269_463,https://scrap.kakaocdn.net/dn/bfurie/hyXSDe9Tp5/gdMOVpuSFYQEorkX5WJ7a0/img.jpg?width=1269&amp;amp;height=463&amp;amp;face=0_0_1269_463&quot;&gt;&lt;a href=&quot;https://disquiet.io/@1nnsuu12/makerlog/log-info-now-here-be-%EB%82%9C%EC%A4%91%EC%9D%BC%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://disquiet.io/@1nnsuu12/makerlog/log-info-now-here-be-%EB%82%9C%EC%A4%91%EC%9D%BC%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5yBBf/hyXWAOAqgH/SZrrKA28auHuNxziPzaIZ0/img.jpg?width=1269&amp;amp;height=463&amp;amp;face=0_0_1269_463,https://scrap.kakaocdn.net/dn/bfurie/hyXSDe9Tp5/gdMOVpuSFYQEorkX5WJ7a0/img.jpg?width=1269&amp;amp;height=463&amp;amp;face=0_0_1269_463');&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;Log.info(&amp;rdquo;Now, Here BE 난중일기&amp;rdquo;) | Disquiet*&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;들어가며세상에 좋은 프로젝트는 많지만, 실제로 쓰이는 프로젝트가 더 유의미하다고 판단하기에 유저가 실제로 사용하는 프로젝트를 만들기 위해서 Now, Here 프로젝트를 기획했습니다.이번 서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;disquiet.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sK2SS/btsLARXZxPI/06dthHlxrryz83dWTbTN20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sK2SS/btsLARXZxPI/06dthHlxrryz83dWTbTN20/img.png&quot; data-alt=&quot;디스콰이엇 이번주 뉴스레터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sK2SS/btsLARXZxPI/06dthHlxrryz83dWTbTN20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsK2SS%2FbtsLARXZxPI%2F06dthHlxrryz83dWTbTN20%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;295&quot; height=&quot;640&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;640&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 통해서 워케이션 플랫폼에서 협찬 제의도 오는 등 다양한 기회도 같이 얻았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아마 다양한 일들을 병행하고 있지 않았다면, 어떻게든 시간을 내서 참여했을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자격증&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해 목표한 자격증은 정보처리기사와 SQLD 자격증이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SQLD&lt;/a&gt;의 경우 하루 반을 공부해서 간단하게 취득하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정보처리기사가 희한한데, 1차 때 필기를 합격하고 2차 때&amp;nbsp; 첫 실기를 봤을 때는 내가 시험장에서 끝나고 가채점 확인을 할 때 생각보다 실수를 많이 해서 합격 컷에서 1개 더 틀려 아쉽게 불합격했었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 3차 때 한 번 더 시험을 보았는데, 이번엔 시험 끝나고 3번 가채점해 본 결과 모두 75점이어서 가볍게 합격했다고 생각했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 합격 발표날 또 합격 컷보다 5점이 부족해서, 가채점인 75점과 약 20점이나 차이 나는 것이 이상해 재확인을 요청하였지만 문제없다는 답변을 들었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다시 복기를 해봐도 분명 75점인데, 왜 55점이 또 나왔는지... &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;OMR도 아니고 단답식 문제인데 실수를 4개나 했다는 게 내 잘못이지만 정말 이해가 안 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아무튼! 내년 1회 차에 다시 도전해 볼 생각이다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어학으로는 OPIC을 준비하지 않고 봐서 IM3를 받았는데, 상반기에 준비해서 IM1을 받은 걸 보면 운이 좋았던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그저 팁이라곤, 좀 더 자신감 있게 얘기한 것 밖에 없다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인생&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년과 마찬가지로 올해도 쉬는 날 거의 없이 개발만 하면서 살았기 때문에, 개발 외적인 내 인생에 대해서 정리할 내용이 별로 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 한 번 모아서 정리해 보자면,&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;학교&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2018년에 항공 전공으로 들어간 학교, 이후에 준사관 시험을 위해서 1년간 휴학하고 복학해서 복수전공도 하면서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;열심히 다닌 학교를 이제야 마무리했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1학기까지 대부분의 졸업 요건을 마쳤기 때문에 2학기에는 온라인 강의로만 수강하였다.&lt;/span&gt;&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;2400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5l4VX/btsLATnYONP/EU53vmQ2hU0KOyrKyL3EXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5l4VX/btsLATnYONP/EU53vmQ2hU0KOyrKyL3EXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5l4VX/btsLATnYONP/EU53vmQ2hU0KOyrKyL3EXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5l4VX%2FbtsLATnYONP%2FEU53vmQ2hU0KOyrKyL3EXK%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;375&quot; height=&quot;833&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2400&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 최종적으로&lt;b&gt; 전체 학점 4.03&lt;/b&gt;으로 학교를 졸업하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;열심히 학습한&lt;b&gt; SW복수전공 같은 경우는 4.35&lt;/b&gt;로 졸업하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2개의 학위를 따기 위해 2번의 졸업시험, 졸업프로젝트가 있었지만 결론적으로 하길 잘했다고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 이렇게 빡세진 취업 시장에서 비전공보다는 훨씬 낫다고 생각하기 때문이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;블로그&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;블로그의 경우 현재 기준으로 &lt;b&gt;조회수가 31500&lt;/b&gt;이 넘는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm5nWh/btsLCoNMWPs/3KNbYUwIwjeQ22ShNt6Sn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm5nWh/btsLCoNMWPs/3KNbYUwIwjeQ22ShNt6Sn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm5nWh/btsLCoNMWPs/3KNbYUwIwjeQ22ShNt6Sn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm5nWh%2FbtsLCoNMWPs%2F3KNbYUwIwjeQ22ShNt6Sn1%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;1140&quot; height=&quot;450&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;450&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년 12월 말에 시작했는데, 보다시피 5월까지는 한 달 내내 조회수가 5~600회도 안 나오던 시기였다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 이제껏 내가 살아온 인생같이, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우직하게 꾸준히 작성하다 보니 오히려 글을 적게 쓴 하반기에 과거의 글들이 떠오르면서 한 달 평균 7000회 이상 조회수가 나왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 대단한 조회수는 아니지만 나름의 성과를 얻었다고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 운동과 블로그를 통해서 배운 것은 결과는 &lt;b&gt;운칠기삼&lt;/b&gt;이라는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 기술 3이 있어야 운이 왔을 때 잡을 수 있고, 기술은 성실함에서 생긴다는 것을 배웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;취업도 실제로 여름방학 시기에 운이 찾아왔었지만, 내가 알아보지 못해 잡지 못했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 경험들에서 배운 것처럼 다시 운이 찾아왔을 때 꼭 잡을 수 있도록 내년 한 해 동안도 성실하고 우직하게 해 볼 생각이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운동&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 인생에서 가장 중요한 부분 중 하나를 차지하는 헬스를, 올해 하반기에는 아예 1번도 하지 못했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 운동으로 키운 몸무게 83kg에서 무려 75~6kg로 헬스인이 가장 무서워하는 근손실도 무지막지하게 났다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운동을 못한 이유는 기본적으로 운동을 다녀와서 씻고 하면 2~3시간이 걸리고, 이후에 졸려서 집중력이 확 낮아지는데, 하반기에 기본적으로 3~4개 이상을 병행했던 나에게 시간이 너무 부족했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 유산소를 기피하던 헬창인 내가 시간은 부족하고 운동은 해야겠으니 겨울이 시작되기 전까지 &lt;b&gt;하루 30분 러닝&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평생 유산소를 싫어했고, 군대에서도 전부 특급인데 구보만 2급이라 특급 전사를 따지 못했던 내가 러닝을 하였는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 한 번도 쉬지 않고 30분을 뛰는 것을 성공했을 때 깨달은 것은, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 힘들지만 한걸음 한걸음 가다 보면 목표에 도달할 수&amp;nbsp; 있다는 것을 머리가 아니라 몸으로 느끼게 된&amp;nbsp; 순간이었다.&lt;/span&gt;&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;2400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ICkOg/btsLBlD9y4E/KCIYaxIfMJy7mUfCvuVIn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ICkOg/btsLBlD9y4E/KCIYaxIfMJy7mUfCvuVIn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ICkOg/btsLBlD9y4E/KCIYaxIfMJy7mUfCvuVIn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FICkOg%2FbtsLBlD9y4E%2FKCIYaxIfMJy7mUfCvuVIn1%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;295&quot; height=&quot;656&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 거대한 근육질 몸만을 추구했던 내가, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;적당히 유산소와 헬스를 겸비한 적당히 탄탄한 몸으로 추구하는 육체미도 바뀌게 된 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내년 상반기부터는 대학교와 유레카는 끝나니, 헬스를 다시 제대로 시작해 볼 생각이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;감사한 분들&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올 한 해도 정말 열심히 살았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 멘토의 역할을 해주신&lt;b&gt; 정영진 님과, 장원익 님&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한 분은 강연을 통해서 , 한 분은 유레카를 통해서 알게 된 사이이고 내가 개인적으로 커피챗을 요청해 인연이 시작된 사이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한 분은 개발 철학을, 한 분은 실제 취업을 위한 유용한 내용들을 알려주셨다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 중간에 잠깐 일본 취업에 대한 고민이 들어, 유투버이신 &lt;b&gt;&lt;a href=&quot;https://www.youtube.com/@SlowSteadyBrown&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;브라운님&lt;/a&gt;께&lt;/b&gt; 연락을 드려 2시간 동안 조언을 들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;멘토링을 하면서 지금까지 쌓아온 것이 아까우니 한국에서 킵고잉 하라는 결론이 났지만 고민을 더 오래 하면서 시간을 낭비하지 않게 조언해 주시고 원래는 1시간 조언해 주신다고 하셨는데 2시간 동안 정성 들여서 조언해 주신 브라운님께 감사하다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 다양한 좋은 동료들을 만났다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상반기 회고에 적었던&lt;b&gt; 희준이는&lt;/b&gt; 하반기에도 최고의 동료였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;취준 역시 계속 서로 공유하면서 진행하였는데, 결론적으로 희준이는 좋은 SI 기업에 취업하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;희준이가 최종 발표를 기다릴 때는 내가 취업할 때 결과를 기다린 것보다 더욱 마음 졸이며 기다렸던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좋은 개발자가 좋은 기업에 취업한 것이라, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이외에도 개발자의 길을 걷게 조언했던&lt;b&gt; 인수, 교현이,&lt;/b&gt; 프로젝트를 진행하면서 많은 인사이트를 줬던 &lt;b&gt;재진, 동현이 형,&lt;/b&gt; 힘든 취준 생활에 서로 많은 응원을 했던 &lt;b&gt;지윤 누나&lt;/b&gt;와 금융권 관련해서 조언을 준 &lt;b&gt;우진이,&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막으로 가장 고마운 사람은 바로 &lt;b&gt;나 자신&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한 해를 돌아보면서, 좀 더 나은 선택을 했으면 어땠을까 하는 아쉬움도 있지만 매사에 최선을 다해서 후회하지는 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상반기에는 번아웃의 연속이었으며 번아웃이 아닌 순간이 있었나 싶은데, 이제는 역치가 높아져 편안한 마음으로 잘 지내고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;직업적으로 열심히 사는 삶과, 워라밸을 챙기는 삶에 대해서도 고민이 많았는데 기왕 사는 거 최선을 다해보고 싶다는 결심이 들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 인생의 방향을 결정하는 큰 결정을 내릴 때도 과거에 비해 고민 없이 결정하게 되는 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;즐거우면서 동시에 고난했던 2024년을 잘 이겨낸 나 자신에게 가장 고맙다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리하며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회고의 서두에 &lt;b&gt;마중물&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마중물이란, 비유적 표현으로는 &lt;b&gt;'약간의 계기를 마련하여 잠재성을 이끌어내 주는'&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발을 시작하고 가장 많은 것을 공유한 희준이에게 들은 나에 대한 피드백은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생각해 보면 항공정비 -&amp;gt; 준사관 -&amp;gt; 개발로 넘어간 것은 나의 주체적인 선택이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 복수전공, 수많은 프로젝트, 부트캠프, 취업 경험, 다양한 대외활동 등 수동적으로 한 것이 하나도 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 어떤 활동을 하든 간에 모두가 합의한 큰 목표를 달성하기 위해&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;크게는 효율적인 협업 프로세스를 도입하고, 협업하기 위한 다양한 인프라를 세팅하는 것뿐만 아니라&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작게는 모두의 요구사항과 불만을 수용하고 일정을 놓치지 않게 노티를 주는 등&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종적인 목표를 이루기 위한 &lt;b&gt;'마중물'&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발자들의 기술적 능력이 상향 평준화된 지금, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회고를 진행하면서 재밌는 것은 매번 회고 글을 작성할 때는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러고 반년이나 1년 뒤에 해당 글을 다시 읽어보면, 귀여웠던 수준의 나를 보게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음에 회고할 때의 내가 지금의 나를 귀엽다 생각할 수 있도록 2025년도 열심히 살아볼 예정이다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans 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;&lt;/p&gt;</description>
      <category>회고</category>
      <category>회고</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/51</guid>
      <comments>https://jun10920.tistory.com/51#entry51comment</comments>
      <pubDate>Mon, 30 Dec 2024 19:29:16 +0900</pubDate>
    </item>
    <item>
      <title>[SSAFY] 싸피 13기 전공자 합격 후기 - 최소한의 준비를 곁들인...</title>
      <link>https://jun10920.tistory.com/50</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재도 몇 개의 회사에서 전형을 진행 중이지만, 혹시나 이번 하반기에 모두 떨어졌을 때를 대비해서&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유레카를 수료한 이후 공백기를 위해 싸피에 지원했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대학교 4-2학기, Ureka 프로젝트, 많은 회사들의 자소서-코테-면접들을 병행하고 있었기 때문에&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피를 위해 다른 준비를 하진 않았고 그냥 취업준비 하면서 정리한 내용들을 바탕으로 지원했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로 감사하게도 최종합격을 수월하게 하였네요.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans 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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1697&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5rxxT/btsLAswPmAl/kDeXJCvcTvlDTollkGxYr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5rxxT/btsLAswPmAl/kDeXJCvcTvlDTollkGxYr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5rxxT/btsLAswPmAl/kDeXJCvcTvlDTollkGxYr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5rxxT%2FbtsLAswPmAl%2FkDeXJCvcTvlDTollkGxYr1%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;308&quot; height=&quot;436&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1697&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서류 지원&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피는 기업 자소서와 다르게, 교육을 위한 기관이라 그런가 간단한 인적사항과 간단한 에세이 1문항만 작성하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;향후 어떤 SW 개발자로 성장하고 싶은지 SW 관련 경험을 토대로 기술하고, SSAFY에 지원하신 동기에 대해서도 작성 바랍니다. (500자 내외 작성), 최대 600자까지 입력 가능&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;짧은 글 안에 저를 어필해야 하고, 실제로는 교육기관이기 때문에 나의 기술적 역량을 강조하기보다는&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;적당한 SW 경험 + 부족한 점 + 싸피를 통해 어떻게 채우겠다&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 느낌으로 작성하는 게 좋다고, Ureka에서 함께 프로젝트 진행한 팀원의 조언이 있었습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만..!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저는 서론에서 말씀드린 바쁜 상황이었기 때문에 싸피를 위해서 자소서를 첨삭하고 글을 다듬을 시간은 없었고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그냥 자소서를 150건..? 이상 작성한 상황이라 적당히 비슷한 질문에 답변했던 내용을 가지고 와&amp;nbsp;글자 수에 맞게만 수정하여 제출했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 내용은 위의 추천과 다르게, 굉장히 저의 SW 역량을 강조하는 글이었지만 별다른 문제없이 합격하였습니다.&amp;nbsp;&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고로 과거에 저는 12기 때 대학교 졸업예정자는 아니라서 면접은 포기했지만, 코딩테스트까지는 합격한 경험이 있습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그때도 그냥 자소서에는 힘들이지 않고, 코테를 올솔했더니 쉽게 붙은 것을 보면 전공자에게 자소서가 그렇게 중요한 것 같지는 않은..? 뇌피셜이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/31&quot;&gt;https://jun10920.tistory.com/31&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735370469323&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;[SSAFY] 싸피 12기 자소서 &amp;amp; 코딩테스트 합격 후기 (전공자)&quot; data-og-description=&quot;결과적으로는 사정상 다른 부트캠프를 갔지만, 최소한의 시간을 들여 싸피 자소서와 코딩테스트에 합격하였습니다.이 과정을 공유하면 도움이 될 분들이 계실 것 같아서 글을 작성합니다.지원 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/31&quot; data-og-url=&quot;https://jun10920.tistory.com/31&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KEz8G/hyXSzJ8z7j/91zYqlzaPrvsonMIP7bFlK/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/b20JYh/hyXSsK1Q4y/g7aj3urPGM0ddEhO0fzwcK/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/bjubqy/hyXSvub1ce/66YfzBV5ftckQarxZBRAJk/img.png?width=983&amp;amp;height=257&amp;amp;face=0_0_983_257&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/31&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KEz8G/hyXSzJ8z7j/91zYqlzaPrvsonMIP7bFlK/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/b20JYh/hyXSsK1Q4y/g7aj3urPGM0ddEhO0fzwcK/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/bjubqy/hyXSvub1ce/66YfzBV5ftckQarxZBRAJk/img.png?width=983&amp;amp;height=257&amp;amp;face=0_0_983_257');&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;[SSAFY] 싸피 12기 자소서 &amp;amp; 코딩테스트 합격 후기 (전공자)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;결과적으로는 사정상 다른 부트캠프를 갔지만, 최소한의 시간을 들여 싸피 자소서와 코딩테스트에 합격하였습니다.이 과정을 공유하면 도움이 될 분들이 계실 것 같아서 글을 작성합니다.지원&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SW 적성진단&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 블로그 글에서 언급한 것처럼, 코테도 이미 합격한 경험이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코테 난이도는 &lt;b&gt;백준 기준 브론즈 상위 ~ 실버 중간&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 오전/오후 반을 나눠서 문제가 다르게 출제되는데요, 12-13기를 모두 경험했을 때 단순히 2 기수를 비교한 거지만 오전보단 오후가 상대적으로 쉽게 출제가 됐습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 경우 12기, 13기 모두 오후 반을 봤고, 주어진 70분 중에 40분 내로 검산까지 마무리한 다음 퇴실 시간까지 쉬다가 바로 퇴실했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 취업준비도 병행하느라 코테도 종종 보고 있던 상황이라서, 싸피 코테를 위해서 별다른 준비를 하진 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인터뷰&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두둥..!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기서 약간 의외였던 게 저처럼 Ureka 소속의 개발자 중에서 회사에 꽤나 자주 서류-코테를 붙는 다른 개발자들이 저와 같은 생각으로 공백기를 위해 싸피를 넣었는데 이 단계에서 전부 떨어졌습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피 뿐만 아니라, 이번에 유레카 2기 지원 경쟁률도 훨씬 높아졌다는 걸 보면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아무튼 인터뷰는 &lt;b&gt;PT 면접과 개인 면접&lt;/b&gt; 두 가지로 나눠져 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;면접 내용에 대해서는 대외비라 자세하게 말씀드릴 수는 없지만, 팀플 같은 곳에서 발표 많이 해봤고, 팀장이나 토론이나 이런 대중 앞에서 얘기를 많이 해본 분이라면 굳이 따로 준비를 안 해도 될 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저는 항상 리더 역할을 많이 맡았고, 팀플 할 때는 주로 발표를 맡았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 현재 바쁜 상황이라 면접을 따로 준비할 시간이 없어서 지금은 취업한 친한 동생이 정리한 자료를 바탕으로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;면접 전날 저녁 1분 자기소개 작성 + IT 관련 뉴스 좀 읽다 자기 정도만 하고 가서 면접 봤습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;++ 추가로! 지하철 타고 가는 길에 봤던 PT 면접 영상이 꽤나 도움이 됐습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고하시면 좋을 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=DOvCIrwMPbQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/7nuuV/hyXSydqNgI/Luc4hr6xgNxX7rqcVKQl50/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=472_184_676_406,https://scrap.kakaocdn.net/dn/cewbnr/hyXSE5JRhk/X7HPiJlkUFAUcpyeYjmP2K/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=472_184_676_406&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;PT면접 평가요소 및 발표 템플릿/시나리오_피티 면접 실전 활용&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/DOvCIrwMPbQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 결과 발표&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjCwBv/btsLAaJGDIO/jFGb63VGE7r787MJBli861/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjCwBv/btsLAaJGDIO/jFGb63VGE7r787MJBli861/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjCwBv/btsLAaJGDIO/jFGb63VGE7r787MJBli861/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjCwBv%2FbtsLAaJGDIO%2FjFGb63VGE7r787MJBli861%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;598&quot; height=&quot;311&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 수료한 Ureka와 같은 교육기관인 멀티캠퍼스에서 주최하는 거라, 교육 내용이 크게 다르지는 않겠지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;월 100만 원씩 지원해 주고, 많은 취업 지원 혜택 그리고 금융권 서류 가점 등 큰 혜택이 많은 싸피에 합격해서 든든한 보험이 생긴 것 같아 안심했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;약간 싸피가 노력 없이도 붙을 수 있는 부트캠프라고 오해하실 수도 있는데 전혀 아닙니다.&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 다음은, 취업한 내용이나 회고로 돌아오겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기왕이면 싸피의 목표인 취업을 미리 성공해서, 취업 후기로 돌아오고 싶네요 :&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 긴 글 읽어주셔서 감사합니다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>개발경험</category>
      <category>SSAFY</category>
      <category>ssafy후기</category>
      <category>개발자후기</category>
      <category>면접팁</category>
      <category>삼성청년SW아카데미</category>
      <category>싸피서울캠</category>
      <category>취업성공</category>
      <category>코딩교육</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/50</guid>
      <comments>https://jun10920.tistory.com/50#entry50comment</comments>
      <pubDate>Sat, 28 Dec 2024 16:45:12 +0900</pubDate>
    </item>
    <item>
      <title>[Filmeet] 야, 공짜로 할 수 있을 때 AWS 써라. (부제 : DevOps는 정말 어려워)</title>
      <link>https://jun10920.tistory.com/49</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유플러스 수료를 하루 앞두고 적는 Filmeet의 인프라 구축기입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프론트와 백엔드의 CI/CD 파이프라인을 구축하고, 테스트 환경을 팀원 모두 동일하게 가져가기 위해서 인프라를 설정한 경험은 매우 값지고, 어려운 경험이었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;진정으로 데브옵스는 백엔드의 2차 전직 같은... 느낌을 받았습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;네트워크 전공 시간에 배운 내용을 인프라를 우선 돌아가게 구축하고 추후에 공부하면서 깨닫는 부분이 많았던 것 같습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아키텍처&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mR40X/btsLtaDr2Zj/aLYGWhfi1Hd1pDeFKR2sYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mR40X/btsLtaDr2Zj/aLYGWhfi1Hd1pDeFKR2sYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mR40X/btsLtaDr2Zj/aLYGWhfi1Hd1pDeFKR2sYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmR40X%2FbtsLtaDr2Zj%2FaLYGWhfi1Hd1pDeFKR2sYK%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;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 제가 크게 3가지로 나누어서 진행했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 프론트엔드 CI/CD 파이프라인 구축&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 백엔드 CI/CD 파이프라인 구축&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 배포 환경과 테스트 환경을 분리&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;또한 사용한 스택은 정리하자면&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;백엔드&lt;/b&gt;: ECS (Fargate) + Amazon ECR + ALB&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;데이터&lt;/b&gt;: Amazon RDS (MySQL)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이미지 저장소&lt;/b&gt;: AWS S3&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;CI/CD&lt;/b&gt;: GitHub Actions&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;모니터링&lt;/b&gt;: AWS CloudWatch&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프론트엔드&lt;/b&gt;: Amplify&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 파트에 대해서 설명하면서 자세하게 어떤 이유에서 해당 스택들을 선택하게 되었는지 설명드리겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;b&gt;프론트엔드 CI/CD 파이프라인 구축&lt;/b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;순서상 프론트엔드 CI/CD 파이프라인 구축을 마지막에 했지만, 제일 처음으로 소개하게 됐네요.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 CI/CD란 무엇일까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바로 '&lt;b&gt;Continuous Integration(지속적 통합) &amp;amp; Continuous Deployment(지속적 배포) '를&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 풀어서 설명하면,&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지속적 통합 : 코드 변경 사항을 자주 통합, 자동화된 빌드와 테스트를 통해 코드 품질 보장&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지속적 배포 : 코드 변경 사항이 자동으로 배포&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;왜 CI/CD를 구축할까요?&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 이유를 찾기 위해선 우선 DevOps라는 개념부터 알아야 합니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DevOps란 &lt;b&gt;개발(Development)과 운영(Operation)&lt;/b&gt;의 합성어로, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소프트웨어 개발과 운영 팀 간의 효율적인 협업을 목표로 하는 &lt;b&gt;문화&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 결론적으로 &lt;b&gt;효율적인 협업&lt;/b&gt;을 목표로 하며, 기업의 거대화했을 때 나타나는 팀 간의 벽인 &lt;b&gt;사일로&lt;/b&gt;와 정반대의 개념입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 &lt;b&gt;'효율적인 협업'이라는&lt;/b&gt; 목표를 달성하기 위해서 DevOps는 크게 4가지 원칙을 지킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;자동화 :&lt;/b&gt; 빌드, 테스트, 배포와 같은 작업을 자동화하여, 반복 작업을 줄입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;CI/CD : &lt;/b&gt;코드 변경 사항을 자동으로 통합하고 테스트해서, 배포 과정에서의 오류를 줄입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;모니터링과 피드백 : &lt;/b&gt;서비스 상태를 실시간으로 모니터링하고, 문제를 해결합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;협업과 소통 : &lt;/b&gt;개발과 운영 팀이 공통의 목표를 달성하기 위해서 소통합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아무튼 돌고 돌아서 설명한 효율적인 협업을 지향하는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;DevOps&lt;/span&gt;라는 문화를 정착시키기 위해서 쓰이는 도구가 바로 CI/CD입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 통해서 코드 변경 사항이 자동으로 통합되고 테스트되기 때문에 팀원 간의 협업이 쉬워지고, 이를 통해 빠르게 배포하여 서비스에 빠르게 적용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프론트엔드의 경우, &lt;b&gt;AWS Amplify&lt;/b&gt;와 &lt;b&gt;S3+CloudFront&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 Amplify 역시 S3 기반의 환경에 정적 리소스를 업로드하고, CloudFront를 통해 배포하는 것 똑같지만 이를 직접 설정하지 않고 자동으로 처리해 준다는 차이가 있습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;S3와 CloudFront에 대해서 간략히 설명하자면, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;S3&lt;/b&gt;는 Simple Storage Service의 약자로, 이미지, 동영상 그리고 HTML/CSS/JS와 같은 정적 리소스를 저장하고 관리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 특정 버킷을 웹 호스팅 용도로 설정하고 퍼블릭 액세스를 허용하면 HTTP/HTTPS를 통해 웹 콘텐츠를 제공할 수 있습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 &lt;b&gt;CloudFront&lt;/b&gt;는 AWS의 CDN으로, CDN는 콘텐츠 전송 네트워크를 의미하며 S3와 같은 origin에서 데이터를 가져와 사용자와 가장 가까운 엣지 서버를 통해 콘텐츠를 제공함으로써 latency를 최소화하는 기능을 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 캐싱도 하여 자주 액세스 되는 콘텐츠를 엣지 서버에 저장하여 원본 서버에서 I/O 하는 작업 자체를 줄여 성능 또한 향상합니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아무튼! Amplify를 통한 방법과 직접 S3+CloudFront를 설정하는 방법 각각의 장점은&amp;nbsp;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Amplify의 경우 CI/CD 파이프라인이 내장되어 있어 Git 레포지토리만 연동하면 코드 변경 사항이 자동으로 빌드되고 배포되어 큰 설정 없이 진행될 수 있다는 장점이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고&amp;nbsp;S3+CloudFront의 경우 좀 더 배포 환경을 세부적으로 설정할 수 있고, 비용을 좀 더 절약할 수 있다는 장점이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로 프론트엔드는&lt;b&gt; Amplify&lt;/b&gt;를 통해서 구현했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 이유는, 백엔드의 경우 첫 주차에 Github actions + docker + ECR + ECS + Route53 등등을 통해서 CI/CD 구축을 완료했었는데, 프론트엔드의 경우 프로젝트 마지막 주에 CI/CD 구축을 하자는 팀원 간의 합의가 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리하면서 발표도 하고 다양한 것들을 함께 해야 하는 팀장의 역할도 하면서 했던 거라, 최대한 빠르게 배포가 가능한 Amplify를 선택했고, 비용의 경우도 현재는 Ureka에서 팀에게 105만 원을 지원해 줘서 편하게 사용이 가능한 상황이라&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;비용 &amp;lt; 시간&lt;/b&gt;이라는 조건이라고 생각이 들어 Amplify를 선택했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 AWS에서 도메인 구매와 호스팅까지 해주는 Route53을 통해서 filmeet.me 도메인을 통해서 접속할 수 있게 구현을 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;링크 :&amp;nbsp; &lt;a href=&quot;https://filmeet.me/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://filmeet.me/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(하지만 여러분이 이 글을 볼 때는, 이미 Ureka의 지원이 끝나 링크가 안 열릴 가능성이 높습니다. 하하)&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어려웠던 점&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인프라를 세팅하면서, 팀 전체 관리를 하면서, API 개발과 연동, 테스트까지 짧은 프로젝트 기간 내에 진행하느라 우선 기능이 돌아갈 수 있게 구현하고 추후에 학습을 하며 이해하였습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;근데 제가 넉넉하게 지원해 주는 지원금 덕분에 백엔드만 배포가 되어있는 환경에서도 filmeet.net에 배포를 하여&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;api 요청을 &lt;a href=&quot;https://filmeet.me/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://filmeet.net/~&lt;/a&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 실제 프론트엔드 분들의 로컬 환경에서는 import문의 대문자와 소문자가 다르더라고 배포가 되는 반면, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Amplify의 경우 하나라도 철자가 다르면 빌드 에러가 발생해 컨벤션을 지키지 않은 프론트엔드 개발자 분들의 레거시가... 저에게 돌아와... 하나하나 수정하고 빌드하고 하는 과정을 거의 50번은 한 것 같습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 백엔드 CI/CD 구축할 때와 비교해서는 비교적 수월하게 구축한 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b&gt;백엔드 CI/CD 파이프라인 구축&lt;/b&gt; &lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음 사용해 본 AWS라, 첫 주차에 바로 CI/CD 구축을 하기 위해서 목차를 정해서 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;IAM 사용자 생성 및 권한 관리&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;S3 버킷(이미지 저장용) 생성 및 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;애플리케이션 컨테이너화 및 ECR 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;AWS RDS 및 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ElasticCache(Redis)&lt;/span&gt; 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;ECS(Fargate) 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;대상 그룹 및 ALB 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;오토스케일링 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;CI/CD 파이프라인 구축&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;모니터링을 위한 CloudWatch 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. IAM 사용자 생성 및 권한 관리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 첫째로, CI/CD 작업 및 AWS 리소스 관리를 위해 전용 IAM 사용자를 생성했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 최소 권한 원칙에 따라, 아래와 같은 권한을 부여했습니다.&lt;br /&gt;(근데 사실 개발할 때는 AdminFullAccess로 다 풀어놓고 나중에 배포할 때 세팅했던 건 안비밀입니다  )&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;AmazonEC2ContainerRegistryFullAccess&lt;/b&gt;: ECR 접근&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;AmazonECS_FullAccess&lt;/b&gt;: ECS 및 클러스터 관리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;CloudWatchFullAccess&lt;/b&gt;: 로그와 모니터링 데이터 관리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;RDSFullAccess&lt;/b&gt;: RDS 관리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;S3FullAccess&lt;/b&gt;: 이미지 파일 저장 및 관리&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. S3 버킷(이미지 저장용) 생성 및 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그다음으로는, 애플리케이션에서 사용하는 용량이 큰 이미지 파일을 저장하고 실제 RDS에서는 url 형태로 저장하기 위해서 S3 버킷을 생성했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 애플리케이션 컨테이너화 및 ECR 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 이후, 애플리케이션을 Docker 컨테이너로 빌드하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자바 프로젝트의 경우 간단하게 빌드 및 푸시할 수 있는 라이브러리인 Jib 플러그인을 통해 ECR로 푸시했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 AWS의 ECR 레지스트리를 생성하여, Jib 플러그인을 통해 푸시한 Docker 이미지를 저장하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ECR에 최신(LATEST) 이미지 파일이 업로드되면 자동으로 ECS에 정의한 태스크가 배포되도록 설정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. AWS RDS 및 ElasticCache(Redis) 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 팀원들과 동일한 DB를 사용하기 위해서 AWS에 RDS(MySQL) 인스턴스와 ElasticCache(Redis)를 생성했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 거기에 추가로, 로컬에서도 지속적으로 ElastiCache를 확인할 수 있게 확인용 EC2를 SSL 터널용으로 열어 연결했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;왜냐면, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ElastiCache는 AWS의 인스턴스에서만 접근이 가능하기 때문에 로컬에서 바로 접근하면 연결이 되지 않았기 때문입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;5. ECS(Fargate) 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후에 ECS 클러스터를 생성하여, Fargate를 사용해 서버리스 컨테이너 실행 환경을 구성했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;배포하는 다양한 방식이 있지만 ECS 그리고 Fargate를 선택한 이유는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프론트엔드 배포할 때 언급한 시간이 가장 중요한 자원이었기 때문인 게 첫 번째 이유였고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제 유저들에게 배포되는 서비스가 아니기 때문에 사용량에 따라 비용이 결정되는 ECS의 Fargate 모드가 오히려 고정적으로 비용이 지출되는 EC2보다 비용 절감에 이득일 거라 생각한 점이 두 번째 이유였습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;각설하고, 태스크 정의에서 Docker 이미지를 설정하고 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;새 컨테이너 배포 시&amp;nbsp;&lt;/span&gt;무중단 배포(Blue/Green)&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;nbsp;방식 설정하였습니다.&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 무중단 배포(Blue/Green)&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;nbsp;방식이란?&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: left;&quot;&gt;기존 버전(Blue)과 새로운 버전 (Green)을 동시에 운영하여 서비스 중단 없이 배포를 진행하는 방식입니다.&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: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: left;&quot;&gt;마치 과거에 DB 관점에서 고가용성을 보장하기 위해서 제가 Master-Slave 아키텍처로 DB를 구성한 적이 있는데, 이와 비슷하게 서버 관점에서 고가용성을 보장하기 위한 전략입니다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;(Master-Slave 아키텍처 관련글)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: left;&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jun10920.tistory.com/43&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734959822969&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;[Now, Here] 성능 테스트_인덱싱과 트랜잭션 관리 최적화&quot; data-og-description=&quot;  성능 테스트 가이드 시리즈  / 클릭 시 이동1.&amp;nbsp;성능 테스트_성능 목표 잡기2.&amp;nbsp;성능 테스트_HikariCP의 연결 최대 풀 설정3.&amp;nbsp;성능 테스트_Caffeine 캐시 설정 및 적용4.&amp;nbsp;성능 테스트_인덱싱과 트&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/43&quot; data-og-url=&quot;https://jun10920.tistory.com/43&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btqpgt/hyXSuVowj3/qnH655iPmfoiQUmC47kdX1/img.png?width=800&amp;amp;height=207&amp;amp;face=0_0_800_207,https://scrap.kakaocdn.net/dn/clkqhS/hyXSrxAI2T/ArozYIz1bUEiZKHnfW6mpk/img.png?width=800&amp;amp;height=207&amp;amp;face=0_0_800_207,https://scrap.kakaocdn.net/dn/bAoIAs/hyXSsiYcMI/Zvp4uEHtWJAsdgTVCzVcLk/img.png?width=1775&amp;amp;height=505&amp;amp;face=0_0_1775_505&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/43&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btqpgt/hyXSuVowj3/qnH655iPmfoiQUmC47kdX1/img.png?width=800&amp;amp;height=207&amp;amp;face=0_0_800_207,https://scrap.kakaocdn.net/dn/clkqhS/hyXSrxAI2T/ArozYIz1bUEiZKHnfW6mpk/img.png?width=800&amp;amp;height=207&amp;amp;face=0_0_800_207,https://scrap.kakaocdn.net/dn/bAoIAs/hyXSsiYcMI/Zvp4uEHtWJAsdgTVCzVcLk/img.png?width=1775&amp;amp;height=505&amp;amp;face=0_0_1775_505');&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;[Now, Here] 성능 테스트_인덱싱과 트랜잭션 관리 최적화&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  성능 테스트 가이드 시리즈  / 클릭 시 이동1.&amp;nbsp;성능 테스트_성능 목표 잡기2.&amp;nbsp;성능 테스트_HikariCP의 연결 최대 풀 설정3.&amp;nbsp;성능 테스트_Caffeine 캐시 설정 및 적용4.&amp;nbsp;성능 테스트_인덱싱과 트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;6. 대상 그룹 및 ALB 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;추가로, 로드밸런싱을 위한 ALB 설정과, ALB에서 트래픽을 ECS의 컨테이너로 전달하기 위한 대상 그룹을 설정했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;구현 당시에는 블로그와 AI를 통해서 로드밸런싱이라는 목적 달성을 위해 급하게 구현했는데, 추후에 직접 손으로 그려가며 학습하니 이해가 되었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/swRWH/btsLvkdxtZt/zrPOFJ7pqoid9Y1d5VQjs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/swRWH/btsLvkdxtZt/zrPOFJ7pqoid9Y1d5VQjs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/swRWH/btsLvkdxtZt/zrPOFJ7pqoid9Y1d5VQjs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FswRWH%2FbtsLvkdxtZt%2FzrPOFJ7pqoid9Y1d5VQjs1%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;634&quot; height=&quot;619&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;902&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 필기를 요약하자면 아래와 같습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Route 53&lt;/b&gt;은 도메인 요청을 ALB로 전달.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;ALB&lt;/b&gt;는 트래픽을 다중 서브넷(AZ)으로 분산.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대상 그룹(Target Group)은 헬스 체크를 통해 정상 서버를 식별.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;트래픽은 &lt;b&gt;정상 서버로만 전달&lt;/b&gt;되어 안정성을 유지.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 SSL 인증서를 통해서 HTTPS를 활성화시켜서 사용하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;7. 오토스케일링 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그다음으론, 오토 스케일링을 설정하여 트래픽에 따라 컨테이너를 자동으로 확장/축소하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스케일링 조건으론 CPU 사용률을 70%가 초과하면 컨테이너를 2개로 확장하게 설정하였습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 꼭 필요한 설정은 아니었지만, 유레카에서 오토스케일링을 배웠으니 이를 사용해 보는 것에 의미를 두며 설정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;8. CI/CD 파이프라인 구축&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후엔 CI/CD 파이프라인 구축을 위해서 workflow 파일 작성을 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 GitHub Actions를 활용해 코드를 빌드, 테스트, 배포를 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734961303533&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name: Deploy on PR Merge to Main

on:
  pull_request:
    types: [closed]  # PR이 닫힐 때 실행
    branches:
      - main  # main 브랜치에 머지될 때 작동
jobs:
  deploy:
    if: &amp;gt;
      (github.event_name == 'push') ||
      (github.event_name == 'pull_request' &amp;amp;&amp;amp; github.event.pull_request.merged == true)
    runs-on: ubuntu-latest  # GitHub Actions 실행 환경 설정

    # 작업 디렉토리 기본값 설정
    defaults:
      run:
        working-directory: filmeet  # 'filmeet' 디렉토리에서 명령 실행

    # 전역 환경 변수 설정
    env:
      AWS_REGION: ap-northeast-2  # AWS 리전 설정

    steps:
      # 1️⃣ 저장소 체크아웃
      - name: 소스 코드 체크아웃
        uses: actions/checkout@v3

      # 2️⃣ AWS 자격 증명 설정
      - name: AWS 자격 증명 구성
        uses: aws-actions/configure-aws-credentials@v2
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}  # AWS Access Key ID (GitHub Secrets에서 가져옴)
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}  # AWS Secret Access Key (GitHub Secrets에서 가져옴)
          aws-region: ${{ env.AWS_REGION }}  # AWS 리전 설정

      # 3️⃣ Java 17 설치
      - name: Java 17 설정
        uses: actions/setup-java@v3
        with:
          java-version: '17'  # 사용하려는 Java 버전
          distribution: 'temurin'  # Java 배포판 설정

      # 4️⃣ Gradle 실행 권한 부여
      - name: Gradle 실행 권한 설정
        run: chmod +x ./gradlew  # Gradle Wrapper에 실행 권한 부여

      # 5️⃣ Amazon ECR에 로그인
      - name: Amazon ECR 로그인
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1  # ECR에 로그인하여 인증 토큰 획득

      # 5️⃣ Docker 이미지 빌드 및 푸시
      - name: Docker 이미지 빌드 및 푸시
        run: ./gradlew jib --no-build-cache
        env:
          AWS_ECR_PASSWORD: ${{ steps.login-ecr.outputs.ecr-login-password }}
          SPRING_DATASOURCE_URL: ${{ secrets.SPRING_DATASOURCE_URL }}
          SPRING_DATASOURCE_USERNAME: ${{ secrets.SPRING_DATASOURCE_USERNAME }}
          SPRING_DATASOURCE_PASSWORD: ${{ secrets.SPRING_DATASOURCE_PASSWORD }}
          SPRING_DATA_REDIS_HOST: ${{ secrets.SPRING_DATA_REDIS_HOST }}
          SPRING_DATA_REDIS_PORT: ${{ secrets.SPRING_DATA_REDIS_PORT }}
          SPRING_CLOUD_AWS_S3_BUCKET: ${{ secrets.SPRING_CLOUD_AWS_S3_BUCKET }}
          SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID: ${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID }}
          SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET: ${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET }}
          SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_ID: ${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_ID }}
          SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_SECRET: ${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_SECRET }}
          SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_NAVER_CLIENT_ID: ${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_NAVER_CLIENT_ID }}
          SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_NAVER_CLIENT_SECRET: ${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_NAVER_CLIENT_SECRET }}
          KOBIS_APIKEY: ${{ secrets.KOBIS_APIKEY }}
          KMDB_APIKEY: ${{ secrets.KMDB_APIKEY }}
          OMDB_APIKEY: ${{ secrets.OMDB_APIKEY }}
          FIREBASE_CONFIG: ${{ secrets.FIREBASE_CONFIG }}
          JWT_SECRET: ${{ secrets.JWT_SECRET }}
          JWT_VALIDITY_ACCESS: ${{ secrets.JWT_VALIDITY_ACCESS }}
          JWT_VALIDITY_REFRESH: ${{ secrets.JWT_VALIDITY_REFRESH }}
          FRONT_REDIRECT_URL: ${{ secrets.FRONT_REDIRECT_URL }}

      # 6️⃣ ECS 서비스 업데이트
      - name: ECS 서비스 업데이트
        run: |
          aws ecs update-service \
            --cluster filmeet-cluster \
            --service filmeet-service \
            --force-new-deployment \
            --deployment-configuration maximumPercent=200,minimumHealthyPercent=75 \
            --health-check-grace-period 300&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;workflow 파일은 구체적으로 설명하자면,&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(1) 이벤트 트리거 설정&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;on: pull_request: PR(Pull Request)이 닫히고 main 브랜치에 병합되었을 때 워크플로우가 실행&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(2) AWS 자격 증명 구성&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AWS 서비스와 상호작용하기 위해 aws-actions/configure-aws-credentials를 사용하여 AWS Access Key와 Secret Key를 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리전은 ap-northeast-2 (서울 리전)으로 설정하여 지연 시간을 최소화&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(3) Java 17 및 Gradle 설정&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java 17: 애플리케이션은 최신 Java LTS 버전인 Java 17을 기반으로 작성&lt;br /&gt;actions/setup-java를 통해 실행 환경에 필요한 Java 버전을 설치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Gradle Wrapper 권한 부여: Gradle 명령 실행을 위한 권한을 추가하여 워크플로우가 원활히 진행되도록 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(4) Docker 이미지 빌드 및 푸시&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Amazon ECR: Docker 이미지를 Amazon ECR에 업로드해 ECS에서 사용할 수 있도록 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Gradle Jib 플러그인: ./gradlew jib 명령을 사용해 Docker 이미지를 빌드&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;환경 변수(Secrets)를 활용하여 민감한 정보를 안전하게 관리&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(5) ECS 서비스 업데이트&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;force-new-deployment: 기존 컨테이너를 교체하여 새 이미지로 배포&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;maximumPercent=200, minimumHealthyPercent=75: 배포 중 최소 75%의 컨테이너가 가용 상태를 유지하도록 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;health-check-grace-period=300: 새로운 컨테이너가 시작된 후 5분간 상태를 확인할 유예 시간 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초반에 헬스 체크를 할 유예 시간을 너무 짧게 줬더니, 계속 배포 실패가 나와서 정말 한참을 배포했던 것 같습니다...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로 수많은 설정 변경과 노가다를 하였지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순히 5분간 상태를 확인하는 설정 하나만 하였더니 멀쩡하게 배포를 성공하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;9. 모니터링을 위한 CloudWatch 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막으로 CloudWatch에 배포한 ECS 서비스의 로그를 전송하여 실시간을 애플리케이션 상태를 확인하도록 설정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성과&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결론적으로,&lt;/b&gt; 위와 같은 과정을 통해서 세 가지 성과를 얻었습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;무중단 배포&lt;/b&gt;: Blue/Green 방식과 ALB를 통해 사용자에게 끊김 없는 서비스 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;트래픽 최적화&lt;/b&gt;: 오토스케일링과 ALB로 성능과 비용을 모두 최적화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;자동화와 안정성 강화&lt;/b&gt;: GitHub Actions와 CloudWatch로 CI/CD와 모니터링이 완벽히 통합&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;배포 환경과 테스트 환경을 분리&lt;/b&gt; &lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막으로, 성능테스트를 위해서 배포 환경과 테스트 환경을 분리했습니다. 자세한 내용은 아래 글을 참고해 주시면 감사하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/48&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jun10920.tistory.com/48&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734961241908&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;[Filmeet] 24초에서 0.1초로: DB 성능 최적화의 여정 _ Query Plan 분석 / 커넥션 풀 조정 심화&quot; data-og-description=&quot;오랜만입니다.계속 취준, 학업, 부트캠프까지 병행하다 보니 블로그에 글을 많이 못 올렸는데매일 300명 이상의 분들이 읽어주셔서 조만간 조회수 30000을 달성하겠네요. 감사합니다 :&amp;gt;벌써 6월 11&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/48&quot; data-og-url=&quot;https://jun10920.tistory.com/48&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btO8bg/hyXSzCoOAk/xUeekPFW0fXyBge9hD9qS1/img.png?width=800&amp;amp;height=300&amp;amp;face=0_0_800_300,https://scrap.kakaocdn.net/dn/dLiZAa/hyXOl6TPEH/WpKWaX4Sg0XEQChCYiDbHk/img.png?width=800&amp;amp;height=300&amp;amp;face=0_0_800_300&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/48&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/48&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btO8bg/hyXSzCoOAk/xUeekPFW0fXyBge9hD9qS1/img.png?width=800&amp;amp;height=300&amp;amp;face=0_0_800_300,https://scrap.kakaocdn.net/dn/dLiZAa/hyXOl6TPEH/WpKWaX4Sg0XEQChCYiDbHk/img.png?width=800&amp;amp;height=300&amp;amp;face=0_0_800_300');&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;[Filmeet] 24초에서 0.1초로: DB 성능 최적화의 여정 _ Query Plan 분석 / 커넥션 풀 조정 심화&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;오랜만입니다.계속 취준, 학업, 부트캠프까지 병행하다 보니 블로그에 글을 많이 못 올렸는데매일 300명 이상의 분들이 읽어주셔서 조만간 조회수 30000을 달성하겠네요. 감사합니다 :&amp;gt;벌써 6월 11&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 docker를 통해서 쉽게 pinpoint를 설정하려고 했지만, 오히려 정확하게 docker를 이해하지 못한 채 디버깅을 하려 하니 계속 먼 길을 돌아가는 기분이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 그냥 ec2 인스턴스에 pinpoint web, collector, hbase 등등을 직접 다운로드하여 세팅하였더니 훨씬 빠르게 세팅을 완료했던 경험이 있습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;역시 제대로 이해하지 않고 사용하면, 에러가 발생했을 때 대응을 못하는 경우가 생겨 오히려 비효율적인 경우가 있는 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;마무리하며&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 Filmeet 프로젝트를 통해 단순히 기술을 사용하는 것을 넘어 &lt;b&gt;서비스를 운영하는 데 필요한 인프라 구축과 DevOps의 중요성&lt;/b&gt;을 몸소 경험할 수 있었습니다. &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히, AWS의 다양한 서비스를 활용하면서 클라우드 기반의 아키텍처 설계와 CI/CD 파이프라인 구축이 얼마나 서비스의 생산성을 높이는지 깨달았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;배운 점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DevOps와 협업의 중요성&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발과 운영이 긴밀히 연결된 DevOps 문화를 실천하면서, 팀원들과의 협업이 얼마나 중요한지 실감했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CI/CD 파이프라인을 통해 인당 배포 시간을 1시간 -&amp;gt; 5분 내로 줄이면서 얼마나 효율적인지 체감했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기술 이해의 깊이&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에는 &quot;작동하는 것&quot;에 초점을 두었지만, 시간이 지날수록 &quot;왜 그렇게 작동하는지&quot;를 이해하는 것이 중요하다는 것을 깨달았습니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 디버깅을 하는 과정에서 이해하지 못하고 사용한 대가를 톡톡히 치렀습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 시간이 여유롭지 못한 상황에서 어쩔 수 없는 선택이라고 생각하지만, 조금이라도 여유를 가질 수 있다면 확실하게 이해를 하고 사용을 하는 것을 목표로 하려고 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;실수로부터의 학습&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;잘못된 설정으로 인해 수차례 배포가 실패했지만, 이 과정에서 문제를 진단하고 해결하는 능력을 키울 수 있었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;실수는 성장의 기회&quot;라는 말이 얼마나 사실인지 다시 한번 느꼈습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;아쉬운 점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;짧은 프로젝트 기간 동안 많은 것을 구현하려다 보니, &lt;b&gt;기술의 깊이 있는 학습&lt;/b&gt;보다는 &quot;작동하게 만드는 것&quot;에 초점이 맞춰졌습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프론트엔드 CI/CD 구축 과정에서 Amplify를 선택하며 시간은 절약했지만, S3와 CloudFront를 직접 설정하는 경험을 놓친 점은 조금 아쉽습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;앞으로의 계획&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트를 통해 경험한 AWS 서비스와 DevOps 프로세스를 더 깊이 학습하고, 배운 내용을 정리하여 다른 사람들에게도 공유하고 싶습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 프로젝트에서는 기능 구현을 넘어, &lt;b&gt;코드 품질과 아키텍처의 최적화&lt;/b&gt;까지 신경 쓰는 개발자로 성장하고 싶습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Filmeet 프로젝트를 함께한 팀원들에게도 감사의 마음을 전하고 싶습니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각자의 역할을 충실히 해낸 덕분에 프로젝트를 성공적으로 마무리할 수 있었습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트를 진행하며 수많은 도전과 장애물을 만났지만, 그 모든 과정이 성장과 배움의 계기가 되었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 이 글을 통해 AWS 서비스와 DevOps를 처음 접하거나 CI/CD 파이프라인을 구축하는 분들에게 참고 자료가 되었으면 합니다. 제가 겪었던 어려움과 해결 과정이 다른 분들에게 도움이 되길 바랍니다.  &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>AWS</category>
      <category>CI/CD</category>
      <category>devops</category>
      <category>Ureka</category>
      <category>유레카</category>
      <category>파이프라인</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/49</guid>
      <comments>https://jun10920.tistory.com/49#entry49comment</comments>
      <pubDate>Mon, 23 Dec 2024 23:06:24 +0900</pubDate>
    </item>
    <item>
      <title>[Filmeet] 24초에서 0.1초로: DB 성능 최적화의 여정 _ Query Plan 분석 / 커넥션 풀 조정 심화</title>
      <link>https://jun10920.tistory.com/48</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오랜만입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;계속 취준, 학업, 부트캠프까지 병행하다 보니 블로그에 글을 많이 못 올렸는데&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매일 300명 이상의 분들이 읽어주셔서 조만간 조회수 30000을 달성하겠네요. 감사합니다 :&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;벌써 6월 11일에 시작한 유레카 1기의 수료를 일주일 앞두고 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 프로젝트에서 훌륭한 백엔드 팀원들에게 많이 배우면서, 짧은 기간 동안 많은 성장이 있었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데브옵스 역할을 맡아, CI/CD 파이프라인을 구축하고 다양한 툴들을 세팅한 경험도 무척 좋았습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 오늘 글의 주제는, 성능 테스트를 통한 병목지점 최적화 얘기입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;연속으로 세 프로젝트에서 성능 테스트를 진행했지만 감히 예상하건대 이번 최적화가 가장 많은 성능개선을 이룬 것 같습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;잘 읽어주시면 감사하겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;성능목표 잡기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞선 성능 테스트 글에서도, 어떤 성능 테스트를 하더라도 성능 목표를 우선적으로 잡아야 한다고 언급한 적이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734413707008&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;[Now, Here] 성능 테스트_성능 목표 잡기&quot; data-og-description=&quot;안녕하세요!이전에 언급했던 것처럼 Now, Here 글로 다시 찾아왔습니다.현재 출시가 얼마 남지 않았고, 대부분의 기능 구현은 완료한 상태입니다.그래서 성능 테스트를 통해 웹 서비스의 성능을 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/40&quot; data-og-url=&quot;https://jun10920.tistory.com/40&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GmuXE/hyXKubZ7BW/07DHjYg9KL7UznrljKyRH0/img.png?width=800&amp;amp;height=212&amp;amp;face=0_0_800_212,https://scrap.kakaocdn.net/dn/ThXSn/hyXOkr1cdi/WpNI7JbbrEJ5Qk7KuIRWR0/img.png?width=800&amp;amp;height=212&amp;amp;face=0_0_800_212,https://scrap.kakaocdn.net/dn/cSiQ6k/hyXOmDnA4c/ITyzMHIh6oK3f4LyFSBo2k/img.png?width=1852&amp;amp;height=491&amp;amp;face=0_0_1852_491&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/40&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GmuXE/hyXKubZ7BW/07DHjYg9KL7UznrljKyRH0/img.png?width=800&amp;amp;height=212&amp;amp;face=0_0_800_212,https://scrap.kakaocdn.net/dn/ThXSn/hyXOkr1cdi/WpNI7JbbrEJ5Qk7KuIRWR0/img.png?width=800&amp;amp;height=212&amp;amp;face=0_0_800_212,https://scrap.kakaocdn.net/dn/cSiQ6k/hyXOmDnA4c/ITyzMHIh6oK3f4LyFSBo2k/img.png?width=1852&amp;amp;height=491&amp;amp;face=0_0_1852_491');&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;[Now, Here] 성능 테스트_성능 목표 잡기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요!이전에 언급했던 것처럼 Now, Here 글로 다시 찾아왔습니다.현재 출시가 얼마 남지 않았고, 대부분의 기능 구현은 완료한 상태입니다.그래서 성능 테스트를 통해 웹 서비스의 성능을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 최적화 과정에서도 팀원과 논의를 하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음엔 이전 글에 적혀있는 것처럼,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;TTFB (Time To First Byte) 기준으로 평균 응답시간이 3초 이내로 들어오는 것을 목표로 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 근거로는 이전 글에 적혀있는 것처럼 아래의 통계 내용이 있기 때문입니다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주요 통계&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모바일 웹사이트 방문자의 53%는 웹페이지 로딩에 3초 이상 걸리면 해당 사이트를 떠납니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평균적으로 모바일 사이트의 로딩 시간은 3G 연결에서 19초, 4G 연결에서 14초입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로딩 속도의 영향&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5초 내에 로딩되는 모바일 사이트는 19초가 걸리는 사이트에 비해 다음과 같은 이점이 있습니다:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;25% 더 높은 광고 가시성&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;70% 더 긴 평균 세션 시간&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;35% 더 낮은 이탈률&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;페이지 로딩 시간이 1초에서 3초로 증가하면 이탈 확률이 32% 증가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자 기대치&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인터넷 사용자의 약 50%는 웹페이지 로딩 시간이 2초 미만이기를 기대합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성능이 좋지 않은 경험을 한 사용자의 약 80%는 해당 페이지를 영구적으로 피하고 다시 방문하지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 실제 현업에 계신 멘토님의 조언을 들은 결과,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유플러스 측에선 목표를 평균 응답시간을 &lt;b&gt;모두 0.1s 내로 받는 것&lt;/b&gt;으로 한다고 하셨습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 다소 어려운 목표라고 생각했지만, 저희 역시&lt;b&gt; 평균응답시간 0.1s&lt;/b&gt;를 성능 목표로 잡았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성능테스트 환경 및 방법&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;환경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;APM : &lt;b&gt;Pinpoint&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;부하테스트 툴 : &lt;b&gt;Postman의 Run collection test 기능(제한적으로 유료)&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;APM 툴로는 일반적으로 Grafana나, 프로메테우스를 주로 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;20년 이상의 경력을 가지신 네이버 출신 멘토님의 다른 툴들에 비해 추천한다는 조언에 Pinpoint를 사용하기로 했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로메테우스 + 그라파나 조합과 비교해서 아래와 같은 차이점이 있습니다.&lt;/span&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;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기능&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Pinpoinit&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Grafana + Prometheus&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;애플리케이션 성능 모니터링 및 추적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시계열 데이터 시각화 및 메트릭 모니터링&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;분산 추적&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지원 (트랜잭션 추적)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Prometheus 자체로는 불가 (Jaeger 같은 추가 도구 필요)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;설치 및 설정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에이전트 설치만으로 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Prometheus + Grafana 설정 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;실시간 모니터링&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상세한 트랜잭션 및 리소스 모니터링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;메트릭 기반 시계열 데이터 모니터링&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;데이터 수집 및 저장&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자동으로 애플리케이션 메트릭 및 로그 수집&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Prometheus는 메트릭 수집, Grafana는 시각화만 담당&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개발 언어&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java, PHP&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;언어 제한 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;시스템 분석&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;트랜잭션 병목 파악에 강점&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시스템 리소스 수준 메트릭 파악에 강점&lt;/span&gt;&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이중 아래와 같은 경우 Pinpoint를 사용하는 것을 더 추천하기에 최종적으로 Pinpoint를 사용하기로 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Pinpoint를 사용하면 좋은 경우&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;분산 시스템에서 트랜잭션 단위로 병목을 분석해야 할 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java 또는 PHP 기반 애플리케이션을 사용 중일 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;간편한 설치 및 빠른 도입이 필요할 때&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음으로는, 테스트 환경을 고민했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 환경을 구성하는 방법에 대해서는 세 가지 선택지가 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;부하 테스트 실행 환경&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(1)&lt;/b&gt; AWS에 모든 부하 테스트 구성(부하테스트 툴, Spring 서버, RDS)을 실행.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점: 실제 AWS 환경과 동일한 조건에서 테스트.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점: 높은 비용, 운영 데이터와 테스트 데이터 간 혼란 가능성.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(2)&lt;/b&gt; 로컬에서 Spring 서버 실행 + AWS에 부하테스트 툴, RDS 구성.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점: 비용 절감, 효율적인 협업 가능.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점: 테스트의 일부는 네트워크 환경을 반영하지 못함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(3)&lt;/b&gt; 로컬에 모든 테스트 환경 구성.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점: 비용 없음, 간단한 설정.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점: 네트워크 및 실제 운영 환경과의 괴리, 테스트 데이터 공유 어려움.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 Pinpoint 설치 역시 2가지 방법이 있었습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Pinpoint 배포 위치&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로컬에 설치.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점: 비용 없음, 간단한 설정.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점: 팀원 간 협업 어려움, 중앙 집중 데이터 수집 불가.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AWS에 설치.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점: 팀원이 공유할 수 있는 중앙 집중형 모니터링 환경 제공.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점: EC2 및 HBase 리소스 사용으로 비용 발생.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로, 돈을 유레카에서 지원받고 있는 상황이지만 ECS(Fargate)가 사용량에 비례해서 지불하는 금액이 올라가는 방식이기에 괜히 수십 번 성능테스트 하는 상황에서 예상치 못한 금액이 나올 것 같아 결론적으로 아래와 같이 설정하게 되었습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;최종 설계&lt;/b&gt;:&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AWS에 &lt;b&gt;부하테스트, Pinpoint, 테스트용 RDS&lt;/b&gt;를 구성하고, 각자의 로컬에서 Spring 서버를 실행하여 부하 테스트를 수행&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;설계의 이유&lt;/b&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;비용 효율성&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로컬에서 Spring 서버를 실행함으로써 ECS(Fargate) 사용 비용을 절감.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AWS의 공용 리소스(부하테스트, Pinpoint, RDS)는 최소한의 비용으로 유지.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;협업 및 중앙 관리&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AWS RDS와 Pinpoint를 통해 중앙에서 데이터를 관리하며, 모든 개발자가 동일한 환경에서 테스트 가능.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Pinpoint Web을 활용해 실시간 트랜잭션 흐름과 병목 지점 분석 가능.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트 데이터 분리&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트용 RDS를 별도로 구성하여 운영 데이터와 테스트 데이터를 철저히 분리.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 완료 후 데이터를 초기화하거나 삭제하여 관리 용이.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;확장 가능성&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;추후 팀 전체의 Spring 서버를 AWS ECS로 옮기거나, AWS 리소스를 확대하여 더 높은 트래픽 테스트 가능.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AWS에 테스트용 RDS나 다른 세팅을 하는 것은 쉬웠으나, Pinpoint를 세팅하는 것은 매우 매우 매우 오래 걸렸습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;성능 테스트 방법&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 요청 후 핀포인트로 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;병목지점 확인 / 응답시간 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SQL 문 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DB 콘솔 창에 SQL 문 실행&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 번 반복해서 응답시간 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EXPIAIN, EXPAIN ANALYZE로 실행 계획 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;확인한 결과를 통해서 최적화&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EXPIAIN, EXPAIN ANALYZE로 실행 계획 결과 재확인&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 요청해서 핀포인트로 최적화된 결과 재확인&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음 결과&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 맨 처음에 데이터를 적당히 넣은 상태에서 부하테스트를 했을 때는 상당히 괜찮은 성능을 보였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 이전에 데이터를 많이 넣은 상태에서 부하테스트를 진행하면 다른 결과를 보인 적이 있다는 팀원 분의 의견을 반영하여, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 엔티티에 100만 개의 데이터를 넣은 상태에서 다시 부하테스트를 진행했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 그 결과는 다음과 같습니다.&lt;/span&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;1830&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B5llu/btsLlPS2WyR/Qk8kmU4WEr0fK65M8uVIHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B5llu/btsLlPS2WyR/Qk8kmU4WEr0fK65M8uVIHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B5llu/btsLlPS2WyR/Qk8kmU4WEr0fK65M8uVIHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB5llu%2FbtsLlPS2WyR%2FQk8kmU4WEr0fK65M8uVIHK%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;919&quot; height=&quot;346&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존에 데이터가 없었을 때 &amp;gt; 100만 데이터 삽입 후&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;총 요청 수 : 약 5만 &amp;gt; 1019&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;평균 응답 시간 : 약 3초 &amp;gt; 24초&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;에러율 : 0% &amp;gt; 56%&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이와 같이 상당히 결과가 안 좋게 나왔습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFpmXL/btsLlQRXu9f/K1WwlbKBEh52dPJCxj1ns0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFpmXL/btsLlQRXu9f/K1WwlbKBEh52dPJCxj1ns0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFpmXL/btsLlQRXu9f/K1WwlbKBEh52dPJCxj1ns0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFpmXL%2FbtsLlQRXu9f%2FK1WwlbKBEh52dPJCxj1ns0%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;1818&quot; height=&quot;491&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 응답시간 worst 5개의 평균응답시간을 보면 &lt;b&gt;약 30초&lt;/b&gt;로, 정말 말도 안 되는 성능을 보여줬습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DB 커넥션 풀 조정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대부분의 에러를 보면 DB 커넥션 풀이 부족해서 타임아웃이 발생해 생기는 에러가 대부분이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 과거에 기본 DB 커넥션 풀인 &lt;b&gt;10에서 20&lt;/b&gt;으로 늘리고 확인을 했습니다.&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;HikariCP Connection Pool 설정&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;maximum-pool-size: 20&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기본값&lt;/b&gt;: 10&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;효과: 최대 동시 커넥션을 20개까지 지원. 트래픽이 많아도 커넥션 부족으로 인한 요청 대기 시간을 줄임.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1802&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Seqb0/btsLmotW9pJ/LughaO4er4qgFMmGw4R6i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Seqb0/btsLmotW9pJ/LughaO4er4qgFMmGw4R6i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Seqb0/btsLmotW9pJ/LughaO4er4qgFMmGw4R6i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSeqb0%2FbtsLmotW9pJ%2FLughaO4er4qgFMmGw4R6i1%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;1802&quot; height=&quot;183&quot; data-origin-width=&quot;1802&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5sBIr/btsLmi8qonr/jjW8lxr2uFFbxTndkMumXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5sBIr/btsLmi8qonr/jjW8lxr2uFFbxTndkMumXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5sBIr/btsLmi8qonr/jjW8lxr2uFFbxTndkMumXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5sBIr%2FbtsLmi8qonr%2FjjW8lxr2uFFbxTndkMumXk%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;1785&quot; height=&quot;597&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에러 발생률은 늘었지만, 응답시간이&lt;b&gt; 24초에서 13초&lt;/b&gt;로 약 절반정도 줄어들음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최대 응답시간 api들도 &lt;b&gt;30초에서 &amp;rarr; 20초&lt;/b&gt;로 줄어들음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 계속 에러가 발생을 하는 상황이어서, DB 커넥션 풀을 약 30~50씩 증가시키면서 계속 테스트를 진행했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 여러 번의 테스트를 거친 결과, 결론적으로 200으로 늘렸을 때 에러가 발생하지 않고 끝까지 진행할 수 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyb7oI/btsLleZ6KWI/YTr7vUKFpkdqcN5ltsLebk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyb7oI/btsLleZ6KWI/YTr7vUKFpkdqcN5ltsLebk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyb7oI/btsLleZ6KWI/YTr7vUKFpkdqcN5ltsLebk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcyb7oI%2FbtsLleZ6KWI%2FYTr7vUKFpkdqcN5ltsLebk%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;1816&quot; height=&quot;155&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFfN2P/btsLmQXO2Xt/Kk6cc0gK06A0uIz9yoQeKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFfN2P/btsLmQXO2Xt/Kk6cc0gK06A0uIz9yoQeKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFfN2P/btsLmQXO2Xt/Kk6cc0gK06A0uIz9yoQeKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFfN2P%2FbtsLmQXO2Xt%2FKk6cc0gK06A0uIz9yoQeKK%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;1812&quot; height=&quot;490&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로 초기 테스트 데이터 대비 아래와 같은 결과가 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;총 요청 수 : 1019 -&amp;gt; 1913 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;약&amp;nbsp;&lt;/span&gt;&lt;b&gt;87.7% 증가&lt;/b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;평균 응답 시간 : 24초 -&amp;gt; 5초 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;약&amp;nbsp;&lt;/span&gt;&lt;b&gt;79.2% 단축&lt;/b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;에러율 : 56% -&amp;gt; 0% &lt;b&gt;100% 개선&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기 테스트 결과 치고는 많은 성능 향상이 있었지만, 아직 처음 성능 목표로 잡은 0.1초까지는 길이 한참 남았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 아직 Pinpoint를 통한 각 API의 메서드 단위까지 응답시간을 나누어 분석하고 최적화하는 과정은 시작도 안 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이어서 팀원들과 나누어서 Response time worst&amp;nbsp; API 목록들을 하나씩 최적화하기로 했습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최적화한 API 목록으로는&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;지금 뜨는 리뷰 조회 API (복합 인덱스)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;영화 개봉 예정일 쿼리 (단일 인덱스)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;영화 제목 검색 쿼리 (FULLTEXT INDEX)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개인 맞춤형 추천 영화 리스트 조회 (단일 인덱스)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;컬렉션 제목 검색 API(Generated Column, FULLTEXT INDEX, 필요한 인덱스만 Query)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;등등..&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다양한 API를 개선했지만 대부분의 병목의 원인과 최적화 절차는 비슷했고, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그중 가장 많은 과정을 거친 컬렉션 제목 검색 API 최적화 과정을 중점적으로 설명하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Pinpoint와 Query Plan 분석을 통한 개선&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 요청 후 핀포인트로 확인&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGxCZ/btsLm51BFUP/lPHf1Nb4oBWBd64prgkKU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGxCZ/btsLm51BFUP/lPHf1Nb4oBWBd64prgkKU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGxCZ/btsLm51BFUP/lPHf1Nb4oBWBd64prgkKU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGxCZ%2FbtsLm51BFUP%2FlPHf1Nb4oBWBd64prgkKU0%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;942&quot; height=&quot;240&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;950&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pewpw/btsLmJxRkCr/ERMSTPLaSDAeMojL49aVG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pewpw/btsLmJxRkCr/ERMSTPLaSDAeMojL49aVG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pewpw/btsLmJxRkCr/ERMSTPLaSDAeMojL49aVG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpewpw%2FbtsLmJxRkCr%2FERMSTPLaSDAeMojL49aVG1%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;1612&quot; height=&quot;950&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;950&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;총 응답시간&lt;/b&gt;: &lt;b&gt;1,464 ms&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;executeQuery 쿼리 시간&lt;/b&gt;: &lt;b&gt;1,234 ms&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uzBRU/btsLlG9Pd0Q/rDJIUwyXjAOUCYjXGLu6HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uzBRU/btsLlG9Pd0Q/rDJIUwyXjAOUCYjXGLu6HK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uzBRU/btsLlG9Pd0Q/rDJIUwyXjAOUCYjXGLu6HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuzBRU%2FbtsLlG9Pd0Q%2FrDJIUwyXjAOUCYjXGLu6HK%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;309&quot; height=&quot;146&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;178&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;즉 결과에 분석하면 &lt;b&gt;쿼리 실행이 가장 큰 병목 구간&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 부분의 SQL문을 확인하고, 콘솔에서 5번 정도 실행하여 평균 시간을 확인했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734446476602&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[2024-12-14 16:33:25] 0 rows retrieved in 1 s 648 ms (execution: 1 s 274 ms, fetching: 374 ms)
[2024-12-14 16:33:38] 0 rows retrieved in 1 s 375 ms (execution: 1 s 262 ms, fetching: 113 ms)
[2024-12-14 16:33:41] 0 rows retrieved in 1 s 627 ms (execution: 1 s 270 ms, fetching: 357 ms)
[2024-12-14 16:33:44] 0 rows retrieved in 1 s 472 ms (execution: 1 s 281 ms, fetching: 191 ms)
[2024-12-14 16:33:46] 0 rows retrieved in 1 s 315 ms (execution: 1 s 248 ms, fetching: 67 ms)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 실행 시간 합계: 1.648, 1.375, 1.627, 1.472, 1.315초&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;평균 총 실행 시간&lt;/b&gt;: 약 &lt;b&gt;1.487초&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에서 API를 통해 확인했던 것과 비슷하게, 단순히 쿼리만 입력해도 걸리는 시간이 1회당 평균적으로 1.487초 이상 걸렸습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Query Plan을 통한 분석&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MySQL의 EXPIAIN, EXPAIN ANALYZE를 통해 쿼리 실행 계획을 더 자세히 분석할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Query Plan이란?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- DBMS가 SQL 쿼리를 처리하기 위해 사용하는 실행 계획으로, 쿼리 실행에 대한 단계를 보여주며 각 단계에서 필요한 리소스와 처리 시간을 단계적으로 보여준다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Query Plan 분석과 최적화를 통해 쿼리 실행에 필요한 최소한의 리소스를 사용하면서 최적의 성능을 제공할 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;pre id=&quot;code_1734418154117&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-&amp;gt; Limit: 11 row(s)  (cost=520425 rows=11) (actual time=1297..1297 rows=0 loops=1)
    -&amp;gt; Nested loop inner join  (cost=520425 rows=1.59e+6) (actual time=1297..1297 rows=0 loops=1)
        -&amp;gt; Sort: c1_0.created_at DESC  (cost=161895 rows=1.59e+6) (actual time=1297..1297 rows=0 loops=1)
            -&amp;gt; Filter: ((c1_0.is_deleted = 0) and (lower(c1_0.title) like &amp;lt;cache&amp;gt;(lower(concat('%','제목','%'))) escape '') and (c1_0.member_id is not null))  (cost=161895 rows=1.59e+6) (actual time=1297..1297 rows=0 loops=1)
                -&amp;gt; Table scan on c1_0  (cost=161895 rows=1.59e+6) (actual time=0.0766..736 rows=1.6e+6 loops=1)
        -&amp;gt; Single-row index lookup on u1_0 using PRIMARY (member_id=c1_0.member_id)  (cost=0.251 rows=1) (never executed)&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 Query Plan을 분석한 내용은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Table Scan on collection&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;작업 내용&lt;/b&gt;: collection 테이블의 모든 행을 읽습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;실제 소요 시간&lt;/b&gt;: actual time=0.0766ms.. 736ms 이 단계에서 약&amp;nbsp;&lt;b&gt;736ms&lt;/b&gt;&amp;nbsp;동안 전체 테이블을 읽었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결론&lt;/b&gt;: Full Table Scan으로 인해 테이블 전체를 스캔하는 데&amp;nbsp;&lt;b&gt;736ms&lt;/b&gt;가 소요되었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;WHERE 조건과 정렬 작업 (Filter + Sort)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;작업 내용&lt;/b&gt;:&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;WHERE 조건:&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(c1_0.is_deleted = 0)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(lower(c1_0.title) like '% 제목%')&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(c1_0.member_id IS NOT NULL)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;실제 소요 시간&lt;/b&gt;:Table Scan이 끝난 후부터 정렬이 완료될 때까지 걸린 시간&amp;nbsp;&lt;b&gt;1297ms - 736ms = 약 561ms&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;병목 원인&lt;/b&gt;: 조건이 전체 데이터를 대상으로 작동하므로 시간 소모가 큼.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;시간 계산 요약&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;전체 테이블 읽기 (Full Table Scan)&lt;/b&gt;: &lt;b&gt;736ms&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;WHERE 조건 평가 + 정렬&lt;/b&gt;: &lt;b&gt;561ms&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;총 소요 시간 = &lt;b&gt;736ms + 561ms = 1297ms&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Query Plan 분석을 통해 알 수 있듯이, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 테이블을 Full Table Scan 하고 정렬하는 부분에서 지연시간이 발생하는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 하나씩 최적화하면서 확인하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;LOWER 문제 해결 (Generated Column과 인덱스 추가)&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Generated Column 추가&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LOWER(title)의 결과를 저장할 lower_title 컬럼을 생성하고, 인덱스를 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ALTER TABLE collection
ADD lower_title VARCHAR(255) GENERATED ALWAYS AS (LOWER(title)) STORED;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Generated Column에 인덱스 추가&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;lower_title에 인덱스를 생성하여 WHERE 조건을 최적화합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;CREATE INDEX idx_lower_title ON collection (lower_title);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;쿼리 수정&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존 쿼리에서 LOWER(c1_0.title) 대신 lower_title을 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT ...
FROM collection c1_0
WHERE lower_title LIKE '%제목%';
&lt;/code&gt;&lt;/pre&gt;
&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Generated colomn이란?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Generated Column은 MySQL 테이블에 있는 다른 컬럼의 값을 기반으로 계산된 값을 저장하거나 계산하는 컬럼입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;lower_title 같은 컬럼을 Generated colomn으로 만들어, 값이 추가될 때마다 자동으로 정렬되어 있는 컬럼을 생성해 index를 생성하면 쿼리를 실행할 때마다 정렬을 하지 않아도 됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1734418385280&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-&amp;gt; Limit: 11 row(s)  (cost=342903 rows=11) (actual time=1185..1185 rows=0 loops=1)
    -&amp;gt; Nested loop inner join  (cost=342903 rows=1.59e+6) (actual time=1185..1185 rows=0 loops=1)
        -&amp;gt; Sort: c1_0.created_at DESC  (cost=162152 rows=1.59e+6) (actual time=1185..1185 rows=0 loops=1)
            -&amp;gt; Filter: ((c1_0.is_deleted = 0) and (c1_0.lower_title like '%제목%' escape '') and (c1_0.member_id is not null))  (cost=162152 rows=1.59e+6) (actual time=1185..1185 rows=0 loops=1)
                -&amp;gt; Table scan on c1_0  (cost=162152 rows=1.59e+6) (actual time=0.0736..806 rows=1.6e+6 loops=1)
        -&amp;gt; Single-row index lookup on u1_0 using PRIMARY (member_id=c1_0.member_id)  (cost=0.251 rows=1) (never executed)&lt;/code&gt;&lt;/pre&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;쿼리 비용 감소&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 번째 쿼리 비용: &lt;b&gt;520425&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두 번째 쿼리 비용: &lt;b&gt;342903&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; &lt;b&gt;약 34.1% 비용 감소&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;실행 시간 개선&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 번째 쿼리 실행 시간: &lt;b&gt;1297 ms&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두 번째 쿼리 실행 시간: &lt;b&gt;1185 ms&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; &lt;b&gt;약 8.6% 시간 단축&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필요한 인덱스만 읽기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번엔 엔티티의 모든 Column을 읽지 않고, 필요한 인덱스만 읽는 식으로 수정해 결과를 확인했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734418578607&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-&amp;gt; Limit: 11 row(s)  (cost=342903 rows=11) (actual time=1037..1037 rows=0 loops=1)
    -&amp;gt; Nested loop inner join  (cost=342903 rows=1.59e+6) (actual time=1037..1037 rows=0 loops=1)
        -&amp;gt; Sort: c1_0.created_at DESC  (cost=162152 rows=1.59e+6) (actual time=1037..1037 rows=0 loops=1)
            -&amp;gt; Filter: ((c1_0.is_deleted = 0) and (c1_0.lower_title like '%제목%' escape '') and (c1_0.member_id is not null))  (cost=162152 rows=1.59e+6) (actual time=1037..1037 rows=0 loops=1)
                -&amp;gt; Table scan on c1_0  (cost=162152 rows=1.59e+6) (actual time=0.0702..659 rows=1.6e+6 loops=1)
        -&amp;gt; Single-row index lookup on u1_0 using PRIMARY (member_id=c1_0.member_id)  (cost=0.251 rows=1) (never executed)&lt;/code&gt;&lt;/pre&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;쿼리 실행 시간 개선&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음 실행 시간: &lt;b&gt;1297 ms&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새로운 실행 시간: &lt;b&gt;1037 ms&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; &lt;b&gt;약 20% 단축&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;쿼리 비용 감소&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음 비용: &lt;b&gt;520425&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새로운 비용: &lt;b&gt;342903&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; &lt;b&gt;약 34.1% 비용 감소&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개선이 상당히 됐지만, 아직도 쿼리를 실행하는데 1초가 걸리는 문제와 row는 전체를 다 순회하는 문제가 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Full Text Index 활용&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Full Text Index 추가&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;LIKE 대신 MATCH를 사용하여 검색&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT ...
FROM collection
WHERE MATCH(title) AGAINST ('제목' IN NATURAL LANGUAGE MODE);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Full Text Index란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;텍스트 검색 전용:긴 텍스트 데이터(CHAR, VARCHAR, TEXT)에 적합한 인덱스.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반 인덱스와 달리, 단어 단위로 데이터를 인덱싱하여 검색 속도를 크게 향상.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1734418797839&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-&amp;gt; Limit: 11 row(s)  (cost=1.28 rows=1) (actual time=0.0132..0.0132 rows=0 loops=1)
    -&amp;gt; Nested loop inner join  (cost=1.28 rows=1) (actual time=0.0127..0.0127 rows=0 loops=1)
        -&amp;gt; Sort row IDs: c1_0.created_at DESC  (cost=1.05 rows=1) (actual time=0.0121..0.0121 rows=0 loops=1)
            -&amp;gt; Filter: ((c1_0.is_deleted = 0) and (match c1_0.lower_title against ('제목')) and (c1_0.member_id is not null))  (cost=1.05 rows=1) (actual time=0.00655..0.00655 rows=0 loops=1)
                -&amp;gt; Full-text index search on c1_0 using lower_title (lower_title='제목')  (cost=1.05 rows=1) (actual time=0.006..0.006 rows=0 loops=1)
        -&amp;gt; Single-row index lookup on u1_0 using PRIMARY (member_id=c1_0.member_id)  (cost=0.451 rows=1) (never executed)&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;쿼리 실행 계획 최적화 전후 비교&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 78px;&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;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;전체 테이블 읽기&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;736ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.006ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Full Table Scan &amp;rarr; Full Text Index로 최적화.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;WHERE 조건 평가 + 정렬&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;561ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.0121ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;조건 및 정렬 최적화로 처리 속도 대폭 개선.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;총 소요 시간&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1297ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.0132ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;총 소요 시간이 약 99% 이상 감소.&lt;/span&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기까지 진행하고 부하테스트를 진행한 결과&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1797&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cde90R/btsLmmJ5Iup/9ayGlOJzZBiQAOb805I6a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cde90R/btsLmmJ5Iup/9ayGlOJzZBiQAOb805I6a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cde90R/btsLmmJ5Iup/9ayGlOJzZBiQAOb805I6a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcde90R%2FbtsLmmJ5Iup%2F9ayGlOJzZBiQAOb805I6a0%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;1797&quot; height=&quot;187&quot; data-origin-width=&quot;1797&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1827&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DL7ym/btsLnzIo853/V7l1Nvowq3oHXYXpFDJHkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DL7ym/btsLnzIo853/V7l1Nvowq3oHXYXpFDJHkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DL7ym/btsLnzIo853/V7l1Nvowq3oHXYXpFDJHkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDL7ym%2FbtsLnzIo853%2FV7l1Nvowq3oHXYXpFDJHkK%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;1827&quot; height=&quot;601&quot; data-origin-width=&quot;1827&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;총 요청 수 : 1019 -&amp;gt; 102855&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;평균 응답 시간 : 24초 -&amp;gt; 0.16초&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;에러율 : 56% -&amp;gt; 0%&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로 개선되었습니다.&lt;/span&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;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캐시&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 이미 최적화의 목표는 거의 다 이루었지만, 목표였던 최종 평균 응답시간 0.1초를 위해서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;worst 1순위인 &lt;b&gt;개인 맞춤형 추천 영화 리스트 조회 API&lt;/b&gt;를 개선했습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인 맞춤형 추천 영화 리스트 조회할 때는 인기 TOP 10 영화를 제외한 영화들 중에서 선택을 하는데,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매번 TOP10 영화를 계산하는 과정이 굉장히 비효율적이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 TOP10 영화를 조회하는 API에서 Redis에 캐시를 하고, 개인 맞춤형 추천 영화 리스트 조회 API에서는 캐시 한 TOP10 영화를 조회해서 해당 영화들을 제외하고 나머지 로직을 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;커넥션 풀 최적화 - 심화&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;처음에 에러가 발생하지 않도록 200까지 DB 커넥션 풀을 증가해서 테스트를 진행했지만,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt; 사실 직관적으로 '트래픽이 많으니 더 많은 연결이 필요하겠지'라는 판단은 사실&amp;nbsp; 틀렸습니다.&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;실제로 Oracle에서 실제 성능 테스트를 진행한 결과 커넥션 풀을 2048개에서 96개로 줄여&amp;nbsp;응답 시간이 100ms에서 2ms로 오히려 줄어든 결과가 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=_C77sBcAtSQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/be4l2I/hyXKq1NjHc/kgZkTVKwTYudCKBKcqw7v1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=380_240_422_286,https://scrap.kakaocdn.net/dn/bqqIsi/hyXKmE745U/hbh3nc5J4zRWJjtw6HwZW0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=380_240_422_286&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[REUP] OLTP Performance - Concurrent Mid-Tier Connections&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_C77sBcAtSQ&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;아래 글에서 적혀있듯이, 데이터베이스 커넥션 풀의 작동 원리를 CPU, 디스크, 네트워크 관점에서 심층적으로 살펴보고 실제 환경에서 최적의 풀 크기를 선정하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734450114230&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;About Pool Sizing&quot; data-og-description=&quot;光 HikariCP・A solid, high-performance, JDBC connection pool at last. - brettwooldridge/HikariCP&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing&quot; data-og-url=&quot;https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/q9TsM/hyXOp7YWDe/OR71FX6vehBeKdav4YU7kk/img.png?width=1200&amp;amp;height=600&amp;amp;face=943_133_1051_279,https://scrap.kakaocdn.net/dn/bVIF8N/hyXOinvxYd/3LkSkDVmBMkeo7AhUSuRvk/img.png?width=1200&amp;amp;height=600&amp;amp;face=943_133_1051_279&quot;&gt;&lt;a href=&quot;https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/q9TsM/hyXOp7YWDe/OR71FX6vehBeKdav4YU7kk/img.png?width=1200&amp;amp;height=600&amp;amp;face=943_133_1051_279,https://scrap.kakaocdn.net/dn/bVIF8N/hyXOinvxYd/3LkSkDVmBMkeo7AhUSuRvk/img.png?width=1200&amp;amp;height=600&amp;amp;face=943_133_1051_279');&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;About Pool Sizing&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;光 HikariCP・A solid, high-performance, JDBC connection pool at last. - brettwooldridge/HikariCP&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;p 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최적의 풀 크기를 구하다 보면 직관적으로 생각하는 '많다' 보다 오히려 훨씬 적은 수의 커넥션 풀이 좋다는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운영체제 관점에서 살펴보면,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU 코어가 하나인 컴퓨터도 여러 개의 스레드를 동시에 실행하는 것처럼 보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 실제로는 하나의 코어에서 한 번에 하나의 스레드만 실행할 수 있고, OS가 context switching 하면서 다른 스레드의 코드를 실행하는 방식으로 동작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 운영체제의 Concurrency과 관련 있는 내용이죠. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 스레드 수가 CPU 코어수를 초과하면, 스레드를 추가할수록 성능이 향상되는 것이 아니라 오히려 저하됩니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 데이터베이스 관점에서 생각하면,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터는 일반적으로 디스크에 저장하는데, HDD 같은 경우 읽기와 쓰기를 하는 헤드가 데이터에 접근하기 위해 이곳저곳을 이동하면서 조회하는 탐색 시간이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이런 I/O 대기 시간 동안 디스크 작업이 완료되기를 기다리며 스레드를 block 시키고, OS가 블록 된 스레드를 제외하고 다른 스레드의 코드를 실행함으로써 CPU 리소스를 좀 더 효율적으로 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 스레드가 I/O 작업으로 블록 되는 동안 물리적 CPU 코어 수보다 많은 스레드를 실행할 때 최종적인 처리량을 높이는 것입니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 최적의 스레드 개수는 몇 개일까요?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SSD의 경우 탐색 시간이 없기 때문에 블로킹이 발생하지 않고, 그래서 블록 &amp;gt; 다른 스레드 실행하는 걸 오히려 줄이는 게 효율적입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 코어 수에 가까운 더 적은 수의 스레드가 더 많은 스레드보다 성능이 좋을 가능성이 높습니다.&lt;/span&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;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최적의 연결 수 계산 공식&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 곳의 벤치마크 결과를 통해 검증된 공식은 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;활성 커넥션 수 = ((CPU 코어 수 * 2) + 유효 스핀들 수)&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스핀들이란, HDD의 물리적 플래터(데이터 저장 원반)를 움직이는 축을 의미하므로 유효 스핀들 수는 HDD에서 동시에 읽고 쓸 수 있는 독립된 경로를 의미합니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 위 공식은 하이퍼스레딩(물리적 코어를 두 개의 논리적 스레드로 나누어 동작하게 하는 기능)이 적용되어 있더라도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HT스레드(논리적 스레드, 여기선 물리적 코어보다 많음)를 제외한 실제 물리적 코어 수만을 계산합니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 위 공식을 다시 정리하자면,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;CPU 코어 수&lt;/b&gt;: 물리적 CPU 코어 수(하이퍼스레딩 무시).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;times; 2&lt;/b&gt;: CPU 하나가 I/O 대기 시간을 줄이고 효율적으로 스레드를 처리할 수 있도록 두 개의 연결을 할당&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;유효 스핀들 수&lt;/b&gt;: 하드 디스크에서 동시에 데이터를 읽고 쓸 수 있는 경로 수&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SSD를 사용하면 &lt;b&gt;유효 스핀들 수 = 0&lt;/b&gt;으로 계산&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;예제 &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4 코어 i7 CPU와 HDD&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;물리적 CPU 코어&lt;/b&gt;: 4개&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;유효 스핀들 수&lt;/b&gt;: 1 (하드 디스크가 1개)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;활성 커넥션 수 = (4 * 2) + 1 = 9의 커넥션이 최적입니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b&gt;예제&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4코어 i7 서버 + SSD:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;활성 커넥션 수 = (4 * 2) = 8개의 커넥션이 최적입니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/29WTY/btsLmI8eGwh/kLVGcWq1KyqNwD38LGpwh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/29WTY/btsLmI8eGwh/kLVGcWq1KyqNwD38LGpwh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/29WTY/btsLmI8eGwh/kLVGcWq1KyqNwD38LGpwh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F29WTY%2FbtsLmI8eGwh%2FkLVGcWq1KyqNwD38LGpwh1%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;1082&quot; height=&quot;381&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 저희가 사용한 RDS는 M4.2xlarge로, 코어가 4이기 때문에 (4 * 2) = 8 (RDS는 대부분 SSD 사용)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;200개에서 8개의 커넥션 풀&lt;/b&gt;로 설정하고 마지막 부하테스트를 진행했습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 결과&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&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;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSxiP4/btsLkLqCUgx/QZlumoDkVtNMyfpT5xOPS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSxiP4/btsLkLqCUgx/QZlumoDkVtNMyfpT5xOPS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSxiP4/btsLkLqCUgx/QZlumoDkVtNMyfpT5xOPS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSxiP4%2FbtsLkLqCUgx%2FQZlumoDkVtNMyfpT5xOPS0%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;1830&quot; height=&quot;133&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1813&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m5RfE/btsLkKSO7g9/OJBlo67AzufMIGIkvSQgg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m5RfE/btsLkKSO7g9/OJBlo67AzufMIGIkvSQgg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m5RfE/btsLkKSO7g9/OJBlo67AzufMIGIkvSQgg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm5RfE%2FbtsLkKSO7g9%2FOJBlo67AzufMIGIkvSQgg1%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;1813&quot; height=&quot;485&quot; data-origin-width=&quot;1813&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;총 요청 수 : 1019 -&amp;gt; 131734&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;평균 응답 시간 : 24초 -&amp;gt; 0.1초&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;에러율 : 56% -&amp;gt; 0%&amp;nbsp;&lt;b&gt;100% 개선&lt;/b&gt;&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;1. 요청 수 증가율&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;최초 값&lt;/b&gt;: 1019&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;최적화 후 값&lt;/b&gt;: 131734&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xRwbZ/btsLlTuvNiJ/xGbsg0xmCs1sZJsrL0wGY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xRwbZ/btsLlTuvNiJ/xGbsg0xmCs1sZJsrL0wGY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xRwbZ/btsLlTuvNiJ/xGbsg0xmCs1sZJsrL0wGY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxRwbZ%2FbtsLlTuvNiJ%2FxGbsg0xmCs1sZJsrL0wGY1%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;710&quot; height=&quot;70&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 평균 응답시간 감소율&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;최초 값&lt;/b&gt;: 24초&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;최적화 후 값&lt;/b&gt;: 0.1초&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zyAS0/btsLmMH4NeO/XibbEEvxD9YRKI7g9fceqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zyAS0/btsLmMH4NeO/XibbEEvxD9YRKI7g9fceqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zyAS0/btsLmMH4NeO/XibbEEvxD9YRKI7g9fceqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzyAS0%2FbtsLmMH4NeO%2FXibbEEvxD9YRKI7g9fceqK%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;712&quot; height=&quot;77&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;77&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로 목표했던 평균 응답시간 0.1초를 만족할 수 있었습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리하며&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 최적화 경험을 통해서 &lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새로운 테스트 환경 구축 방법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;병목지점 분석의 체계적인 접근법&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기에 평균 응답 시간이 24초까지 치솟았을 때는 도대체 어떻게 0.1초로 줄이지,라는 좌절감도 있었지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음 글에는, 이번 최적화만큼 프로젝트에서 열심히 했던 &lt;b&gt;CI/CD 구축 경험&lt;/b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;과&amp;nbsp;&lt;/span&gt;&lt;b&gt;데브옵스 설정 과정&lt;/b&gt;&lt;span style=&quot;color: #666666; text-align: start;&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;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;긴 글 읽어주셔서 감사합니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans 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;b&gt;참고 블로그 글&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734457177936&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;더 적은 연결로 50배 빠른 데이터베이스 구현하기 - 당신의 커넥션 풀은 과유불급인가요?&quot; data-og-description=&quot;10,000명의 동시 접속자도 10개의 커넥션으로 충분하다고?&quot; data-og-host=&quot;maily.so&quot; data-og-source-url=&quot;https://maily.so/devpill/posts/e9o02g3ez8w&quot; data-og-url=&quot;https://maily.so/devpill/posts/e9o02g3ez8w&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cxQZ86/hyXKzdnMJG/aDCARKL5MeKl1dnua0cVJk/img.png?width=1094&amp;amp;height=848&amp;amp;face=0_0_1094_848,https://scrap.kakaocdn.net/dn/ba5jaf/hyXOgQLSn9/TqkREeNYTPcGLzBHhyPe9K/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024,https://scrap.kakaocdn.net/dn/Foreg/hyXOigKLZ4/SNOUF9UEEiWioLwuyYQP4k/img.png?width=1094&amp;amp;height=848&amp;amp;face=0_0_1094_848&quot;&gt;&lt;a href=&quot;https://maily.so/devpill/posts/e9o02g3ez8w&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://maily.so/devpill/posts/e9o02g3ez8w&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cxQZ86/hyXKzdnMJG/aDCARKL5MeKl1dnua0cVJk/img.png?width=1094&amp;amp;height=848&amp;amp;face=0_0_1094_848,https://scrap.kakaocdn.net/dn/ba5jaf/hyXOgQLSn9/TqkREeNYTPcGLzBHhyPe9K/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024,https://scrap.kakaocdn.net/dn/Foreg/hyXOigKLZ4/SNOUF9UEEiWioLwuyYQP4k/img.png?width=1094&amp;amp;height=848&amp;amp;face=0_0_1094_848');&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;더 적은 연결로 50배 빠른 데이터베이스 구현하기 - 당신의 커넥션 풀은 과유불급인가요?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;10,000명의 동시 접속자도 10개의 커넥션으로 충분하다고?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;maily.so&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>프로젝트</category>
      <category>Pinpoint</category>
      <category>queryplan</category>
      <category>대용량트래픽</category>
      <category>데이터베이스최적화</category>
      <category>부하테스트</category>
      <category>성능테스트</category>
      <category>최적화</category>
      <category>쿼리실행계획</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/48</guid>
      <comments>https://jun10920.tistory.com/48#entry48comment</comments>
      <pubDate>Wed, 18 Dec 2024 02:39:56 +0900</pubDate>
    </item>
    <item>
      <title>[Naviya] Queue와 Cache를 통한 대규모 응모 이벤트 파이프라인 구축기</title>
      <link>https://jun10920.tistory.com/47</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 저는 유레카(유플러스 채용 연계 부트캠프)에서, 종합 프로젝트를 진행 중입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그중에 아이 성향을 주제로 하는 응모 시스템을, 대규모 트래픽(1초에 10만 트래픽을 10초간 버티는 안정성)을 안정적으로 버티게 구축하는 역할을 맡았습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 기능을 포함해서 Naviya 프로젝트를 진행하며 고민했던 점들을 회고하며 글을 작성해 보겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필수 요구사항&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;자녀 성향을 응모하는 100명 한정 선착순 이벤트 페이지 시스템&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;응모 페이지는 회원의 이름과 전화번호를 받는다&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;중복으로 응모는 되지 않는다&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;선착순 응모 페이지는 매일 오후 1시 정각에 가장 높은 트래픽을 받는다 -&amp;gt; 1분에 10만 요청을 10분간 받는다&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;응모 결과는 다음날 오후 1시에 발표한다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평가 기준은 &lt;b&gt;개인 맞춤형 서비스&lt;/b&gt;와 &lt;b&gt;대규모 트래픽 처리&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;팀원들이 진행하는 자녀 성향 진단 시스템, 콘텐츠 추천 시스템에서 구현하는 &lt;b&gt;개인 맞춤형 서비스&lt;/b&gt;와&amp;nbsp;달리,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 맡은 부분이 &lt;b&gt;대규모 트래픽 처리&lt;/b&gt;가 가능한 지를 보여줄 수 있는 부분이라고 생각했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 팀들은 그럼에도 대용량 트래픽 처리보다는 여러 이벤트를 확장성 있게 개설하고, 질문 문항을 수정할 수 있는 식으로 구현하였지만, 저의 경우 직접 &lt;b&gt;K6를 통해 성능 테스트를 진행&lt;/b&gt;하고, 하나씩 &lt;b&gt;병목 지점을 찾아 개선해 가며 최종적인 로직과 아키텍처&lt;/b&gt;를 완성해 나가는 것을 목표로 프로젝트를 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기 설계&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대규모 응모 시스템 구축만 신경 쓰려면, 사실 대단히 많은 엔티티가 필요하지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;추가로 기존의 여러 프로젝트 경험을 미루어보았을 때, 꼭 필요하지 않은 연관관계를 굳이 부여하면 오히려 여러 부가적인 문제(N+1 문제, 테스트 시나리오 복잡성 증가 등등)가 발생합니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;항상 프로젝트를 할 때 제일 중요하게 생각하는 것은 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이 프로젝트를 왜 하는가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;이 프로젝트를 통해서 어떤 걸 얻고 싶은가?&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 유저에게 서비스를 할 목적으로 개발했던 &lt;b&gt;Now, Here&lt;/b&gt;의 경우에는 그에 맞춰서 개발했지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지금 개발하는 Naviya의 주된 목표는 아래와 같았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 대규모 부하테스트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. Redis기반 실시간 대규모 트래픽 처리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 메시지 큐 시스템을 통한 안정적인 트래픽 처리 데이터 파이프라인 구축&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 초기 ERD는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Redis : 전화번호(PK), 이름, 선착순 100명을 측정할 수 있는 count&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DBMS :&amp;nbsp; Id(PK), 이름, 전화번호, 생성날짜(응모 성공자 파악을 위함)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과 같이 매우 간단하게 구현했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(최종에는 살짝 수정)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 초기 설계에서 Redis를 사용한 이유는, Redis는 NoSQL 기반의 인메모리 데이터 저장소로써 데이터를 디스크에 저장하지 않고 메모리에 저장하기 때문에, 매번 디스크 I/O보다 훨씬 빠른 속도로 조회 및 사용이 가능하기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 중복 응모 방지를 할 때 Redis를 사용하면 키 값인 번호를 메모리에서 조회해 매우 빠른 속도로 중복을 방지할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 선착순 100명을 세기 위한 count를 중복 아닌 경우에 추가하고, 이후에 100명이 된다면 저장이 아니라 바로 마감 응답을 보낼 수 있게 처리하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;앞으로 어떤 테스트 결과와 최적화를 통해 최종 아키텍처로 향하는지 같이 확인하시죠.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;부하 테스트 K6&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;부하 테스트 툴로도 굉장히 다양한 툴이 많습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전 프로젝트의 경우 Postman의 유료 기능에 있는 성능 테스트 기능을 통해서 진행하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에는 좀 더 범용적으로 많이 사용하는 K6, nGrinder, Jmeter 중에서 선택을 하고 싶었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유플러스 현직자 분들과의 멘토링에서 현재 유플러스에서는 nGrinder를 많이 사용하지만 각 프로젝트의 상황에 맞춰서 툴을 선택하는 것이 좋겠다고 조언을 들었습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 조사한 각 테스트 툴의 장단점은 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;K6&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. Go언어 기반으로 높은 성능과 낮은 자원 소비&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. Js기반 테스크 스크립트 작성을 통해 상대적으로 시나리오 테스트 코드를 쉽게 구현&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 다른 도구에 비해 VU(가상 유저) 생성 시 낮은 하드웨어 리소스를 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 단일 스레드 실행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. GUI 없음&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;nGrinder&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. Jython 또는 Groovy로 작성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 분산테스트 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 웹 인터페이스를 제공해 테스트 관리와 모니터링이 쉬움&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 높은 자원 사용량&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 복잡한 설정&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;JMeter&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. Java로 작성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. GUI 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 오랜 역사로 큰 커뮤니티 보유와 다양한 정보 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 높은 자원 사용량&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 프로젝트의 경우 단일 로컬 서버에서 1초당 10만 트래픽을 10초간 처리하는 테스트를 작성하는데, K6도 로컬에서 작동하고 서버도 로컬에서 띄우다 보니 셋 중에서 가장 하드웨어 리소스가 적게 드는 K6를 선택하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GUI가 없는 것이 편의성 측면에는 문제였지만, 저와 같은 상황에서는 오히려 리소스가 적게 드는 희소식이었습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 도커를 통해서 간편하게 K6를 세팅하여 사용했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;크게 선착순 100개가 순차적으로 잘 들어가는지 확인하는 테스트와, 원래 프로젝트의 목표인 대규모 트래픽 테스트 두 가지를 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대규모 트래픽 테스트의 시나리오는 대규모 사용자 수와 높은 요청 빈도를 기반으로 한 부하 테스트 시나리오로, Redis와 포함한 응모 이벤트 시스템이 대규모 트래픽 상황에서 얼마나 안정적으로 작동하는지를 평가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 시나리오는 점진적으로 가상 유저 수(VUs)를 증가시키며, 최종적으로 500명의 유저가 동시에 초당 200번씩 10초간 시스템에 접근하는 상황을 재현합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 구성 요소&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;부하 단계 (stages)&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;첫 번째 단계&lt;/b&gt;: 5초 동안 VUs를 50명까지 점진적으로 증가시켜 초기 부하를 가함.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;두 번째 단계&lt;/b&gt;: 5초 동안 100 VUs를 유지해 서버가 일정한 부하를 처리할 수 있는지 확인.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;세 번째 단계&lt;/b&gt;: 10초 동안 500 VUs를 유지하여 대규모 동시 접속 시나리오를 재현.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;임계값 설정 (thresholds)&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;응답 시간&lt;/b&gt;: 95% 이상의 요청이 3000ms 이내에 완료되어야 함.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;실패율&lt;/b&gt;: 전체 요청의 1% 미만이어야 함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트 로직&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;요청 데이터&lt;/b&gt;: 각 VU는 자신의 고유 userId와 전화번호 정보를 포함한 JSON 형식의 요청 데이터를 생성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;요청 반복&lt;/b&gt;: 각 VU는 &lt;b&gt;200번의 POST 요청&lt;/b&gt;을 서버에 전송하며, 요청 사이에 &lt;b&gt;0.1초 간격&lt;/b&gt;을 두어 부하 분포를 조정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;성공 여부 확인&lt;/b&gt;: 각 요청의 응답 상태와 메시지 형식을 검사하여 &lt;b&gt;성공적으로 처리된 응모&lt;/b&gt;만 카운트&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;추후에 체험형 이벤트 선택 기능을 추가하고 나선 약간의 수정이 있었지만, 우선 큰 흐름은 위와 같은 형식으로 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 처음에 테스트 결과로는&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730187277552&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  ✗ response is a string
      ↳  72% &amp;mdash; ✓ 43438 / ✗ 16120

     checks.........................: 72.93% 43438 out of 59558
     data_received..................: 14 MB  285 kB/s
     data_sent......................: 9.4 MB 193 kB/s
     http_req_blocked...............: avg=176.82ms min=0s     med=0s    max=19.65s p(90)=13.03&amp;micro;s p(95)=910.79ms
     http_req_connecting............: avg=158.83ms min=0s     med=0s    max=18.09s p(90)=0s      p(95)=904.81ms
   ✗ http_req_duration..............: avg=767.64ms min=0s     med=0s    max=27.25s p(90)=2.13s   p(95)=3.03s
       { expected_response:true }...: avg=1.56s    min=31.7ms med=1.21s max=27.25s p(90)=3.04s   p(95)=4.17s
   ✗ http_req_failed................: 50.89% 45176 out of 88761
     http_req_receiving.............: avg=966.78&amp;micro;s min=0s     med=0s    max=2.62s  p(90)=58.89&amp;micro;s p(95)=91.84&amp;micro;s
     http_req_sending...............: avg=7.09ms   min=0s     med=0s    max=3.44s  p(90)=85.5&amp;micro;s  p(95)=6.67ms
     http_req_tls_handshaking.......: avg=0s       min=0s     med=0s    max=0s     p(90)=0s      p(95)=0s
     http_req_waiting...............: avg=759.57ms min=0s     med=0s    max=27.25s p(90)=2.11s   p(95)=3.01s
     http_reqs......................: 88761  1828.145604/s
     iteration_duration.............: avg=7.2s     min=1.07s  med=3.73s max=41.32s p(90)=19.48s  p(95)=24.49s
     iterations.....................: 54249  1117.327102/s
     vus............................: 1207   min=0              max=46613
     vus_max........................: 100000 min=12122          max=100000&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;라고 나왔는데, 이중 중요한 지표만 요약해서 설명드리면 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;response is a string&lt;/b&gt;: 72.93%&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트에서 응답이 문자열임을 확인하는 검사가 약 73% 성공&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;43,438개의 요청에서 응답이 문자열이었지만, 16,120개의 요청에서는 문자열로 확인되지 않음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;http_req_failed&lt;/b&gt;: 50.89%&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 전체 요청의 약 51%가 실패했습니다. 88,761개의 요청 중 45,176개가 실패&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;해석&lt;/b&gt;: 서버가 부하를 감당하지 못해 절반 이상의 요청이 실패, 타임아웃 또는 서버 자원 부족으로 인한 문제&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;http_req_duration&lt;/b&gt;: avg=767.64ms&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 요청의 평균 응답 시간이 약 768ms&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;해석&lt;/b&gt;: 일부 요청의 응답 시간이 매우 길어졌고, 27초 이상의 응답 지연이 발생&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;http_reqs&lt;/b&gt;: 88,761&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 총 88,761개의 요청이 이루어졌으며, 초당 약 1,828건의 요청이 발생&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;해석&lt;/b&gt;: 트래픽은 잘 발생했으나, 요청의 절반 이상이 실패하여 실제 성공한 요청은 상대적으로 적음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 맨 처음에는 큐 시스템 도입을 하지 않았기도 하였지만 결과와 같이 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다소 많이 구린 서버 성능이었는데 덕분에 최적화할 거리가 많아져서 좋았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;수백 명의 유저가 동시에 수백 건의 요청을 보내다 보니, 성능 문제뿐만 아니라 &lt;b&gt;동시성 문제&lt;/b&gt;도 발생하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 A의 요청이 진행 중인데 B의 요청이 반영돼 COUNT 가 100이 되어서 A의 요청에 영향을 미친 다던지와 같은 문제들 말입니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 스레드 풀, DB 커넥션 풀, Redis 커넥션 풀 수 조정, &lt;b&gt;타임아웃 시간 증가&lt;/b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. Redis 캐시 형태 list -&amp;gt; set형으로 최적화&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. Lua 스크립트를 통해 count 증가와 응모 처리를 원자적 단위로 처리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. 큐 시스템 도입으로 응답은 빠르게, 처리는 순차적으로 진행&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1번의 경우 단순히 config 파일을 수정하거나, properties파일을 수정하는 것이니, 2~4번에 해당하는 내용을 설명하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최적화 - 캐시 자료형 Set로 전환&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;알고리즘 문제를 풀 때 처음에는 완전 탐색으로 풀고 추후에 하나씩 로직을 개선해 나가는 것처럼, 이번 프로젝트에서도 처음에 빠르게 기능을 구현할 때는 List 형태로 구현했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730187956262&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Override
    @Transactional
    public String submitLotteryEntry(LotteryEntryRequest request) {
        try {
            String phone = request.getPhone();
            String name = request.getName();
            String selectedProgram = request.getSelectedProgram();
            String entryData = String.format(&quot;%s:%s:%s&quot;, name, phone, selectedProgram);

            log.info(&quot;새로운 응모 요청 처리 중 - 이름: {}, 전화번호: {}, 프로그램: {}&quot;,
                    name, phone, selectedProgram);

            // Redis에서 중복 체크
            List&amp;lt;String&amp;gt; winnersList = redisTemplate.opsForList().range(LOTTERY_WINNERS_LIST, 0, -1);
            if (winnersList != null) {
                boolean isDuplicate = winnersList.stream()
                        .map(data -&amp;gt; data.split(&quot;:&quot;)[1]) // 전화번호 추출
                        .anyMatch(p -&amp;gt; p.equals(phone));

                if (isDuplicate) {
                    log.warn(&quot;중복 응모 시도 - 전화번호: {}&quot;, phone);
                    return &quot;이미 응모한 전화번호입니다.&quot;;
                }
            }

            // 응모 카운트 확인
            Long currentCount = redisTemplate.opsForValue().get(LOTTERY_COUNT_KEY) != null
                    ? Long.parseLong(redisTemplate.opsForValue().get(LOTTERY_COUNT_KEY))
                    : 0;

            if (currentCount &amp;gt;= 100) {
                log.info(&quot;응모 마감 - 현재 응모자 수가 100명을 초과하였습니다.&quot;);
                return &quot;응모가 마감되었습니다.&quot;;
            }

            // 성공한 응모 처리
            redisTemplate.opsForList().rightPush(LOTTERY_WINNERS_LIST, entryData);
            redisTemplate.opsForValue().increment(LOTTERY_COUNT_KEY);

            log.info(&quot;응모가 접수되었습니다 - 이름: {}, 전화번호: {}, 프로그램: {}&quot;,
                    name, phone, selectedProgram);
            return &quot;응모가 접수되었습니다. 결과는 내일 오후 1시에 발표됩니다.&quot;;

        } catch (Exception e) {
            log.error(&quot;응모 처리 중 오류 발생 - 이름: {}, 전화번호: {}, 프로그램: {} 오류: {}&quot;,
                    request.getName(), request.getPhone(), request.getSelectedProgram(), e.getMessage());
            return &quot;응모 처리 중 오류가 발생했습니다. 다시 시도해주세요.&quot;;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;List 형으로도 현재 요구사항은 잘 만족할 수 있지만, List형으로 구현할 경우 중복된 응모 방지를 위해서 전체 리스트를 순회하며 비교해야 합니다. 이는 시간복잡도가 O(n)입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 Hash 구조를 이용하면 Key-Value 상으로 저장되기 때문에 응모자의 전화번호를 고유한 키로 두어 O(1)의 시간 복잡도로 찾을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 Hash는 각 키가 고유한 값을 가지므로, 중복된 전화번호로 응모하는 경우 즉시 중복 응모를 방지할 수 있는 이점이 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막 이점으로는, Value값을 이용하면 MySQL로 이전할 때 전체 응모 데이터를 상대적으로 values() 메서드를 통해 가져오고 별다른 변환을 하지 않아 이전 작업이 간단해집니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서비스 안의 다른 메서드들을 포함해서, 응모를 요청하는 메서드를 아래와 같이 set() 자료형을 이용하게끔 수정하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730188643276&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Override
    @Transactional
    public String submitLotteryEntry(LotteryEntryRequest request) {
        try {
            String phone = request.getPhone();
            String name = request.getName();
            String selectedProgram = request.getSelectedProgram();
            String entryKey = phone;
            String entryData = String.format(&quot;%s:%s:%s&quot;, name, phone, selectedProgram);

            log.info(&quot;새로운 응모 요청 처리 중 - 이름: {}, 전화번호: {}, 프로그램: {}&quot;,
                    name, phone, selectedProgram);

            Boolean isDuplicate = redisTemplate.opsForHash().hasKey(LOTTERY_HASH_KEY, entryKey);
            if (Boolean.TRUE.equals(isDuplicate)) {
                log.warn(&quot;중복 응모 시도 - 전화번호: {}&quot;, phone);
                return &quot;이미 응모한 전화번호입니다.&quot;;
            }

            String countStr = redisTemplate.opsForValue().get(LOTTERY_COUNT_KEY);
            Long currentCount = 0L;

            if (countStr == null) {
                redisTemplate.opsForValue().set(LOTTERY_COUNT_KEY, &quot;0&quot;);
            } else {
                try {
                    currentCount = Long.valueOf(countStr);
                } catch (NumberFormatException e) {
                    log.warn(&quot;Invalid count value in Redis. Resetting count to 0.&quot;);
                    currentCount = 0L;
                    redisTemplate.opsForValue().set(LOTTERY_COUNT_KEY, &quot;0&quot;);
                }
            }

            if (currentCount &amp;gt;= 100) {
                log.info(&quot;응모 마감 - 현재 응모자 수가 100명을 초과하였습니다.&quot;);
                return &quot;응모가 마감되었습니다.&quot;;
            }

            redisTemplate.opsForHash().put(LOTTERY_HASH_KEY, entryKey, entryData);
            redisTemplate.opsForValue().increment(LOTTERY_COUNT_KEY, 1);

            log.info(&quot;응모가 접수되었습니다 - 이름: {}, 전화번호: {}, 프로그램: {}&quot;,
                    name, phone, selectedProgram);
            return &quot;응모가 접수되었습니다. 결과는 내일 오후 1시에 발표됩니다.&quot;;

        } catch (Exception e) {
            log.error(&quot;응모 처리 중 오류 발생 - 이름: {}, 전화번호: {}, 프로그램: {} 오류: {}&quot;,
                    request.getName(), request.getPhone(), request.getSelectedProgram(), e.getMessage());
            return &quot;응모 처리 중 오류가 발생했습니다. 다시 시도해주세요.&quot;;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최적화 및 동시성 문제 해결 - Lua 스크립트, 중복 및 응모 처리 메시지 캐싱&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대용량 트래픽을 처리하는 상황에서, 최대한 서버를 거치지 않고 Redis에서 처리하기 위해서 &lt;b&gt;중복 및 응모 처리 메시지 자체도 Redis에 캐싱&lt;/b&gt;을 하여 사용했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 위에서 작성한 것처럼 set() 자료형을 통해서 구현했던 응모 처리 메서드에서 &lt;b&gt;Lua 스크립트&lt;/b&gt;를 통해&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;중복 응모 여부 처리&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;응모 처리 - 성공 / 실패&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;성공 시 count 증가&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;++ value 값을 string이 아니라 json 형태로 파싱 하는 걸로 변경&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 작업을 하나의 원자적 단위로 처리하게끔 수정하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 아래와 같이 기존의 set() 자료형에서 생길 수 있는 문제들을 한 번에 해결했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;데이터 일관성 : 응모자가 많은 경우 중복 체크, 데이터 저장, 카운트 증가 등의 상황에서 race condition 문제가 발생&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;성능 저하 : redis의 네트워크 호출이 많아질수록 네트워크와 Redis의 부하가 높아지고 성능이 저하&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1730189188955&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Override
    @Transactional
    public String submitLotteryEntry(LotteryEntryRequest request) {
        String script =
                &quot;local count_key = KEYS[1] &quot; +
                        &quot;local hash_key = KEYS[2] &quot; +
                        &quot;local entry_key = ARGV[1] &quot; +
                        &quot;local entry_data = ARGV[2] &quot; +
                        &quot;local max_entries = 100 &quot; + // 선착순 100명 제한
                        &quot;local current_count = tonumber(redis.call('GET', count_key) or '0') &quot; +

                        // 중복 체크
                        &quot;if redis.call('HEXISTS', hash_key, entry_key) == 1 then &quot; +
                        &quot;   return redis.call('GET', KEYS[3]) &quot; +  // 중복 응모 메시지
                        &quot;end &quot; +

                        // 선착순 제한 체크
                        &quot;if current_count &amp;gt;= max_entries then &quot; +
                        &quot;   return '응모가 마감되었습니다.' &quot; + // 선착순 마감 메시지
                        &quot;end &quot; +

                        // 응모 데이터 저장 및 카운트 증가
                        &quot;redis.call('HSET', hash_key, entry_key, entry_data) &quot; +
                        &quot;redis.call('INCR', count_key) &quot; +
                        &quot;return redis.call('GET', KEYS[4])&quot;;       // 응모 완료 메시지

        String entryKey = request.getPhone();
        String entryData = String.format(&quot;{\&quot;name\&quot;:\&quot;%s\&quot;, \&quot;phone\&quot;:\&quot;%s\&quot;}&quot;, request.getName(), request.getPhone());

        try {
            byte[] resultBytes = redisTemplate.execute((RedisCallback&amp;lt;byte[]&amp;gt;) connection -&amp;gt;
                    connection.scriptingCommands().eval(
                            script.getBytes(),
                            ReturnType.VALUE,
                            4,
                            LOTTERY_COUNT_KEY.getBytes(),
                            LOTTERY_HASH_KEY.getBytes(),
                            DUPLICATE_RESPONSE_KEY.getBytes(),
                            ENTRY_PROCESSED_RESPONSE_KEY.getBytes(),
                            entryKey.getBytes(),
                            entryData.getBytes()
                    )
            );

            String result = resultBytes != null ? new String(resultBytes) : &quot;오류 발생&quot;;
            log.info(&quot;응모 처리 결과: {}&quot;, result);
            return result;

        } catch (Exception e) {
            log.error(&quot;응모 처리 중 오류 발생 - 이름: {}, 전화번호: {} 오류{}&quot;, request.getName(), request.getPhone(), e.getMessage());
            return &quot;응모 처리 중 오류가 발생했습니다. 다시 시도해주세요.&quot;;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최적화 - Redis Streams&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막으로 최적화하기 위해서 도입한 부분은 바로 비동기 큐 시스템입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선, 대규모 트래픽 처리를 위해서 주로 어떤 선례가 있는지 확인해 봤고, 크게 나온 부분이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 비동기 큐 시스템 vs Spring Framework Reactive Stack &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 2가지였습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 경우에는 로컬 단일 서버에서 프로그램을 돌리고, 현재 하드웨어 리소스를 수평 확장 시키기 어려운 상황이기 때문에 고성능 병렬 처리를 좋게 만들지만 과도한 리소스를 사용할 우려가 있는 Spring Framework Reactive Stack 보다는 비동기 큐 시스템을 사용하기로 결정했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 비동기 큐 시스템은 뭐고, 또 어떤 종류가 있을까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;간단하게 비동기 큐 시스템에 대해 설명드리면, 이는 메시지를 큐에 넣고 consumer가 비동기적으로 처리하여 고부하를 분산시켜 처리하는 방식입니다. 주로 RabbitMQ와 Kafka 같은 메시지 큐 시스템은 특정 작업을 별도의 큐에 담아 소비자가 처리할 수 있도록 합니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이것 외에도 아래 표와 같은 큐 시스템이 있습니다.&lt;/span&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;760&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qCcW1/btsKmIobuZo/AUbKtkoj6mKmLKlyx07jw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qCcW1/btsKmIobuZo/AUbKtkoj6mKmLKlyx07jw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qCcW1/btsKmIobuZo/AUbKtkoj6mKmLKlyx07jw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqCcW1%2FbtsKmIobuZo%2FAUbKtkoj6mKmLKlyx07jw1%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;760&quot; height=&quot;220&quot; data-filename=&quot;큐.png&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 중에서 많은 기업들의 JD에도 적혀있는 kafka와 지금 제가 사용하는 Redis에 포함된 Redis Streams에 대해 조사해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XKndw/btsKoiofgZf/4ovyz5Ra5ajhnRTdA25I60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XKndw/btsKoiofgZf/4ovyz5Ra5ajhnRTdA25I60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XKndw/btsKoiofgZf/4ovyz5Ra5ajhnRTdA25I60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXKndw%2FbtsKoiofgZf%2F4ovyz5Ra5ajhnRTdA25I60%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;615&quot; height=&quot;395&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 서비스에서 Redis를 기반으로 구현 중이기도 하여서 설치와 설정이 간편하다는 장점, 지연 시간이 짧고 실시간 응답이 필요할 때 유리하다는 점, 현재 저의 부하테스트에는 초당 수십만 메시지까지의 성능이면 충분하다는 점을 생각해서 Redis Streams를 사용하기로 결정했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그런데 여기서 살짝의 문제가 있었습니다..!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 윈도우 운영체제를 쓰고 있고, 윈도우 운영체제에서는 다운로드하여서 사용할 수 있는 Redis의 버전이 3.0.0대의 버전이 가장 최근이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;근데 현재 Redis는 7 버전까지 나온 상황이고, Redis Streams은 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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 해결하기 위해서 구글링 해본 결과 WSL2를 통해서 Ubuntu를 다운로드하여서 사용하는 방법이 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 Ubutu에 redis를 다운로드하고 이후에 이를 로컬 서버에 연결해서 사용하는 방식으로 구현했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기까지 구현하고 위에서 작성한 테스트 시나리오로 테스트한 결과는 어땠을까요?&lt;/span&gt;&lt;/p&gt;
&lt;p 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고로 한 번에 위와 같은 과정들을 한 것이 아니라, 매번 최적화하고 K6를 통해서 테스트하는 과정들을 수십 번 반복했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 앞으로도 글의 분량이 많은데, 매번 테스트한 결과를 모두 첨부하면 글이 너무나도 길어질 것 같아서 처음 테스트 결과와 마지막 테스트 결과만 첨부하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730194943835&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     ✓ is success or correct message

     checks.........................: 100.00% 98748 out of 98748
     data_received..................: 31 MB   591 kB/s
     data_sent......................: 20 MB   372 kB/s
     http_req_blocked...............: avg=137.94&amp;micro;s min=1.39&amp;micro;s  med=7.62&amp;micro;s  max=124.54ms p(90)=11.19&amp;micro;s  p(95)=13.06&amp;micro;s
     http_req_connecting............: avg=127.33&amp;micro;s min=0s      med=0s      max=124.31ms p(90)=0s       p(95)=0s
   ✓ http_req_duration..............: avg=54.15ms  min=2.26ms  med=41.85ms max=1.33s    p(90)=110.63ms p(95)=137.1ms
       { expected_response:true }...: avg=54.15ms  min=2.26ms  med=41.85ms max=1.33s    p(90)=110.63ms p(95)=137.1ms
   ✓ http_req_failed................: 0.00%   0 out of 98748
     http_req_receiving.............: avg=93.4&amp;micro;s   min=10.97&amp;micro;s med=65.37&amp;micro;s max=295.03ms p(90)=139.73&amp;micro;s p(95)=187.97&amp;micro;s
     http_req_sending...............: avg=35.29&amp;micro;s  min=3.8&amp;micro;s   med=23.7&amp;micro;s  max=8.72ms   p(90)=66.33&amp;micro;s  p(95)=98.33&amp;micro;s
     http_req_tls_handshaking.......: avg=0s       min=0s      med=0s      max=0s       p(90)=0s       p(95)=0s
     http_req_waiting...............: avg=54.02ms  min=2.2ms   med=41.72ms max=1.33s    p(90)=110.47ms p(95)=136.97ms
     http_reqs......................: 98748   1861.989901/s
     iteration_duration.............: avg=31.48s   min=24.86s  med=31.99s  max=33.95s   p(90)=33.03s   p(95)=33.19s
     iterations.....................: 421     7.938366/s
     vus............................: 79      min=10             max=499
     vus_max........................: 500     min=500            max=500&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 전체적인 성공률과 처리량&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;✓ checks: 100.00% (98,748 out of 98,748)
- 모든 요청이 성공적으로 처리됨
- 총 98,748개의 요청이 처리됨

http_reqs: 98,748 (1,861.99/s)
- 초당 약 1,862개의 요청을 처리&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 하드웨어 리소스의 영향으로 10만 개의 요청을 10초 안에 보내지는 못했지만, 보낸 모든 요청을 100% 성공적으로 응답했습니다.&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 응답 시간 분석&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;http_req_duration (중요 지표):
- 평균: 54.15ms
- 최소: 2.26ms
- 중간값: 41.85ms
- 최대: 1.33s
- 90% 요청: 110.63ms 이하
- 95% 요청: 137.1ms 이하&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 보다시피 원래 목표했던 95%의 요청이 3초 안에 들어올 뿐만 아니라 최대로 올린 시간 역시 1.33초 굉장히 많이 줄었습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성공률 73% -&amp;gt; 100%&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최대 응답시간 27초 -&amp;gt; 1.3초로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각각 37%, 95% 개선되는 성과를 보였습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; (테스트 실행 동영상 / 4배속) &lt;/span&gt;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;부가 기능 - 체험형 이벤트 선택 기능 및 프론트 수정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 기존의 목표인&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 대규모 부하테스트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. Redis기반 실시간 대규모 트래픽 처리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 메시지 큐 시스템을 통한 안정적인 트래픽 처리 데이터 파이프라인 구축&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;를 다 완료했습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;근데 &lt;b&gt;'아이의 성향을 가지고 응모 페이지 구현'&lt;/b&gt;하라는 요구사항을 만족해야 하고, 아이를 위해서 또는 아이가 사용하는 서비스인 만큼 이런 부분을 기획과 디자인에 반영해서 개발을 진행했어야 했습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 생각한 아이디어는 아이의 성향에 따라서 체험할 수 있는 프로그램을 4가지 고르고, 해당 프로그램과 이름, 전화번호를 선착순으로 입력한 100명이 체험형 프로그램을 무료로 진행할 수 있는 이벤트를 기획했습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 디자인을 팀원과 논의하여 노란색의, 아이에게도 친화적인 디자인으로 최종 수정했습니다.&lt;/span&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;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 아키텍처 및 결론&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;741&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjUumn/btsKnopI85x/NppGEAfmvVQwZfcPRY8mAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjUumn/btsKnopI85x/NppGEAfmvVQwZfcPRY8mAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjUumn/btsKnopI85x/NppGEAfmvVQwZfcPRY8mAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjUumn%2FbtsKnopI85x%2FNppGEAfmvVQwZfcPRY8mAK%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;1107&quot; height=&quot;741&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;741&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종적으로 위와 같이 10만 * 10초의 트래픽을 감당하기 위한 아키텍처를 설계했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 대규모 응모 처리 시스템을 구현하면서 좋았던 점은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. Redis 캐시를 사용해 본 경험&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 대용량 트래픽을 위한 큐 시스템 적용 경험&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. K6를 통한 테스트 시나리오 작성 및 성능 테스트 경험&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 실질적인 성능 향상 경험&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 4가지였습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 아쉬운 점은 하드웨어의 한계로 10만 * 10초의 트래픽을 실제로 테스트하지 못하고, 1만 * 10초의 트래픽으로 테스트한 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 클라우드 서비스를 이용해서 해도 되지만, 사이드프로젝트에서 프리티어를 이용하려고 하다 보면 훨씬 안 좋은 하드웨어 자원을 사용한다는 것을 알아서 그냥 로컬에서 진행했습니다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리하며&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 개발을 시작한 지 얼마 안 됐을 때는 쉘 프롬프트만 봐도 머리가 쥐 날 것 같았는데, 이제는 하나의 컴퓨터에서 우분투에 Redis, 윈도우&amp;nbsp;쉘에 도커 띄워서 K6 부하테스트, 로컬에 서버 올려서 작동하는 걸 한 번에 수월하게 다루는 것을 보고 그래도 나름대로 개발 실력이 계속 늘고 있다는 게 느껴져서 좋았습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 코테랑.. 다른 부분도 매우 좋아지기를 바라면서 글을 마칩니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  긴 글 읽어주셔서 감사합니다.&lt;/blockquote&gt;</description>
      <category>프로젝트</category>
      <category>K6</category>
      <category>Queue</category>
      <category>redis</category>
      <category>개발</category>
      <category>대규모트래픽처리</category>
      <category>대용량트래픽</category>
      <category>응모시스템</category>
      <category>최적화</category>
      <category>큐시스템</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/47</guid>
      <comments>https://jun10920.tistory.com/47#entry47comment</comments>
      <pubDate>Wed, 30 Oct 2024 12:03:18 +0900</pubDate>
    </item>
    <item>
      <title>각자의 전쟁터에서</title>
      <link>https://jun10920.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&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;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;인터넷이란 창을 통해 세상의 모든 소식을 접하다 보니, 희극과 비극을 동시에 너무나도 쉽게 알게 되는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;이 시대가 묘하게 다가옵니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;저희 본가에서 차로 약 30분만 가면 북한이 보입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;그 북한의 제 나이대 청년들은 지금 러시아에서 전쟁에 참전하고 있습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;https://lnkd.in/gV8znz7P&quot;&gt;https://lnkd.in/gV8znz7P&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;그리고 그 반대편 우크라이나에서는, 평범하게 일상을 살아가던 이들이 군대에 강제로 징집되고 있죠.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;https://lnkd.in/gNyhiRpi&quot;&gt;https://lnkd.in/gNyhiRpi&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;이런 소식을 접할 때면, 하반기에 취준을 이어가고 있는 저의 모습과 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;그들의 현실이 너무 달라 보여서, &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;묘한 괴리감을 느끼곤 합니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;각자 나름의 전쟁을 치르고 있다고들 하지만, 그 무게감이 과연 같을까요?&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;얼마 전 가족들과의 식사 자리에서 이야기를 나눈 적이 있습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;이런 상황들이 악화되어 진짜 전쟁이 나게 된다면 어떻게 할 건지에 대한 대화였죠.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;특히 저와 동생은 둘 다 징병 대상자라, 그 순간만큼은 분위기가 꽤나 무겁게 가라앉았습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;전쟁터에 나가기 싫어서 나라를 떠나거나 범죄자가 되어 해외에 망명하는 이들이 있다는 걸 잘 압니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;그들은 &amp;lsquo;개인&amp;rsquo;의 입장에서 생존을 택한 것이겠죠. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;그리고 그와는 반대로, 나라를 위해 목숨을 바친 이들도 있습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;각자의 선택이 있겠지만, 저는 그들의 결정을 결코 쉽게 비난할 수 없다고 생각합니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;저는 우주가 끝없다 해도, 제가 죽으면 제 우주는 끝나버리니까요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;그런 의미에서 나의 우주를 지키기 위해 도망가는 사람을 이해할 수밖에 없습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;그럼에도 불구하고, 저는 전쟁이 나가면 꼭 참전하려구요.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;나라를 지키겠다는 대단한 마음은 아니지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;모든 사람이 저런 마음으로 도망간다면 제가 사랑하는 사람들은 누가 지킬까요?&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;저같은 사람들이 모여서 사랑하는 사람들이 잘 살 수 있는 나라를 지키기 위해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;저는 당연하지만 당연하지 않은 참전을 꼭 하려구요.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;끝없는 취준 속에도 종종 힘들지만, 그럼에도 오늘 할 수 있는 일을 하면서 또 하루가 저뭅니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;긴 글 읽어주셔서 감사합니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/46</guid>
      <comments>https://jun10920.tistory.com/46#entry46comment</comments>
      <pubDate>Sun, 20 Oct 2024 18:24:35 +0900</pubDate>
    </item>
    <item>
      <title>[Now, Here] 프로젝트 서비스가 오픈 되었습니다!</title>
      <link>https://jun10920.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요~!&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;시작했습니다!&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;감사하겠습니다!&lt;br /&gt;(지인이나, SNS(에타같은..) 공유도 해주시면 감사.. :&amp;gt;)&lt;br /&gt;&lt;br /&gt;아래는 홍보 멘트입니다!&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_a4 최종 (1).jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xNQx9/btsJPAYm0Uy/hgK6xlSGNF1CQeTcOTzD7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xNQx9/btsJPAYm0Uy/hgK6xlSGNF1CQeTcOTzD7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xNQx9/btsJPAYm0Uy/hgK6xlSGNF1CQeTcOTzD7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxNQx9%2FbtsJPAYm0Uy%2FhgK6xlSGNF1CQeTcOTzD7K%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;707&quot; data-filename=&quot;edited_a4 최종 (1).jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&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;&lt;b&gt;나우히어(Now,&amp;nbsp;Here)&lt;/b&gt;가&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;마세요! &lt;br /&gt;&lt;br /&gt;  나우히어에서 당신의 인연을 찾아보세요  &lt;br /&gt;-&amp;nbsp;&lt;b&gt;MBTI&amp;nbsp;기반&amp;nbsp;맞춤&amp;nbsp;매칭:&lt;/b&gt;&amp;nbsp;당신의&amp;nbsp;성향에&amp;nbsp;꼭&amp;nbsp;맞는&amp;nbsp;상대를&amp;nbsp;만나보세요!&lt;br /&gt;-&amp;nbsp;&lt;b&gt;무제한&amp;nbsp;매칭:&lt;/b&gt;&amp;nbsp;마음에&amp;nbsp;드는&amp;nbsp;상대를&amp;nbsp;찾을&amp;nbsp;때까지&amp;nbsp;계속! &lt;br /&gt;-&amp;nbsp;&lt;b&gt;간편한&amp;nbsp;가입:&lt;/b&gt; 복잡한&amp;nbsp;절차는&amp;nbsp;No!&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;정보만으로&amp;nbsp;시작해요.&lt;br /&gt;&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;삭제됩니다. &lt;br /&gt;&lt;br /&gt; &amp;nbsp;&lt;b&gt;완전&amp;nbsp;무료&amp;nbsp;서비스!&lt;/b&gt;&amp;nbsp;  &lt;br /&gt;나우히어는&amp;nbsp;여러분의&amp;nbsp;특별한&amp;nbsp;만남을&amp;nbsp;위해&amp;nbsp;100%&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;&lt;b&gt;여러분의&amp;nbsp;소중한&amp;nbsp;피드백을&amp;nbsp;기다립니다&lt;/b&gt;&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;됩니다. &lt;br /&gt;&lt;br /&gt; &amp;nbsp;지금&amp;nbsp;바로&amp;nbsp;나우히어&amp;nbsp;시작하기 &lt;br /&gt;링크:&amp;nbsp;&lt;a href=&quot;https://www.now-here.site/login/MTAyOTM4NDU&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.now-here.site/login/MTAyOTM4NDU&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;⏰&amp;nbsp;&lt;b&gt;10월&amp;nbsp;31일&lt;/b&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;나우히어와&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>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/45</guid>
      <comments>https://jun10920.tistory.com/45#entry45comment</comments>
      <pubDate>Sun, 29 Sep 2024 11:54:09 +0900</pubDate>
    </item>
    <item>
      <title>[Now, Here] 성능 테스트_하드웨어 리소스 업그레이드</title>
      <link>https://jun10920.tistory.com/44</link>
      <description>&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;  성능 테스트 가이드 시리즈  / 클릭 시 이동&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/40&quot;&gt;성능 테스트_성능 목표 잡기&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;2.&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/41&quot;&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/41&quot;&gt;성능 테스트_HikariCP의 연결 최대 풀 설정&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/42&quot;&gt;성능 테스트_Caffeine 캐시 설정 및 적용&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/43&quot;&gt;성능 테스트_인덱싱과 트랜잭션 관리 최적화&lt;/a&gt;&lt;br /&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/44&quot;&gt;성능&amp;nbsp;테스트_하드웨어&amp;nbsp;리소스&amp;nbsp;업그레이드&lt;/a&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/44&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3aAZ0/btsJDqBwbaO/03sKVfsnuyVMeKebzZTLJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3aAZ0/btsJDqBwbaO/03sKVfsnuyVMeKebzZTLJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3aAZ0/btsJDqBwbaO/03sKVfsnuyVMeKebzZTLJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3aAZ0%2FbtsJDqBwbaO%2F03sKVfsnuyVMeKebzZTLJK%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;1760&quot; height=&quot;452&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1760&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3FQPp/btsJE8y6iRJ/3cKyjtHdXUFjQiw5m2tSLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3FQPp/btsJE8y6iRJ/3cKyjtHdXUFjQiw5m2tSLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3FQPp/btsJE8y6iRJ/3cKyjtHdXUFjQiw5m2tSLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3FQPp%2FbtsJE8y6iRJ%2F3cKyjtHdXUFjQiw5m2tSLk%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;747&quot; height=&quot;457&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Total Average response time&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 7575ms &amp;rarr; 4,465 ms(41.06%의 성능 향상) &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Top 5 slowest requests based on their average response times.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1775&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg7KrF/btsJESQM6h3/F7qb4M0NeKBANuHijoAqB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg7KrF/btsJESQM6h3/F7qb4M0NeKBANuHijoAqB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg7KrF/btsJESQM6h3/F7qb4M0NeKBANuHijoAqB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg7KrF%2FbtsJESQM6h3%2FF7qb4M0NeKBANuHijoAqB1%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;1775&quot; height=&quot;505&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1775&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;API 성능 개선 요약&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;각 API별 성능 개선율&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 91.3953%; height: 154px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 45.3488%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;API 엔드포인트&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 23.0233%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;평균 응답 시간 개선율&amp;nbsp;&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 22.9069%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;90th 응답 시간 개선율&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 45.3488%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;GET /matching/senderList (받은 하트 페이지 조회)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 23.0233%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;72.10%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 22.9069%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;66.42%&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 45.3488%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;GET /matching/getNotificationList (알림 목록 조회)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 23.0233%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;21.00%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 22.9069%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;7.08%&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 45.3488%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;GET /matching/summaryDetail (매칭 현황 페이지 조회)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 23.0233%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;43.29%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 22.9069%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;37.79%&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 45.3488%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;GET /matching/summary (매칭 요약 조회)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 23.0233%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;35.74%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 22.9069%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;34.25%&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 45.3488%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;GET /matching/banner (배너 대칭 목록 조회)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 23.0233%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;88.33%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 22.9069%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;86.52%&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px; width: 45.3488%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;GET /matching/getNotification (알림 개수 조회)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 23.0233%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;54.33%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px; width: 22.9069%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;39.83%&lt;/span&gt;&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;상세 성능 개선 데이터&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GET /matching/senderList (받은 하트 페이지 조회)&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평균 응답 시간: 33,288ms &amp;rarr; 9,289ms (72.10% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;90th 응답 시간: 44,404ms &amp;rarr; 14,911ms (66.42% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GET /matching/getNotificationList (알림 목록 조회)&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평균 응답 시간: 23,766ms &amp;rarr; 18,774ms (21.00% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;90th 응답 시간: 28,215ms &amp;rarr; 26,218ms (7.08% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GET /matching/summaryDetail (매칭 현황 페이지 조회)&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평균 응답 시간: 23,865ms &amp;rarr; 13,533ms (43.29% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;90th 응답 시간: 28,220ms &amp;rarr; 17,555ms (37.79% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GET /matching/summary (매칭 요약 조회)&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평균 응답 시간: 18,525ms &amp;rarr; 11,905ms (35.74% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;90th 응답 시간: 25,130ms &amp;rarr; 16,522ms (34.25% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GET /matching/banner (배너 대칭 목록 조회)&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평균 응답 시간: 32,414ms &amp;rarr; 3,784ms (88.33% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;90th 응답 시간: 50,631ms &amp;rarr; 6,825ms (86.52% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GET /matching/getNotification (알림 개수 조회)&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평균 응답 시간: 23,766ms &amp;rarr; 10,854ms (54.33% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;90th 응답 시간: 28,215ms &amp;rarr; 16,976ms (39.83% 개선)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;전체 평균 개선율&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평균 응답 시간 개선율: (72.10% + 21.00% + 43.29% + 35.74% + 88.33% + 54.33%) / 6 &amp;asymp;&lt;b&gt; 52.47%&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;90th 응답 시간 개선율: (66.42% + 7.08% + 37.79% + 34.25% + 86.52% + 39.83%) / 6 &amp;asymp; &lt;b&gt;45.32%&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이와 같이 전체 API 성능이 크게 개선되었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;평균 응답 시간은 약 약 52.47% 개선되었고, 90th 백분위 응답 시간은 약 45.32% 개선되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 통해서 &lt;b&gt;비효율적인 프로세스 개선을 통한 리소스 사용 줄이기&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용 방법으로는&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;HikariCP의 연결 최대 풀 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Caffeine 캐시 설정 및 적용&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;엔티티 인덱싱&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;트랜잭션 최적화&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이고 추가로&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DB 아키텍처 설계할 때 Master - Slave 형태로 설계해 로드 밸런싱한 것&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스키마 설계할 때 event_id를 기준으로 파티셔닝&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만, 목표 성능 예산이었던 3초는 어떻게 달성할 것인가?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; 바로 아직 사용하지 않은, 리소스 성능 향상을 사용할 것이다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GCP에서 훨씬 좋은 성능의 DB 서버를 실제 상용 DB 서버로 사용하기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리소스 향상이 매우 압도적으로 일어날 것을 예상할 수 있는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 서비스를 개선하기 전에 예산이 없는 상황에서 과도한 금액이 나가는 것을 우려해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로컬 DB를 연결해 리소스 증가시 어느 정도의 성능을 발휘하는지 파악했다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 리소스 자원 업그레이드 테스트&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1767&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crxzuz/btsJEUujrZl/QdUyO0qvuGFWN7Miz6lUN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crxzuz/btsJEUujrZl/QdUyO0qvuGFWN7Miz6lUN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crxzuz/btsJEUujrZl/QdUyO0qvuGFWN7Miz6lUN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcrxzuz%2FbtsJEUujrZl%2FQdUyO0qvuGFWN7Miz6lUN1%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;1767&quot; height=&quot;462&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1767&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddfN1j/btsJEp2wayF/PsiAq6tDprpuBMkI0FUysk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddfN1j/btsJEp2wayF/PsiAq6tDprpuBMkI0FUysk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddfN1j/btsJEp2wayF/PsiAq6tDprpuBMkI0FUysk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddfN1j%2FbtsJEp2wayF%2FPsiAq6tDprpuBMkI0FUysk%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;746&quot; height=&quot;453&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Total Average response time&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;7575ms &amp;rarr; 88 ms &lt;b&gt;( 98.84%의 성능 향상) &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Top 5 slowest requests based on their average response times.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gw4tY/btsJD63gcDh/93jqBfkrOpNjwzCw8nGvj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gw4tY/btsJD63gcDh/93jqBfkrOpNjwzCw8nGvj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gw4tY/btsJD63gcDh/93jqBfkrOpNjwzCw8nGvj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGw4tY%2FbtsJD63gcDh%2F93jqBfkrOpNjwzCw8nGvj0%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;1792&quot; height=&quot;495&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&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;br /&gt;프로세스 최적화 진행 전과 비교한 계산 과정&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;개선된 시간 = 7575ms - 88ms = 7487ms&lt;/li&gt;
&lt;li&gt;개선율 = (개선된 시간 / 원래 시간) * 100 = (7487 / 7575) * 100 &amp;asymp; 98.84%&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 7575ms에서 88ms로의 성능 개선은 &lt;b&gt;약 98.84%의 향상&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 최적화 이후와 비교한 계산 과정&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;개선된 시간 = 4,465ms - 88ms = 4,377ms&lt;/li&gt;
&lt;li&gt;개선율 = (개선된 시간 / 원래 시간) * 100 = (4,377 / 4,465) * 100 &amp;asymp; 98.03%&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 4,465ms에서 88ms로의 성능 개선은&lt;b&gt; 약 98.03%의 향상&lt;br /&gt;&lt;br /&gt;역시&amp;hellip;. 가장 좋은 것은 돈을 들여서 리소스 자원을 업그레이드하는 것이다. &lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경험을 통해서 배운 것은&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;성능 테스트의 중요성&lt;/b&gt;&lt;br /&gt;실제로 서비스를 운영하기 전에 테스트 환경에서 성능을 측정하고 개선하는 과정이 얼마나 중요한지 깨달았다. &lt;br /&gt;특히 우리 서비스처럼 축제 때 트래픽이 폭주하는 상황을 고려하면 더욱 그렇다. &lt;br /&gt;500명의 유저가 약 25만 개의 매칭 데이터를 요청하는 상황을 가정하고 테스트했는데&lt;br /&gt;초기에는 평균 응답 시간이 무려 7575ms나 걸렸다. 이런 식으로 미리 문제를 파악하고 개선할 수 있었다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단계별 최적화의 효과&lt;/b&gt;&lt;br /&gt;문제를 한 번에 해결하려고 하지 않고, 하나씩 파악하고 개선해 나가는 방식이 효과적이었다. &lt;br /&gt;HikariCP 설정 최적화로 연결 풀 고갈 문제를 해결하고, Caffeine 캐시 적용으로 전체 응답 시간을 39.68% 개선했다. 인덱싱과 트랜잭션 최적화를 통해 처음 대비 41.06%의 성능 향상을 이뤘고&lt;br /&gt;이런 식으로 단계별로 접근하니 각 단계에서의 효과를 명확히 볼 수 있었다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DB 최적화의 중요성&lt;/b&gt;&lt;br /&gt;DB 최적화가 전체 성능에 미치는 영향이 엄청나다는 걸 직접 경험했다. &lt;br /&gt;특히 매칭 엔티티에 복합 인덱스를 추가하니까 조회 성능이 크게 향상됐다. &lt;br /&gt;트랜잭션 관리도 중요했는데, 읽기 전용 메서드에 @Transactional(readOnly = true)를 &lt;br /&gt;적용하니까 불필요한 락을 방지하고 성능이 개선됐다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;캐싱의 효과&lt;/b&gt;&lt;br /&gt;Caffeine 캐시를 제대로 설정하니 배너 매칭 목록 조회 API의 응답 시간이 32,414ms에서 3,784ms로 줄어들었다. &lt;br /&gt;이건 무려 88.33%의 개선이다. 캐시 설정을 제대로 하니까 전체 응답 시간도 40% 가까이 개선되었다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;하드웨어 리소스의 영향&lt;/b&gt;&lt;br /&gt;소프트웨어 최적화도 중요하지만, 역시 가장 좋은 건 돈을 들여서 리소스 자원을 업그레이드하는 것이다.&lt;br /&gt;로컬 DB로 테스트했을 때 평균 응답 시간이 7575ms에서 88ms로 줄어들었는데 &lt;br /&gt;최적화를 진행하지 않았을 때 대비 98.84%의 성능 향상&lt;br /&gt;최적화하고 리소스만 업그레이드 했을 때 대비 98.03% 성능 향상이 되었다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;아키텍처 설계의 중요성&lt;/b&gt;&lt;br /&gt;Master-Slave 구조로 DB를 설계하고, event_id 기준으로 파티셔닝을 해 놓았다.&lt;br /&gt;이런 설계가 성능에 미치는 영향을 고려하면서 개발하는 게 중요하다는 걸 배웠다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 경험을 통해서 &lt;br /&gt;성능 최적화가 단순히 코드 몇 줄 바꾸는 게 아니라 &lt;br /&gt;&lt;b&gt;전체적인 시스템 설계부터 세세한 설정까지 모든 게 연관&lt;/b&gt;되어 있다는 걸 배웠다. &lt;br /&gt;그리고 무엇보다 수치로 개선 정도를 확인할 수 있어서 좋았다. &lt;br /&gt;다음 프로젝트에서는 이런 경험을 바탕으로 처음부터 성능을 고려한 설계를 할 수 있을 것 같다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>개발자</category>
      <category>백엔드</category>
      <category>부하테스트</category>
      <category>성능테스트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/44</guid>
      <comments>https://jun10920.tistory.com/44#entry44comment</comments>
      <pubDate>Mon, 16 Sep 2024 23:57:24 +0900</pubDate>
    </item>
    <item>
      <title>[Now, Here] 성능 테스트_인덱싱과 트랜잭션 관리 최적화</title>
      <link>https://jun10920.tistory.com/43</link>
      <description>&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;  성능 테스트 가이드 시리즈  / 클릭 시 이동&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/40&quot;&gt;성능 테스트_성능 목표 잡기&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;2.&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/41&quot;&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/41&quot;&gt;성능 테스트_HikariCP의 연결 최대 풀 설정&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/42&quot;&gt;성능 테스트_Caffeine 캐시 설정 및 적용&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/43&quot;&gt;성능 테스트_인덱싱과 트랜잭션 관리 최적화&lt;/a&gt;&lt;br /&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/44&quot;&gt;성능&amp;nbsp;테스트_하드웨어&amp;nbsp;리소스&amp;nbsp;업그레이드&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1813&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XLcs5/btsJDP1PfWq/yM0sM3HgcCq7gnw8RmoLtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XLcs5/btsJDP1PfWq/yM0sM3HgcCq7gnw8RmoLtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XLcs5/btsJDP1PfWq/yM0sM3HgcCq7gnw8RmoLtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXLcs5%2FbtsJDP1PfWq%2FyM0sM3HgcCq7gnw8RmoLtk%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;1813&quot; height=&quot;471&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1813&quot; data-origin-height=&quot;471&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wuSzw/btsJFsxuF7o/QmbukKiITFJ6En2ZDkoTxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wuSzw/btsJFsxuF7o/QmbukKiITFJ6En2ZDkoTxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wuSzw/btsJFsxuF7o/QmbukKiITFJ6En2ZDkoTxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwuSzw%2FbtsJFsxuF7o%2FQmbukKiITFJ6En2ZDkoTxk%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;743&quot; height=&quot;452&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Total Average response time&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 7575ms &amp;rarr; 4569ms&lt;b&gt; (39.68% 최적화)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 테스트에서는 이렇게 DB 성능이 나왔는데 이전의 테스트 당시 모니터링 화면과 양상이 유사하지 않은가?&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;왜냐면 테스트할 때 R관련 API가 실행될 때 데이터가 25만 개 이기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Tuples out이 계속 증가하다가 이후 CUD관련 API가 실행되면 이는 줄어들고 Tuples in이 되는 것을 볼 수 있다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Top 5 slowest requests based on their average response times.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1775&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U8Cad/btsJDbEyDkh/HwN9G5i8fGTvuWkf8OIYrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U8Cad/btsJDbEyDkh/HwN9G5i8fGTvuWkf8OIYrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U8Cad/btsJDbEyDkh/HwN9G5i8fGTvuWkf8OIYrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU8Cad%2FbtsJDbEyDkh%2FHwN9G5i8fGTvuWkf8OIYrK%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;1775&quot; height=&quot;505&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1775&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캐시를 제대로 설정하니 전체 응답 시간은 약 40%가 개선되었고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제가 됐던 &lt;b&gt;배너 매칭 목록 조회 API는&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자세하게 설명하자면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 배너 매칭 목록 조회 API의 평균 시간과 상위 90프로까지 시간이 각각 5081ms, 9220ms이 되었는데&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 평균시간 기준과 상위 90프로 기준&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;32414ms -&amp;gt; 5081ms의 경우: 개선된 시간 = 32414 - 5081 = 27333ms 개선율 = (27333 / 32414) * 100 &amp;asymp; &lt;b&gt;84.32%&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;50631ms -&amp;gt; 9220ms의 경우: 개선된 시간 = 50631 - 9220 = 41411ms 개선율 = (41411 / 50631) * 100 &amp;asymp; &lt;b&gt;81.79%&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;따라서,&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;32414ms에서 5081ms로의 개선은 &lt;b&gt;약 84.32%의 성능 향상&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;50631ms에서 9220ms로의 개선은 &lt;b&gt;약 81.79%의 성능 향상&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 통해 이제껏 문제가 됐던 배너 매칭 목록은 worst top 5 목록에서 아예 사라졌고 다른 5개가 리스팅 됐다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;원인 분석&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한 단계씩 적용해 가며&amp;nbsp; 단계적으로 최적화를 진행할 생각이어서 이전에 찾은 원인을 이어서 분석하였다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 엔티티에서 pk나 유니크 제약 조건과 별개로 비즈니스 로직에 맞게 인덱싱을 적용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;트랜잭션 관리 최적화를 통해서&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;간단하게는 R 기능만 사용하는 트랜잭션임을 밝혀 성능 최적화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;추후에 상용 DB를 연결할 때는 Master와 Slave에 각각 다른 트랜잭션을 날려 로드 밸런싱까지 할 수 있게 설정했다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;성능 개선&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;worst top 5 api는 전부 매칭과 관련된 API로 매칭과 관련해서&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 비즈니스 로직에 맞게 필요한 인덱싱 추가&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;service와 repository의 모든 메서드를 참고해서 R기능의 메서드를 트랜잭션 관리 최적화&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;읽기 전용 메서드에는 @Transactional(readOnly = true)를 적용&lt;/b&gt;하여 성능을 향상하고&lt;br /&gt;데이터베이스의 불필요한 락을 방지.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;쓰기, 삭제, 업데이트 작업을 하는 메서드에는 기본 트랜잭션 (@Transactional)을 사용&lt;/b&gt;하여 데이터 일관성을 유지&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;를 적용했다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;엔티티 클래스에서 인덱스 지정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 내 서비스는 JPA를 사용하기 때문에 어노테이션 안에 @Index 어노테이션을 통해 인덱스를 정의할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Entity
@Table(name = &quot;matching&quot;, indexes = {
    @Index(name = &quot;idx_matching_status&quot;, columnList = &quot;status&quot;),
    @Index(name = &quot;idx_matching_created_at&quot;, columnList = &quot;createdAt&quot;),
    @Index(name = &quot;idx_sender_receiver_member_id&quot;, columnList = &quot;sender_member_id, receiver_member_id&quot;, unique = true)
})
public class Matching {
    // 엔티티 필드들
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;@Index: 특정 칼럼에 대한 인덱스를 지정.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;name: 인덱스의 이름을 지정.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;columnList: 인덱스를 적용할 칼럼(들)을 지정.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;unique = true: 복합 인덱스를 유니크 인덱스로 설정할 수 있음. &lt;br /&gt;여기서 sender_member_id와 receiver_member_id를 묶어서 유니크 인덱스로 지정한 것은 &lt;br /&gt;두 멤버의 매칭이 중복되지 않게 보장해 줌.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 @Index(name = &quot;idx_sender_receiver_member_id&quot;, columnList = &quot;sender_member_id, receiver_member_id&quot;, unique = true)와 같이 복합 인덱스를 설정하면 두 칼럼을 조합해서 조회하는 경우 성능이 크게 향상된다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어 한 명의 회원이 보낸 매칭 또는 받은 매칭을 조회하는 쿼리들이 빠르게 처리된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 unique = true를 사용하면 &lt;b&gt;두 멤버가 서로 매칭되는 관계&lt;/b&gt;가 중복으로 발생하지 않도록 데이터베이스 레벨에서 제약을 설정&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;즉, &lt;b&gt;동일한 두 멤버가 여러 번 매칭되는 것을 방지&lt;/b&gt;할 수 있어. 예를 들어, sender_member_id = 1과 receiver_member_id = 2로 매칭된 경우, 동일한 두 사람에 대해 다시 매칭을 생성하려고 하면 오류가 발생&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;트랜잭션 최적화&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;읽기 전용 트랜잭션 적용&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;읽기 전용으로 처리되는 메서드는 데이터베이스에서 데이터를 변경하지 않으므로@Transactional(readOnly = true)를 적용&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Transactional(readOnly = true)
@Override
public List&amp;lt;Matching&amp;gt; findByReceiverId(Long memberId) {
    return em.createQuery(&quot;SELECT m FROM Matching m WHERE m.receiver.id = :memberId&quot;, Matching.class)
             .setParameter(&quot;memberId&quot;, memberId)
             .getResultList();
}

@Transactional(readOnly = true)
@Override
public List&amp;lt;BannerListResponse&amp;gt; getBannerList() {
    List&amp;lt;Object[]&amp;gt; results = matchingRepository.findMemberForBanner(Status.ACCEPTED);
    return matchingListToDto.convertToBannerListResponse(results);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 하면 읽기 작업 시 불필요한 락을 방지하고 성능을 개선된다.&lt;br /&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;쓰기/수정 트랜잭션&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;쓰기 작업은 데이터베이스에 변경을 일으키므로, 기본 트랜잭션을 적용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Transactional
@Override
public void save(Matching matching) {
    try {
        em.persist(matching);
    } catch (Exception e) {
        log.error(&quot;매칭 저장 중에 실패: {}&quot;, matching, e);
    }
}

@Transactional
@Override
public void update(Matching matching) {
    try {
        em.merge(matching);
    } catch (Exception e) {
        log.error(&quot;매칭 업데이트 중 실패: {}&quot;, matching, e);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; 하지만 서비스 자체의 도메인이 크지 않기 때문에 Matching을 하는 김에 &lt;br /&gt;모든 엔티티에 인덱싱과 트랜잭션 관리 최적화를 진행했다.&lt;br /&gt;&lt;br /&gt;결과는 다음에..&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>개발자</category>
      <category>백엔드</category>
      <category>부하테스트</category>
      <category>성능테스트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/43</guid>
      <comments>https://jun10920.tistory.com/43#entry43comment</comments>
      <pubDate>Mon, 16 Sep 2024 23:16:26 +0900</pubDate>
    </item>
    <item>
      <title>[Now, Here] 성능 테스트_Caffeine 캐시 설정 및 적용</title>
      <link>https://jun10920.tistory.com/42</link>
      <description>&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;  성능 테스트 가이드 시리즈  / 클릭 시 이동&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/40&quot;&gt;성능 테스트_성능 목표 잡기&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;2.&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/41&quot;&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/41&quot;&gt;성능 테스트_HikariCP의 연결 최대 풀 설정&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/42&quot;&gt;성능 테스트_Caffeine 캐시 설정 및 적용&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/43&quot;&gt;성능 테스트_인덱싱과 트랜잭션 관리 최적화&lt;/a&gt;&lt;br /&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/44&quot;&gt;성능&amp;nbsp;테스트_하드웨어&amp;nbsp;리소스&amp;nbsp;업그레이드&lt;/a&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/44&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1807&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSIOVr/btsJDSRFAuJ/SBxcckcMURIkrPTpRkEXK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSIOVr/btsJDSRFAuJ/SBxcckcMURIkrPTpRkEXK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSIOVr/btsJDSRFAuJ/SBxcckcMURIkrPTpRkEXK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSIOVr%2FbtsJDSRFAuJ%2FSBxcckcMURIkrPTpRkEXK1%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;1807&quot; height=&quot;576&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1807&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bthIUZ/btsJDqaoPCf/McNVAclNYNWyovCLy8fROK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bthIUZ/btsJDqaoPCf/McNVAclNYNWyovCLy8fROK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bthIUZ/btsJDqaoPCf/McNVAclNYNWyovCLy8fROK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbthIUZ%2FbtsJDqaoPCf%2FMcNVAclNYNWyovCLy8fROK%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;746&quot; height=&quot;455&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Total Average response time&lt;/span&gt;&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;7575ms&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Top 5 slowest requests based on their average response times.&lt;/span&gt;&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;image.png&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSiwMu/btsJDfz6fvI/zflynkYXhrcNTBkDxA6MJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSiwMu/btsJDfz6fvI/zflynkYXhrcNTBkDxA6MJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSiwMu/btsJDfz6fvI/zflynkYXhrcNTBkDxA6MJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSiwMu%2FbtsJDfz6fvI%2FzflynkYXhrcNTBkDxA6MJk%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;1476&quot; height=&quot;461&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;461&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 평균시간과 기준치로 삼았던 90th TTFB를 보면 가장 높은 경우 무려 32414ms, 50631ms가 걸리는 기염을 토했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 서버 리소스가 적은 탓(512MB&amp;hellip;)이 가장 크겠지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우리의 목표는 현재 상황에서 얼마나 개선하는가 가 목표이기에 이를 우선 배너 매칭 목록 조회부터 원인 파악을 하기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원인 파악&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 해당 API에 관련된 코드를 확인했다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt; // controller
 @GetMapping(&quot;/banner&quot;)
    public ResponseEntity&amp;lt;ResponseForm&amp;gt; getMemberForBanner() {
        List&amp;lt;BannerListResponse&amp;gt; bannerList = matchingService.getBannerList();

        if (bannerList == null) {
            bannerList = List.of();
        }

        return ResponseEntity.ok(ResponseForm.of(ResponseCode.BANNER_LIST_QUERY_SUCCESS, bannerList));
	
	// service
    @Cacheable(&quot;bannerListCache&quot;)// 메서드의 결과를 캐시하여 동일한 인자로 호출되면 캐시된 결과 반환
    @Override
    public List&amp;lt;BannerListResponse&amp;gt; getBannerList() {
        // 최적화된 쿼리로 데이터를 가져옴
        List&amp;lt;Object[]&amp;gt; results = matchingRepository.findMemberForBanner(Status.ACCEPTED);

        // 데이터를 DTO로 변환하여 반환
        return matchingListToDto.convertToBannerListResponse(results);
    	}
    }

	// repository
    @Override
    public List&amp;lt;Object[]&amp;gt; findMemberForBanner(Status status) {
        try {
            return em.createQuery(&quot;SELECT s.nickname, s.mbti, s.gender, r.nickname, r.mbti, s.gender &quot; +
                            &quot;FROM Matching m &quot; +
                            &quot;JOIN m.sender s &quot; +
                            &quot;JOIN m.receiver r &quot; +
                            &quot;WHERE m.status = :status &quot; +
                            &quot;ORDER BY m.createdAt DESC&quot;, Object[].class)
                    .setParameter(&quot;status&quot;, status)
                    .setMaxResults(10)
                    .getResultList();
        } catch (Exception e) {
            log.error(&quot;배너에 적힐 10명의 매칭을 찾는 도중에 에러가 발생했습니다: {}&quot;, status, e);
            return List.of(); // 빈 리스트 반환
        }
    }&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 로컬 캐시도 적용하고, 쿼리를 날릴 때 엔티티 자체를 가져오지 않고 필요한 칼럼만 조회해서 가져오는 등 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 캐시 관련 설정을 다시 한번 검토하기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캐시 활성화 문제&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 Spring에서 캐시 기능을 활성화하기 위해서는 &lt;b&gt;@EnableCaching&lt;/b&gt; 어노테이션을 추가해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;import org.springframework.cache.annotation.EnableCaching;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableCaching  // 캐시 기능 활성화
public class NowHereApplication {

    public static void main(String[] args) {
        SpringApplication.run(NowHereApplication.class, args);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 캐시 설정을 추가해야 하는데 크게&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캐시 타입 지정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최대 캐시 크기 및 만료 시간 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;캐시 타입&lt;/b&gt;에는&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Caffeine&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자바 기반 로컬 캐시&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단일 서버 환경에서 캐시가 필요한 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빠른 C/R 기능이 중요한 DB 서버에서 데이터를 캐싱하는 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로컬이라 읽기 쓰기 성능이 뛰어남&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 서버 인스턴스에서 동일한 데이터를 캐싱해야 한다면 분산 캐시가 아니라 문제가 발생 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Ehcache&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자바 기반 로컬 캐시&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;디스크 기반 캐시를 지원해 메모리 제한을 초과해도 디스크에 데이터 저장&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클러스터링을 통해 분산 캐시처럼 사용 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로컬 캐시인 경우 서버 인스턴스마다 다른 캐시 데이터를 가질 수 있는 위험&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Redis&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인메모리 데이터베이스로서 분산 캐시 용도로 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;키-값 저장소로 동작하여 메모리에 모든 데이터를 저장하여 매우 빠른 성능 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 서버 인스턴스에서 동일한 캐시 일관성 보장&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;외부 서버 의존&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 위한 추가적인 리소스 비용 발생&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Hazelcast&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Memcached&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 캐시에 대한 설정이 미흡하여 제대로 캐싱이 되지 않는 것이 문제였다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성능 개선&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에서 설명한 캐시 중에서 기본적으로 개발 환경에서는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 빠른 캐싱 성능을 제공하고 설정이 간단한 Caffeine 캐시를 사용하는 것을 추천하고는 한다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 우리 서비스와 같은 경우 DB를 Master - Slave 구조로 멀티 데이터베이스 소스 형태로 구축해기에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Redis나 Hazelcast 같은 분산 캐시를 추천한다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇지만 나는 Redis, Hazelcast를 학습하고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 응용하기 위한 러닝 커브가 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 우리 서비스의 규모를 봤을 때 오버 엔지니어링이라는 판단을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 Master - Slave를 구축할 때 CUD는 Master가, R는 Slave가 담당하도록 구축하게 했기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단일 서버에 Master에서 주기적으로 Slave와 동기화하고, Slave에서 Caffeine을 통해서 로컬 캐시를 사용해도 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 아래와 같이 캐시는 &lt;b&gt;caffeine&lt;/b&gt;, &lt;b&gt;최대 500개의 캐시 항목 저장, 10분 후에 만료되도록 설정&lt;/b&gt;하였다.&lt;br /&gt;&lt;br /&gt;결과는 다음 글에..&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;spring.cache.type=caffeine  # 캐시 타입 지정
spring.cache.caffeine.spec=maximumSize=500,expireAfterWrite=10m 
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로젝트</category>
      <category>개발자</category>
      <category>백엔드</category>
      <category>부하테스트</category>
      <category>성능테스트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/42</guid>
      <comments>https://jun10920.tistory.com/42#entry42comment</comments>
      <pubDate>Mon, 16 Sep 2024 23:03:39 +0900</pubDate>
    </item>
    <item>
      <title>[Now, Here] 성능 테스트_HikariCP의 연결 최대 풀 설정</title>
      <link>https://jun10920.tistory.com/41</link>
      <description>&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;  성능 테스트 가이드 시리즈  / 클릭 시 이동&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/40&quot;&gt;성능 테스트_성능 목표 잡기&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;2.&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/41&quot;&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/41&quot;&gt;성능 테스트_HikariCP의 연결 최대 풀 설정&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/42&quot;&gt;성능 테스트_Caffeine 캐시 설정 및 적용&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/43&quot;&gt;성능 테스트_인덱싱과 트랜잭션 관리 최적화&lt;/a&gt;&lt;br /&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/44&quot;&gt;성능&amp;nbsp;테스트_하드웨어&amp;nbsp;리소스&amp;nbsp;업그레이드&lt;/a&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/44&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;문제 원인 파악&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적으로 테스트를 진행할 때는 에러가 발생하면 안 되는데, &lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;첫 번째 테스트를 진행하던 중에 에러가 발생했다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xd1TL/btsJEZPPsz1/OnPV92vmLQmEgsUlCMnMZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xd1TL/btsJEZPPsz1/OnPV92vmLQmEgsUlCMnMZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xd1TL/btsJEZPPsz1/OnPV92vmLQmEgsUlCMnMZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxd1TL%2FbtsJEZPPsz1%2FOnPV92vmLQmEgsUlCMnMZK%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;1818&quot; height=&quot;858&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;딱 특정 지점에만 에러가 발생하는 것을 보고 해당 부분의 log를 분석하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;2024-09-16T04:22:39.013+09:00  WARN 24884 --- [now_here] [.0-8080-exec-72] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: null
2024-09-16T04:22:39.013+09:00  WARN 24884 --- [now_here] [.0-8080-exec-35] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: null
2024-09-16T04:22:39.014+09:00 ERROR 24884 --- [now_here] [.0-8080-exec-72] o.h.engine.jdbc.spi.SqlExceptionHelper   : HikariPool-1 - Connection is not available, request timed out after 30001ms (total=10, active=10, idle=0, waiting=88)
2024-09-16T04:22:39.014+09:00 ERROR 24884 --- [now_here] [.0-8080-exec-35] o.h.engine.jdbc.spi.SqlExceptionHelper   : HikariPool-1 - Connection is not available, request timed out after 30002ms (total=10, active=10, idle=0, waiting=88)
2024-09-16T04:22:39.015+09:00 ERROR 24884 --- [now_here] [.0-8080-exec-35] c.n.n.d.m.service.MemberAuthService      : get Member By Token Error =Could not open JPA EntityManager for transaction
2024-09-16T04:22:39.016+09:00 ERROR 24884 --- [now_here] [.0-8080-exec-35] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.lang.NullPointerException: Cannot invoke &quot;com.now_here5.now_here.global.security.dto.AuthenticatedMemberDto.getRoleNamesDto()&quot; because &quot;memberDto&quot; is null
&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HikaraiCP 연결 풀이 고갈되어서 그런데, 로그를 좀 더 분석해 보면&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;HikariPool-1 - Connection is not available, request timed out after 30001ms (total=10, active=10, idle=0, waiting=88)
total=10: 최대 10개의 연결이 설정
active=10: 현재 모든 연결이 사용 중
idle=0: 유휴 상태의 연결이 없음
waiting=88: 88개의 스레드가 연결을 대기
이로 인해 연결을 얻지 못한 요청들이 30초 후에 타임아웃
&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이와 같은 이유로&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;smali&quot;&gt;&lt;code&gt;java.lang.NullPointerException: Cannot invoke &quot;com.now_here5.now_here.global.security.dto.AuthenticatedMemberDto.getRoleNamesDto()&quot; because &quot;memberDto&quot; is null
&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 에러를 통해 알 수 있듯이 memberDto 객체가 생성되지 않아 NullPointerException이 발생하는 것이었다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;성능 개선&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성능 개선을 위한 내용을 작성할 때 설명을 위해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; HikariCP의 &lt;/b&gt;&lt;b&gt;JDBC 커네션 풀의 설정 파라미터&lt;/b&gt;와 &lt;b&gt;모니터링 툴의 지표&lt;/b&gt;에 대해 설명하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; HikariCP의&amp;nbsp;JDBC 커네션 풀의 설정 파라미터 &lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;maximum-pool-size&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최대 풀 크기를 설정하는 파라미터로 HikariCP가 동시에 유지할 수 있는 최대 데이터베이스 연결 수를 지정&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;늘릴 때 장점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;동시 처리 가능한 요청 수가 증가해 타임아웃 발생 가능성이 줄어듦&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터베이스 서버 과부하 우려&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;minimum-idle&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최소 idle 연결 수를 설정하는 파라미터&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본값이 10개이므로 새로운 요청이 들어올 때 빠르게 연결을 제공하도록 함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;늘릴 때 단점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;불필요한 idle 연결 수가 많아지면 자원 낭비가 발생&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;connection-timeout&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;연결 타임아웃을 설정하는 파라미터, 데이터베이스 연결을 위해 API 서버가 기다릴 최대 시간을 밀리초 단위로 설명&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;풀 고갈 상황에서 요청들이 빠르게 실패하고 예외 처리를 적절하게 대응 가능&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;너무 짧으면 일시적인 트래픽 급증 시 불필요한 타임아웃 발생&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;너무 길면 사용자 만족도 감소&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;idle-timeout&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;idle 상태의 타임아웃을 설정하는 상태&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위와 맥락을 같이함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;max-lifetime&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;연결의 풀에서 유지될 수 있는 최대 수명을 설정&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적으로 30분으로 설정해 오래된 연결이 자동으로 폐기되고 새로 생성되게함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;너무 짧은 경우 연결을 재성성하게 되어 성능에 영향&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; pgAdmin4 Dashboard&amp;nbsp; &lt;/span&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;image.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1IWFa/btsJERYEhrx/ztyBLBUZkFvkerTkEKbOwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1IWFa/btsJERYEhrx/ztyBLBUZkFvkerTkEKbOwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1IWFa/btsJERYEhrx/ztyBLBUZkFvkerTkEKbOwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1IWFa%2FbtsJERYEhrx%2FztyBLBUZkFvkerTkEKbOwK%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;742&quot; height=&quot;458&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Database Sessions (데이터베이스 세션)&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파란색(Total)은 전체 세션 수, 주황색(Active)은 활성 세션, 녹색(Idle)은 유휴 상태의 세션&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음에는 총 세션 수가 약간 변동하다가, 이후 안정적으로 유지&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;활성 세션과 유휴 세션은 전체 세션과 비슷하며 이는 전체적인 세션 관리가 원활하게 이루어지고 있음을 나타냄&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Transactions per second (초당 트랜잭션)&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초당 트랜잭션 수가 처음에는 상당히 많다가 급격히 줄어들고, 이후 거의 유지&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;트랜잭션이 처음에는 활발하게 일어났으나 이후 줄어드는 패턴을 볼 수 있습니다. &lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 특정 작업이 완료되면서 트랜잭션 수가 감소&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Tuples in (데이터 삽입)&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;튜플 삽입(Inserts), 업데이트(Updates), 삭제(Deletes)에 대한 정보&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Tuples out (데이터 출력)&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Fetched(가져오기)와 Returned(반환)된 튜플&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기에는 데이터 가져오기와 반환 작업이 활발하게 일어나다가 급격히 줄어듬&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 처음에 데이터베이스로부터 데이터를 많이 조회했다가 작업이 완료되면서 감소&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Block I/O (블록 입출력)&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터베이스 블록 입출력에서 Read(읽기)와 Hit(히트)에 대한 정보&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;읽기 작업이 초기에는 상당히 활발하다가 감소하는 경향&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 초반에 데이터 읽기 작업이 집중적으로 이루어졌다는 것을 의미&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모니터링 툴에서 갑자기 지표들이 감소한 이유는 에러를 우선적으로 처리하고 다음 테스트를 진행하기 위해&lt;br /&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에서 분석한 문제 원인과 해결 방안을 통해서 내린 결론은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;HikariCP의 최대 풀 크기가 10으로 고정되어 있어 스레드가 대기를 하다가 타임아웃이 발생해 에러가 발생&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이를 2&lt;b&gt;0으로 조정하고 2번째 테스트를 진행&lt;/b&gt;했다.&lt;br /&gt;&lt;br /&gt;결과는 다음 글에..&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>developert</category>
      <category>개발자</category>
      <category>백엔드</category>
      <category>부하테스트</category>
      <category>성능테스트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/41</guid>
      <comments>https://jun10920.tistory.com/41#entry41comment</comments>
      <pubDate>Mon, 16 Sep 2024 22:51:12 +0900</pubDate>
    </item>
    <item>
      <title>[Now, Here] 성능 테스트_성능 목표 잡기</title>
      <link>https://jun10920.tistory.com/40</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;안녕하세요!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전에 언급했던 것처럼 Now, Here 글로 다시 찾아왔습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 출시가 얼마 남지 않았고, 대부분의 기능 구현은 완료한 상태입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 성능 테스트를 통해 웹 서비스의 성능을 측정하고, 병목지점을 찾아 성능 개선을 이루는 경험을 공유합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;  성능 테스트 가이드 시리즈  / 클릭 시 이동&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/40&quot;&gt;성능 테스트_성능 목표 잡기&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;2.&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/41&quot;&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/41&quot;&gt;성능 테스트_HikariCP의 연결 최대 풀 설정&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/42&quot;&gt;성능 테스트_Caffeine 캐시 설정 및 적용&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/43&quot;&gt;성능 테스트_인덱싱과 트랜잭션 관리 최적화&lt;/a&gt;&lt;br /&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://jun10920.tistory.com/44&quot;&gt;성능&amp;nbsp;테스트_하드웨어&amp;nbsp;리소스&amp;nbsp;업그레이드&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성능 목표 잡기 &lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성능이 좋다는 의미는 무엇인가?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보통 웹 성능이 좋다는 의미는 웹사이트에 접속했을 때 이들이 원하는 콘텐츠가 로딩될 때까지 걸리는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Average response time이 적다&lt;/b&gt;는 것을 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 &lt;b&gt;웹 성능이 좋다 &amp;rarr; 콘텐츠가 빨리 로딩된다&lt;/b&gt;로 해석할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세부적으로는 여러 가지 과정에 대하여 최대 허용 시간을 배분하는 것을 의미하는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;총예산 3초, DB 조회 1초, API 요청 처리는 0.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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 성능 개선은 비용, 시간이 많이 드는 작업이라 모든 서비스 페이지를 빠르게 만드는 것은 ROI가 좋지 않고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 중요하고, 성능이 안 좋은 페이지에 성능 개선을 하는 것이 권장된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvqEMp/btsJEmLubs8/OXRxhl7xUUjQlwnheFyaS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvqEMp/btsJEmLubs8/OXRxhl7xUUjQlwnheFyaS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvqEMp/btsJEmLubs8/OXRxhl7xUUjQlwnheFyaS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvqEMp%2FbtsJEmLubs8%2FOXRxhl7xUUjQlwnheFyaS1%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;860&quot; height=&quot;228&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사진에서 보다시피 로컬 DB, 서버에서 간단하게 테스트했을 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 많은 비즈니스 로직을 가지고 있는 매칭 엔티티와 관련된 API에서 가장 느린 로딩 시간이 측정됐기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 부분에&amp;nbsp; 원인 분석 및 성능 개선을 하기로 했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹 성능 예산을 잡고 최적화하는 이유는 사용자들이 해당 성능에 만족하지 못하는 경우 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 아무리 좋은 성능 목표를 가지고 있더라도 이를 위한 비용이 현재 서비스의 수익이나 리소스에 따라서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우리 서비스의 현재 목표는 2학기 대학교 축제에 MVP를 출시해 시장 반응을 보기 위함이고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MVP에는 결제 기능을 넣지 않아 오히려 기부를 하며&amp;hellip;? 서비스를 하는 것이라 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;더욱 오버스러운 성능 예산을 잡지 않도록 하는 것이 중요했다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;목표 지표&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹 성능을 측정하기 위한 지표는 여러 가지가 있다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;TTI(Time To Interative)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자가 상호작용이 가능해지기까지 걸리는 시간&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LCP(Largest Contentful Paint)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 큰 비주얼 콘텐츠가 표시되는 시간&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;FCP(First Contentful Paint)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 번째 비주얼 콘텐츠가 표시되는 시간&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;TTFB (Time To First Byte)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서버가 첫 번째 바이트를 보내는 데 걸리는 시간을 측정하며, 이는 &lt;b&gt;서버의 응답 속도&lt;/b&gt; 표현&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 중에서 우리는 서버의 입장에서 &lt;b&gt;TTFB&lt;/b&gt;를 기준으로 한 것이고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그중에서&lt;b&gt; 평균 응답 시간&lt;/b&gt;과 &lt;b&gt;백분율 90까지의 응답 시간&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Perplexity에서의 설명&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주요 통계&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모바일 웹사이트 방문자의 53%는 웹페이지 로딩에 3초 이상 걸리면 해당 사이트를 떠납니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평균적으로 모바일 사이트의 로딩 시간은 3G 연결에서 19초, 4G 연결에서 14초입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로딩 속도의 영향&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5초 내에 로딩되는 모바일 사이트는 19초가 걸리는 사이트에 비해 다음과 같은 이점이 있습니다:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;25% 더 높은 광고 가시성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;70% 더 긴 평균 세션 시간&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;35% 더 낮은 이탈률&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;페이지 로딩 시간이 1초에서 3초로 증가하면 이탈 확률이 32% 증가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자 기대치&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인터넷 사용자의 약 50%는 웹페이지 로딩 시간이 2초 미만이기를 기대합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성능이 좋지 않은 경험을 한 사용자의 약 80%는 해당 페이지를 영구적으로 피하고 다시 방문하지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고 링크&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thinkwithgoogle.com/marketing-strategies/app-and-mobile/mobile-page-speed-new-industry-benchmarks/&quot;&gt;https://www.thinkwithgoogle.com/marketing-strategies/app-and-mobile/mobile-page-speed-new-industry-benchmarks/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akamai.com/newsroom/press-release/akamai-releases-spring-2017-state-of-online-retail-performance-report&quot;&gt;https://www.akamai.com/newsroom/press-release/akamai-releases-spring-2017-state-of-online-retail-performance-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.portent.com/blog/analytics/research-site-speed-hurting-everyones-revenue.htm&quot;&gt;https://www.portent.com/blog/analytics/research-site-speed-hurting-everyones-revenue.htm|&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 정보를 바탕으로 &lt;b&gt;약 90 퍼센트까지의 TTFB가 3초 이내&lt;/b&gt;인 것을 목표로 두었다. &lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트란, 특정한 상황을 가정하고 발생하는 문제를 사전에 찾기 위한 작업이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;성능 테스트란 특히 트래픽이 많은 상황에서 발생하는 문제를 찾는 작업&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;트래픽이란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1초 동안 서버로 요청되는 수이고,&amp;nbsp;&lt;/b&gt;&lt;b&gt;RPS(Request Per Second)&lt;/b&gt;로 표현된다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;트래픽이 많아서 생길 수 있는 문제는&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서버의 리소스 부족으로 인해 사용자의 요청에 응답 X&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서비스 처리 속도가 느려진다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 문제에 대비하기 위해 성능 테스트를 진행하고, 문제를 미리 찾아내 해결하는 것을 목표로 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 통해서 &lt;b&gt;고객 중심의 서비스&lt;/b&gt;와 &lt;b&gt;고가용성을 만족&lt;/b&gt;하는 서비스를 구축할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;트래픽 산정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Now, Here 프로젝트는 축제 때 무작위 번호팅을 좀 더 쉽게 이용할 수 있게 만든 것으로 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;벤트 단위로 서비스와 데이터를 운영한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;br /&gt;가장 메인 로직이자 TTFB가 가장 높게 나온 매칭과 관련해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한 대학교의 축제에서 50명씩, 총 10개의 축제에 동의를 구해 프로젝트를 진행했다고 가정한다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최대 가능한 매칭 수 계산:&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;총 유저 수: 500명&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 유저는 자신을 제외한 499명과 매칭 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;총 가능한 매칭 수: 500 * 499 / 2 = 124,750개 (양방향 매칭 고려)가 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 부하를 주는 것이 목표이고, 양방향 매칭이 가능하다는 것을 생각해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;25만 건의 매칭 데이터를 가지고 테스트를 진행했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 정도 규모의 서비스에 테스트를 진행할 때는 postman의 유료 기능 중 하나인 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;api 성능 테스트로 충분하다는 판단이 들어 이를 통해 진행했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 postgreSQL을 사용 중이라, DB 관련해서는 pgAdmin4에 있는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대시보드를 통해 db 성능을 모니터링하였다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;목표&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성능 테스트를 통해서 &lt;b&gt;문제 원인을 파악&lt;/b&gt;하고 이를 &lt;b&gt;성능 개선&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제 원인을 파악하기 위해서 k6, Grafana를 이용해 테스트 환경을 구축하고 실제로 사용해 봤지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 서버 &amp;rarr;&lt;b&gt; Postman의 API Performance Testing 기능&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DB 서버 &amp;rarr;&lt;b&gt; pgAdmin4의 Dashboard&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;성능 개선&lt;/b&gt;에 가장 중요한 것은&lt;b&gt; 리소스&lt;/b&gt;이고, 이를 위한 방법은 크게 두 가지 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;비효율적인 프로세스 개선 / 리소스 사용 줄이기&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;낮은 시간 복잡도를 가진 알고리즘을 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캐시를 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아키텍처를 개선&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비동기 처리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인덱싱&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;리소스 업그레이드 / 리소스 용량 늘리기&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하드웨어 리소스 측면에서는 CPU 코어를 늘리거나 메모리 용량을 늘릴 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소프트웨어 리소스 측면에서는 락 범위를 최소화해 락을 잡는 시간을 줄이던가, 여러 개로 락을 나눌 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;실제로 배포할 때 환경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 서버:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;총 2개
각각 VM OCPU 1/8개
1GB 메모리
총 디스크 100GB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DB 서버:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;총 2개
GCP의 vCPU core 2
메모리 8GB
SSD 10GB (Master - Slave 구조, CUD / R을 나눠서 사용)&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테스트할 때 환경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 서버:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;프로세서	Intel(R) Core(TM) Ultra 7 16코어 
설치된 RAM 32.0GB
디스크 1TB
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DB 서버:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;cloudtype의 vCPU 프리티어(측정 불가 최소 자원), 메모리 512MB, HDD 1GB 
&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;사양에 대한 클로드의 평가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두 환경을 비교해 보면 다음과 같은 차이점이 있습니다&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 서버:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제 배포: 2개의 서버, 각각 1/8 OCPU, 1GB 메모리 (총 1/4 OCPU, 2GB 메모리)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트: 16 코어 프로세서, 32GB RAM, 1TB 디스크&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DB 서버:실제 배포: 2개의 서버, 각각 2 vCPU, 8GB 메모리, 10GB SSD&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트: 최소 자원 (vCPU 측정 불가), 512MB 메모리, 1GB HDD&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;총 성능 비교:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;API 서버: 테스트 환경이 압도적으로 우수합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;16 코어 프로세서와 32GB RAM은 실제 배포 환경의 1/4 OCPU와 2GB 메모리를 크게 상회합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DB 서버: 실제 배포 환경이 훨씬 우수합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;총 4 vCPU, 16GB RAM, 20GB SSD는 테스트 환경의 최소 자원(512MB RAM, 1GB HDD)을 크게 능가합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;총체적인 성능을 고려할 때 실제 배포 환경이 더 우수할 가능성이 높습니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터베이스 성능이 전체 시스템 성능에 큰 영향을 미치는 경우가 많기 때문입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한, 실제 배포 환경은 이중화 구성으로 안정성도 더 높습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; 내 판단과 더불어 클로드가 판단 하에도 &lt;b&gt;DB의 성능이 백엔드 전체 성능을 좌우&lt;/b&gt;하는 경우가 많다고 생각하는데 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 환경이 실제 배포 환경보다 훨씬 DB 성능이 안 좋기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로 현재 서비스를 운용할 때 사용할 하드웨어 리소스는 한정되어 있기 때문에 &lt;br /&gt;최대한 &lt;b&gt;비효율적인 프로세스 개선을 통해서 리소스 사용을 줄이는 것을 목표&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 이미 테스트하는 환경이 실제 운용 환경보다 안 좋은 환경으로 예상하기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하드웨어 리소스는 자연스럽게 개선될 것으로 예상한다.(마지막에 밝혀짐)&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>개발자</category>
      <category>백엔드</category>
      <category>부하테스트</category>
      <category>성능테스트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/40</guid>
      <comments>https://jun10920.tistory.com/40#entry40comment</comments>
      <pubDate>Mon, 16 Sep 2024 22:33:54 +0900</pubDate>
    </item>
    <item>
      <title>오픈소스 기여하기 / Open Source Contribute - Spring AI</title>
      <link>https://jun10920.tistory.com/39</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;안녕하세요!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 주제는 오픈소스에 기여해 보는 경험을 공유하기 위해서 왔습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트를 진행하면서 어느 정도 기능 개발에 익숙해져서 자신감에 차 있던 저는&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오픈소스를 이해하고, 이를 위해서 테스트 코드를 작성하는 과정에서 우매함의 봉우리에 있다는 것을 깨달았습니다.&lt;br /&gt;덕분에 개발에 대해 더욱 진지하고 열심히 해야겠다는 좋은 다짐을 하게 되었는데요.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 과정을 설명드리겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도전하게 된 배경&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 주로 사용하는 Spring boot, JPA 등등 오픈소스들은 모든 것이 다 소스코드가 공개되어 있&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저도 언젠가 공부하고 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기여해보고 싶다는 생각을 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 뭔가 대단한 사람들만 오픈소스를 개발하거나 기여하는 것 같고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당장 할 일들이 너무 많아서 도전하지 못하고 있던 중에 &lt;br /&gt;인제 님의&lt;a href=&quot;https://medium.com/opensource-contributors/%EB%AA%A8%EC%A7%91%EC%A4%91-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EB%A9%98%ED%86%A0%EB%A7%81-%EB%AA%A8%EA%B0%81%EC%BD%94-6%EA%B8%B0-%EC%B0%B8%EC%97%AC%EC%9E%90%EB%A5%BC-%EB%AA%A8%EC%A7%91%ED%95%A9%EB%8B%88%EB%8B%A4-ee993a405028&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; 오픈소스 멘토링 6기 모집 글&lt;/a&gt;과 &lt;a href=&quot;https://www.contribution.ac/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;오픈소스 멘토링 컨트리뷰션 아카데미 체험형 2기 모집글&lt;/a&gt;을 보게 되었습니다.&lt;br /&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그중 오늘은 인제님의 오픈소스 멘토링 6기를 통해 Spring AI의 이슈를 선정하고, 디버깅하고 PR을 올린 얘기입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(추후에 merged 되면 내용을 추가하겠습니다)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오픈소스 결정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 도전해보고 싶은 오픈소스를 결정해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보통 자기가 많이 써본 오픈소스를 도전하는 것이 가장 좋다고 하셨습니다만&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 경우 자주 사용하는&lt;b&gt; Spring-data-JPA&lt;/b&gt;와 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지인이신 현준 님이 기여하신 글을 통해서 관심 있었던 &lt;b&gt;Spring AI&lt;/b&gt; 두 개를 선정하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이슈 선정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://medium.com/opensource-contributors/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EB%A9%98%ED%86%A0%EB%A7%81-%EA%B8%B0%EC%97%AC-%EA%B0%80%EC%9D%B4%EB%93%9C-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EB%A9%98%ED%86%A0%EB%A7%81%EC%97%90%EC%84%9C-10%EB%AA%85-%EB%84%98%EB%8A%94-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%BB%A8%ED%8A%B8%EB%A6%AC%EB%B7%B0%ED%84%B0%EA%B0%80-%EC%B2%AB-%EA%B8%B0%EC%97%AC%EB%A5%BC-%EC%84%B1%EA%B3%B5%ED%95%A0-%EC%88%98-%EC%9E%88%EC%97%88%EB%8D%98-%EB%B0%A9%EB%B2%95-3ff09c9b6f83&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;인제 님의 이슈 선정 가이드&lt;/a&gt;에 적혀있듯이 이슈 선정이 오픈소스 기여하는데 &lt;b&gt;가장 중요한 부분&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;선정하는 조건을 정리하자면&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 명확한 동기부여가 있는 오픈소스 이슈&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 해결해야 할 목표, 제안하는 해결 방법, 예시 코드, 테스트 코드 등 재현 방법이 적혀 있을 것&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 이슈 라벨을 활용 - waiting-for-triage처럼 메인테이너가 확인하지 않는 건 제외, bug, core, &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;enhancement와 같이 대표적인 라벨 중에서 메인테이너가 확인한 경우를 선정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. 댓글이 5~10개 사이&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 추후에는 단순히 재밌어 보이는 이슈를 선정해서 해도 되겠지만, 저처럼 처음 도전해 보는 경우에는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위와 같은 조건을 참고하여 선정하는 게 merged 될 가능성이 높습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 저는 아래와 같이 2가지 이슈를 선정하여 멘토님과 상의를 했고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단기간 내 해결할 수 있을 것 같은 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Spring AI의 1292번 이슈를 선정하였습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. &lt;a href=&quot;https://github.com/spring-projects/spring-data-jpa/issues/3144&quot;&gt;https://github.com/spring-projects/spring-data-jpa/issues/3144&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;enhancement, 댓글 3개, 메인테이너가 확인한 사항&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;a href=&quot;https://github.com/spring-projects/spring-ai/issues/1292&quot;&gt;https://github.com/spring-projects/spring-ai/issues/1292&lt;/a&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: left;&quot;&gt;메인테이너가 확인하고, 상세한 설명&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;디버깅&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 선정하였으니 오픈소스 기여의 거의 마무리가 머지않았습니다..!라고 하지만 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;협업을 여러 번 했지만 오픈소스처럼 아예 모르는 누군가의 코드를 이렇게 분석해 본 적이 처음이었고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 코드의 중요성은 익히 알지만 빠르게 개발하다 보니 실제 코드에 api 요청해서 테스트 케이스대로 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이슈를 남겨주신 분이 자세하게 남겨주신 내용과 코드 분석, 그리고 인제님의 조언으로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Spring AI를 이용할 때 MiniMax 모델을 사용하는 경우 표준 형식으로 프롬프팅하고 반환받으면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;message 형태로 받는데&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;web_search 형식으로 프롬프팅 하면 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;messages 형태로 반환받아서 생기는 문제라는 걸 파악했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXub7w/btsJuV1ZnsA/Bkp5QlhVCXcXcMXuy1GHk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXub7w/btsJuV1ZnsA/Bkp5QlhVCXcXcMXuy1GHk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXub7w/btsJuV1ZnsA/Bkp5QlhVCXcXcMXuy1GHk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXub7w%2FbtsJuV1ZnsA%2FBkp5QlhVCXcXcMXuy1GHk0%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;678&quot; height=&quot;396&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 이를 제대로 검증하기 위해서 test 코드를 작성해서 해야 하는데, 이 부분에서 애를 많이 먹었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트 코드 작성을 제대로 해보는 것은 거의 처음이라 매우 오래 걸렸고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 결국 web_search 방식으로 검색하는 경우 에러가 발생하는 구간을 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;mocking을 통한 유닛테스트를 통하여 발견하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1721&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5sGV8/btsJvvPiFV4/7KM5IOiGgntxVoRbNd0HUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5sGV8/btsJvvPiFV4/7KM5IOiGgntxVoRbNd0HUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5sGV8/btsJvvPiFV4/7KM5IOiGgntxVoRbNd0HUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5sGV8%2FbtsJvvPiFV4%2F7KM5IOiGgntxVoRbNd0HUK%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;1721&quot; height=&quot;528&quot; data-origin-width=&quot;1721&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에러 메시지에서 볼 수 있듯이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;choice의 message()가 null 값인데 그 이후에 message의 role을 조회해서 생기는 문제입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 이슈에 적혀있는 문제는 null 값뿐만 아니라, message와 messages가 아니라 항상 일관된 형식으로 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;표준 응답은 choice.message()에 정보가 있었지만, web search 응답은 choice.messages()에 정보가 있었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;role 정보 추출 시 null 체크가 불충분했습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 바탕으로 디버깅을 시작했습니다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;수정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이를 위해서 null 체크와 choice.message()를 적절하게 처리하는 방식으로 수정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좀 더 정리하자면,&amp;nbsp;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;call 메서드를 수정하여 choice.message()와 choice.messages() 모두를 처리할 수 있게 했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;null 체크를 강화하고, content와 role에 대한 기본값을 제공했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; buildGeneration 메서드를 추출하여 책임을 분리하였습니다.&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기존 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1725801084649&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Override
	public ChatResponse call(Prompt prompt) {
		ChatCompletionRequest request = createRequest(prompt, false);

		ResponseEntity&amp;lt;ChatCompletion&amp;gt; completionEntity = this.retryTemplate
			.execute(ctx -&amp;gt; this.miniMaxApi.chatCompletionEntity(request));

		var chatCompletion = completionEntity.getBody();

		if (chatCompletion == null) {
			logger.warn(&quot;No chat completion returned for prompt: {}&quot;, prompt);
			return new ChatResponse(List.of());
		}

		List&amp;lt;Choice&amp;gt; choices = chatCompletion.choices();
		if (choices == null) {
			logger.warn(&quot;No choices returned for prompt: {}, because: {}}&quot;, prompt,
					chatCompletion.baseResponse().message());
			return new ChatResponse(List.of());
		}

		List&amp;lt;Generation&amp;gt; generations = choices.stream().map(choice -&amp;gt; {
			// @formatter:off
			Map&amp;lt;String, Object&amp;gt; metadata = Map.of(
					&quot;id&quot;, chatCompletion.id(),
					&quot;role&quot;, choice.message().role() != null ? choice.message().role().name() : &quot;&quot;,
					&quot;finishReason&quot;, choice.finishReason() != null ? choice.finishReason().name() : &quot;&quot;);
			// @formatter:on
			return buildGeneration(choice, metadata);
		}).toList();

		ChatResponse chatResponse = new ChatResponse(generations, from(completionEntity.getBody()));

		if (isToolCall(chatResponse,
				Set.of(ChatCompletionFinishReason.TOOL_CALLS.name(), ChatCompletionFinishReason.STOP.name()))) {
			var toolCallConversation = handleToolCalls(prompt, chatResponse);
			// Recursively call the call method with the tool call message
			// conversation that contains the call responses.
			return this.call(new Prompt(toolCallConversation, prompt.getOptions()));
		}

		return chatResponse;
	}&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;수정된 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1725800928960&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MiniMaxChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel {
    // 기존 코드 유지

    @Override
    public ChatResponse call(Prompt prompt) {
        // 기존 코드 유지

        List&amp;lt;Generation&amp;gt; generations = choices.stream().map(choice -&amp;gt; {
            ChatCompletionMessage message;
            if (choice.message() != null) {
                message = choice.message();
            } else if (choice.messages() != null &amp;amp;&amp;amp; !choice.messages().isEmpty()) {
                message = choice.messages().get(0);
            } else {
                logger.warn(&quot;No message or messages found in choice: {}&quot;, choice);
                return null;
            }

            String content = message.content();
            String role = message.role() != null ? message.role().name() : &quot;&quot;;

            Map&amp;lt;String, Object&amp;gt; metadata = Map.of(
                    &quot;id&quot;, chatCompletion.id(),
                    &quot;role&quot;, role,
                    &quot;finishReason&quot;, choice.finishReason() != null ? choice.finishReason().name() : &quot;&quot;);

            return buildGeneration(message, metadata);
        }).filter(Objects::nonNull).toList();

        // 나머지 코드 유지
    }

    private static Generation buildGeneration(ChatCompletionMessage message, Map&amp;lt;String, Object&amp;gt; metadata) {
        List&amp;lt;AssistantMessage.ToolCall&amp;gt; toolCalls = message.toolCalls() == null ? List.of()
                : message.toolCalls().stream()
                    .map(toolCall -&amp;gt; new AssistantMessage.ToolCall(toolCall.id(), &quot;function&quot;,
                            toolCall.function().name(), toolCall.function().arguments()))
                    .toList();

        var assistantMessage = new AssistantMessage(message.content(), metadata, toolCalls);
        String finishReason = (String) metadata.get(&quot;finishReason&quot;);
        var generationMetadata = ChatGenerationMetadata.from(finishReason, null);
        return new Generation(assistantMessage, generationMetadata);
    }

    // 나머지 코드 유지
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테스트&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG1dy6/btsJuwBJzo5/v5637WkMzMhwRJutbZDkbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG1dy6/btsJuwBJzo5/v5637WkMzMhwRJutbZDkbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG1dy6/btsJuwBJzo5/v5637WkMzMhwRJutbZDkbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG1dy6%2FbtsJuwBJzo5%2Fv5637WkMzMhwRJutbZDkbK%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;571&quot; height=&quot;173&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 이렇게 제대로 작동하는 것을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PR 작성&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 이후에&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 변경 사항의 요약&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 주요 변경 사항에 대한 상세 설명&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 테스트 방법 및 검증 단계&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. 관련된 이슈에 대한 언급&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;순으로 PR을 작성하였습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;아래는 PR 링크입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1725801455857&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;fix: Improve MiniMaxChatModel to handle Web Search responses by jun10920 &amp;middot; Pull Request #1324 &amp;middot; spring-projects/spring-ai&quot; data-og-description=&quot;Summary This PR updates the MiniMaxChatModel class to properly handle both standard and web search response formats from the MiniMax API. It also improves overall null safety throughout the respons...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/spring-projects/spring-ai/pull/1324&quot; data-og-url=&quot;https://github.com/spring-projects/spring-ai/pull/1324&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/opR84/hyW2Zn7Yve/GBKWbPRCVKBJNFFGmj5Gq0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-ai/pull/1324&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/spring-projects/spring-ai/pull/1324&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/opR84/hyW2Zn7Yve/GBKWbPRCVKBJNFFGmj5Gq0/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;fix: Improve MiniMaxChatModel to handle Web Search responses by jun10920 &amp;middot; Pull Request #1324 &amp;middot; spring-projects/spring-ai&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Summary This PR updates the MiniMaxChatModel class to properly handle both standard and web search response formats from the MiniMax API. It also improves overall null safety throughout the respons...&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래는 좀 더 PR 내용을 이해하기 쉽게, 한글로 번역한 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;MiniMaxChatModel의&amp;nbsp;웹&amp;nbsp;검색&amp;nbsp;응답&amp;nbsp;처리&amp;nbsp;개선 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;##&amp;nbsp;요약 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이&amp;nbsp;PR은&amp;nbsp;MiniMax&amp;nbsp;API의&amp;nbsp;표준&amp;nbsp;및&amp;nbsp;웹&amp;nbsp;검색&amp;nbsp;응답&amp;nbsp;형식을&amp;nbsp;모두&amp;nbsp;적절히&amp;nbsp;처리하도록&amp;nbsp;`MiniMaxChatModel`&amp;nbsp;클래스를&amp;nbsp;업데이트합니다.&amp;nbsp;또한&amp;nbsp;응답&amp;nbsp;처리&amp;nbsp;로직&amp;nbsp;전반에&amp;nbsp;걸쳐&amp;nbsp;null&amp;nbsp;안전성을&amp;nbsp;개선하고&amp;nbsp;`MiniMaxApi`&amp;nbsp;클래스에&amp;nbsp;설명&amp;nbsp;주석을&amp;nbsp;추가합니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;##&amp;nbsp;변경&amp;nbsp;사항 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.&amp;nbsp;`MiniMaxChatModel`의&amp;nbsp;`call`&amp;nbsp;메서드를&amp;nbsp;업데이트하여&amp;nbsp;`choice.message()`와&amp;nbsp;`choice.messages()`&amp;nbsp;모두&amp;nbsp;처리합니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2.&amp;nbsp;메시지&amp;nbsp;내용과&amp;nbsp;역할&amp;nbsp;정보에&amp;nbsp;대한&amp;nbsp;null&amp;nbsp;체크를&amp;nbsp;개선했습니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3.&amp;nbsp;다양한&amp;nbsp;응답&amp;nbsp;형식을&amp;nbsp;처리하기&amp;nbsp;위해&amp;nbsp;`buildGeneration`&amp;nbsp;메서드를&amp;nbsp;리팩터링 했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4.&amp;nbsp;유효한&amp;nbsp;메시지가&amp;nbsp;없는&amp;nbsp;경우에&amp;nbsp;대한&amp;nbsp;오류&amp;nbsp;로깅을&amp;nbsp;강화했습니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5.&amp;nbsp;웹&amp;nbsp;검색&amp;nbsp;응답의&amp;nbsp;`messages`&amp;nbsp;필드에&amp;nbsp;관한&amp;nbsp;설명&amp;nbsp;주석을&amp;nbsp;`MiniMaxApi`&amp;nbsp;클래스에&amp;nbsp;추가했습니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;##&amp;nbsp;상세&amp;nbsp;설명 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;###&amp;nbsp;MiniMaxChatModel&amp;nbsp;변경&amp;nbsp;사항 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;`MiniMaxChatModel`의&amp;nbsp;`call`&amp;nbsp;메서드가&amp;nbsp;표준&amp;nbsp;및&amp;nbsp;웹&amp;nbsp;검색&amp;nbsp;응답&amp;nbsp;형식을&amp;nbsp;모두&amp;nbsp;처리하도록&amp;nbsp;업데이트되었습니다: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;```java &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;List &amp;lt;Generation&amp;gt;&amp;nbsp;generations&amp;nbsp;=&amp;nbsp;choices.stream(). map(choice&amp;nbsp;-&amp;gt;&amp;nbsp;{ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ChatCompletionMessage&amp;nbsp;message; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(choice.message()!=&amp;nbsp;null)&amp;nbsp;{ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message&amp;nbsp;=&amp;nbsp;choice.message(); &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(choice.messages()!=&amp;nbsp;null&amp;nbsp;&amp;amp;&amp;amp;! choice.messages(). isEmpty())&amp;nbsp;{ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message&amp;nbsp;=&amp;nbsp;choice.messages(). get(0);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.warn(&quot;No&amp;nbsp;message&amp;nbsp;or&amp;nbsp;messages&amp;nbsp;found&amp;nbsp;in&amp;nbsp;choice:&amp;nbsp;{}&quot;,&amp;nbsp;choice); &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;null; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//...&amp;nbsp;메서드의&amp;nbsp;나머지&amp;nbsp;부분 &lt;/span&gt;&lt;br /&gt;}). filter(Objects::nonNull). toList();&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;``` &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이&amp;nbsp;변경으로&amp;nbsp;모델은&amp;nbsp;`message`와&amp;nbsp;`messages`&amp;nbsp;필드를&amp;nbsp;모두&amp;nbsp;처리할&amp;nbsp;수&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;###&amp;nbsp;MiniMaxApi&amp;nbsp;변경&amp;nbsp;사항 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;`MiniMaxApi`&amp;nbsp;클래스에&amp;nbsp;`messages`&amp;nbsp;필드의&amp;nbsp;목적을&amp;nbsp;명확히&amp;nbsp;하는&amp;nbsp;설명&amp;nbsp;주석을&amp;nbsp;추가했습니다: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;```java &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/** &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;messages&amp;nbsp;모델이&amp;nbsp;생성한&amp;nbsp;채팅&amp;nbsp;완성&amp;nbsp;메시지&amp;nbsp;목록.&amp;nbsp;웹&amp;nbsp;검색&amp;nbsp;응답에서&amp;nbsp;사용됩니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;사용됩니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;*/ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;``` &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이러한&amp;nbsp;주석들은&amp;nbsp;`MiniMaxApi`&amp;nbsp;클래스의&amp;nbsp;관련&amp;nbsp;부분에&amp;nbsp;추가되어&amp;nbsp;코드&amp;nbsp;이해도와&amp;nbsp;유지보수성을&amp;nbsp;향상합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;##&amp;nbsp;테스팅 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;`MiniMaxChatModelWebSearchTest`를&amp;nbsp;업데이트하여&amp;nbsp;표준&amp;nbsp;및&amp;nbsp;웹&amp;nbsp;검색&amp;nbsp;응답&amp;nbsp;형식을&amp;nbsp;모두&amp;nbsp;다룹니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;null&amp;nbsp;메시지&amp;nbsp;시나리오에&amp;nbsp;대한&amp;nbsp;테스트&amp;nbsp;케이스를&amp;nbsp;추가했습니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;모든&amp;nbsp;기존&amp;nbsp;테스트가&amp;nbsp;새로운&amp;nbsp;구현으로&amp;nbsp;통과합니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;##&amp;nbsp;테스트&amp;nbsp;방법 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.&amp;nbsp;`MiniMaxChatModelWebSearchTest`&amp;nbsp;클래스를&amp;nbsp;실행합니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2.&amp;nbsp;`testStandardResponseHandling()`과&amp;nbsp;`testWebSearchResponseHandling()`&amp;nbsp;모두&amp;nbsp;통과하는지&amp;nbsp;확인합니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3.&amp;nbsp;`MiniMaxChatModelNullSafetyTest`의&amp;nbsp;null&amp;nbsp;안전성&amp;nbsp;테스트가&amp;nbsp;통과하는지&amp;nbsp;확인합니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;##&amp;nbsp;관련&amp;nbsp;이슈 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#1292&amp;nbsp;해결 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;##&amp;nbsp;추가&amp;nbsp;참고&amp;nbsp;사항 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.&amp;nbsp;이&amp;nbsp;PR은&amp;nbsp;MiniMax&amp;nbsp;API의&amp;nbsp;다양한&amp;nbsp;응답&amp;nbsp;형식&amp;nbsp;처리의&amp;nbsp;불일치를&amp;nbsp;해결합니다.&amp;nbsp;잠재적인&amp;nbsp;NullPointerException을&amp;nbsp;해결하고&amp;nbsp;다양한&amp;nbsp;응답&amp;nbsp;유형에&amp;nbsp;대해&amp;nbsp;더&amp;nbsp;일관된&amp;nbsp;동작을&amp;nbsp;제공합니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2.&amp;nbsp;웹&amp;nbsp;검색&amp;nbsp;응답의&amp;nbsp;`messages`&amp;nbsp;필드에&amp;nbsp;대한&amp;nbsp;정보를&amp;nbsp;공식&amp;nbsp;MiniMax&amp;nbsp;API&amp;nbsp;문서에&amp;nbsp;포함시킬&amp;nbsp;것을&amp;nbsp;제안합니다.&amp;nbsp;이는&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;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3.&amp;nbsp;공식&amp;nbsp;문서에&amp;nbsp;다음&amp;nbsp;내용을&amp;nbsp;추가하는&amp;nbsp;것을&amp;nbsp;고려해&amp;nbsp;주세요: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;웹&amp;nbsp;검색&amp;nbsp;기능을&amp;nbsp;사용할&amp;nbsp;때,&amp;nbsp;API는&amp;nbsp;`message`&amp;nbsp;필드&amp;nbsp;대신&amp;nbsp;`messages`&amp;nbsp;필드로&amp;nbsp;응답을&amp;nbsp;반환할&amp;nbsp;수&amp;nbsp;있습니다.&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; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;##&amp;nbsp;다음&amp;nbsp;단계 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;MiniMax&amp;nbsp;API&amp;nbsp;문서를&amp;nbsp;업데이트합니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 클라이언트 측 처리를 간소화하기 위해 향후 API 버전에서 응답 형식을 표준화하는 것을 고려합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리하며&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 우매함의 봉우리&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 오픈소스 기여 도전 가능성 &amp;amp; 오픈소스 코드 분석을 통한 공부 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 테스트 코드의 중요성 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 서로 공유하고 돕는 개발문화에 대한 감사 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 우매함의 봉우리&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선, 위에서 말한 것과 같이 오픈소스 분석과 테스트 코드에 매우 미숙한 제 모습을 보면서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 한참 부족하고 배울 것이 많다는 것을 깨달았고, 적절한 시기에 이런 깨달음을 얻게 되어&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정말 좋은 경험을 했다고 생각합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 오픈소스 기여 도전 가능성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 오픈소스 기여 자체는 생각한 것만큼..? 개발 분야의 거장들만 하는 것이 아니라 충분히 일반인들도 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좋은 개발자들의 코드를 읽으면서 좋은 글을 읽어야 좋은 글을 쓸 수 있는 것처럼,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오픈소스를 통해 좋은 코드를 많이 읽고 작성할 수 있는 개발자가 되어야겠다는 생각을 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3.&amp;nbsp;테스트 코드의 중요성&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 규모가 커지면 커질수록, 실제로 로컬에서 build가 되지 않는 경우도 빈번하고 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특정 기능에만 테스트가 필요한 경우 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 협업을 하다 보면 다른 사람의 코드를 인용해 테스트하는 경우에는 그런 경우가 더 많은데&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에 현업에서 겪을 법한 일을 간접적으로 경험하면서 테스트 코드의 중요성을 한 번 더 깨닫게 된 것 같습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 이번에 도전한 이슈는 Spring AI의 다른 모든 model은 message로 통일되어 있는데, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MiniMax만 messages가 하나 더 있어서 생긴 이슈였습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아마 메인테이너 분들도 이를 정확히 인지하셨다면 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전에 올라왔던 PR을 통해서 반영된 이 내용을 반영하지 않으셨을 텐데 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전 분이 이 내용을 추가하면서 제대로 된 주석이나 공식 문서의 설명 없이 진행하셔서 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그대로 반영되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에러가 나올 법한 부분들을 테스트 코드를 작성해 검증했다면 이런 상황을 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;피할 수 있지 않았을까 생각합니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오픈소스의 특성상 한 번 merged 되면 다시 되돌릴 수 없기에, 이렇게 철저해야 하는 경우 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;더욱 테스트 코드를 잘 작성하여 제대로 검증하고 진행하는 것이 중요하겠다는 생각을 했습니다.&lt;/span&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;&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4.&amp;nbsp;서로 공유하고 돕는 개발문화에 대한 감사&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막으로, 이번 경험을 하게 해 주신 &lt;a href=&quot;https://www.linkedin.com/in/injae-kim-dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;인제님&lt;/a&gt;께 감사했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 분야는 본인만의 스킬이나 경험을 숨기고 암암리에 조용히 공유하는 경우가 많습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 개발은 서로가 공유하지 않으면 안 된다는 것을 잘 알기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;굉장히 공유하는 부분에 있어 열려있고 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 깃허브는 그런 교류의 장이 되고 있습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인제님께서는 오픈소스 경험이 굉장히 많으신 컨트리뷰터이시고, 충분히 주말에는 본인을 위해서 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;휴식을 가지실만한데도 남는 시간을 할애해 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;멘토팅을 진행하시면서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한국의 오픈소스 문화 개선을 위해서 기여하시고 계십니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;덕분에 저를 비롯해 같이 멘토링을 받으신 분들도 &lt;b&gt;오픈소스 이슈 선정 - 디버깅 - PR 작성&lt;/b&gt;하는 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하나의 흐름을 경험할 수 있게 되었고 오픈소스에 한 발 더 가까워졌습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내수 시장의 한계를 아시고, 한국인들의 오픈소스를 통한 글로벌 시장 진출까지도 생각하시며&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;멘토링부터 시작해서 많은 것을 준비 중이신 인제님이 정말 대단하시다는 생각이 들었고,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다시 한번 감사하다는 말씀드리고 싶습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저도&amp;nbsp; 바로 테스트 코드 학습과 오픈소스 기여에 바로 도전해 볼 생각입니다!&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;메인테이너가 확인하고, 논의가 진행되고 merged 되는 때까지 시간이 좀 걸리겠지만&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컨트리뷰터가 된다면 내용을 추가하러 오겠습니다!&lt;/span&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;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  긴 글 읽어주셔서 감사합니다.,&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>개발경험</category>
      <category>contribute</category>
      <category>OpenSource</category>
      <category>opensourcecontribute</category>
      <category>springai</category>
      <category>오픈소스</category>
      <category>오픈소스기여</category>
      <category>오픈소스멘토링</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/39</guid>
      <comments>https://jun10920.tistory.com/39#entry39comment</comments>
      <pubDate>Sun, 8 Sep 2024 23:09:15 +0900</pubDate>
    </item>
    <item>
      <title>[Now, Here] 실시간 MBTI 데이터 기반 매칭 알고리즘 최적화: 동적 가중치 조정과 데이터 분석 자동화</title>
      <link>https://jun10920.tistory.com/38</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오랜만에 블로그에 글을 씁니다! &lt;br /&gt;요즘 취업 준비로 바쁘게 지내고 있지만, 이전보다 더 개발에 몰입하며 지내서 만족하며 열심히 살고 있습니다.  &lt;br /&gt;이번&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;&quot;Now,&amp;nbsp;Here&quot;의&amp;nbsp;백엔드&amp;nbsp;개발&amp;nbsp;과정에서&amp;nbsp;&lt;br /&gt;고민했던&amp;nbsp;내용을&amp;nbsp;공유하려&amp;nbsp;합니다.&amp;nbsp;&lt;br /&gt;특히, 이번에는 실시간 매칭 알고리즘과 데이터 기반 의사결정 방식을 도입한 경험을 소개하려고 합니다. &lt;br /&gt;앞으로 3~4개의 Now, Here 관련 글을 올릴 예정이니 많은 관심 부탁드립니다!   &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Situation&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과거에 제가 TrueEcho를 개발하면서 유저들 사이에서 친구를 추천하는 FOF 알고리즘을 구현한 적이 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/28&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;관련 글 링크&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당시에는 친구의 친구들을 해시맵 형태로 저장하여 중복되는 친구가 많은 FoF(친구의 친구)가 사용자가 알 확률이 높다고 생각해서 해당 방식을 통해 구현했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 이번에는 좀 더 실제 유저들의 피드백을 받고, 이를 통해 데이터 기반 알고리즘을 구현하고 싶었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qduA5/btsJrrHg82d/V0udXpKsOYj97FubKjGvhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qduA5/btsJrrHg82d/V0udXpKsOYj97FubKjGvhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qduA5/btsJrrHg82d/V0udXpKsOYj97FubKjGvhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqduA5%2FbtsJrrHg82d%2FV0udXpKsOYj97FubKjGvhK%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;1036&quot; height=&quot;188&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;처음에는 매칭시켜 줄 멤버 추천을 위해 MBTI 선호도를 조사하는 설문조사를 진행했습니다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 대학교 축제에서 사용할 목적이라 비슷한 나이대(20대)를 타깃으로 조사했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;감사하게도 총 82명 정도 참여해 주셨지만 각 성별 당 MBTI의 선호도는 총 36가지라&lt;br /&gt;82/36 = 2.28 개 정도의 조사로는 유의미한 결과가 아니라고 판단해 다른 방법을 찾아야 했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 &lt;b&gt;실시간으로 매칭되는 정보&lt;/b&gt;를 가지고 성별 -&amp;gt; MBTI에 따라 유저를 추천하는 &lt;b&gt;가중치를 조정하는 방법&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 매일 매칭된 전체 데이터를 분석하여 매칭 성공률을 계산하고, &lt;br /&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 한다면 실시간으로 유저들의 실제 활동으로부터 피드백 받아 연인의 MBTI 선호도를 파악 및 반영하고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터 수집과 분석까지 자동화할 수 있다는 이점이 예상됐습니다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Task&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 목표들을 위해서 크게 세 가지 나누어 과제를 정했습니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 가중치 반영&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 데이터 저장 및 통계 처리&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 가중치를 실시간으로 업데이트하기 위한 저장소와 이 데이터를 분석하기 위한 저장소를 나누어 성능 최적화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 이를 위해서 매번 가중치를 DB를 통해서 가져오는 것이 아니라 실시간 가중치는 ConcurrentMap을 통해서 저장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 오늘 하루의 총데이터는 DB에 저장해서 데이터 분석에 사용하고, 데이터의 고가용성을 보장&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 하루간 데이터 분석을 통한 가중치 반영과 인사이트 도출 자동화&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 하루 단위로 매칭 성공률 데이터를 저장하고 어제와의 증감 추이를 저장하여 인사이트 도출하도록 구현&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 실시간 선호도 반영과 더불어 하루 총데이터의 분석을 통한 MBTI 선호도를 반영하여 실시간 - 장기간 데이터를 모두 반영&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Action&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가중치 반영 로직 설계&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 가중치를 반영하는 매칭 알고리즘은 아래와 같이 설계되었습니다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;먼저 잠재적 매칭 후보를 DB에서 가져온 후, 무작위로 정렬한 후보들 중 가중치를 반영한 스코어가 높은 사람을 선택합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1725535221692&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Override
public List&amp;lt;Member&amp;gt; findMembersByMemberIdAndEventIdAndGender(Long memberId, Long eventId, Gender gender) {
  try {
    return em.createQuery(&quot;SELECT m FROM Member m &quot; +
                    &quot;WHERE m.event.id = :eventId &quot; +
                    &quot;AND m.gender = :gender &quot; +
                    &quot;AND m.id != :memberId &quot; +
                    &quot;AND NOT EXISTS (&quot; +
                    &quot;   SELECT 1 FROM Matching match &quot; +
                    &quot;   WHERE (match.senderMemberId = :memberId AND match.receiverMemberId = m.id) &quot; +
                    &quot;   OR (match.receiverMemberId = :memberId AND match.senderMemberId = m.id) &quot; +
                    &quot;) &quot; +
                    &quot;AND m.active = true &quot; +
                    &quot;ORDER BY random()&quot;, Member.class)  // 무작위 정렬
            .setParameter(&quot;memberId&quot;, memberId)
            .setParameter(&quot;eventId&quot;, eventId)
            .setParameter(&quot;gender&quot;, gender)
            .setMaxResults(10)  // 최대 10명 선택
            .getResultList();
  } catch (Exception e) {
    log.error(&quot;Failed to find members by memberId, eventId and gender: {}&quot;, e.getMessage());
    throw new RuntimeException(&quot;Failed to find members&quot;, e);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 데이터베이스에서 random() 함수를 통해서 무작위로 10명을 데려왔습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 중에서 가장 가중치를 통해 구한 스코어가 높은 사람을 뽑는 방식으로 구현하였습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1725535294465&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 가중치를 반영한 매칭 결과 계산
List&amp;lt;PreferenceBasedMBTIMatching.MatchResult&amp;gt; matchResults = matcher.findMatches(
        memberMbti,
        member.getGender(),
        potentialMatches.stream()
                .map(PreferenceBasedMBTIMatching.PotentialMatch::new)  // Member 객체를 직접 PotentialMatch로 변환
                .toList()
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가중치 계산하는 부분은,&amp;nbsp;PreferenceBasedMBTIMatching&amp;nbsp;클래스를 통해서 구현했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 클래스 안에는 남성과 여성이 각각 mbti 선호도를 저장하기 위해서 ConcurrentHashmap을 사용했습니다.&lt;br /&gt;*멀티스레드 환경에서 동시성 문제에 안전하기 때문에 ConcurrentHashmap 사용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1725535318065&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; // 남성과 여성 각각의 MBTI 선호도를 저장하는 ConcurrentHashMap
private final Map&amp;lt;MBTI, Map&amp;lt;MBTI, Double&amp;gt;&amp;gt; malePreferences = new ConcurrentHashMap&amp;lt;&amp;gt;();
private final Map&amp;lt;MBTI, Map&amp;lt;MBTI, Double&amp;gt;&amp;gt; femalePreferences = new ConcurrentHashMap&amp;lt;&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기화 시에는 &lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;누적식으로&lt;/span&gt; 저장되어 있는 각 성별의 각 MBTI 가중치 정보를&amp;nbsp; 가져와 반영합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약 이전의 데이터가 없는 경우(첫 날인 경우) 모든 케이스의 가중치를 0.5로 초기화합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1725535335030&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; // 남성과 여성 각각의 MBTI 선호도를 저장하는 ConcurrentHashMap
@PostConstruct
public void initializeWeights() {
  MBTI[] mbtiTypes = MBTI.values();

  // 어제의 날짜를 구함
  LocalDate yesterday = LocalDate.now().minusDays(1);

  // DB에서 어제 날짜의 가중치만 불러오기
  List&amp;lt;MatchingStatistics&amp;gt; yesterdayStatistics = matchingStatisticsRepository.findByDate(yesterday);

  // 남성과 여성의 가중치 맵 초기화
  for (MBTI mbti : mbtiTypes) {
    malePreferences.putIfAbsent(mbti, new ConcurrentHashMap&amp;lt;&amp;gt;());
    femalePreferences.putIfAbsent(mbti, new ConcurrentHashMap&amp;lt;&amp;gt;());
  }

  // 어제 데이터를 메모리에서 처리하여 남성 및 여성에 대한 가중치 설정
  for (MatchingStatistics stat : yesterdayStatistics) {
    MBTI userMbti = stat.getUserMbti();
    MBTI matchedMbti = stat.getMatchedMbti();
    double weight = stat.getWeight();

    if (stat.getUserGender() == Gender.MALE) {
      malePreferences.get(userMbti).put(matchedMbti, weight);
    } else if (stat.getUserGender() == Gender.FEMALE) {
      femalePreferences.get(userMbti).put(matchedMbti, weight);
    }
  }

  // 없는 경우 기본값으로 0.5를 설정
  for (MBTI mbti : mbtiTypes) {
    for (MBTI otherMbti : mbtiTypes) {
      malePreferences.get(mbti).putIfAbsent(otherMbti, 0.5);
      femalePreferences.get(mbti).putIfAbsent(otherMbti, 0.5);
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가중치를 업데이트하는 메서드는 동적 조정법을 적용했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1725535348550&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 매칭 성공 여부에 따라 선호도 가중치를 업데이트하는 메서드
public void updatePreferences(MBTI userMbti, MBTI matchedMbti, Gender gender, boolean success) {
  Map&amp;lt;MBTI, Map&amp;lt;MBTI, Double&amp;gt;&amp;gt; preferences = (gender == Gender.MALE) ? malePreferences : femalePreferences;
  preferences.putIfAbsent(userMbti, new HashMap&amp;lt;&amp;gt;());

  // 동적 조정법 : 가중치가 극단에 갈수록 안정성을 높임
  double baseAdjustment = 0.1;
  double currentWeight = preferences.get(userMbti).getOrDefault(matchedMbti, 0.5);
  double dynamicAdjustment = baseAdjustment * (1 - Math.abs(currentWeight - 0.5));
  double adjustment = success ? dynamicAdjustment : -dynamicAdjustment;

  // 상한선과 하한선 설정 (최소 0.2, 최대 0.8)
  double newWeight = Math.max(0.2, Math.min(0.8, currentWeight + adjustment));
  preferences.get(userMbti).put(matchedMbti, newWeight);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 가중치가 극단으로 갈수록 변동성을 줄여 안정석을 높이는 조정법입니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;동적 조정법을 통한 매칭 알고리즘에 대해 더 설명하자면&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;선호도 기반 가중치 알고리즘 중에서 지나치게 가중치가 높아지거나 낮아지는 것을 방지하는 알고리즘입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가중치는 0과 1 사이로 설정하여 0.5에 가까울 때는 빠르게,&amp;nbsp; 0과 1에 가까울수록 천천히 변화시키게 구현했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기본 조정 값(baseAdjustment)&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가중치를 조정하는 기본 값은 0.1입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 성공적인 매칭 시 가중치가&amp;nbsp;&lt;b&gt;얼마나 변할지&lt;/b&gt;를 결정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;현재 가중치(currentWeight)&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 저장된 가중치 값을 불러옵니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약 값이 없다면 기본값인 0.5를 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;동적 조정 값(dynamicAdjustment)&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;가중치가 0.5에 가까울수록 크게, 0이나 1에 가까울수록 작게 변화&lt;/b&gt;하도록 설정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구체적으로는&amp;nbsp;1 - |currentWeight - 0.5|를 계산하여 가중치가 0.5에서 멀어질수록 조정량이 줄어듭니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어, 현재 가중치가 0.5일 경우 조정량은&amp;nbsp;0.1 * (1 - 0) = 0.1로, 큰 폭의 변화가 일어납니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;반면에 가중치가 0.9일 경우&amp;nbsp;0.1 * (1 - 0.4) = 0.06으로 조정량이 줄어듭니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;매칭 성공 여부에 따른 조정&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매칭이 성공했을 경우에는 가중치를 증가시키고, 실패했을 경우에는 가중치를 감소합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 상한선과 하한선을 0.8과 0.2로 설정하여 극단적으로 선택되거나 선택이 안 되는 경우를 미연에 방지합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 위와 같은 동적 조정법을 통해 가중치를 조정하고 난 이후 &lt;br /&gt;실제로 멤버 추천을 어떻게 하는지 아래에 설명하겠습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1725535363171&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public List&amp;lt;MatchResult&amp;gt; findMatches(MBTI userMbti, Gender userGender, List&amp;lt;PotentialMatch&amp;gt; potentialMatches) {
  List&amp;lt;MatchResult&amp;gt; results = new ArrayList&amp;lt;&amp;gt;();

  if (userMbti == null || userGender == null) {
    throw new IllegalArgumentException(&quot;User MBTI or gender cannot be null&quot;);
  }

  for (PotentialMatch match : potentialMatches) {
    if (match.getMbti() == null || match.getGender() == null) {
      continue;
    }

    double userPref = getPreferenceScore(userMbti, match.getMbti(), userGender);
    double matchPref = getPreferenceScore(match.getMbti(), userMbti, match.getGender());
    double score = Math.min(userPref, matchPref);
    log.info(&quot;Matched score: {}&quot;, score);
    results.add(new MatchResult(match, score));
  }

  results.sort((a, b) -&amp;gt; Double.compare(b.score, a.score));

  return results.stream().limit(2).collect(Collectors.toList());
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스크린샷과 같이 잠재적 후보들과 나의 성별/MBTI에 따라서 가중치를 확인합니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 score(매칭 가능성)을 구할 때 &lt;b&gt;Math.min() 함수를&lt;/b&gt; 사용합니다.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 양쪽의 선호도가 모두 높아야 유의미하다고 판단해서, 매칭의 안정성을 보장하기 위함입니다.&lt;br /&gt;* 단방향이 아니라 양방향으로 선호도가 높을 때 선호한다고 판단하기 때문&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 과정을 통해 구한 Score를 통해서 잠재적 매칭 후보들 중을 정렬하여 상위 두 명의 결과만을 반환합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;일간 매칭 가중치와 매칭률 증감 저장&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서버에 저장했으므로 휘발성 데이터이기 때문에, 데이터의 고가용성과 분석을 통한 인사이트를 위해서 MatchingStatistics&amp;nbsp;엔티티를 사용해, 각 성별과 MBTI별로 가중치를 기록합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1725535376609&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Scheduled(cron = &quot;0 0 0 * * *&quot;) // 매일 자정에 실행
@Transactional  // 데이터베이스 트랜잭션 관리
public void updateMatchingWeights() {
  log.info(&quot;Starting weight update process...&quot;);

  // 어제 날짜의 매칭 데이터를 가져옴
  List&amp;lt;Matching&amp;gt; matchings = matchingRepository.findMatchingsFromYesterday();
  int totalMatches = matchings.size();
  int acceptedMatches = 0;

  for (Matching matching : matchings) {
    Member sender = matching.getSender();
    Member receiver = matching.getReceiver();

    if (sender != null &amp;amp;&amp;amp; receiver != null) {
      // 매칭 성공 여부에 따라 가중치를 업데이트
      boolean accepted = matching.getStatus() == Status.ACCEPTED;
      if (accepted) {
        acceptedMatches++;
      }

      matcher.updatePreferences(sender.getMbti(), receiver.getMbti(), sender.getGender(), accepted);
      matcher.updatePreferences(receiver.getMbti(), sender.getMbti(), receiver.getGender(), accepted);

      // 각 성별과 MBTI별로 가중치 기록
      saveMatchingStatistics(sender, receiver);
    }
  }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DailyMatchingRate&amp;nbsp;엔티티를 통해 오늘 총 매칭률과 어제와 오늘의 매칭률 증감을 계산했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1725535389709&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; // 전체 매칭률 계산
        double matchRate = (totalMatches &amp;gt; 0) ? ((double) acceptedMatches / totalMatches) * 100 : 0;
        log.info(&quot;Today's matching rate: {}%&quot;, matchRate);

        // 어제의 매칭률을 가져옴
        double yesterdayMatchRate = dailyMatchingRateRepository.findByDate(LocalDate.now().minusDays(1))
                .map(DailyMatchingRate::getMatchRate)
                .orElse(0.0);

        // 매칭률 증감 계산
        double matchRateChange = matchRate - yesterdayMatchRate;

        // 전체 매칭 성공률을 기록 (하루에 한 번)
        saveDailyMatchRate(matchRate, matchRateChange);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;스케줄링을 통한 자동화&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막으로 매일 자정에 오늘 자정부터 어제 자정까지의 매칭 데이터를 분석하고, 가중치와 매칭 성공률을 자동으로 저장하도록 설정했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 통해 사람이 개입하지 않아도 시스템이 자동으로 데이터를 처리하고 개선할 수 있게 자동화하였습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Result&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매칭 알고리즘을 통해서 실시간으로 가중치를 반영하게 되었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하루 동안의 매칭 성공률을 자동으로 분석 및 기록하여 데이터 분석과 저장을 가능하게 구현하였습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 데이터를 바탕으로 향후 매칭 알고리즘을 개선하고, 사용자 경험을 더욱 향상할 수 있는 기반을 마련하였습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리하며&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적으로 많은 곳에서 사용하는 기능들과 다르게 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아이디어부터 구현하는 로직들을 새로이 고민해야 했기에 쉽지 않은 개발이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 알고리즘을 구현하면서 코딩테스트를 풀 때 시간복잡도와 공간복잡도를 고민하며 개발하는 것처럼&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;br /&gt;DB를 거치지 않고 가중치를 반영하는 방법은 무엇일까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고가용성을 위해서 데이터를 잃지 않고 누적하는 방법은 무엇일까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가중치를 조정할 때 어떤 방식으로 할까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;트루에코 프로젝트를 구현할 때와 다르게 이제 하나의 클래스, 메서드를 작성하더라도 여러 조건과 임팩트를 같이 고려하며 개발을&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어느 정도 할 수 있게 된 것 같아 성장했음을 체감한 순간이었던 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최근 Now, Here에 몰두하여 많은 시간을 쏟아부었고, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 과정을 통해서 경험했던 내용들을 공유하러 금방 다시 오겠습니다.&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  긴 글 읽어주셔서 감사합니다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>프로젝트</category>
      <category>Java</category>
      <category>MBTI</category>
      <category>Nowhere</category>
      <category>대학교축제</category>
      <category>동적조정법</category>
      <category>매칭 알고리즘</category>
      <category>백엔드</category>
      <category>이벤트</category>
      <category>프로젝트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/38</guid>
      <comments>https://jun10920.tistory.com/38#entry38comment</comments>
      <pubDate>Fri, 6 Sep 2024 00:50:48 +0900</pubDate>
    </item>
    <item>
      <title>개발 혹한기에 개발 시작한 지 1년 만에 카카오 서류/코테/면접 경험하기(수시채용)</title>
      <link>https://jun10920.tistory.com/37</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;부제: 아직 부족한 것, 앞으로의 공부 방향&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;객관적으로, 아직 범용적인 스펙만 있고 엣지 포인트가 없는 저에게 과분한 기회가 왔었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바로 카카오 채용절차입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후에 코딩테스트도 합격하여 면접까지 봤었습니다만&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 공고에 충분하게 핏 하지 않아서 더 이상 절차를 진행하지 못했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음으로 경험하게 될 대규모 채용인 하반기 공채 전에 좋은 경험이었다고 생각하고&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이에 대한 경험을 나눕니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(추가로 &lt;b&gt;카카오 수시채용&lt;/b&gt; 관련해서는 정보가 별로 없어서 준비하는데 살짝 어려웠어서 도움이 되고자 글을 작성합니다)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(&lt;b&gt;주황색 &lt;/b&gt;또는 &lt;b&gt;파란색 단어는 링크가 삽입&lt;/b&gt;되어 있습니다)&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서류 합격&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1학기가 끝나고 여름방학이 시작됐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1년간 휴학하고 &lt;a href=&quot;https://jun10920.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;준사관 시험&lt;/a&gt;을 준비했기에, 친한 지인들은 슬슬 취업을 한 상태이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;졸업과 동시에 취업을 하기 원하는 나이기에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4학년 여름방학이지만 마음이 그리 여유롭지 않았다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 &lt;a href=&quot;https://jun10920.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;회고록&lt;/a&gt;에 작성한 것과 같이 넓고 얇은 스펙은 어느 정도 완성되어 있기에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;수시채용 기간이라 대략 6~70여 곳 정도 지원을 했고 서류합격률은 5% 정도였다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그중에서 하나은행 코딩테스트에서 불합격을 통지받은 날,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;카카오에서 &lt;b&gt;서류합격&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 이미 너무 많은 곳에서 서류 불합격 이메일을 받았기 때문에 카카오에서 이메일이 왔을 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 하루 뒤에 코딩테스트 안내 이메일을 받고서야 합격인 것을 확인했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yZea2/btsIRvvFDGw/Lz6OfUnkpaLdgU48M4T7kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yZea2/btsIRvvFDGw/Lz6OfUnkpaLdgU48M4T7kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yZea2/btsIRvvFDGw/Lz6OfUnkpaLdgU48M4T7kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyZea2%2FbtsIRvvFDGw%2FLz6OfUnkpaLdgU48M4T7kk%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;689&quot; height=&quot;416&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩테스트&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;카카오 신입 공채와 달리, 수시채용의 경우에는 해커랭크에서 코딩테스트를 본다(경력과 같음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인터넷의 후기를 보면 &lt;b&gt;공채보다는 쉽다&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 코테 실력은 백준을 거의 하지 않아서 프로그래머스 기준으로 lv2는 적당히 잘 풀고, lv3는 시간을 오래 들이면 가능한 수준인데 불합격했던 하나은행 코테보다 카카오 수시채용 코테가 쉽다고 느꼈기 때문이다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구체적으로 레벨을 예로 들자면, &lt;b&gt;레벨 lv2정도의 문제를 3문제 주고, 180분&lt;/b&gt; 동안 푸는 형식이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;카테고리는 어려운 알고리즘은 안 나오고 &lt;b&gt;구현, 그리디, 이진탐색&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 난이도에 비해 시간이 넉넉해서 1시간 반정도 안에 다 풀고, 다시 틀린 부분이 있는지 확인해 보고 제출했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모든 테스트 케이스를 전부 통과했기 때문에 합격을 예상했고, 합격했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Npb2b/btsIQ2AGn6P/XcSylkMht55DZhdoPfz1k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Npb2b/btsIQ2AGn6P/XcSylkMht55DZhdoPfz1k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Npb2b/btsIQ2AGn6P/XcSylkMht55DZhdoPfz1k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNpb2b%2FbtsIQ2AGn6P%2FXcSylkMht55DZhdoPfz1k0%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;257&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;면접 준비&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩테스트는 부트캠프나 이런저런 프로그램을 통해서 여러 번 경험했지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;화상으로 2대 1로 진행하였고, 이력서를 기반해서 30분에서 1시간 정도 진행한다고 안내받았다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;후기가 별로 없었지만, 화상면접과 관련된 모든 글들을 읽어보니 대면 면접만큼 힘들게 1시간 동안 보는 팀도 있고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 힘들게 준비하는 팀 기준으로 생각하고, CS(데이터베이스, 네트워크, 운영체제, 자료구조, 알고리즘, 자바)와 프로젝트에 사용한 기술들의 원리(spring boot, jpa 등등), 프로젝트 관련 내용, 자기소개글에서 중요할 법한 내용들을 모두 노션에 정리해서 하나하나 DFS처럼 궁금한 게 생기면 계속 질문을 만들고 답을 달면서 준비했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 1년 동안 개발을 하면서, 1학년 때부터 개발을 시작한 사람들을 따라잡기 위해 너무 많은 것을 병행했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지금도 여러 개를 병행 중이지만 면접을 준비하는 기간에는 &lt;b&gt;'카카오 면접 준비'&lt;/b&gt;라는 명목 하에 모든 것을 차치하고 기술 면접만 준비했는데, 면접에서 어느 정도 깊이까지 나올지 몰라서 계속 깊이깊이 탐구하는 과정이 너무 재밌었다.&amp;nbsp;&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정말로, 개발을 제대로 시작한 1년 중에서 가장 재밌었던 순간이었다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 면접 날이 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;면접&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;면접 때는 공지받은 대로 &lt;b&gt;2대 1 면접으로 화상으로 진행했고, 50분&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자기소개 / 지원동기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 직무에 대한 지식&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 직무 관련된 깊이 있는 경험&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터베이스 관련된 지식&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;높은 러닝 커브를 증명할 수 있는 경험&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;면접을 보면서 느낀 것과 정영진 님과 커피챗하면서 느낀 것은 비슷했는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그것은 바로 내가 열심히 살고 러닝 커브가 높다는 것은 알겠는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개발의 어떤 분야에 특화되어 있는지&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 대학교도 졸업하지 못한 쌩신입이, 어떤 분야에 특화될 수 있는지는 의문인지라&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CS 기본기가 탄탄하고, 뭐든지 빠르게 배울 수 있는 사람을 원하실 거라고 생각이 들었고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 거기에 맞춰서&amp;nbsp;준비했는데 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적인 백엔드 직무가 아니라 빅데이터 플랫폼 엔지니어링이라는 특수한 직무라 데이터베이스에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 러닝 커브가 높다는 것을 좀 더 증명해 주길 바라셨던 것 같은데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미 내가 회고록에 적은 것과 같이 거기서 뭘 더할 수 없을 정도로 최대치를 한 거기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;면접 상에서 CS나 프로젝트 등에서는 대답 못한 게 없었고 분위기도 그렇게 나쁘지는 않았지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;뭔가 애매모호한 분위기를 느꼈고, 결과는 &lt;b&gt;불합격&lt;/b&gt;이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1spG9/btsISqUXTFt/oODk0mSYT6KggA85Fk9JHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1spG9/btsISqUXTFt/oODk0mSYT6KggA85Fk9JHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1spG9/btsISqUXTFt/oODk0mSYT6KggA85Fk9JHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1spG9%2FbtsISqUXTFt%2FoODk0mSYT6KggA85Fk9JHk%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;724&quot; height=&quot;239&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 부족한 것, 앞으로의 공부 방향&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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&gt;그래서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해 초에 계획 세운 것과 같이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트 / CS / 코딩테스트 / 자격증으로 나눠서 나의 부족한 부분과 해결하기 위해 계획을 세웠다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;부족한 부분&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트 - 백엔드 관련된 프로젝트가 1개뿐, 최소 하나정도는 더 있어야 할 것 같음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CS - CS전공 고학점, 정처기, SQLD 공부를 하면서 전반적인 개념은 있지만 조리 있게 말할 정도로 정리되지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩테스트 - 컨디션에 따라 실력 차이가 너무 벌어지고, 파이썬과 자바 사이에서 갈피를 못 잡아서 실력이 더 떨어짐&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자격증 - 정처기 실기가 합격이 애매한 상황, 오픽이 IM1이라 더 높이면 좋을 것 같음, 토익은 9월에 만료&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;계획&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트 - 백엔드 관련돼서 유저를 받아보는 프로젝트 1 ~ 2개&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CS - 예상 면접 질문들에 답을 달면서 전 범위를 훑어보며 꼬리물기로 학습&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩테스트 - 파이썬이냐 자바냐를 확실하게 정하고 매일 최소 2문제 이상 풀기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자격증 - 정처기 실기 불합격 되면 9월 10일에 재신청, 오픽 8월 중순에 시험, 토익은 여유가 생기면 다시 도전&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;중점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;i&gt;&lt;b&gt;깊이 있게 학습&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 프로젝트도 어느 정도까지 고려해서 진행했는지 기록&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- CS도 자바나 내가 사용하는 기술의 어느 깊이까지 파고들면서 사용했는지 기록(결국 cs와 다 연관되어 있음)&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마치며&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;반년 간 많은 변화가 있었던 것처럼, 남은 2024년에도 최선을 다해서 노력해서 많은 변화를 만들고 싶다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내가 가진 유일한 무기이자 최고의 무기는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;꾸준하고, 긍정적인 것&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로도 우직하고, 긍정적으로 나아가겠다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  긴 글 읽어주셔서 감사합니다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>개발경험</category>
      <category>개발자취업</category>
      <category>네카라쿠배</category>
      <category>카카오</category>
      <category>카카오면접</category>
      <category>카카오수시채용</category>
      <category>카카오코딩테스트</category>
      <category>카카오코테</category>
      <category>카카오화상</category>
      <category>카카오화상면접</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/37</guid>
      <comments>https://jun10920.tistory.com/37#entry37comment</comments>
      <pubDate>Tue, 30 Jul 2024 15:12:12 +0900</pubDate>
    </item>
    <item>
      <title>나만의 AI 만들기 : 프롬프팅으로 GPT 능력 극대화하기 | 추천 GPTS 첨부</title>
      <link>https://jun10920.tistory.com/36</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나름대로 GPTS를 이용해서 학습, 취업 준비 등등 많은 부분을 효율적으로 하고 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저보다 잘하시는 분들도 많겠지만,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주변의 개발자들과도 비교해서도 잘 쓰는 편인 것 같아 도움이 될 것 같아서&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;글을 작성합니다!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(유료 사용자만 GPTS를 생성할 수 있는 것으로 알고 있어 참고 바랍니다)&lt;br /&gt;(무료 사용자 분들은 마지막&amp;nbsp; GPTs 목록만 가져가셔도 좋으실듯..)&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;글을 쓰게 된 배경&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저는 GPT를 원래도 꾸준히 쓰고 있었지만, 작년 말에 &lt;a href=&quot;https://www.youtube.com/@careerhackeralex&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;커리어해커 알렉스&lt;/a&gt; 님의 영상을 보고 나서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GPT를 통한 제 일상의 효율성 자체가 급격히 좋아졌습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 영상을 모두 보시고 개인화된 방법을 사용하는 것이 가장 좋을 거라 생각하지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저와 비슷한 상황에 계신 분들은 도움이 될 거라 생각됩니다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GPTS란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GPT를 사용하시는 분들 중에서도, GPT가 그냥 똑똑한 AI 정도로만 알지 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자세히 모르는 경우가 더 많은 거라고 생각합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저도 기술적인 내용을 깊게는 모르지만 이해하시기 쉽게 간단하게 설명을 드리지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;거대한 데이터를 기반으로 한 역할 놀이라고 하고 싶습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 감독이고, GPT가 배우라고 할 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;감독인 제가 아무런 역할(대본)을 배우에게 주지 않으면 배우는 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본인의 능력과는 상관없이 능력을 제대로 발휘하지 못합니다.|&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 배우에게 '너는 어떤 역할을 맡아서 어떤 식으로 연기하면 돼. 이때 우리의 상황은 무엇이고 앞으로 어떻게 될 거야.'&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;라고 말해주는 것처럼 GPT에게 역할을 주는 것이 바로 &lt;b&gt;프롬프팅&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GPTS가 나오기 전에도 설정의 ChatGPT 맞춤 설정에서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-24 132042.png&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsd5iC/btsIK6CSfmT/htvvfx8PhAIcDXLQv2HtXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsd5iC/btsIK6CSfmT/htvvfx8PhAIcDXLQv2HtXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsd5iC/btsIK6CSfmT/htvvfx8PhAIcDXLQv2HtXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsd5iC%2FbtsIK6CSfmT%2Fhtvvfx8PhAIcDXLQv2HtXK%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;332&quot; height=&quot;222&quot; data-filename=&quot;스크린샷 2024-07-24 132042.png&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;222&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프롬프팅의 퀄리티에 따라서 GPT의 성능도 천차만별로 달라지기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그런데, 매번 다른 목적을 가지고 GPT를 사용할 때마다 이 프롬프팅을 갈아 끼우는 것이 귀찮으니&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아예 각각 다르게 프롬프팅된 GPT를 만든 것이 GPTS 기능입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GPT 만들기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 GPT를 사용할 때 가장 중요한 것은 프롬프팅입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미 GPTs에도 프롬프팅을 만들기 위한 GPT가 존재합니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 좋은 GPT들이 있겠지만 저의 경우 영상을 통해 유용한 방법을 알려주신 커리어해커 알렉스 님의 &lt;a href=&quot;https://www.careerhackeralex.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;프롬프트 생성기&lt;/a&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발 블로그 글을 작성하기 위해 도와주는 파워블로그 GPT를 만들면서 설명을 이어가겠습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 링크를 건 사이트에 들어가서 내 프롬프트 만들기를 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 현재 저의 역할을 먼저 설정합니다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJVEHU/btsIKaMGtQC/rMeBW48MQ154o996mnrgo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJVEHU/btsIKaMGtQC/rMeBW48MQ154o996mnrgo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJVEHU/btsIKaMGtQC/rMeBW48MQ154o996mnrgo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJVEHU%2FbtsIKaMGtQC%2FrMeBW48MQ154o996mnrgo0%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;1862&quot; height=&quot;967&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;967&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후에는 GPT의 역할(배우의 역할)을 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1838&quot; data-origin-height=&quot;977&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfVlHs/btsIJTLcZD8/9o6zF6ItcPcLek7HmabNBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfVlHs/btsIJTLcZD8/9o6zF6ItcPcLek7HmabNBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfVlHs/btsIJTLcZD8/9o6zF6ItcPcLek7HmabNBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfVlHs%2FbtsIJTLcZD8%2F9o6zF6ItcPcLek7HmabNBK%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;1838&quot; height=&quot;977&quot; data-origin-width=&quot;1838&quot; data-origin-height=&quot;977&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 경우에는 글을 작성하는 것을 도와주는 GPT를 만들기 위해서 콘텐츠 스크립트 작성을 선택했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후에는 아까 말씀드린 것처럼 저 자세한 지침을 배우(GPT)에게 주어야 하는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 경우는 아래 사진과 같이 작성했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(실제로 만들 때는 더 자세하게 작성합니다)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;915&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7Zowz/btsIJvqvEpB/lyUiFxsQqMsFw6zXiKTAMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7Zowz/btsIJvqvEpB/lyUiFxsQqMsFw6zXiKTAMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7Zowz/btsIJvqvEpB/lyUiFxsQqMsFw6zXiKTAMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7Zowz%2FbtsIJvqvEpB%2FlyUiFxsQqMsFw6zXiKTAMk%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;1008&quot; height=&quot;915&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;915&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;그럼 GPT가 더 높은 성능을 보이는 영어로 프롬프트를 작성해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;951&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d46AT1/btsIJI4kBqb/3KLpTdkKA79BdzkJmi1Pm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d46AT1/btsIJI4kBqb/3KLpTdkKA79BdzkJmi1Pm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d46AT1/btsIJI4kBqb/3KLpTdkKA79BdzkJmi1Pm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd46AT1%2FbtsIJI4kBqb%2F3KLpTdkKA79BdzkJmi1Pm0%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;463&quot; height=&quot;545&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;951&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후에 GPT 사이트로 돌아와&amp;nbsp;&lt;/span&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;1367&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btUTlH/btsIJDaKqaU/c50lKcOZlIsGPhLdXJbIv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btUTlH/btsIJDaKqaU/c50lKcOZlIsGPhLdXJbIv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btUTlH/btsIJDaKqaU/c50lKcOZlIsGPhLdXJbIv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtUTlH%2FbtsIJDaKqaU%2Fc50lKcOZlIsGPhLdXJbIv0%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;1367&quot; height=&quot;406&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;406&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 GPT 옆의 만들기를 누르시면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;947&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4tCvW/btsIK5cV7Eh/uzEFFYE6qbZKKipNo0xc61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4tCvW/btsIK5cV7Eh/uzEFFYE6qbZKKipNo0xc61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4tCvW/btsIK5cV7Eh/uzEFFYE6qbZKKipNo0xc61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4tCvW%2FbtsIK5cV7Eh%2FuzEFFYE6qbZKKipNo0xc61%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;726&quot; height=&quot;363&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;947&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;직접 다 작성하는 경우도 있지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에는 프롬프트를 gpt에게 주고, 어울리는 이름과 설명, 그리고 이미지 모두 생성해 달라고 해서 추가했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOq86M/btsILyTwbqa/Irnq8jLLBfiK4TUvP8SWR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOq86M/btsILyTwbqa/Irnq8jLLBfiK4TUvP8SWR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOq86M/btsILyTwbqa/Irnq8jLLBfiK4TUvP8SWR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOq86M%2FbtsILyTwbqa%2FIrnq8jLLBfiK4TUvP8SWR1%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;573&quot; height=&quot;546&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;완성&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 일반 GPT와 방금 만든 DevBlog GPT가 답을 어떻게 다르게 하는지 확인하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(하지만 저는 기본적으로 초반에 설명한 GPT 맞춤 설정을 통해 제가 개발자이고, 어떻게 반응했으면 좋겠는지 기본적인 프롬프팅이 적용된 상태라는 것을 감안하셔야 합니다)&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반 GPT&lt;/span&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;1288&quot; data-origin-height=&quot;953&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFMRit/btsIKRMQVoV/yAUd88Tw162QgdCFcYjWZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFMRit/btsIKRMQVoV/yAUd88Tw162QgdCFcYjWZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFMRit/btsIKRMQVoV/yAUd88Tw162QgdCFcYjWZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFMRit%2FbtsIKRMQVoV%2FyAUd88Tw162QgdCFcYjWZk%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;740&quot; height=&quot;548&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;953&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DevBlog GPT&lt;/span&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;1302&quot; data-origin-height=&quot;950&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mYASw/btsIKVuX8Mh/SyfXD9eeLhrurbU0HpO4TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mYASw/btsIKVuX8Mh/SyfXD9eeLhrurbU0HpO4TK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mYASw/btsIKVuX8Mh/SyfXD9eeLhrurbU0HpO4TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmYASw%2FbtsIKVuX8Mh%2FSyfXD9eeLhrurbU0HpO4TK%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;718&quot; height=&quot;524&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;950&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본 GPT도 제 개인 맞춤설정 때문에 좋은 답을 주지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보다시피 개발 블로그 전용 GPT인 DevBlog GPT는 주제와 함께 어떻게 블로그 글을 작성하면 좋을지 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 경험한 바로는, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주제를 더 상세하게 알려주거나 블로그 글을 어떻게 쓰고 싶다고 상세하게 알려줄수록 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;둘의 성능 차이가 더 벌어집니다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리하며&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저는 방금 만든 GPT를 제외하고도&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2QMB/btsILGYdHWs/WQFOPLuA2hS3BJoiXGlkN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2QMB/btsILGYdHWs/WQFOPLuA2hS3BJoiXGlkN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2QMB/btsILGYdHWs/WQFOPLuA2hS3BJoiXGlkN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2QMB%2FbtsILGYdHWs%2FWQFOPLuA2hS3BJoiXGlkN0%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;533&quot; height=&quot;402&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 식으로 필요에 따라서 그때그때 만들면서 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 현재 채팅 100+ 가 적혀있는 것처럼 사용 횟수에 따라서 추후에 Open AI에서&lt;b&gt; 수익화&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 &lt;b&gt;본인의 효율을 늘리면서, 수익화&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;++ 프롬프팅 할 때 &lt;b&gt;파일도 업로드&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;++ 학교에서 수업을 들을 때, 선생님의 모든 수업 내용을 클로바&amp;nbsp;노트로 녹음하여 해당 자료와 모든 족보를 프롬프팅 해서 OOO선생님 GPT를 만들고, 시험 기간에 새로 배운 내용들을 알려주어 예상 문제를 뽑아서 사용하는 예시를 들은 적도 있습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이처럼 아이디어에 따라서 정말 유용하게 사용할 수 있는 것이 AI인 것 같습니다.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 만든 GPT 중에서 성능도 좋고, 잘 사용하고 있는 GPT들을 올리면서 마무리하겠습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(사용하면서 피드백 주실 부분이 있으시면 언제든 주시면 감사하겠습니다)&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GPTS 목록&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DevBlog GPT&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-g6UeA08DN-devblog-gpt&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chatgpt.com/g/g-g6UeA08DN-devblog-gpt&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721796990111&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;ChatGPT&quot; data-og-description=&quot;A conversational AI system that listens, learns, and challenges&quot; data-og-host=&quot;chatgpt.com&quot; data-og-source-url=&quot;https://chatgpt.com/g/g-g6UeA08DN-devblog-gpt&quot; data-og-url=&quot;https://chatgpt.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Hr7wW/hyWGVsTufm/BdGwyBvxo7Ril6P1aHNxUK/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/cenhTT/hyWCHJRZKt/gJbf2NBnGtzOQ5ZHFuoPWK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-g6UeA08DN-devblog-gpt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chatgpt.com/g/g-g6UeA08DN-devblog-gpt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Hr7wW/hyWGVsTufm/BdGwyBvxo7Ril6P1aHNxUK/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/cenhTT/hyWCHJRZKt/gJbf2NBnGtzOQ5ZHFuoPWK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;ChatGPT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A conversational AI system that listens, learns, and challenges&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chatgpt.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;부숴버려 코딩테스트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-9Sxl5Cyeq-busweobeoryeo-kodingteseuteu&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chatgpt.com/g/g-9Sxl5Cyeq-busweobeoryeo-kodingteseuteu&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721797019355&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;ChatGPT&quot; data-og-description=&quot;A conversational AI system that listens, learns, and challenges&quot; data-og-host=&quot;chatgpt.com&quot; data-og-source-url=&quot;https://chatgpt.com/g/g-9Sxl5Cyeq-busweobeoryeo-kodingteseuteu&quot; data-og-url=&quot;https://chatgpt.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PJL0c/hyWG0ucHns/Y8zPEcf24MDtNsT0NhVUR0/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/EDajR/hyWCIPvMMF/1LUKSieNIXgqTKBfl884WK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-9Sxl5Cyeq-busweobeoryeo-kodingteseuteu&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chatgpt.com/g/g-9Sxl5Cyeq-busweobeoryeo-kodingteseuteu&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PJL0c/hyWG0ucHns/Y8zPEcf24MDtNsT0NhVUR0/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/EDajR/hyWCIPvMMF/1LUKSieNIXgqTKBfl884WK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;ChatGPT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A conversational AI system that listens, learns, and challenges&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chatgpt.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;네이버 부스트캠프 준비 도우미 GPT&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-r68ERYZ1d-neibeo-buseuteukaempeu-doumi&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chatgpt.com/g/g-r68ERYZ1d-neibeo-buseuteukaempeu-doumi&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721797039728&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;ChatGPT&quot; data-og-description=&quot;A conversational AI system that listens, learns, and challenges&quot; data-og-host=&quot;chatgpt.com&quot; data-og-source-url=&quot;https://chatgpt.com/g/g-r68ERYZ1d-neibeo-buseuteukaempeu-doumi&quot; data-og-url=&quot;https://chatgpt.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KNT28/hyWCMEo4ZM/Ct19BRZPlwsTqQtVhgN4I1/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/rZRmZ/hyWCE7r6aC/8uZLf6bsMhBvZ9X4LBM1w0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-r68ERYZ1d-neibeo-buseuteukaempeu-doumi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chatgpt.com/g/g-r68ERYZ1d-neibeo-buseuteukaempeu-doumi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KNT28/hyWCMEo4ZM/Ct19BRZPlwsTqQtVhgN4I1/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/rZRmZ/hyWCE7r6aC/8uZLf6bsMhBvZ9X4LBM1w0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;ChatGPT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A conversational AI system that listens, learns, and challenges&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chatgpt.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;OPIc 개인 튜터 GPT&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-akL1ggD4c-my-opic-tutor-nayi-opig-yeongeo-seonsaengnim&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chatgpt.com/g/g-akL1ggD4c-my-opic-tutor-nayi-opig-yeongeo-seonsaengnim&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721797061227&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;ChatGPT&quot; data-og-description=&quot;A conversational AI system that listens, learns, and challenges&quot; data-og-host=&quot;chatgpt.com&quot; data-og-source-url=&quot;https://chatgpt.com/g/g-akL1ggD4c-my-opic-tutor-nayi-opig-yeongeo-seonsaengnim&quot; data-og-url=&quot;https://chatgpt.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c9ptcF/hyWGRYkaL9/kanTqL5RtRGrc9MPKRJhcK/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/imMQo/hyWGWef9OT/rf4zIcJQe0o9U2S52EvRY0/img.png?width=512&amp;amp;height=512&amp;amp;face=136_85_323_289&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-akL1ggD4c-my-opic-tutor-nayi-opig-yeongeo-seonsaengnim&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chatgpt.com/g/g-akL1ggD4c-my-opic-tutor-nayi-opig-yeongeo-seonsaengnim&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c9ptcF/hyWGRYkaL9/kanTqL5RtRGrc9MPKRJhcK/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/imMQo/hyWGWef9OT/rf4zIcJQe0o9U2S52EvRY0/img.png?width=512&amp;amp;height=512&amp;amp;face=136_85_323_289');&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;ChatGPT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A conversational AI system that listens, learns, and challenges&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chatgpt.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일본어 회화 연습 GPT&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-z5DcDjkR5-haruka-ilboneo-hoehwa-yeonseub-ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chatgpt.com/g/g-z5DcDjkR5-haruka-ilboneo-hoehwa-yeonseub-ai&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721797071600&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;ChatGPT&quot; data-og-description=&quot;A conversational AI system that listens, learns, and challenges&quot; data-og-host=&quot;chatgpt.com&quot; data-og-source-url=&quot;https://chatgpt.com/g/g-z5DcDjkR5-haruka-ilboneo-hoehwa-yeonseub-ai&quot; data-og-url=&quot;https://chatgpt.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bi7VF8/hyWGXYxVon/oB2qxJDNssCfsDLMH07mIK/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/cTxHmJ/hyWCJt7OYD/o6uK8Mf6KGCbDZtpC9Vgp1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-z5DcDjkR5-haruka-ilboneo-hoehwa-yeonseub-ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chatgpt.com/g/g-z5DcDjkR5-haruka-ilboneo-hoehwa-yeonseub-ai&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bi7VF8/hyWGXYxVon/oB2qxJDNssCfsDLMH07mIK/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/cTxHmJ/hyWCJt7OYD/o6uK8Mf6KGCbDZtpC9Vgp1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;ChatGPT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A conversational AI system that listens, learns, and challenges&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chatgpt.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>GPT</category>
      <category>GPTs</category>
      <category>gpt프롬프팅</category>
      <category>OpenAI</category>
      <category>지피티</category>
      <category>챗지피티</category>
      <category>커리어해커알렉스</category>
      <category>프롬프트</category>
      <category>프롬프팅</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/36</guid>
      <comments>https://jun10920.tistory.com/36#entry36comment</comments>
      <pubDate>Wed, 24 Jul 2024 14:08:21 +0900</pubDate>
    </item>
    <item>
      <title>앞으로 개발자로서 나아갈 방향 _ 송주영 연구위원님의 강연 / 시니어 개발자 정영진 님과의 커피챗 후기</title>
      <link>https://jun10920.tistory.com/35</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;안녕하세요! 오랜만입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년 이맘때쯤에 갔던 너디너리 컨퍼런스 이후에 처음으로 강연을 다녀왔습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바로 너디너리 컨퍼런스에서 가장 인상 깊었던 송주영 님의 강연인데요!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 강연 이후에 현장에 계셨던 정영진 님께 커피챗을 요청드려서 얘기를 나눴습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최근에 고민이 있었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그것은 바로 제가 개발자가 되고 싶은 건지, 개발을 이용해서 취업을 하고 싶은 건지였습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 생각이 정리되던 와중에 강연과 커피챗을 통해서 방향을 확실하게 잡을 수 있었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이에 대한 내용을 작성하겠습니다. 궁금하시면 한 번 읽어주세요!&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강연을 가게 된 계기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저에게 개발을 추천했던 2명 중에 한 명인 &lt;a href=&quot;https://github.com/insu12021202&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;인수&lt;/a&gt;와 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년 여름방학에 컴공선배에서 주최한 &lt;a href=&quot;https://event-us.kr/neordinary/event/68943&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;너디너리 데모데이&lt;/b&gt;&lt;/a&gt;에 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다녀왔습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(이에 대한 내용은 2023년에 회고에 잠시 등장)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1720602900554&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;항공 학부 출신 개발자 도전기 2023년 회고&quot; data-og-description=&quot;  준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활동하고, 너디너리 컨퍼런스 가고, 프로젝트 3개 하고, 컴공 복수 전공하고, 연말~연초에 주 60시간 공부 시작 이야기 이번 회고를 쓰기 앞서 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/12&quot; data-og-url=&quot;https://jun10920.tistory.com/12&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kBRP8/hyWvWADuCs/u6wGyEjumJohdQNZzpvRDk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bRPEbe/hyWzrZ49NK/qmEh5b2s9Fbc275V8g8GM1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Hi6bc/hyWvOWTEMU/OIyl8sR1wsc2HQFyKviyoK/img.png?width=1080&amp;amp;height=1136&amp;amp;face=0_0_1080_1136&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/12&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kBRP8/hyWvWADuCs/u6wGyEjumJohdQNZzpvRDk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bRPEbe/hyWzrZ49NK/qmEh5b2s9Fbc275V8g8GM1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Hi6bc/hyWvOWTEMU/OIyl8sR1wsc2HQFyKviyoK/img.png?width=1080&amp;amp;height=1136&amp;amp;face=0_0_1080_1136');&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;항공 학부 출신 개발자 도전기 2023년 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활동하고, 너디너리 컨퍼런스 가고, 프로젝트 3개 하고, 컴공 복수 전공하고, 연말~연초에 주 60시간 공부 시작 이야기 이번 회고를 쓰기 앞서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 회고에서 적은 것과 같이 당시 들었던 강연 중에서 가장 인상 깊었던 두 분이 송주영 님과 하조은 님이었는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 하조은 님과도 종종 SNS에서 소통하고, 송주영 님은 &lt;a href=&quot;https://www.youtube.com/channel/UCi0FOToztgfQgckymkBkPGQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;유튜브&lt;/a&gt;를 하셔서 구독을 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 약 1년이 지난 이번 여름방학,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;송주영 님이 토크쇼 형식으로 강연을 하신다고 유튜브 커뮤니티에 올리셨습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 좋아하는 동생이자 팀원인 &lt;a href=&quot;https://github.com/HeeJohn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;희준이에게&lt;/a&gt; 바로 같이 가자 해서 고맙게도 같이 다녀왔습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강연 내용&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞선 초반부에는 &lt;a href=&quot;https://www.linkedin.com/in/jupitersong/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;송주영&lt;/a&gt; 님이 어떻게 개발자로서 성장하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LG 유플러스 연구위원이라는 자리로 오게 되었는지에 대한 자전적인 이야기를&amp;nbsp; 하셨습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가정환경과 별개로 열심히 개발하셔서 대학교를 가시고 이후에 학업에 대한 의지로 편입하시게 된 이야기,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 삼성에 들어가서 삼성 녹스와 smart things를 개발하게 된 이야기,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 하이브 소속의 위버스 - LG 유플러스에 오게 된 이야기였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;질문을 받겠다고 하셨을 때 오신 분들 중에서 선뜻 나서지 못했을 때&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 먼저 손들고 질문을 드렸습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그것은 바로, 너디너리 컨퍼런스 때 개발자로서 가장 중요한 게 뭐냐고 물어봤었을 때 건강이라고 하셨는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오늘 강연에서는 말도 안 되는 양의 인풋을 갈아 넣어서 좋은 결과를 얻으신 얘기를 들어서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;왜냐하면 제가 지난 1년 간 급격하게 성장했던 것이 많은 인풋을 넣어서였지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주영님이 본인이 말씀하시기에 건강을 못 지킨 편이라, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;뒤에 계셨던 주영님 조직의 팀원인 정영진 님이 대신 답하라고 말씀하셨습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원래는 2시간 예정이었지만 강의가 3시간 20분 정도로 길어졌는데, 그만큼 유익하고 재밌어서 시간이 가는 줄 몰랐습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강연 후기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강연을 진행하면서 전반적으로 느껴지는 것은,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주영님과 주영님 팀의 높은 수준의 개발 실력과 그만큼의 노력들, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 더 높은 수준의 개발을 하는 해외 개발자들에서 비롯된 걱정,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저는 주영 님이 개발자로서 성장하셨지만 엄청 고생하셨던 얘기를 들으면서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상반기 내내 너무 힘들게 살아서 그런지, 딱 종강을 한 이후에는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대기업 SI/금융권/서비스 IT 구분할 것 없이 운명에 맡겨서, 어느 곳이든 적당히 좋은 기업에 취업하게 되면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 시간이 자나 가면서 점점 성장에 대한 욕구가 많다는 것을 느꼈고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강연을 통해서 이 생각을 더욱 확신하게 된 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이어진 커피챗&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강연이 끝난 후에 제가 롤모델로 삼는 삶인 운동/개발을 둘 다 병행하는 삶을 사시는 &lt;a href=&quot;https://www.linkedin.com/in/youngjin-jung/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;정영진&lt;/a&gt; 님께 다시 찾아가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발자로서 계속 성장하고 싶은데, 어떻게 하면 좋은지랑 개발과 운동을 병행하는 팁에 대해서 질문을 드렸습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음 날 어제 강연을 통해서 개발자로서 어떻게 나아갈지 방향을 좀 잡은 것 같다고 감사하다고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 영진님께 추가적으로 실력 있는 개발자로서 기본기를 갖추기 위해서 방향을 잡고 싶은데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 강연이 끝난 다음 주에 영진님과 커피챗을 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;커피챗 후기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 개발을 어떻게 잘할지는 마치 어떻게 하면 건강하지랑 별반 다르지 않은 질문이라고 생각합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 말인즉슨, 건강하려면 밥 잘 먹고 잘 자고 운동하면 되는 것을 모두 아는 것처럼&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이런 내용보다는 개발자로서 영진님이 성장하신 과정과 제가 커리어적으로 어떻게 나아가는 게 좋을지, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 개발과 별개로 운동에 대한 얘기나 일상과 개발의 균형을 어떻게 맞추는지 등 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 약 2시간 정도 얘기 나누고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음에도 운동이든 뭐든 편하게 연락하라는 영진 님의 말씀을 마지막으로 커피챗을 마무리했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로 개발자로서 나아갈 방향&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 주영님의 강연을 통해서 저를 성장시킬 수 있는 환경에서 일을 하고 싶다는 게 확실해졌습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 앞으로의 취준 기간 동안, 프로젝트 역시 진행하겠지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대부분의 시간을 자바와 데이터베이스를 포함한 백엔드 개발자로서 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;갖춰야 할 역량들에 대해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보실지는 모르겠지만 이 글을 빌어 다시 한번 방향을 잡게 해 주신 두 분께 감사의 말씀을 올리며 글을 마칩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발경험</category>
      <category>강연</category>
      <category>개발</category>
      <category>개발 로드맵</category>
      <category>너디너리데모데이</category>
      <category>데브아트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/35</guid>
      <comments>https://jun10920.tistory.com/35#entry35comment</comments>
      <pubDate>Wed, 24 Jul 2024 11:58:46 +0900</pubDate>
    </item>
    <item>
      <title>Java Stack의 숨겨진 비효율성: ArrayDeque를 PS에서 사용하는 이유</title>
      <link>https://jun10920.tistory.com/34</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존에는 PS를 Python으로 준비하다가 유레카 과정을 통해서 자바를 다시 학습하면서 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩테스트를 준비하고 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java의 클래스에는 이미 Stack이 있는데 굳이 ArrayDeque를 사용하는 경우가 많고, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 Java 진영에서도 권장하는 방법입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 이유가 궁금해서 고찰해 본 내용을 정리했습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;배경 지식&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;스택(Stack)&lt;/b&gt;이란, &lt;b&gt;LIFO(Last In First Out)&lt;/b&gt; 구조로 되어있는 자료구조를 의미한다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 구현하기 위해서 Java 언어에서는 보통 Stack과 ArrayDeque 클래스를 통해서 구현하곤 하는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;왜 Stack을 구현한 Stack 클래스가 있는데도 ArrayDeque를 통해서 구현할까?&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 이유는&lt;b&gt; 3가지&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 &lt;b&gt;첫 번째&lt;/b&gt;로, ArrayDeque는 필요에 따라 배열의 크기를 동적으로 조절하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기 크기를 초과하면 새로운 배열을 할당하고 기존 요소를 자동으로 복사하여 성능 저하를 최소화한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;두 번째&lt;/b&gt;로는, ArrayDeque는 Java의 표준 라이브러리(java.util)에 포함되어 있어 별도의 외부 라이브러리를 설치하거나, 직접 자료구조를 구현할 필요가 없다.&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞선 두 개는 그냥 ArrayDeque의 장점이지, Stack 클래스와의 차별점은 아니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 가장 중요한 &lt;b&gt;세 번째 이유&lt;/b&gt;는 Stack 클래스는 Vector를 기반으로 하여서, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;동기화가 필요하지 않은 상황에서 불필요한 오버헤드가 발생할 수 있는데 ArrayDeque 그렇지 않다는 점이다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇다면, Stack이 Vector 기반이라서 오버헤드가 발생한다는 얘기는 무슨 의미일까?&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Stack의 문제점&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Stack의 장점이었지만 지금 상황에서의 단점은 바로, Vector 기반이라는 점이다&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java의 Stack 클래스는 위에서 언급한 것처럼 Vector 클래스를 상속하여 구현된 클래스이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Vector 클래스&lt;/b&gt;는 &lt;b&gt;동기화(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;synchronized&lt;/span&gt;)된 클래스&lt;/b&gt;로 멀티스레드 환경에서 안전하게 사용될 수 있도록 설계되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 오히려 이 점이, PS 같이 일반적으로 단일 스레드 환경에서 불필요한 오버헤드를 초래한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇다면, &lt;b&gt;Vector 클래스의 동기화&lt;/b&gt;는 무슨 의미일까?&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Vector 클래스의 동기화 &lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;동기화란, 여러 스레드가 동시에 접근할 때 발생할 수 있는 데이터 불일치 문제를 방지하도록 설계된 것을 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운영체제에 대해서 배워본 적이 있다면, 뭔가 낯익은 느낌이 들지 않는가?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바로 &lt;b&gt;뮤텍스락, 세마포어&lt;/b&gt;와 비슷한 개념을 자바에서 구현해서 동기화 문제를 해결한 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Vector에서 동기화를 어떻게 구현했는지 좀 더 설명하자면,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대부분의 메서드를 &lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;synchronized &lt;/span&gt;키워드&lt;/b&gt;로 선언되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; synchronized 키워드는 해당 메서드가 실행될 때 객체의 잠금(lock)을 획득하도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시) 메서드 전체에 걸린 경우&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719582911496&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시) 특정 블록에만 걸린 경우&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719583011877&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public boolean contains(Object o) {
    synchronized (this) {
        return indexOf(o, 0) &amp;gt;= 0;
    }
}&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위와 같이 synchronized 키워드와 같이 동기화를 위한 방법들을 통해서 Vector 클래스는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 스레드가 동시에 같은 자원에 접근하고 수정할 수 있는 멀티스레드 환경에서 inconsistency나 race condition이 발생할 수 있는 문제를 방지한다.&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시: 멀티스레드 환경에서의 Vector 사용 예시&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719583174004&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Vector;

public class Main {
    private static Vector&amp;lt;Integer&amp;gt; vector = new Vector&amp;lt;&amp;gt;();

    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i &amp;lt; 1000; i++) {
                    vector.add(i);
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i &amp;lt; 1000; i++) {
                    vector.add(i);
                }
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(&quot;Vector size: &quot; + vector.size());
    }
}&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 예시 코드에서 두 개의 스레드가 동시에 vector에 접근해 값을 추가하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 위와 같은 장치들 덕분에 두 스레드가 안전하게 vector에 접근하고 수정할 수 있어서 에러가 발생하지 않는다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 얘기의 본론으로 돌아가서, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 PS와 같이 시간효율성을 따지는 경우에는&lt;b&gt; ArrayDeque을 사용하는 것&lt;/b&gt;이 더 &lt;b&gt;효율적&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국, &lt;b&gt;멀티스레드 환경에서 안전성을 위해 동기화 기능을 구현한 Vector를 상속받은 Stack 구조&lt;/b&gt;는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;단일 스레드 환경에서 오히려 오버헤드가 발생해서 ArrayDeque를 사용하는 것이 더 좋다&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;글을 읽으면서 만약 이해가 부족했거나 동기화에 대해서 더 자세히 알고 싶다면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 운영체제의 멀티스레드 환경에서 동기화 문제, 특히 뮤텍스락과 세마포어에 대해서 학습하길 권장한다.&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 벌써 금요일이네요! 긴 글 읽어주셔서 감사하고 주말 잘 보내세요&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>자바</category>
      <category>ArrayDeque</category>
      <category>Java</category>
      <category>PS</category>
      <category>stack</category>
      <category>단일스레드</category>
      <category>동기화</category>
      <category>멀티스레딩</category>
      <category>밀티스레드</category>
      <category>자바</category>
      <category>코딩테스트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/34</guid>
      <comments>https://jun10920.tistory.com/34#entry34comment</comments>
      <pubDate>Fri, 28 Jun 2024 23:08:33 +0900</pubDate>
    </item>
    <item>
      <title>잠은 죽어서 자는 건가 싶었던 2024년 상반기 회고</title>
      <link>https://jun10920.tistory.com/33</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원래 회고를 1년 주기로 작성하려 했는데, 상반기만 해도 많은 일들을 해서 올해는 반년 단위로 회고를 하려고 합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과장하는 게 아니라, 정말 하루도 최선을 다하지 않은 날이 없는 것 같습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;남은 하반기에도 달리기 위해서 상반기를 정리하는 시간을 갖도록 하겠습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;글을 보시다가 &lt;b&gt;주황/파란색으로 표시된 부분&lt;/b&gt;은 &lt;b&gt;링크가 포함되어 있는 부분&lt;/b&gt;입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans 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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;작년 회고 글&lt;/a&gt;을 작성할 때만 해도 작년 글의 서두에 작성한 것과 같이 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발 관점에서 작성할만한 게 별로 없었다고 했었는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 이후로 정말 하루도 쉬지 않고 열심히 산 결과, 한 학기만에&amp;nbsp;많은 성과가 있었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년 회고글의 마지막과 같이&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;올해의 첫 번째 목표&lt;/b&gt;는&lt;b&gt;&amp;nbsp;소프트웨어학과 복수전공 / 항공정비전공을 4점대 이상 학점으로 졸업하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;두 번째 목표&lt;/b&gt;가 하반기에 &lt;b&gt;대기업 및 메이저 부트캠프에 들어가는 것이었다.&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 이를 위한 세부 목표로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프로젝트 / 코딩테스트 / CS&amp;nbsp; / 자격증으로&lt;/b&gt; 나누어서 계획했는데&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 상반기 회고는 위의 네 가지 카테고리에 기타 항목을 추가해서 정리하였다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트는 많은 지인들과 레퍼런스들로부터 얻은 정보로, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 학교의 졸업 프로젝트를 겸사겸사 하면서, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;플레이스토어에 출시하여 유저들이 실제로 사용해 보고 이를 모니터링한 것을 바탕으로 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 겨울방학 동안 미리 구성한 팀원들과 필요한 기술스택들을 배우고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3월부터 6월까지 요구 분석 - 설계 - 구현 과정을 거친 프로젝트가 바로 &lt;a href=&quot;https://github.com/TrueEchoProject/TrueEcho_Main&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TrueEcho&lt;/a&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(겨울방학 간 들은 &lt;b&gt;갓 - 영한&lt;/b&gt;님의 강의들)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ueEF9/btsH5lhj60F/BUpnCK8kDcoNgrHWU1e080/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ueEF9/btsH5lhj60F/BUpnCK8kDcoNgrHWU1e080/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ueEF9/btsH5lhj60F/BUpnCK8kDcoNgrHWU1e080/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FueEF9%2FbtsH5lhj60F%2FBUpnCK8kDcoNgrHWU1e080%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;490&quot; height=&quot;455&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;455&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;TrueEcho는 진실된 모습으로 사람들과 소통하자는 목적의 SNS 플랫폼으로, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;플레이스토어 출시까지 생각했지만, 졸업 프로젝트 목표로만 들어온 팀원들이 몇 명 있어 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;버전 1은 제대로 된 apk를 만들어서 서버 배포해 보는 것까지만 진행하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로 몇 가지 중점적인 기능에 집중하고 결제 기능을 추가하여 버전 2를 만들어 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 프로젝트에 대한 얘기만 해도 여러 고민과 도전들(&lt;a href=&quot;https://jun10920.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;N+1 문제&lt;/a&gt;, &lt;a href=&quot;https://jun10920.tistory.com/28&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;fof 알고리즘 구현&lt;/a&gt;)을 포함해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;글 2 ~ 3개 분량(보고서만 230장 작성..)이 나오기 때문에, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자세한 사항은 &lt;a href=&quot;https://github.com/TrueEchoProject/TrueEcho_Main&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;깃허브 링크&lt;/a&gt;나 추후에 작성할 버전 1 or 버전 2 회고 블로그글을 참고하면 좋을 것 같다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아무튼! 규모도 적당히 크고, 시장을 조사한 것을 바탕으로 요구 분석하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 바탕으로 엔티티들을 식별해서 DB 설계하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 인터페이스와 클래스들을 설계해서 프론트와 협업하며 구현까지 완료한 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;꽤나 괜찮은 프로젝트를 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(물론 지금도 최적화 및 에러처리를 하며 CloudType에 배포한 것을 도커에서 배포하는 중에 있다).&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩테스트&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1월 동안 &lt;a href=&quot;https://jun10920.tistory.com/13&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;C언어와&lt;/a&gt; 함께 &lt;a href=&quot;https://jun10920.tistory.com/14&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;알고리즘을 공부&lt;/a&gt;하고 2월 한 달간 미친 듯이 코테를 풀었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 기간 동안 백준 83문제, 프로그래머스 109문제를 풀었는데 지금 봐도 적지 않은 양이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 하나하나 풀이를 보지 않고 풀었으면 불가능한 양이었지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나름대로 수많은 PS 고수들의 공부법을 보고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단기간에 빨리 PS&lt;a href=&quot;https://jun10920.tistory.com/16&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; 실력을 빨리 올리기 위한 방법&lt;/a&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 개강 직전에는 파이썬 한정이지만 머릿속의 생각을 코드로 구현하는 게 정말 자연스러웠고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 코테 시작 한 달 만에&lt;a href=&quot;https://jun10920.tistory.com/24&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; SW 마에스트로 코딩테스트에&lt;/a&gt;서 3/5 솔을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(이전 합격 컷이 1 ~ 2 솔이라 3 솔하고 40분 남은 상황에서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여유롭게 오답만 열심히 하다가 떨어진 것은 안 비밀.. 이번 컷이 대충 4 솔이라고 하더라)&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아무튼 나름의 필요한 수준까지는 실력이 올랐으나 개강하고 많은 것들을 병행하면서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PS 문제를 꾸준히 못 푸니 다시 실력이 떨어졌다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 실력이 떨어지는 중이었던 &lt;a href=&quot;https://jun10920.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;SSAFY&lt;/b&gt;&lt;/a&gt;나 유플러스 부트캠프인 &lt;a href=&quot;https://jun10920.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;유레카&lt;/b&gt;&lt;/a&gt; 코테는 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;따로 준비하지 않고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;합격했지만 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;종강 직후에 본 네이버 부스트캠프 코테에서는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파이썬 문법도 긴가민가했어서 7/10 솔하고 떨어졌다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 종강했으니 기존의 팀원과 원래 지속하던 &lt;a href=&quot;https://bamlatte.notion.site/2024-04-07-de07beb535da46288a3e831d03052d55?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;알고리즘 스터디도&lt;/a&gt;&amp;nbsp;열심히 할 예정!&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CS&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 소프트웨어학과를 복수 전공하고 있고, 학기 중에는 이미 여러 가지 일들을 병행 중이라 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CS를 위한 추가적인 공부를 하기보단 전공 수업이라도 확실히 듣자는 계획이었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 일정들 때문에 시험기간 제외하고는 추가로 공부하진 못했지만 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;수업시간에는 열심히 듣고 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;시험기간에는 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;20학점 / 6 전공 1 교양&lt;/b&gt; 중에서&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;공업수학 A+&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;디지털 시스템 이해 A+&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;운영체제 A+&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;컴퓨터 구조 A&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;네트워크 A+&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;캡스톤 프로젝트(졸업 프로젝트) A +&lt;/span&gt;&lt;/b&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: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;으로, 총 &lt;b&gt;4.42 / 4.5&lt;/b&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: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;학점을 잘 받은 이유는,&amp;nbsp;&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; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CS 전공들을 배우며 깨우치는 것이 &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정말 재밌었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 심종익 교수님의 운영체제는 하루에 평균 3 ~ 4시간만 잤던 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1학기 일상 중에도 정말 집중해서 들었을 만큼 재밌고 유익했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 이유로는 복수전공을 함으로써 2 ~ 4학년 과목을 전부 한 번에 수강하였는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 디지털 시스템 이해의 회로 부분과 컴퓨터 구조의 회로 부분이 겹치거나&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴퓨터 구조의 주기억장치 / 보조기억장치 부분이 운영체제와 이어지는 등 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CS 전공들이 서로 연관되는 부분들이 있어 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 그렇다 하더라도, 프로젝트 - 코테 - 자격증 - CS - 대외활동 - 운동까지 하는 일정 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한 학기 내내 3 ~ 4 시간 자긴 했다..&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자격증&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발자에게 자격증이란 꼭 필요한 것은 아니지만, 복수전공자로서 좀 더 전문성을 갖추고 싶었고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;더불어 기왕 CS 전공을 배울 때 취득하면 수월할 것 같아서 올해 목표로 잡았었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 생각보다 힘든 일정들 때문에 이게 과연 가능한가..? 싶은 일정이었지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/29&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;정보처리기사는 일주일간 공부해서 필기 합격&lt;/a&gt;(실기는 7월 예정),&lt;a href=&quot;https://jun10920.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; SQLD는 이틀 정도 공부해서 취득&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;짧은 기간 안에 효율적인 방법으로 공부하고, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CS 전공들을 듣고 있는 와중이라 가능했던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지금은 뿌듯하지만, 정말 매주 챌린지 같던 1학기가 불과 얼마 전이지만 돌아가고 싶지 않을 정도로 고생했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;++ 추가로 이틀 연습하고 OPIc 보러 갔는데, 토익 915점이 있더라도 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;몇 년간 영어회화를 하지 않다가 가니까 IM1이 나왔다ㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;방학 중에 일주일 정도 다시 연습해서 7월 초에 다시 한번 IH 목적으로 볼 예정이다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기타&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;라고 하지만, 사실 위에 작성한 부분들만큼 시간을 많이 쓴 중요한 부분이긴 하다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인턴 / 부트캠프&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미 새해를 시작하면서 1학기 동안 세웠던 계획의 최소치와 최대치 중에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최대치를 달성한 상황이라, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하반기부터 지원할 예정이었던 부트캠프와 인턴을 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1학기에 여유가 생길 때마다 자소서를 작성하고 코테를 보며 지원했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 첫 번째 목표는 서비스 IT 기업이지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대기업 SI나 금융권도 제외하고 준비하는 것이 아니라서 다방면으로 기회가 된다면 지원했다.&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 결과&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://jun10920.tistory.com/32&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;유플러스 SW 교육과정 -&amp;gt; 최종 합격&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://jun10920.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;싸피 -&amp;gt; 서류 및 코테 합격, 면접 포기&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;IBK 기업은행 하계 인턴 -&amp;gt; 서류 및 역검 결과 대기 중&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;하나은행 체험형 인탠 -&amp;gt; 서류 대기 중&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://jun10920.tistory.com/24&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SW 마에스트로&lt;/a&gt; -&amp;gt; 코테 불합&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;네이버 부스트캠프 -&amp;gt; 코테 불합&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;떨어진 SW 마에스트로와 네이버 부스트캠프도 아깝지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인턴과 부트캠프를 준비하면서, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 자기소개서와 깃허브 read.me 등 나를 소개할 수 있는 수단들을 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 이력서와 &lt;a href=&quot;https://github.com/jun10920&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;깃허브 리드미&lt;/a&gt;를 잘 꾸며서 만족스럽다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 GPT를 사용하는 실력이 부쩍 늘어서 여러 기업과 부트캠프에 지원할 때 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 기관들을 학습한 GPTS를 만들어서 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시로, 네이버 부스트캠프를 준비할 때 이전 모든 기수와 이번 기수의 정보를 학습시킨 GPTs인&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718849330502&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;ChatGPT - 네이버 부스트캠프 도우미&quot; data-og-description=&quot;네이버 부스트캠프에 관련된 시중에 나와있는 모든 정보를 알고 있는 GPT, 자소서와 면접에 대한 도움을 줘요.&quot; data-og-host=&quot;chatgpt.com&quot; data-og-source-url=&quot;https://chatgpt.com/g/g-r68ERYZ1d-neibeo-buseuteukaempeu-doumi&quot; data-og-url=&quot;https://chatgpt.com/g/g-r68ERYZ1d-neibeo-buseuteukaempeu-doumi&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e6sLG/hyWoEFLQUe/C0kHPCRXVL8HI8OHpNtKK1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://chatgpt.com/g/g-r68ERYZ1d-neibeo-buseuteukaempeu-doumi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chatgpt.com/g/g-r68ERYZ1d-neibeo-buseuteukaempeu-doumi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e6sLG/hyWoEFLQUe/C0kHPCRXVL8HI8OHpNtKK1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;ChatGPT - 네이버 부스트캠프 도우미&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;네이버 부스트캠프에 관련된 시중에 나와있는 모든 정보를 알고 있는 GPT, 자소서와 면접에 대한 도움을 줘요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chatgpt.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;네부캠을 제외하고도 많은 부분에서 전문화된 GPTs 제작해서 사용하면서 큰 도움을 받았고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 과정에서 GPT 활용 역량을 많이 기른 것 같다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대외활동&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대외활동으로는 첫째로 &lt;b&gt;&lt;a href=&quot;https://jun10920.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SSAFY 엠배서더&lt;/a&gt;와 원티드 백엔드 챌린지,&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;우아한 스터디 &lt;/span&gt;&lt;/b&gt;등을 지원했는데&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SSAFY 엠배서더는 잘 활동해서 마무리했고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원티드 백엔드 챌린지는 시간이 부족해서 시작은 했으나 제대로 활동하지 못했고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우아한 스터디는 지원했는데 합격/불합격 상관없이 답신 이메일을 주신다고 했는데 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우아한 스터디의 경우 공지한 대로 답신이라도 주셨으면 싶었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 물론 운영자분이 바쁘셔서 그랬겠지만, 떨어진 것보다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 두 번째로&lt;b&gt; 블로그를 꾸준히 운영하는 것&lt;/b&gt;도 목표였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 잠도 제대로 못 자는 상황에서 매주 정기적으로 글을 작성하는 건 어려웠지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 잠을 못 잘 정도로 바쁘지는 않으니, 최대한 글감이 생길 때마다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바로바로 기록하려고 노력할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운동&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 삶에서 떼어낼 수 없는 운동&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나는 담배나 게임을 하지 않고, 술도 정말 가끔 지인과 다 같이 먹을 때 말고는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;즐기지 않기 때문에 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운동에 푹 빠졌던 과거에는 한 달 치 식단표를 미리 칼로리를 계산해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;수첩에 적고 병사식당에서 재면서 밥을 먹고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;20KM 완전 군장 행군을 한 당일에도 하체 루틴이 계획되어 있으면 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 상반기에는 너무 바빠서(잠을 3시간 ~ 4시간 자는데..) 그렇게는 하지는 못하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대신 수업 들으러 갈 때 중량 벨트를 챙겨 수업 끝나고 집으로 오는 길에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 바로 헬스장에 가서 약 4~50분간 중량 맨몸운동을 했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;턱걸이: 맨몸 10개 -&amp;gt; 중량 15kg&lt;/b&gt; 끼고 7개&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;딥스: 맨몸 15개 -&amp;gt; 중량 45kg&lt;/b&gt; 1개까지 성공했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주 3일 40분만 운동하고, 잠을 3 ~ 4시간 자면서 해도 몸 상태나 중량이 꾸준히 좋아졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론, 적게 자고 운동하는 게 급사의 주원인인 것은 알지만 하루종일 개발 &amp;amp; 공부만 하는 일상에서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유일한 스트레스 해소 수단이라 타협본 게 저 정도라 이해하길 바란다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 종강했으니 맨몸 운동에서 벗어나 본래 내 주 종목인 헬스&amp;nbsp; &amp;amp; 파워리프팅으로 돌아갈 생각에 기쁘다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마무리하며&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 학기에 짧은 기간 내에 굉장히 많은 것을 병행하고 또한 대부분 좋은 결과를 얻으면서 배운 것은,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;방법 관점&lt;/b&gt;에서는,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지금 보면 귀여운 수준이지만 초창기에 적었던 &lt;a href=&quot;https://jun10920.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;개발 공부법&lt;/a&gt;과 같이&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;가장 단기간에 성공한 사람과 가장 성과가 뛰어난 사람들의 레퍼런스를 수십 개 참고&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;-&amp;gt; 나에게 맞는 방법으로 개인화 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;-&amp;gt; 남은 기간 안에 잘 분배 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;-&amp;gt; 어떻게든 세운 계획을 이행&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 이 방법을 숙달하면서, &lt;b&gt;높은 러닝커브&lt;/b&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;환경으로는,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지난 회고 때 아마도 항공 관련 대학이라 개발에 대한 지원이 없어 아쉽다는 얘기를 했었는데 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 사실은 변함없지만 환경에는 주변 사람들도 포함이 된다는 것을 다시 한번 깨달았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;군대를 비롯해서 사회생활하면서 매번 느끼는 것은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1학기를 하면서 위에서 말한 &lt;b&gt;프로젝트 / 코테 / 부트캠프 / 자격증&lt;/b&gt;을 함께한 팀원인 &lt;a href=&quot;https://github.com/HeeJohn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;희준이&lt;/a&gt;가 있어서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;포기하지 않고 끝까지 열심히 할 수 있었던 것 같다.&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 주변에는 배울만한 좋은 사람들이 있어서 많이 배우고 감사하며 사는 편이지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;종종 지칠 때 희준이가 개발을 대하는 열정과 자세를 보면 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다시 열정을 되찾고 같이 열심히 하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 서로 좋은 영향을 주고받으면서 한 학기 열심히 달려서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;종강 약 2주 전부터 거의 매일 같이 밤샌 216호에서의 추억은, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 시작된 하반기 동안도 열심히 달리면서 (잠은 자면서) 상반기만큼 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;종강 다음 날부터도 유레카 과정을 수강하며 쉬는 날은 없지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 잠을 푹 잘 수 있고 헬스를 편하게 할 수 있는 게 어디인가 :&amp;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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;항상 열심히 살 수 있는 환경에 사는 것에 감사하고, 건강한 마음을 물려주신 것에 부모님께 감사하며 글을 마친다.&lt;/span&gt;&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;  긴 글 읽어주셔서 감사합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&lt;b&gt;2023년&amp;nbsp;회고&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718852843849&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;항공 학부 출신 개발자 도전기 2023년 회고&quot; data-og-description=&quot;  준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활동하고, 너디너리 컨퍼런스 가고, 프로젝트 3개 하고, 컴공 복수 전공하고, 연말~연초에 주 60시간 공부 시작 이야기 이번 회고를 쓰기 앞서 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/12&quot; data-og-url=&quot;https://jun10920.tistory.com/12&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bg3qtq/hyWoOO2e4S/HKDnNKGKhC1kqmLGPIxjkk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/O5TJp/hyWoGcoAlN/NQVCoZSs7G1Sjn2MIt4Mz1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/AiwR6/hyWoBoCX62/ZykKaGr6GnXaiIn1eZVL31/img.png?width=1080&amp;amp;height=1909&amp;amp;face=0_0_1080_1909&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/12&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bg3qtq/hyWoOO2e4S/HKDnNKGKhC1kqmLGPIxjkk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/O5TJp/hyWoGcoAlN/NQVCoZSs7G1Sjn2MIt4Mz1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/AiwR6/hyWoBoCX62/ZykKaGr6GnXaiIn1eZVL31/img.png?width=1080&amp;amp;height=1909&amp;amp;face=0_0_1080_1909');&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;항공 학부 출신 개발자 도전기 2023년 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활동하고, 너디너리 컨퍼런스 가고, 프로젝트 3개 하고, 컴공 복수 전공하고, 연말~연초에 주 60시간 공부 시작 이야기 이번 회고를 쓰기 앞서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;트루에코&amp;nbsp;깃허브&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718852861673&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;GitHub - TrueEchoProject/TrueEcho_Main&quot; data-og-description=&quot;Contribute to TrueEchoProject/TrueEcho_Main development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/TrueEchoProject/TrueEcho_Main&quot; data-og-url=&quot;https://github.com/TrueEchoProject/TrueEcho_Main&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ma2zn/hyWoF5E3S3/CqVtpt0qJy47KttHyNUrOk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/TrueEchoProject/TrueEcho_Main&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/TrueEchoProject/TrueEcho_Main&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ma2zn/hyWoF5E3S3/CqVtpt0qJy47KttHyNUrOk/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;GitHub - TrueEchoProject/TrueEcho_Main&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to TrueEchoProject/TrueEcho_Main 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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;알고리즘 책 리뷰&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718852871258&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;리뷰가 연달아 올라왔지만 책을 2~3일 만에 읽은 것은 아니다. 열혈 C 프로그래밍을 2023년 연말까지 열심히 공부한 뒤에 새해에는 코딩 테스트 겸 CS 공부를 위한 자료구조 &amp;amp; 알고리즘 책을 공부했&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/14&quot; data-og-url=&quot;https://jun10920.tistory.com/14&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d9gdmj/hyWoKFUzu1/sGjhNkAkX49rANWh9XqMb1/img.png?width=800&amp;amp;height=697&amp;amp;face=0_0_800_697,https://scrap.kakaocdn.net/dn/ct0dNU/hyWoJfWDEc/OppMYcieDGwZbJBe4L4CY0/img.png?width=800&amp;amp;height=697&amp;amp;face=0_0_800_697,https://scrap.kakaocdn.net/dn/dRnnar/hyWoJfWDxp/7ic1HuT0ihbfMJwyHWFfYK/img.png?width=750&amp;amp;height=653&amp;amp;face=0_0_750_653&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/14&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/14&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d9gdmj/hyWoKFUzu1/sGjhNkAkX49rANWh9XqMb1/img.png?width=800&amp;amp;height=697&amp;amp;face=0_0_800_697,https://scrap.kakaocdn.net/dn/ct0dNU/hyWoJfWDEc/OppMYcieDGwZbJBe4L4CY0/img.png?width=800&amp;amp;height=697&amp;amp;face=0_0_800_697,https://scrap.kakaocdn.net/dn/dRnnar/hyWoJfWDxp/7ic1HuT0ihbfMJwyHWFfYK/img.png?width=750&amp;amp;height=653&amp;amp;face=0_0_750_653');&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;리뷰가 연달아 올라왔지만 책을 2~3일 만에 읽은 것은 아니다. 열혈 C 프로그래밍을 2023년 연말까지 열심히 공부한 뒤에 새해에는 코딩 테스트 겸 CS 공부를 위한 자료구조 &amp;amp; 알고리즘 책을 공부했&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;알고리즘 스터디 노션&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718852887493&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;[알고리즘] 코딩테스트 스터디 / 2024.04.07 시작 | Notion&quot; data-og-description=&quot;스터디 규칙&quot; data-og-host=&quot;bamlatte.notion.site&quot; data-og-source-url=&quot;https://bamlatte.notion.site/2024-04-07-de07beb535da46288a3e831d03052d55?pvs=4&quot; data-og-url=&quot;https://bamlatte.notion.site/de07beb535da46288a3e831d03052d55&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbKay1/hyWoInSmiu/z4uUXI4IoI12W2iBtm02o0/img.png?width=2000&amp;amp;height=1502&amp;amp;face=0_0_2000_1502,https://scrap.kakaocdn.net/dn/da1x88/hyWoFYY8DC/qHwFkgX1eGlpuplZXAScTk/img.png?width=2000&amp;amp;height=1502&amp;amp;face=0_0_2000_1502&quot;&gt;&lt;a href=&quot;https://bamlatte.notion.site/2024-04-07-de07beb535da46288a3e831d03052d55?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bamlatte.notion.site/2024-04-07-de07beb535da46288a3e831d03052d55?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbKay1/hyWoInSmiu/z4uUXI4IoI12W2iBtm02o0/img.png?width=2000&amp;amp;height=1502&amp;amp;face=0_0_2000_1502,https://scrap.kakaocdn.net/dn/da1x88/hyWoFYY8DC/qHwFkgX1eGlpuplZXAScTk/img.png?width=2000&amp;amp;height=1502&amp;amp;face=0_0_2000_1502');&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;[알고리즘] 코딩테스트 스터디 / 2024.04.07 시작 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스터디 규칙&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bamlatte.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SW&amp;nbsp;마에스트로&amp;nbsp;자소서&amp;nbsp;&amp;amp;&amp;nbsp;코딩테스트&amp;nbsp;후기&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718852892896&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;[SW마에스트로] 소마 15기 자소서 &amp;amp; 코딩테스트 후기&quot; data-og-description=&quot;올해 목표인 메이저 부트캠프 &amp;amp; 취업 중에서 가장 이른 시기에 진행된 소프트웨어 마에스트로 지원 관련해서 후기를 작성하려고 합니다. 자소서 &amp;amp; 코딩테스트 관련해서 좋은 팁이 있습니다. 지&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/24&quot; data-og-url=&quot;https://jun10920.tistory.com/24&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/unRrR/hyWoIakFrx/fNPAltQvz5kvKOn2JBLCO0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/kuQMK/hyWoIuEMFg/0bJVmR9oMycU0YCDk1Qpo1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/24&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/24&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/unRrR/hyWoIakFrx/fNPAltQvz5kvKOn2JBLCO0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/kuQMK/hyWoIuEMFg/0bJVmR9oMycU0YCDk1Qpo1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[SW마에스트로] 소마 15기 자소서 &amp;amp; 코딩테스트 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;올해 목표인 메이저 부트캠프 &amp;amp; 취업 중에서 가장 이른 시기에 진행된 소프트웨어 마에스트로 지원 관련해서 후기를 작성하려고 합니다. 자소서 &amp;amp; 코딩테스트 관련해서 좋은 팁이 있습니다. 지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발&amp;nbsp;공부법&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718852897698&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;2024년의 개발 공부법(INPUT) 정리&quot; data-og-description=&quot;이 글을 쓰게 된 이유 이전에 주로 써왔던 Js나 객제지향 프로그래밍 전공 수업에서 배운 Java는 어느 정도 문법을 익혔지만, 전공에서 응용하면서 주먹구구식으로 배운 C언어와 자료구조를 최대&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/11&quot; data-og-url=&quot;https://jun10920.tistory.com/11&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gWvXH/hyWoPtIaCL/A1M7g0j42yURIwJO5Pwbu0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b4fn7a/hyWoEMtLZ0/nhgWcvQkQpgg2gt0NEEeek/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/11&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gWvXH/hyWoPtIaCL/A1M7g0j42yURIwJO5Pwbu0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b4fn7a/hyWoEMtLZ0/nhgWcvQkQpgg2gt0NEEeek/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;2024년의 개발 공부법(INPUT) 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 글을 쓰게 된 이유 이전에 주로 써왔던 Js나 객제지향 프로그래밍 전공 수업에서 배운 Java는 어느 정도 문법을 익혔지만, 전공에서 응용하면서 주먹구구식으로 배운 C언어와 자료구조를 최대&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C언어&amp;nbsp;공부&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718852908520&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;윤성우의 열혈 C 프로그래밍 리뷰 - C언어 교재 추천&quot; data-og-description=&quot;이전에 쓴 글인 2023년 회고에서 언급했듯, (아직 안 보신 분은 아래의 링크에서 봐주시면 감사) 항공 학부 출신 개발자 도전기 2023년 회고   준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/13&quot; data-og-url=&quot;https://jun10920.tistory.com/13&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qlFGV/hyWoLrlQeF/PIyXFTDYjKy4Cu44Upk99k/img.png?width=800&amp;amp;height=368&amp;amp;face=0_0_800_368,https://scrap.kakaocdn.net/dn/b0MmT9/hyWoLZcbnH/qAQpGXJiS6KelLRaa1rLg0/img.png?width=800&amp;amp;height=368&amp;amp;face=0_0_800_368,https://scrap.kakaocdn.net/dn/78VY1/hyWoHWMT4C/IwctpeQayqjob4CKOvhgsK/img.png?width=750&amp;amp;height=345&amp;amp;face=0_0_750_345&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/13&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/13&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qlFGV/hyWoLrlQeF/PIyXFTDYjKy4Cu44Upk99k/img.png?width=800&amp;amp;height=368&amp;amp;face=0_0_800_368,https://scrap.kakaocdn.net/dn/b0MmT9/hyWoLZcbnH/qAQpGXJiS6KelLRaa1rLg0/img.png?width=800&amp;amp;height=368&amp;amp;face=0_0_800_368,https://scrap.kakaocdn.net/dn/78VY1/hyWoHWMT4C/IwctpeQayqjob4CKOvhgsK/img.png?width=750&amp;amp;height=345&amp;amp;face=0_0_750_345');&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;윤성우의 열혈 C 프로그래밍 리뷰 - C언어 교재 추천&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이전에 쓴 글인 2023년 회고에서 언급했듯, (아직 안 보신 분은 아래의 링크에서 봐주시면 감사) 항공 학부 출신 개발자 도전기 2023년 회고   준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SSAFY&amp;nbsp;앰배서더&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718853009332&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;[SSAFY] 앰배서더 초청행사 후기&quot; data-og-description=&quot;너무 오랜만에 돌아왔네요! 저의 졸업프로젝트이자 포트폴리오에도 사용하려고 앱 배포 및 유저 확보까지 기획 중인 프로젝트가 있어 너무 바빠서 블로그에 신경을 많이 못 쓴 거 같습니다 (핑&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/25&quot; data-og-url=&quot;https://jun10920.tistory.com/25&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FkE7T/hyWoEsfijT/TdgPl1Y7gw4Muu1U3XWgkk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Pcjnv/hyWoNvXP1u/jfH8miDMnkNwMQUIHRG23k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cSncPJ/hyWoMRmh6Q/ljXXv1CThvo0EkE7kpIfV0/img.jpg?width=5786&amp;amp;height=3610&amp;amp;face=2522_2450_2720_2666&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/25&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FkE7T/hyWoEsfijT/TdgPl1Y7gw4Muu1U3XWgkk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Pcjnv/hyWoNvXP1u/jfH8miDMnkNwMQUIHRG23k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cSncPJ/hyWoMRmh6Q/ljXXv1CThvo0EkE7kpIfV0/img.jpg?width=5786&amp;amp;height=3610&amp;amp;face=2522_2450_2720_2666');&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;[SSAFY] 앰배서더 초청행사 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;너무 오랜만에 돌아왔네요! 저의 졸업프로젝트이자 포트폴리오에도 사용하려고 앱 배포 및 유저 확보까지 기획 중인 프로젝트가 있어 너무 바빠서 블로그에 신경을 많이 못 쓴 거 같습니다 (핑&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정보처리기사 필기 취득 후기&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718853063606&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;정보처리기사 필기 일주일 만에 준비하기(24년 2회차)&quot; data-og-description=&quot;시험 끝나고 계속 바쁘게 지내고 있는 와중에 이번 1학기에 목표했던 정보처리기사 시험이 다가와준비한 자료와 공부 방법에 대한 글입니다!이미 전공을 통해서 CS에 대한 지식이 있다면 훨씬 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/29&quot; data-og-url=&quot;https://jun10920.tistory.com/29&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MYscQ/hyWoOBynQW/FkjDn2sJ8H7QEnHFRggkgK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/LP878/hyWoJmJ0cP/mI1vHCsIFgPK9zeAwHVnok/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/29&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/29&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MYscQ/hyWoOBynQW/FkjDn2sJ8H7QEnHFRggkgK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/LP878/hyWoJmJ0cP/mI1vHCsIFgPK9zeAwHVnok/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;정보처리기사 필기 일주일 만에 준비하기(24년 2회차)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;시험 끝나고 계속 바쁘게 지내고 있는 와중에 이번 1학기에 목표했던 정보처리기사 시험이 다가와준비한 자료와 공부 방법에 대한 글입니다!이미 전공을 통해서 CS에 대한 지식이 있다면 훨씬&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SQLD 취득 후기&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718853098760&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;SQLD 1.5일 만에 합격하기 (24년 2회차)&quot; data-og-description=&quot;안녕하세요. 오랜만입니다. 조만간 회고에 작성하겠지만, 1학기 간 20학점(6 전공 1 교양), 플레이스토어에 배포할 목적으로 개발한 프로젝트, 자격증 2개, 코테 다수, 자소서 작성 다수, 면접 1번 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/30&quot; data-og-url=&quot;https://jun10920.tistory.com/30&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cRsul2/hyWoI9azxQ/BaZRZ2Iw2lfknxCwlAVS0K/img.png?width=800&amp;amp;height=200&amp;amp;face=0_0_800_200,https://scrap.kakaocdn.net/dn/bcwu3e/hyWoIg3b7k/ccbauV8woa73t2M8iKSJw0/img.png?width=800&amp;amp;height=200&amp;amp;face=0_0_800_200,https://scrap.kakaocdn.net/dn/vgczT/hyWoMcGsPx/LbPQIivEm0hBwPuK54ADKK/img.png?width=1271&amp;amp;height=318&amp;amp;face=0_0_1271_318&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/30&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cRsul2/hyWoI9azxQ/BaZRZ2Iw2lfknxCwlAVS0K/img.png?width=800&amp;amp;height=200&amp;amp;face=0_0_800_200,https://scrap.kakaocdn.net/dn/bcwu3e/hyWoIg3b7k/ccbauV8woa73t2M8iKSJw0/img.png?width=800&amp;amp;height=200&amp;amp;face=0_0_800_200,https://scrap.kakaocdn.net/dn/vgczT/hyWoMcGsPx/LbPQIivEm0hBwPuK54ADKK/img.png?width=1271&amp;amp;height=318&amp;amp;face=0_0_1271_318');&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;SQLD 1.5일 만에 합격하기 (24년 2회차)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오랜만입니다. 조만간 회고에 작성하겠지만, 1학기 간 20학점(6 전공 1 교양), 플레이스토어에 배포할 목적으로 개발한 프로젝트, 자격증 2개, 코테 다수, 자소서 작성 다수, 면접 1번&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;싸피 서류 코테 합격 후기&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718853113514&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;[SSAFY] 싸피 12기 자소서 &amp;amp; 코딩테스트 합격 후기 (전공자)&quot; data-og-description=&quot;결과적으로는 사정상 다른 부트캠프를 갔지만, 최소한의 시간을 들여 싸피 자소서와 코딩테스트에 합격하였습니다.이 과정을 공유하면 도움이 될 분들이 계실 것 같아서 글을 작성합니다.지원 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/31&quot; data-og-url=&quot;https://jun10920.tistory.com/31&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yVtUo/hyWoCVwA2W/kDSTNG5zucHevJSw6aWT81/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/bOFriw/hyWoBvv3ze/GyUL6wlOLKjRKHHqDDnhxK/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/ZeYuq/hyWoz5yT9O/UY8lIvIHIwLT0OdtfGfRAk/img.png?width=983&amp;amp;height=257&amp;amp;face=0_0_983_257&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/31&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yVtUo/hyWoCVwA2W/kDSTNG5zucHevJSw6aWT81/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/bOFriw/hyWoBvv3ze/GyUL6wlOLKjRKHHqDDnhxK/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/ZeYuq/hyWoz5yT9O/UY8lIvIHIwLT0OdtfGfRAk/img.png?width=983&amp;amp;height=257&amp;amp;face=0_0_983_257');&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;[SSAFY] 싸피 12기 자소서 &amp;amp; 코딩테스트 합격 후기 (전공자)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;결과적으로는 사정상 다른 부트캠프를 갔지만, 최소한의 시간을 들여 싸피 자소서와 코딩테스트에 합격하였습니다.이 과정을 공유하면 도움이 될 분들이 계실 것 같아서 글을 작성합니다.지원&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유레카 합격 후기&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718853124431&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;[LG유플러스] 유레카 SW 교육과정 합격 후기(전공자)&quot; data-og-description=&quot;통신 3사 중에서 최초로 웹 개발자를 양성하고, 취업 관련 혜택을 주는 유레카 부트캠프에 합격했습니다.이에 대한 후기와 회고를 작성해 보겠습니다.1기 일정위에서 짧게 언급한 것과 같이 이&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/32&quot; data-og-url=&quot;https://jun10920.tistory.com/32&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vAmHh/hyWoO9rWey/1hYZwabuUFzBnfAAmBIPJ1/img.png?width=678&amp;amp;height=257&amp;amp;face=0_0_678_257,https://scrap.kakaocdn.net/dn/pG12H/hyWoG4FJN1/lgGhKAxwRAAFiyfP6QToM0/img.png?width=678&amp;amp;height=257&amp;amp;face=0_0_678_257,https://scrap.kakaocdn.net/dn/csegGI/hyWoPAvVKu/nUOEFHqcXGlW3vI0JAtl0K/img.png?width=678&amp;amp;height=257&amp;amp;face=0_0_678_257&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/32&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/32&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vAmHh/hyWoO9rWey/1hYZwabuUFzBnfAAmBIPJ1/img.png?width=678&amp;amp;height=257&amp;amp;face=0_0_678_257,https://scrap.kakaocdn.net/dn/pG12H/hyWoG4FJN1/lgGhKAxwRAAFiyfP6QToM0/img.png?width=678&amp;amp;height=257&amp;amp;face=0_0_678_257,https://scrap.kakaocdn.net/dn/csegGI/hyWoPAvVKu/nUOEFHqcXGlW3vI0JAtl0K/img.png?width=678&amp;amp;height=257&amp;amp;face=0_0_678_257');&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;[LG유플러스] 유레카 SW 교육과정 합격 후기(전공자)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;통신 3사 중에서 최초로 웹 개발자를 양성하고, 취업 관련 혜택을 주는 유레카 부트캠프에 합격했습니다.이에 대한 후기와 회고를 작성해 보겠습니다.1기 일정위에서 짧게 언급한 것과 같이 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TrueEcho 고민들&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718853137089&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;[TrueEcho] FOF 알고리즘_User들 사이에 친구 추천은 어떻게 하면 좋을까!?&quot; data-og-description=&quot;시험 끝났는데 오히려 더 바쁜 일정이 시작된 요즘..! 뭔가 빈둥거리면 안 되는데 그러고 있어서 살짝 위기감을 느끼는 중입니다.오늘 작성할 글은 프로젝트를 개발하던 중에, User들 간에 친구 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/28&quot; data-og-url=&quot;https://jun10920.tistory.com/28&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dqqf69/hyWoGcvKNn/zRLxkt2gTXMOZu0xMUgIY0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/eLkMG/hyWoBPPwsG/Nh8U62hOeKU5Z13WO4V480/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cl2LBN/hyWoKeUzc3/xkxeWK1OpKVPktvvnDEjyK/img.png?width=842&amp;amp;height=567&amp;amp;face=0_0_842_567&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/28&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/28&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dqqf69/hyWoGcvKNn/zRLxkt2gTXMOZu0xMUgIY0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/eLkMG/hyWoBPPwsG/Nh8U62hOeKU5Z13WO4V480/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cl2LBN/hyWoKeUzc3/xkxeWK1OpKVPktvvnDEjyK/img.png?width=842&amp;amp;height=567&amp;amp;face=0_0_842_567');&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;[TrueEcho] FOF 알고리즘_User들 사이에 친구 추천은 어떻게 하면 좋을까!?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;시험 끝났는데 오히려 더 바쁜 일정이 시작된 요즘..! 뭔가 빈둥거리면 안 되는데 그러고 있어서 살짝 위기감을 느끼는 중입니다.오늘 작성할 글은 프로젝트를 개발하던 중에, User들 간에 친구&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1718853138789&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;[TrueEcho] 실제로 마주한 JPA N + 1 문제를 66.7% 퍼센트의 성능 최적화로 극악무도하게 해결한 이야기&quot; data-og-description=&quot;예 사실 극악무도하게 해결하진 않았지만실제 프로젝트를 진행하는 중에 쿼리가 무지막지하게 나오는 어떠한 문제를 마주했고,(과장이 약간 섞인) 66.7퍼센트의 성능 개선을 어떻게 했는지,결국&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/26&quot; data-og-url=&quot;https://jun10920.tistory.com/26&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJoTmo/hyWoBWzIy4/afoIeIuLWWx0B7bjuyd5q0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/xUHeC/hyWoKssSTL/6e10dkYeSxZTZYOZQRjKwk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/XYTN1/hyWoFdBKk1/ADWlhp1X8pIlFptEiP5ee0/img.png?width=1410&amp;amp;height=1072&amp;amp;face=0_0_1410_1072&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/26&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJoTmo/hyWoBWzIy4/afoIeIuLWWx0B7bjuyd5q0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/xUHeC/hyWoKssSTL/6e10dkYeSxZTZYOZQRjKwk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/XYTN1/hyWoFdBKk1/ADWlhp1X8pIlFptEiP5ee0/img.png?width=1410&amp;amp;height=1072&amp;amp;face=0_0_1410_1072');&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;[TrueEcho] 실제로 마주한 JPA N + 1 문제를 66.7% 퍼센트의 성능 최적화로 극악무도하게 해결한 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;예 사실 극악무도하게 해결하진 않았지만실제 프로젝트를 진행하는 중에 쿼리가 무지막지하게 나오는 어떠한 문제를 마주했고,(과장이 약간 섞인) 66.7퍼센트의 성능 개선을 어떻게 했는지,결국&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>회고</category>
      <category>개발</category>
      <category>개발자</category>
      <category>상반기 회고</category>
      <category>자격증</category>
      <category>코딩테스트</category>
      <category>프로젝트</category>
      <category>회고</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/33</guid>
      <comments>https://jun10920.tistory.com/33#entry33comment</comments>
      <pubDate>Thu, 20 Jun 2024 12:20:35 +0900</pubDate>
    </item>
    <item>
      <title>[LG유플러스] 유레카 SW 교육과정 합격 후기(전공자)</title>
      <link>https://jun10920.tistory.com/32</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;통신 3사 중에서 최초로 웹 개발자를 양성하고, 취업 관련 혜택을 주는 유레카 부트캠프에 합격했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이에 대한 후기와 회고를 작성해 보겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1기 일정&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에서 짧게 언급한 것과 같이 이번 기수가 1 기수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일정은 아래와 같다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;지원서 접수: 5월 3일 ~ 5월 19일&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;코딩테스트: 5월 23일&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;면접: 5월 30일&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;최종 합격 발표: 6월 3일&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;지원 동기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원래 나는 부트캠프나 인턴은 하반기부터 도전하려 헀지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미 1학기에 세워둔 최대치의 목표를 달성한 상태여서,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다 안 돼도 본전이라는 생각에 무리한 일정이어도 한 번 도전해 보기로 마음먹었었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 앞서 작성한 &lt;a href=&quot;https://jun10920.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;싸피 지원&lt;/a&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;관련 글&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718613418742&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;[SSAFY] 싸피 12기 자소서 &amp;amp; 코딩테스트 합격 후기 (전공자)&quot; data-og-description=&quot;결과적으로는 사정상 다른 부트캠프를 갔지만, 최소한의 시간을 들여 싸피 자소서와 코딩테스트에 합격하였습니다.이 과정을 공유하면 도움이 될 분들이 계실 것 같아서 글을 작성합니다.지원 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/31&quot; data-og-url=&quot;https://jun10920.tistory.com/31&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/37HfM/hyWoJT2nGU/xCz5gifvJT3xci3J1iJqbK/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/HD7p2/hyWk9NGHau/UCQKWqKQl9Wlw2LroAKA71/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/psL4p/hyWoAW7UAN/PwgKGqYh06rA5DftyrCpQ0/img.png?width=983&amp;amp;height=257&amp;amp;face=0_0_983_257&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/31&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/37HfM/hyWoJT2nGU/xCz5gifvJT3xci3J1iJqbK/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/HD7p2/hyWk9NGHau/UCQKWqKQl9Wlw2LroAKA71/img.png?width=800&amp;amp;height=209&amp;amp;face=0_0_800_209,https://scrap.kakaocdn.net/dn/psL4p/hyWoAW7UAN/PwgKGqYh06rA5DftyrCpQ0/img.png?width=983&amp;amp;height=257&amp;amp;face=0_0_983_257');&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;[SSAFY] 싸피 12기 자소서 &amp;amp; 코딩테스트 합격 후기 (전공자)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;결과적으로는 사정상 다른 부트캠프를 갔지만, 최소한의 시간을 들여 싸피 자소서와 코딩테스트에 합격하였습니다.이 과정을 공유하면 도움이 될 분들이 계실 것 같아서 글을 작성합니다.지원&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 방학 은행 인턴 -&amp;gt; 2학기에 싸피 시험 봐서 금융권으로 취업&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 유레카 -&amp;gt; 통신 3사로 취업&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 네이버 부스트캠프&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. 방학 동안 진행하는 학점연계인턴(정규직 전환 예정 조건)&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 과정들이 전부 겹쳐서 여러 개를 병행할 수 없는 상황이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 주변에 현업 금융권 개발자와 대기업 SI 개발자 지인들과 다른 몇 명의 지인들에게&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 저 중에 몇 개는 포기했고, 몇 개는 도전을 했는데, 결과적으로 현재 2번 루트를 선택해서 유레카 과정을 밟고 있다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유레카가 내가 1 기수라서 유레카에 대한 정보가 거의 없어서 혜택이 뭔지도 모르고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 통신사에서 진행한 최초의 웹개발 부트캠프&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 수료생 전원 서류 전형 면제 및 코딩테스트 면제&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년 같은 취업 혹한기에도 모든 도메인에서 높은 서류합격률을 보인 현 금융권 개발자 지인이 조언한 것은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 범용적인 개발 스펙(포폴, 자격증, 어학 등등)은 당연한 것이고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원하는 &lt;b&gt;도메인에 대한 로열티&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다시 말하자면 금융권, 통신사 등등 각각의 도메인에 대해 관심이 많고 준비해 왔다는 것을 보여줘야 요즘 같은 시기에 취업할 수 있다는 것이다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1번에 대한 이유&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 나도 이번 1학기를 기점으로&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;소프트웨어 전공 학위&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;자격증 2개&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;어학&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;포트폴리오에 쓸만한 좋은 프로젝트 경험&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;등등 범용적으로 많이 쓰이는 스펙은 맞췄으므로 도메인 하나를 정해서 전문적인 모습을 보여야겠다고 생각해서 유레카를 선택했다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2번에 대한 이유&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모든 전형을 면제해 주는 것은 아니고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후에도 인적성 검사 / 면접 / 인턴십을 거쳐야 LG 유플러스에 합격할 수 있기는 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 수료생 전원이기 때문에 프론트/백엔드/비대면/대면 120명이 같이 지원하므로 적은 경쟁자라고 볼 수는 없다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 긍정적으로 보는 것은 이번 상반기 취업 공고를 보면 &lt;b&gt;웹개발 부문은 전부 빠지고 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나머지 부문에서만 뽑은 것을 보아 &lt;b&gt;유레카에서 많이 채용&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 지인들을 보면 어차피 열심히 하는 사람들은 어떻게든 잘 가기 때문에, 경쟁률에 대한 걱정은 크게 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;서류 작성(이력서)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LG 공채에서 사용하는 사이트에서 유레카 서류도 작성했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서류에 모든 내용을 기입하고 마지막에 이제 자소서 2 문항이 나왔는데 그것은 아래와 같다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 1. LG 유플러스 유레카 SW교육에 지원하신 동기와 과정 수료 후, 이루고 싶은 취업 계획을 작성해 주십시오. (최소 1자, 최대 500자 입력가능) &lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; [전공생] 2-2. SW 관련 경험 중 어려웠던 과제와 해결 방안에 대해 작성하고, LG 유플러스 유레카 SW교육 과정을 통해 향후 어떤 개발자로 성장하고 싶은지 작성해 주십시오. ※SW 관련 경험 : SW 개발, SW 프로젝트 및 경진대회 경험(참여, 수상 등), IT 관련 자격증 취득 등 (최소 1자, 최대 500자 입력가능) &lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1번 문항&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1.&amp;nbsp; 내가 개발 관련해서 열심히 노력한 경험 + 하지만 부족한 점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 이 부족한 ~ 점을 유레카의 ~ 과정을 통해서 ~ 게 향상 하고 싶다&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2번 문항&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 이전에 다른 곳에서도 여러 번 사용했던 소재인 N+1 문제를 해결한 경험을 통해 ~%만큼 성능 향상을 이룬 경험&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;N+ 1 문제 관련 글&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718638504676&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;[TrueEcho] 실제로 마주한 JPA N + 1 문제를 66.7% 퍼센트의 성능 최적화로 극악무도하게 해결한 이야기&quot; data-og-description=&quot;예 사실 극악무도하게 해결하진 않았지만실제 프로젝트를 진행하는 중에 쿼리가 무지막지하게 나오는 어떠한 문제를 마주했고,(과장이 약간 섞인) 66.7퍼센트의 성능 개선을 어떻게 했는지,결국&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/26&quot; data-og-url=&quot;https://jun10920.tistory.com/26&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b2rFuI/hyWoKSW76E/6QaTaDZJ51OEGIMv1T6P5K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cPmaaT/hyWoDlZmub/oU1vgENlk6q1ZWfP7guPbk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Ka7Sy/hyWk881IUe/kKPKDsVSNk8wQWK4kCs4S1/img.png?width=1410&amp;amp;height=1072&amp;amp;face=0_0_1410_1072&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/26&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b2rFuI/hyWoKSW76E/6QaTaDZJ51OEGIMv1T6P5K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cPmaaT/hyWoDlZmub/oU1vgENlk6q1ZWfP7guPbk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Ka7Sy/hyWk881IUe/kKPKDsVSNk8wQWK4kCs4S1/img.png?width=1410&amp;amp;height=1072&amp;amp;face=0_0_1410_1072');&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;[TrueEcho] 실제로 마주한 JPA N + 1 문제를 66.7% 퍼센트의 성능 최적화로 극악무도하게 해결한 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;예 사실 극악무도하게 해결하진 않았지만실제 프로젝트를 진행하는 중에 쿼리가 무지막지하게 나오는 어떠한 문제를 마주했고,(과장이 약간 섞인) 66.7퍼센트의 성능 개선을 어떻게 했는지,결국&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsnbm8/btsH3n5ISIC/VCrpTkCWR94205wszSwO40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsnbm8/btsH3n5ISIC/VCrpTkCWR94205wszSwO40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsnbm8/btsH3n5ISIC/VCrpTkCWR94205wszSwO40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsnbm8%2FbtsH3n5ISIC%2FVCrpTkCWR94205wszSwO40%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;678&quot; height=&quot;257&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;전공별 평가(코딩 테스트)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서류를 합격하고, 금방 코딩 테스트를 봐야 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩 테스트는 &lt;a href=&quot;https://www.jobda.im/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;잡다 채널&lt;/a&gt;의 개발 역량 검사를 봤는데, 개인적으로 앞으로 기업들이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;요즘 지인의 지인들을 통해서 들은 CTO급 시니어 개발자 분들의 고민이, 알고리즘 잘하는 개발자를 뽑아놨더니 구현을 제대로 못해서 프로젝트에 바로 투입이 어렵다는 얘기였다(물론 평균 이상은 하겠지만)&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 요즘 대기업들이 코딩테스트 추세가 어려운 개념의 알고리즘이 나오기보단&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기본적인 알고리즘을 구현을 어렵게&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;잡다 채널의 개발 역량 검사는 독특한 형식으로 문제가 구성되어 있었는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제가 2문제라면 각 문제마다 소문제가 5개여서 1단계부터 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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;요구한 조건을 분석해서 이를 설계하고 반영하는 과정이 짧은 코딩테스트 내에 다 있었기 때문에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마치 진짜 PS가 아니라 진짜 짧은 단위의 개발을 하는 것 같은 기분을 들게 해 주었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나 같은 경우 2문제 중&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1번 문제: 3/5 문제 솔&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2번 문제: 4/5 문제 솔&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결과는 합격&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VwdtD/btsH3jCq1jd/miZsyJ3cqUDe8zYoKsYmDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VwdtD/btsH3jCq1jd/miZsyJ3cqUDe8zYoKsYmDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VwdtD/btsH3jCq1jd/miZsyJ3cqUDe8zYoKsYmDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVwdtD%2FbtsH3jCq1jd%2FmiZsyJ3cqUDe8zYoKsYmDk%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;847&quot; height=&quot;142&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;대면 면접&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩 테스트 보고 바로 그다음 주가 대면 면접이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;난 목요일에 전공 수업이 하나 있었는데, 교수님의 배려 덕분에 코딩 테스트와 면접을 다행히 볼 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;면접은 &lt;b&gt;면접관(3) - 면접자(5)의 다대다 방식&lt;/b&gt;으로, 기&lt;b&gt;본적인 내용과 취업에 대한 의지, 유레카에 온 이유와 개발 역량에 대한 확인 정도의 내용&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자세한 내용은 &lt;b&gt;대외비&lt;/b&gt;라 공개하지 못하지만 그냥 일반적은 부트캠프 준비하듯이 준비하면 충분할 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceuwQw/btsH023uP9i/Z8VwNpSmzooy9jcNaxk7R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceuwQw/btsH023uP9i/Z8VwNpSmzooy9jcNaxk7R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceuwQw/btsH023uP9i/Z8VwNpSmzooy9jcNaxk7R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceuwQw%2FbtsH023uP9i%2FZ8VwNpSmzooy9jcNaxk7R0%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;833&quot; height=&quot;187&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;187&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;++ 근데 또 너무 안일하게 생각하면 안 되는 건,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩테스트 전부 다 풀었고 면접 본 사람이 떨어지는가 하면 코테 소문제 포함 10문제 중에 1문제 풀고 면접 봤는데 붙은 사람도 있고 주변에 면접에서 떨어진 사람이 꽤나 많았다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아마 &lt;b&gt;면접이 선발되는데 중요한 부분&lt;/b&gt;이 아닐까 싶다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러 개를 병행하고 있어서 유레카에도 많은 시간을 들이지는 못했지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에서 말한 옵션 중에 유레카가 가장 합격 발표가 빨리 나오고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유레카를 준비하시는 분들께 도움이 됐으면 한다. 파이팅!&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발경험</category>
      <category>LG유플러스</category>
      <category>uplus</category>
      <category>개발자</category>
      <category>부트캠프</category>
      <category>유레카</category>
      <category>유플러스</category>
      <category>유플러스부트캠프</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/32</guid>
      <comments>https://jun10920.tistory.com/32#entry32comment</comments>
      <pubDate>Tue, 18 Jun 2024 01:02:15 +0900</pubDate>
    </item>
    <item>
      <title>[SSAFY] 싸피 12기 자소서 &amp;amp; 코딩테스트 합격 후기 (전공자)</title>
      <link>https://jun10920.tistory.com/31</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과적으로는 사정상 다른 부트캠프를 갔지만, 최소한의 시간을 들여 싸피 자소서와 코딩테스트에 합격하였습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 과정을 공유하면 도움이 될 분들이 계실 것 같아서 글을 작성합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지원 과정&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SSAFY의 지원 과정은&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자소서 기반 서류 평가 + 코딩테스트&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대면 인터뷰&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;난 코딩테스트까지만 합격하고 이후 과정은 면접 포기를 했기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자소서와 코딩테스트 관련해서만 작성하다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자소서&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 10기 때도 연습해 볼 겸 당시에는 복수전공을 하지 않아서 비전공자 전형으로 서류를 지원한 적이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비전공자 + 개발에 대한 경험이 없었을 당시에는 어떻게든 관련된 경험을 엮어서 싸피가 원하는 인재상에 맞추려고 노력하면서 작성하고 오픈 카톡방에 들어가 선배 기수들에게 피드백도 여러 번 받았다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 이번에는 복수전공도 하고 개발에 대한 경험도 꽤나 쌓인 터라, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;10기 지원 때처럼 다른 사람들에게 피드백이나 첨삭도 받지 않고 그냥 전공자로서 개발하면서 깊이 고민한 경험을 하나 선택해 작성했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내가 작성한 자소서의 주제는 J&lt;b&gt;PA를 통해서 엔티티를 조회할 때 발생하는 N+1 문제&lt;/b&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 관련 블로그 글&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718611321319&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;[TrueEcho] 실제로 마주한 JPA N + 1 문제를 66.7% 퍼센트의 성능 최적화로 극악무도하게 해결한 이야기&quot; data-og-description=&quot;예 사실 극악무도하게 해결하진 않았지만실제 프로젝트를 진행하는 중에 쿼리가 무지막지하게 나오는 어떠한 문제를 마주했고,(과장이 약간 섞인) 66.7퍼센트의 성능 개선을 어떻게 했는지,결국&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/26&quot; data-og-url=&quot;https://jun10920.tistory.com/26&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b2rFuI/hyWoKSW76E/6QaTaDZJ51OEGIMv1T6P5K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cPmaaT/hyWoDlZmub/oU1vgENlk6q1ZWfP7guPbk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Ka7Sy/hyWk881IUe/kKPKDsVSNk8wQWK4kCs4S1/img.png?width=1410&amp;amp;height=1072&amp;amp;face=0_0_1410_1072&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/26&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b2rFuI/hyWoKSW76E/6QaTaDZJ51OEGIMv1T6P5K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cPmaaT/hyWoDlZmub/oU1vgENlk6q1ZWfP7guPbk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Ka7Sy/hyWk881IUe/kKPKDsVSNk8wQWK4kCs4S1/img.png?width=1410&amp;amp;height=1072&amp;amp;face=0_0_1410_1072');&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;[TrueEcho] 실제로 마주한 JPA N + 1 문제를 66.7% 퍼센트의 성능 최적화로 극악무도하게 해결한 이야기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;예 사실 극악무도하게 해결하진 않았지만실제 프로젝트를 진행하는 중에 쿼리가 무지막지하게 나오는 어떠한 문제를 마주했고,(과장이 약간 섞인) 66.7퍼센트의 성능 개선을 어떻게 했는지,결국&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 두괄식&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 개발 역량을 보여줄 수 있는 요소&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 수치화&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;근데 이미 SW 마에스트로를 지원할 때 작성한 자소서를 비롯해서 당시에 여러 부트캠프에 지원하면서 작성한 자소서 내용을 가져와 조금 수정해서 제출했다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SW 적성 진단 (코딩테스트)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩테스트 역시, 이미 겨울방학 동안 SW 마에스트로를 준비하면서 프로그래머스 문제를 엄청나게 많이 푼 상태였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 코딩테스트를 준비하지 않았는데 싸피를 준비하는 사람이라면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;삼성에서 코딩테스트를 준비하기 위한 사이트인 &lt;a href=&quot;https://swexpertacademy.com/main/main.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SW Expert Academy &lt;/a&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 나는 다른 것들도 많이 병행하고 있던 상태여서 싸피만을 위해서 따로 코테를 준비하진 않았기에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SW Expert Academy에서 준비하지 않았다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그냥 기존에 지인과 알고리즘 스터디를 진행하며 하루에 한 문제씩 프로그래머스 고득점 KIT 문제를 다시 푸는 것으로 대체했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;요즘 전반적인 코딩 테스트의 기조와 삼성의 원래 경향을 봤을 때 어려운 알고리즘이 나오는 것이 아니라 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;단순 구현 문제&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SW 마에스트로랑 다른 기업들의 코딩 테스트를 보다가 SAFFY의 코딩 테스트를 접했을 때,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 2 문제가 나왔는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1번 문제는 10분도 안돼서 다 풀고, 30분 정도 걸려서 2번 문제 풀고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제의 난이도를 내가 많이 푼 프로그래머스의 난이도로 보자면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1번 문제: Lv1&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2번 문제: 쉬운 Lv2 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정도인 것 같다.&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 평소에 알고리즘 문제를 준비하던 사람이면 굳이 싸피를 위해서 추가적인 준비를 하지는 않아도 될 것 같다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;합격 사진&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT3qCU/btsH2mGysfb/HmRKnKKKHWoBDxQ4DOvGB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT3qCU/btsH2mGysfb/HmRKnKKKHWoBDxQ4DOvGB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT3qCU/btsH2mGysfb/HmRKnKKKHWoBDxQ4DOvGB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT3qCU%2FbtsH2mGysfb%2FHmRKnKKKHWoBDxQ4DOvGB1%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;983&quot; height=&quot;257&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;257&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;후기&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;삼성 앰배서더&lt;/b&gt;도 했던 나라서 싸피에 애정이 있었던 나는 &lt;span style=&quot;color: #333333; text-align: start;&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;b&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;관련 글&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1718612029827&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;[SSAFY] 앰배서더 초청행사 후기&quot; data-og-description=&quot;너무 오랜만에 돌아왔네요! 저의 졸업프로젝트이자 포트폴리오에도 사용하려고 앱 배포 및 유저 확보까지 기획 중인 프로젝트가 있어 너무 바빠서 블로그에 신경을 많이 못 쓴 거 같습니다 (핑&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/25&quot; data-og-url=&quot;https://jun10920.tistory.com/25&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctqdus/hyWk91atzS/4n0Ro8ZNw8rQrBl9mKkPtk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b2MeoT/hyWlgMJSyK/PHlK3SMHtnBugNGpYBrKFK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/25&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctqdus/hyWk91atzS/4n0Ro8ZNw8rQrBl9mKkPtk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b2MeoT/hyWlgMJSyK/PHlK3SMHtnBugNGpYBrKFK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[SSAFY] 앰배서더 초청행사 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;너무 오랜만에 돌아왔네요! 저의 졸업프로젝트이자 포트폴리오에도 사용하려고 앱 배포 및 유저 확보까지 기획 중인 프로젝트가 있어 너무 바빠서 블로그에 신경을 많이 못 쓴 거 같습니다 (핑&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 이번에 졸업 문제로 어차피 못 갈 것을 예상해 그냥 내 실력이나 검증해 보자는 마음으로 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자소서와 코딩테스트에 큰 힘을 들이지 않고 임했고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;10기 지원할 때만 해도 정말 개발에 입문한 지 얼마 안돼서 내세울만한 경험도, 코테 실력도 없었는데..&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 앞서 작성한 정보처리기사와 SQLD 합격과 싸피 합격, 그리고 전공에서 좋은 성적들과 여러 프로젝들을 비롯해&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파이팅파이팅&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발경험</category>
      <category>SSAFY</category>
      <category>sw적성진단</category>
      <category>부트캠프</category>
      <category>삼성sw아카데미</category>
      <category>싸피</category>
      <category>싸피11기</category>
      <category>싸피자소서</category>
      <category>싸피전공자</category>
      <category>싸피코테</category>
      <category>코딩테스트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/31</guid>
      <comments>https://jun10920.tistory.com/31#entry31comment</comments>
      <pubDate>Mon, 17 Jun 2024 17:25:22 +0900</pubDate>
    </item>
    <item>
      <title>SQLD 1.5일 만에 합격하기 (24년 2회차)</title>
      <link>https://jun10920.tistory.com/30</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;안녕하세요. 오랜만입니다. &lt;br /&gt;조만간 회고에 작성하겠지만, 1학기 간 20학점(6 전공 1 교양), 플레이스토어에 배포할 목적으로 개발한 프로젝트, &lt;br /&gt;자격증 2개, 코테 다수, 자소서 작성 다수, 면접 1번 등등... &lt;br /&gt;다방면으로 열심히 사느라 글감을 모아놓기만 하고 블로그 작성은 좀 늦어졌습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;종강도 했고, 앞으로 학교 일정 때문에 바빠질 일은 없을 것 같아서 당분간 쌓인 글들을 올리고 반년 회고에 총 집합해서 작성할 것 같으니 혹시나 보실 분들 있으면 기대해 주시면 감사하겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;공부한 배경&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내가 개발자가 되기로 했을 때 조언을 구한 몇 명의 지인들이 추천한 자격증이 정보처리기사와 SQLD였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자격증이 실력을 대변해 주는 것은 아니지만, 복수전공자로서 좀 더 전문성을 보여줄 수 있는 기회라고 생각해서 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;준비하게 됐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 위에 작성한 것과 굉장히 바쁜 일정 중에 시험을 봐야 했기 때문에 이전에 작성한&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/29&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;정보처리기사 준비&lt;/a&gt;와 같이 단기간에 합격을 해야 했고, 이에 맞는 전략으로 준비하여 합격하였다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;공부 자료&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=QB_GYdHUHmA&amp;amp;list=PLbflMVhwy2jPIAzArCK90mqFlTtndFigS&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1. 홍쌤의 데이터랩 강의&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 홍쌤의 데이터랩 강의 자료&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3. 노랭이 문제집&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 2024년에 SQLD 시험이 &lt;b&gt;개정&lt;/b&gt;되었고,&amp;nbsp;짧은 기간 내에 준비하기 위해서 구글링과 &lt;a href=&quot;https://cafe.naver.com/sqlpd&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;데이터 전문가 포럼&lt;/a&gt;에서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;전공자 / 단기간 내 합격 / 2024년 1회차 &lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;많은 좋은 강의와 레퍼런스가 있었지만, 유명하면서 동시에 2024년 신유형을 대비한 무료 강의는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;홍쌤의 데이터랩 채널&lt;/b&gt;이라 해당 강의를 2배속으로 빠르게 1 회독했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 모든 SQLD 준비생들이라면 알법한 노랭이 문제집을 구매하여 풀었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;공부 방법&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 강의나 자료를 바탕으로 가볍게 시험 범위 전체를 1 회독&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. 노랭이를 1 회독 이상 풀이&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 당시에 코딩테스트와 자소서, 전공 과제들이 겹친 상황이었어서 SQLD에 쓸 수 있는 시간 &lt;b&gt;이틀&lt;/b&gt; 밖에 없었던 나는,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;분석한 &lt;b&gt;합격의 최소 조건인 1, 2번을 만족&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 실제로 공부한 과정을 설명하자면&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;시험 이틀 전&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;홍쌤 카페에 가입해서 홍쌤의 데이터랩 강의 자료를 받기 위해서 가입해서 회원 등급을 올리고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;얻은 자료를 바탕으로 강의를 빠르게 1 회독하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후에 시험 전날 저녁에 노랭이를 처음 풀기&amp;nbsp; 시작(!)&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;시험 당일&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새벽 2시인가 3시까지 풀고, 시험 당일 새벽 6시쯤 다시 일어나서 못 푼 부분을 마저 다 풀고 바로 시험을 보러 갔다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비전공자라면 힘든 스케줄이지만, 전공자라는 기준 하에 짧지만 농축된 시간을 들여서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내가 분석한 합격의 최소 조건은 다 맞추고 시험장에 들어갔다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시험을 보는데 물론 어려운 부분도 있었지만 60점 이상이면 합격하는 시험이기에 솔직히 떨어질 것 같은 기분은 들지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이것 말고도 나름대로 1학기에 다방면으로 많은 것을 준비하면서 대부분 좋은 결과를 얻으면서 깨달은 것은,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;짧은 기간 내에 좋은 결과&lt;/b&gt;를 얻기 위한 방법은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;효율적인 계획&lt;/b&gt;을 세우고, 이 계획을 &lt;b&gt;어떻게든 수행&lt;/b&gt;하고, &lt;b&gt;선택과 집중&lt;/b&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 결과적으로는 &lt;b&gt;합격 ~~&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOhtgp/btsH1EOiiH6/LqCawf6mr1YTkFEyeKatAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOhtgp/btsH1EOiiH6/LqCawf6mr1YTkFEyeKatAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOhtgp/btsH1EOiiH6/LqCawf6mr1YTkFEyeKatAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOhtgp%2FbtsH1EOiiH6%2FLqCawf6mr1YTkFEyeKatAk%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;1271&quot; height=&quot;318&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;318&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직도 글감이 쌓여있기 때문에 금방 다시 돌아오겠습니다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>자격증</category>
      <category>db</category>
      <category>SQL</category>
      <category>sqld</category>
      <category>sql개발자</category>
      <category>SQL자격증</category>
      <category>자격증</category>
      <category>전공자</category>
      <category>쿼리</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/30</guid>
      <comments>https://jun10920.tistory.com/30#entry30comment</comments>
      <pubDate>Mon, 17 Jun 2024 16:01:07 +0900</pubDate>
    </item>
    <item>
      <title>정보처리기사 필기 일주일 만에 준비하기(24년 2회차)</title>
      <link>https://jun10920.tistory.com/29</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시험 끝나고 계속 바쁘게 지내고 있는 와중에 이번 1학기에 목표했던 정보처리기사 시험이 다가와&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;준비한 자료와 공부 방법에 대한 글입니다!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미 전공을 통해서 CS에 대한 지식이 있다면 훨씬 수월하게 준비하실 수 있을 것 같아요.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자세한 내용은 글을 읽어주시면 감사하겠습니다 :&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공부한 자료&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정보처리기사 필기 기출문제집&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시나공 IT 홈페이지의 핵심 요약집&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;추가자료(시나공 IT 홈페이지 내의 자료들)&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;키워드 찾기 259문제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필수계산 41문제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필수코드 57문제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;종류순서 114문제&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://www.sinagong.co.kr/pds&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;해당 자료들 다운로드할 수 있는 사이트&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공부 방법&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여유 있는 만큼 기출 풀면서 개념 정독하기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 경우에는 기출문제집의 총 12회 기출에서 5회 정도를 최신순으로 정해서 풀었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당연히 많이 풀수록 좋겠지만 저의 경우 대략적으로 기출 매일 풀고 정리(5일) + 회독 및 정리(2일) 잡고 일주일 간 공부했기 때문에 5회가 적당했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기출문제집의 경우 문제와 바로 밑에 문제에 해당하는 개념이 같이 적혀있어서 공부하기 좋았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 1 회독 때는 문제 풀고 조금이라도 헷갈리거나 찍은 문제들은 체크하면서 개념을 읽고 넘어갔어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때 중요한 것은 무조건 외우려고 너무 힘 빼지 않는 게 포인트입니다!&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두 번째 회독은 첫 번째 회독할 때 체크한 것 위주로 다시 보기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이때는 그냥 체크한 거 위주로 다시 2 회독하면 됩니다. 방법은 위에 적은 것과 똑같이  &lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세 번째 회독은 이해가 안 된 부분은 요약집에서 해당 부분을 찾아서 정독 및 간단하게 정리하기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 경우에는 3번째 회독할 때 이미 자연스럽게 머리에 들어와 딱히 모르는 게 없었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 각 개념에 대해서 완벽하게 알고 있다는 것은 아니고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제 푸는데 문제없는 수준까지는 충분히 개념에 대해서도 기억하고 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 이해가 다른 부분에 비해 잘 안 되고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이해가 아니라 꼭 암기해야만 외울 수 있는 부분(결합도, 응집도 순서 문제 같은)이 있기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그런 부분을 요약집에서 검색해서 찾아보고, 간단하게 정리했습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 이 정도 하면 대부분의 과목에서 합격점보다 높은 점수를 받으실 텐데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 경우 5과목이 가장 어렵고 거리가 있는 과목이라서 2회분을 5과목만 더 풀었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 실력 점검용이라 새로 푼 2회분은 따로 정리하거나 복습하지 않았어요ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막으로 정말 안 외워지는 부분만 한두 장으로 요약해서 시험 보러 갈 때까지 외우기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예로 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결합도 강한 순서&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;내&lt;/b&gt;게 &lt;b&gt;공부&lt;/b&gt;를 강요하지 마세요. &lt;b&gt;제&lt;/b&gt;가 &lt;b&gt;스&lt;/b&gt;트레스를 받잖아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;응집도 강한 순서&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;와 같이 적어놨어요. 아직 공부 안 하셨으면 이게 뭔 소리인가 하실 텐데, 하시다 보면 제가 적은 게&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;꿀팁인지 아실 수 있으실 겁니다ㅎㅎ&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;후기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 경우 개발 경험이 어느 정도 있어서 프로젝트 설계, 프로그래밍 부분은 따로 공부하지 않아도 잘 풀었고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 1과목의 소프트웨어 공학 부분이나 5과목의 정보보안 부분은 이번에 처음 공부한 부분인데 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여름방학에 실기 보고 나서 또 후기를 적으러 오겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 주도 파이팅입니다!  &lt;/span&gt;&lt;/p&gt;</description>
      <category>자격증</category>
      <category>개발자</category>
      <category>개발자자격증</category>
      <category>개발자취업</category>
      <category>정보처리기사</category>
      <category>정보처리기사필기</category>
      <category>정처기</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/29</guid>
      <comments>https://jun10920.tistory.com/29#entry29comment</comments>
      <pubDate>Mon, 13 May 2024 08:43:15 +0900</pubDate>
    </item>
    <item>
      <title>[TrueEcho] FOF 알고리즘_User들 사이에 친구 추천은 어떻게 하면 좋을까!?</title>
      <link>https://jun10920.tistory.com/28</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시험 끝났는데 오히려 더 바쁜 일정이 시작된 요즘..! &lt;br /&gt;뭔가 빈둥거리면 안 되는데 그러고 있어서 살짝 위기감을 느끼는 중입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오늘 작성할 글은 프로젝트를 개발하던 중에, &lt;br /&gt;User들 간에 친구 추천을 할 때 어떤 알고리즘을 사용해서 하면 좋을지 고민하고 구현한 내용입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇게 어려운 알고리즘은 아니지만! 좋게 봐주시면 감사하겠습니다. 그리고 피드백은 항상 환영입니다  &lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;FOF 알고리즘이란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;fof 알고리즘이란, 말 그대로 Friends Of Friends 알고리즘으로 친구의 친구를 추천해 주는 알고리즘입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;사람들이 가장 많이 사용하는 SNS인 인스타그램이나 페이스북, 틱톡 등 다양한 SNS에서 사용하는 알고리즘으로 알고 있는데요!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;이를 직접 구현하기 위해서 고민한 내용을 담았습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;구현 내용&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;단순히 친구의 친구를 불러오는 것도 좋은 방법이겠습니다만..!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;좀 더 자세히 설명을 드리자면,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;해시맵 형태로 fof(친구의 친구)를 key로 저장하고, 겹치는 친구가 있을 때마다 value 값을 1씩 증가시킵니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 제 fof 중에서 겹지인이 많아질수록 value가 많아지겠죠!&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 제가 아는 사람일 확률이 높다고 가정하고, 가장 우선적으로 친구를 추천하는 알고리즘입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래 코드는 다른 부분을 제외하고 fof과 관련 있는 부분만 남겨놓은 코드입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1714831678887&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public List&amp;lt;FriendListResponse&amp;gt; recommendFriends() {
        List&amp;lt;FriendListResponse&amp;gt; response = new ArrayList&amp;lt;&amp;gt;();

        try {
            ...
            }

            Set&amp;lt;User&amp;gt; friends = new HashSet&amp;lt;&amp;gt;(friendList);  // 현재 사용자의 친구 목록
            Map&amp;lt;User, Integer&amp;gt; recommendationMap = new HashMap&amp;lt;&amp;gt;();

            // 친구의 친구들을 찾아서 추천 맵에 추가
            for (User friend : friends) {
                List&amp;lt;User&amp;gt; fofList = getFriendList(friend);
                if (fofList != null) {
                    for (User fof : fofList) {
                        if (!friends.contains(fof) &amp;amp;&amp;amp; !fof.equals(loginUser)) {
                            recommendationMap.put(fof, recommendationMap.getOrDefault(fof, 0) + 1);
                        }
                    }
                }
            }

            int size = 4;
            response = recommendationMap.entrySet().stream()
                    .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                    .map(Map.Entry::getKey)
                    .limit(size)
                    .map(user -&amp;gt; FriendListResponse.builder()
                            .userId(user.getId())
                            .nickname(user.getNickname())
                            .userProfileUrl(user.getProfileURL())
                            .build())
                    .collect(Collectors.toList());

        } catch (Exception e) {
            ...
        }
        return response;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시를 들어서 설명을 하자면,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kUDdW/btsHb98SVCw/bFndxLkirU9Q0W40phGkc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kUDdW/btsHb98SVCw/bFndxLkirU9Q0W40phGkc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kUDdW/btsHb98SVCw/bFndxLkirU9Q0W40phGkc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkUDdW%2FbtsHb98SVCw%2FbFndxLkirU9Q0W40phGkc1%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;487&quot; height=&quot;341&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 User가 저와 2번, 3번, 4번, 397번, 398번 유저가 있다고 가정합시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 저와 3번 유저는 친구가 2명 겹치고, 397번 유저와 398번 유저는 1명씩 겹치는 상황입니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3, 397, 398 순서로 추천을 해주어야 합니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 아래 사진에서 보다시피 POSTMAN을 통해서 API를 호출하면 올바르게 목록이 출력되는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;567&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4sw0C/btsHaPcUmzf/hYdHowrAkURq1xvzY4Gx7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4sw0C/btsHaPcUmzf/hYdHowrAkURq1xvzY4Gx7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4sw0C/btsHaPcUmzf/hYdHowrAkURq1xvzY4Gx7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4sw0C%2FbtsHaPcUmzf%2FhYdHowrAkURq1xvzY4Gx7K%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;644&quot; height=&quot;434&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;567&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ETC&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이외에도 USER를 추천하는 알고리즘에는 네트워크를 분석해서 추천하는 PageRank 알고리즘도 있다고 하는데요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 MVP를 우선적으로 구현중이라 추후에 리팩토링 할 때 시간이 있다면 PageRank 식으로도 구현을 해보고 싶습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음 글을 azure 클라우드 서버 이용 관련 글일 것 같습니다!&amp;nbsp;&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;긴 글 읽어주셔서 감사하고, 위에서 말한 것처럼 피드백은 언제든 환영입니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>fof</category>
      <category>fof알고리즘</category>
      <category>백엔드</category>
      <category>알고리즘</category>
      <category>친구추천</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/28</guid>
      <comments>https://jun10920.tistory.com/28#entry28comment</comments>
      <pubDate>Sat, 4 May 2024 23:13:48 +0900</pubDate>
    </item>
    <item>
      <title>[TrueEcho] 영속성 전이에 의한 em.remove()문제와 해결</title>
      <link>https://jun10920.tistory.com/27</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;약 1시간 정도 끙끙대다 결국 풀어낸 em.remove의 비밀..! 지금 바로 공개합니다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제 상황&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로직 설명&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제를 말씀드리기 앞서 저희 프로젝트의 User(유저)와 Suspended User(탈퇴가 유예된 유저) 간의 로직을 설명해 드리겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 회원 탈퇴 요청을 하면 User 테이블의 user를 Suspended User 테이블에도 생성합니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 7일간의 유예 기간을 주는데요, 7일간 다시 로그인(탈퇴 취소)을 하지 않으면 Suspended User 테이블과 User 테이블에서 사라짐과 동시에 회원 탈퇴가 취소됩니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 만약 탈퇴 요청을 하고 7일 이내에 접속한다면?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Supsended User 테이블에서 삭제되고 탈퇴가 됩니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에러 설명&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바로 여기서 에러가 발생했는데요, 회원 탈퇴 취소 요청이 들어왔을 때 Supsended User 테이블에서 user를 삭제하려고 해도 안 되는 문제였습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;디버거를 통해서 breakpoint를 일일이 찍어봐도 분명 제대로 재로그인한 User의 id와 같은 Suspended User의 id가 전달되는데도 불구하고 remove가 작동되지 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제 원인&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제의 원인은 바로 영속성 전이(Cascade)와 관련이 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;엔티티를 설계하면서 초반에 참고를 많이 했던 &lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713110804018&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;profile&quot; data-og-title=&quot;Instagram Clone Project&quot; data-og-description=&quot;Instagram을 직접 [ 분석-⚙설계- 구현- 리팩토링] 하는 프로젝트입니다. Instagram Clone Project has 4 repositories available. Follow their code on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Instagram-Clone-Coding&quot; data-og-url=&quot;https://github.com/Instagram-Clone-Coding&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dAEgd5/hyVPVBcQBJ/I4AsTWAtCKlrBNmT0UqEf1/img.png?width=280&amp;amp;height=280&amp;amp;face=0_0_280_280&quot;&gt;&lt;a href=&quot;https://github.com/Instagram-Clone-Coding&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Instagram-Clone-Coding&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dAEgd5/hyVPVBcQBJ/I4AsTWAtCKlrBNmT0UqEf1/img.png?width=280&amp;amp;height=280&amp;amp;face=0_0_280_280');&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;Instagram Clone Project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Instagram을 직접 [ 분석-⚙설계- 구현- 리팩토링] 하는 프로젝트입니다. Instagram Clone Project has 4 repositories available. Follow their code 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;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에서 cascade.All을 많은 곳에서 사용하였고, 저도 김영한 님의 jpa 관련 강의들을 들으면서 알고 있던 터라 영속성 전이의 단점은 생각을 못하고 편의성만 생각해서 User의 많은 필드에 남발하고 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바로 삭제가 안 됐던 이유도, Suspended User를 삭제하더라도 User -&amp;gt; Suspended User에 연결된 cascade가 남아있기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;em.remove()는 삭제하려 하고, cascade 속성은 연관관계에 객체가 남아있으니 저장하려고 해서 삭제되지 않고 남아있는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;영속성 전이란?&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;영속성 전이란 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들기 위해서 사용하는 것을 말합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시로, 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하는 것이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론, JPA에만 있는 개념이 아니라 RDBMS 자체를 공부할 때 같이 배우는 개념입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713111153470&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@OneToMany(mappedBy=&quot;parent&quot;, cascade=CascadeType.PERSIST)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 코드와 같이 애노테이션으로 설정할 수 있는데요, CascadeType에도 여러 종류가 있습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ALL: 모두 적용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PERSIST: 영속&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;REMOVE: 삭제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MERGE: 병합&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;REFRESH: REFRESH&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DETACH: DETACH&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;영속성 전이와 고아 객체를 이용해서 부모 엔티티를 통해 자식의 생명 주기를 관리할 수 있는데요, 이를 통해서 DDD(도메인 주도 설계)를 할 때 도움을 받을 수 있습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 이게 현재 글의 메인 주제는 아니기 때문에 이 정도만 설명하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제해결&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원인을 찾는 게 항상 어렵지, 원인을 찾고 나면 해결은 항상 쉽습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;둘의 연관관계를 없애기 위해서 user의 suspendedUser를 삭제하&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;면 됩니다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713111439318&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void removeSuspendedUser() {
        this.suspendedUser = null;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로 원하는 대로 잘 삭제됐습니다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 이번 에러를 통해서 CascadeType에 대해서 배우고, 이를 남발하지 않고 필요한 곳에만 사용해야겠다는 생각이 들었습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;추가로 김영한 님의 강의 QNA를 참고해서 cascade 속성을 사용하는 경우는&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;엔티티 간의 관계가 완전 개인 소유인 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DDD의 Aggregate Root를 구현하는 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;애매하는 경우는 사용 x&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로 정리할 수 있을 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음 편 예고&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음은 User 간의 친구를 추천하기 위한 알고리즘을 구현하는 과정을 작성하겠습니다!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발을 엄청 힘들게 하고 와서 글감은 많지만, 다음 주와 그다음 주는 시험기간이라 확실하게 언제 쓸지는 모르겠네요!&amp;nbsp;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;긴 글 읽어주셔서 감사하고, 아직 개발에 대해 모르는 것이 많으니 언제든 좋은 피드백은 환영입니다!&lt;/span&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;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고 페이지&lt;/span&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1713111727932&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;cascade 옵션 질문 - 인프런&quot; data-og-description=&quot;안녕하세요.강의 잘 듣고 있던 도중 궁금한 점이 생겨서 질문드립니다.엔티티 설계시 주의점 21분쯤에 cascade옵션에 대해서 설명해 주셨는데, 왜 Order 엔티티에 있는 필드값에만 이를 적용하고 다&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/questions/31969/cascade-%EC%98%B5%EC%85%98-%EC%A7%88%EB%AC%B8&quot; data-og-url=&quot;https://www.inflearn.com/questions/31969/cascade-%EC%98%B5%EC%85%98-%EC%A7%88%EB%AC%B8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2w0T2/hyVPSLf8Dl/eAhW3xAGfaGOLOerqYKd9K/img.png?width=1200&amp;amp;height=630&amp;amp;face=281_114_429_262,https://scrap.kakaocdn.net/dn/boZxN2/hyVPPgGTdW/DrwJUF1MKdxx1ia8Vkynd0/img.png?width=1200&amp;amp;height=630&amp;amp;face=281_114_429_262&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/31969/cascade-%EC%98%B5%EC%85%98-%EC%A7%88%EB%AC%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/questions/31969/cascade-%EC%98%B5%EC%85%98-%EC%A7%88%EB%AC%B8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2w0T2/hyVPSLf8Dl/eAhW3xAGfaGOLOerqYKd9K/img.png?width=1200&amp;amp;height=630&amp;amp;face=281_114_429_262,https://scrap.kakaocdn.net/dn/boZxN2/hyVPPgGTdW/DrwJUF1MKdxx1ia8Vkynd0/img.png?width=1200&amp;amp;height=630&amp;amp;face=281_114_429_262');&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;cascade 옵션 질문 - 인프런&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요.강의 잘 듣고 있던 도중 궁금한 점이 생겨서 질문드립니다.엔티티 설계시 주의점 21분쯤에 cascade옵션에 대해서 설명해 주셨는데, 왜 Order 엔티티에 있는 필드값에만 이를 적용하고 다&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>cascade</category>
      <category>em.remove()</category>
      <category>JPA</category>
      <category>JPA에러</category>
      <category>영속성전이</category>
      <category>영속성전이에러</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/27</guid>
      <comments>https://jun10920.tistory.com/27#entry27comment</comments>
      <pubDate>Mon, 15 Apr 2024 01:26:18 +0900</pubDate>
    </item>
    <item>
      <title>[TrueEcho] 실제로 마주한 JPA N + 1 문제를 66.7% 퍼센트의 성능 최적화로 극악무도하게 해결한 이야기</title>
      <link>https://jun10920.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예 사실 극악무도하게 해결하진 않았지만&lt;br /&gt;실제 프로젝트를 진행하는 중에 쿼리가 무지막지하게 나오는 어떠한 문제를 마주했고,&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;(과장이 약간 섞인) 66.7퍼센트의 성능 개선을 어떻게 했는지,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666; text-align: left;&quot;&gt;결국&lt;span&gt; &lt;/span&gt;&lt;/span&gt;단서를 찾아내 해결한 과정을 정리한 글입니다.&lt;br /&gt;비슷한 경험이 있는 분들에게는 도움이 될 것 같아 글을 작성합니다!&lt;br /&gt;(언제든 틀린 부분 있다면 알려주시면 감사하겠습니다)&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제 상황&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 TrueEcho라는 이름의 졸업 프로젝트 겸 ~ 캡스톤 디자인 겸 ~ 실제 앱으로 출시해 유저들을 모아볼 나름 큰 프로젝트를 백엔드를 맡아서 진행 중입니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러던 중에&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;User&lt;/span&gt; 엔티티를 수정하고 이를 조회하는 로직을 작성하던 중이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yOZ9E/btsGwQhD0rB/2k8G2qXyAvbEiNimfkkhCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yOZ9E/btsGwQhD0rB/2k8G2qXyAvbEiNimfkkhCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yOZ9E/btsGwQhD0rB/2k8G2qXyAvbEiNimfkkhCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyOZ9E%2FbtsGwQhD0rB%2F2k8G2qXyAvbEiNimfkkhCK%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;485&quot; height=&quot;424&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;866&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;이때, 위 스크린샷과 같이 어떤 api를 통해서 User 엔티티를 호출해도 항상 다른 엔티티 2개(NotiTimeQ)와 SuspendedUser 엔티티를 조회하는 쿼리가 같이 나가는 문제가 있었습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled1.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;1797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kIHCs/btsGu1keC5i/K7cVDtBYaxEuA4Kje6rcl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kIHCs/btsGu1keC5i/K7cVDtBYaxEuA4Kje6rcl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kIHCs/btsGu1keC5i/K7cVDtBYaxEuA4Kje6rcl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkIHCs%2FbtsGu1keC5i%2FK7cVDtBYaxEuA4Kje6rcl0%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;711&quot; data-filename=&quot;Untitled1.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;1797&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 User 엔티티와 다른 엔티티들 간에 연관관계를 확인했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled2.png&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;1072&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpU4Yg/btsGwATN44Y/WumXJ44doQORdNexBrbSr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpU4Yg/btsGwATN44Y/WumXJ44doQORdNexBrbSr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpU4Yg/btsGwATN44Y/WumXJ44doQORdNexBrbSr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpU4Yg%2FbtsGwATN44Y%2FWumXJ44doQORdNexBrbSr0%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;669&quot; height=&quot;509&quot; data-filename=&quot;Untitled2.png&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;1072&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국, 다른 엔티티들과 다르게 문제가 있는 NotiTimeQ와 SuspendedUser 엔티티는 OneToOne 관계인 것을 발견해 버렸습니다(이 자식 ㅋ)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 현재 연관관계의 주인이 User가 아니라 저 두 엔티티라는 사실마저도 알아버렸죠. 후후&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제 원인&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두 엔티티가 ToOne 관계여서 Fetch 전략을 Lazy로 설정했음에도 왜 User 엔티티를 조회할 때마다 마치 Eager 전략처럼 동시에 두 엔티티도 같이 조회를 하는 걸까요?&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 그 이유는 OneToOne 관계에서는 연관관계의 주인이 아닌 곳에서 엔티티를 호출하는 경우 지연 로딩이 아니라 즉시 로딩으로 동작한다는 사실을요!! (위와 한 얘기랑 같은 말인가..)&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이유를 말씀드리자면, 지연로딩은&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로딩되는 시점에서 Fetch 전략이 Lazy로 설정되어 있는 엔티티를 프록시 객체로 가져온다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 프록시 객체로 되어있는 엔티티를 실제로 사용할 때 쿼리가 실행&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우리의 경우 NotiTimeQ와 SuspendedUser에서 getUser()와 같은 메서드로 엔티티를 사용할 때를 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 프록시 객체는 Null 값을 가질 수 없는 한계점 때문에, OneToOne 관계에서 양방향 매핑일 때 외래 키가 없는 엔티티(관계의 주인이 아닌 곳)에서 호출하면 Lazy 전략을 사용하지 못하는 것입니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;쉽게 풀어서 말씀드리자면, User 엔티티를 호출할 때 서로 양방향 매핑이기 때문에 NotiTimeQ와 SuspendedUser를 프록시 객체로 만들어 참조하고 싶어도, 외래키가 없기 때문에 해당 엔티티들이 null인지 아닌지 확실할 수 없기 때문입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러므로 프록시 객체를 만드는 Lazy 전략이 아니라 Eager 전략을 사용하는 것입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제해결&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 부분을 김영한 님의 강의에서 배운 내용을 기억을 더듬어 해결했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컬렉션이나 ToMany 관계가 아니라 ToOne 관계는 join을 하더라도 1:N으로 row가 늘어나지 않으므로,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;fetch join을 통해서 미리 User을 조회할 때 NotiTImeQ와 SuspendedUser를 조회해도 괜찮습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 원래 코드인&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712752161231&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @Override
    public User findUserByEmail(String email) {
        try{
            return em.createQuery(&quot;select u from User u where u.email=: email&quot; , User.class)
                    .setParameter(&quot;email&quot;, email)
                    .getSingleResult();
        }catch (NoResultException e){
            return null;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에서 fetch join을 이용한 아래의 코드로 수정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712752185751&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; 		@Override
    public User findUserByEmail(String email) {
        try {
            return em.createQuery(
                            &quot;select distinct u from User u &quot; +
                                    &quot;left join fetch u.suspendedUser &quot; +
                                    &quot;left join fetch u.notiTimeQ &quot; +
                                    &quot;where u.email = :email&quot;, User.class)
                    .setParameter(&quot;email&quot;, email)
                    .getSingleResult();
        } catch (NoResultException e) {
            return null;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 결론적으로 같은 api를 호출했을 때 아래의 결과와 같이 쿼리가 N+1에서 1로 획기적으로 줄였습니다.&lt;/span&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-filename=&quot;Untitled3.png&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;1537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TCl8T/btsGxCcjQcj/dZs3NDaKkW4Aj8xFqAk770/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TCl8T/btsGxCcjQcj/dZs3NDaKkW4Aj8xFqAk770/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TCl8T/btsGxCcjQcj/dZs3NDaKkW4Aj8xFqAk770/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTCl8T%2FbtsGxCcjQcj%2FdZs3NDaKkW4Aj8xFqAk770%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;413&quot; height=&quot;796&quot; data-filename=&quot;Untitled3.png&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;1537&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 친구 한 명을 조회할 때마다&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1명의 친구를 조회하는 쿼리(1)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각각 두 개의 엔티티를 조회하는 쿼리(2)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;를 조회하므로, 100명을 조회하면 300개의 쿼리를 전송하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국 300개를 100개로 줄임으로써 성능을 (단순 계산, 약간의 오버를 섞어) 66.7프로 향상한 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;User는 프로젝트에서 가장 많이 사용하는 엔티티로써 문제를 해결함으로써 전체 시스템의 성능 개선에 기여할 수 있어서 좋았습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음 편 예고&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전 글들에 비해서 조금 전문적인 내용들이어서 재밌을지는 모르겠지만! 사실 상관없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어차피 개발 블로그니까 전문적인 내용도 있어야죠ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음은 em.remove()가 도대체 왜 안 되는 거야!?(가제)라는 주제로 글을 작성할 예정입니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 오늘도 파이팅입니다!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>JPA</category>
      <category>Lazy전략</category>
      <category>N+1</category>
      <category>OneToOne</category>
      <category>Spring</category>
      <category>SQL</category>
      <category>백엔드</category>
      <category>백엔드 성능 최적화</category>
      <category>성능최적화</category>
      <category>자바</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/26</guid>
      <comments>https://jun10920.tistory.com/26#entry26comment</comments>
      <pubDate>Wed, 10 Apr 2024 21:42:59 +0900</pubDate>
    </item>
    <item>
      <title>[SSAFY] 앰배서더 초청행사 후기</title>
      <link>https://jun10920.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;너무 오랜만에 돌아왔네요!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저의 졸업프로젝트이자 포트폴리오에도 사용하려고 앱 배포 및 유저 확보까지 기획 중인 프로젝트가 있어 너무 바빠서 블로그에 신경을 많이 못 쓴 거 같습니다 (핑계)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞으로 아무리 바쁘더라도 1주일에 한 개라도 쓸 수 있게... 노력해 보겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지원 계기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 학교에서 보내는 마지막 학기인 4학년 1학기가 시작된 지 벌써 한 달 정도 됐습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 현재 개발 관련해서는&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;20학점(18학점 전공 / 2학점 교양)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정보처리기사 필기시험 준비&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;졸업프로젝트(백엔드)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩테스트 준비&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정도하고 있습니다..! &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하나하나 너무 중요해서 포기하지 못하고 있지만, 이것들만 병행하기도 힘들어서 원래 코테 연습용으로 상반기 채용에 다 지원하려고 했으나 못 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 아쉬워서 대외활동 중에 괜찮은 게 없나 찾아보던 중 앰배서더 활동 모집 알림이 왔습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rRI3L/btsGhEceD9x/pCClp8RtjZYZ9sELNlVAW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rRI3L/btsGhEceD9x/pCClp8RtjZYZ9sELNlVAW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rRI3L/btsGhEceD9x/pCClp8RtjZYZ9sELNlVAW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrRI3L%2FbtsGhEceD9x%2FpCClp8RtjZYZ9sELNlVAW1%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;458&quot; height=&quot;442&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해 목표가 1순위 취업, 2순위 인턴 및 메이저 부트캠프인 만큼 싸피에 지원 시 면접 때 싸피에 대한 열정을 보여주기 좋은 소재인 것 같아서 열심히 서류를 작성해 지원했습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러고 다시 졸업프로젝트를 열심히 진행하던 중에 문자가 왔습니다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf826u/btsGh4In2JA/B3QPPLG7ZZt7mGkypHqFm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf826u/btsGh4In2JA/B3QPPLG7ZZt7mGkypHqFm1/img.png&quot; data-alt=&quot;앰배서더 초청장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf826u/btsGh4In2JA/B3QPPLG7ZZt7mGkypHqFm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf826u%2FbtsGh4In2JA%2FB3QPPLG7ZZt7mGkypHqFm1%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;405&quot; height=&quot;380&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;674&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;항공 관련 대학교라 학교가 비행장에 붙어있고, 시간이 너무 없어서 본가에 3주째 못 올라가고 있었는데 초청행사도 다녀올 겸 오랜만에 본가를 다녀왔습니다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초청행사 활동&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초청행사 활동은 크게 보면&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피와 싸피 앰배서더에 대한 OT&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피 서울캠퍼스 시설 견학&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피를 통해서 취업한 멘토분들과의 점심식사&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2916&quot; data-origin-height=&quot;3838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br5ZkE/btsGhE4osun/DJErPnvc7esm9MkNqI3zkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br5ZkE/btsGhE4osun/DJErPnvc7esm9MkNqI3zkk/img.png&quot; data-alt=&quot;멀티캠퍼스 입구&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br5ZkE/btsGhE4osun/DJErPnvc7esm9MkNqI3zkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr5ZkE%2FbtsGhE4osun%2FDJErPnvc7esm9MkNqI3zkk%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;466&quot; height=&quot;613&quot; data-origin-width=&quot;2916&quot; data-origin-height=&quot;3838&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;역삼에 있는 멀티캠퍼스 18층에서 진행했습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일산에서 가느라고 좀 고생하긴 했습니다만 가는 길에 공부도 하고 시간을 나름 잘 보냈습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVhgrz/btsGhSVIy5j/TjeKsww14818Knzfz9OBnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVhgrz/btsGhSVIy5j/TjeKsww14818Knzfz9OBnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVhgrz/btsGhSVIy5j/TjeKsww14818Knzfz9OBnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVhgrz%2FbtsGhSVIy5j%2FTjeKsww14818Knzfz9OBnK%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;435&quot; height=&quot;580&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;OT&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;OT 장소에 도착하면, 주관 측에서 정해준 조대로 나눠서 자리에 앉습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피가 유명한 메이저 부트캠프이기에 애초에 자세히 알고 있었는데도 OT를 통해서 좀 더 세세하게 어떤 활동을 하는 지랑 앰배서더가 어떤 활동을 하는지 알 수 있었습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지원금 월 100만 원, 무료 교육, 무료 취업 컨설팅 정도는 싸피를 아는 모든 사람들이 알만한 내용이라고 생각이 듭니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5대 은행 업무체약이 되어 있어서 신한은행, 국민은행, 하나은행, 우리은행, 농협은행에 많은 수료생들에게 기회가 주어지고, 이를 제외한 150여 개의 대~중견기업들이 SSAFY 출신이면 코테 면제, 서류 면제, 우선 채용 등의 혜택을 준다는 것을 알았습니다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 교육과정은 비전공자에게는 몰라도, 전공자나 이미 개발자로 취준해오던 사람에게는 큰 메리트가 없었는데요, 하지만 싸피에게만 열리는 대기업들의 채용공고가 있을 정도로 싸피에서 해주는 취업 관련 서비스들이 어마어마해서 이는 취업할 때 정말 큰 강점이 될 거라고 생각이 들었습니다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;멘토와의 점심식사&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2411&quot; data-origin-height=&quot;3510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6hicr/btsGizuvirf/HbPDDq2lmBX8Cl7TZ1e160/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6hicr/btsGizuvirf/HbPDDq2lmBX8Cl7TZ1e160/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6hicr/btsGizuvirf/HbPDDq2lmBX8Cl7TZ1e160/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6hicr%2FbtsGizuvirf%2FHbPDDq2lmBX8Cl7TZ1e160%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;449&quot; height=&quot;654&quot; data-origin-width=&quot;2411&quot; data-origin-height=&quot;3510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;OT 이후에 이미 싸피를 수료하시고 대기업에 취업하신 멘토분들과 점심시간을 함께 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기억에 남는 팁은&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서울의 경우 다른 지역 캠퍼스보다 경쟁률이 1.5배 정도 높다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특정 캠퍼스(예시: 광주나 구미)에서만 취업박람회 때 오는 기업들이 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피&amp;nbsp;입과 할 때 전공자들이 보는 코딩테스트의 난이도는 대략 실버정도이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시설 견학&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mcvPj/btsGkpqJlQd/3P1cZdPGFSKEZyaxXxbHV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mcvPj/btsGkpqJlQd/3P1cZdPGFSKEZyaxXxbHV0/img.png&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-is-animation=&quot;false&quot; width=&quot;386&quot; height=&quot;515&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mcvPj/btsGkpqJlQd/3P1cZdPGFSKEZyaxXxbHV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmcvPj%2FbtsGkpqJlQd%2F3P1cZdPGFSKEZyaxXxbHV0%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;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgjwQH/btsGj3g72xN/lVJZT8XP1V7c6gDZo6bKdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgjwQH/btsGj3g72xN/lVJZT8XP1V7c6gDZo6bKdk/img.png&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-is-animation=&quot;false&quot; data-filename=&quot;Untitled1.png&quot; width=&quot;506&quot; height=&quot;675&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgjwQH/btsGj3g72xN/lVJZT8XP1V7c6gDZo6bKdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgjwQH%2FbtsGj3g72xN%2FlVJZT8XP1V7c6gDZo6bKdk%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;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/div&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;굉장히 인테리어도 많이 신경 쓴 게 느껴지는 서울캠퍼스였습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 지역도 비슷한 분위기로 인테리어를 했다고 들었는데요, 임베디드 반을 위한 시설은 전체 캠퍼스 중에 2개밖에 없고 그중 하나가 오른쪽 사진입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mB1xC/btsGkBLfv0Q/DT9LVU5k7Yhkq2DFrk3hnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mB1xC/btsGkBLfv0Q/DT9LVU5k7Yhkq2DFrk3hnK/img.png&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mB1xC/btsGkBLfv0Q/DT9LVU5k7Yhkq2DFrk3hnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmB1xC%2FbtsGkBLfv0Q%2FDT9LVU5k7Yhkq2DFrk3hnK%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;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ld2Rv/btsGhSak8xn/vCsJLEBn6lMXu2N1uKVdQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ld2Rv/btsGhSak8xn/vCsJLEBn6lMXu2N1uKVdQk/img.png&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ld2Rv/btsGhSak8xn/vCsJLEBn6lMXu2N1uKVdQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLd2Rv%2FbtsGhSak8xn%2FvCsJLEBn6lMXu2N1uKVdQk%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;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인상 깊었던 것은 취업컨설팅 ROOM이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;평소에는 취업 컨설턴트 분들과 취업과 관련해서 컨설팅받는 곳이지만, 이렇게 AWS KOREA 뿐만 아니라 여러 대기업들이 직접 싸피를 찾아와서 취업 관련해서 컨설팅해 주고 면접도 바로 진행한다고 하더라고요!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정말 취업사관학교라고 느껴질 만큼 취업 관련해서는 지원이 대단한 것 같습니다..&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앰배서더 혜택&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각종 기념품들, 버티컬 마우스, 앰배서더 수료증, OPIC 응시권 등등이 있었습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이것들 뿐만 아니라 제가 생각하는 진짜 혜택은&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;싸피 입과시 면접에서의 효용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;같은 목표를 가진 조원들과 이미 싸피 경험이 있으신 멘토분들과의 교류&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20240402_193228677.jpg&quot; data-origin-width=&quot;5786&quot; data-origin-height=&quot;3610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HX3bl/btsGj5zf5Fz/KCxDhqHweDP3jUKkgd9AOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HX3bl/btsGj5zf5Fz/KCxDhqHweDP3jUKkgd9AOk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HX3bl/btsGj5zf5Fz/KCxDhqHweDP3jUKkgd9AOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHX3bl%2FbtsGj5zf5Fz%2FKCxDhqHweDP3jUKkgd9AOk%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;5786&quot; height=&quot;3610&quot; data-filename=&quot;KakaoTalk_20240402_193228677.jpg&quot; data-origin-width=&quot;5786&quot; data-origin-height=&quot;3610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개설한 싸피 홍보용 계정:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://www.instagram.com/ssafy_ozo.ab/?igsh=MWN1NHppMTlkZXFlZQ%3D%3D&amp;amp;utm_source=qr&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.instagram.com/ssafy_ozo.ab/?igsh=MWN1NHppMTlkZXFlZQ%3D%3D&amp;amp;utm_source=qr&lt;/a&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;긴 글 읽어주셔서 감사합니다&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발경험</category>
      <category>SSAFY</category>
      <category>SSAFY앰배서더</category>
      <category>싸피</category>
      <category>싸피 서포터즈</category>
      <category>싸피12기</category>
      <category>싸피후기</category>
      <category>싸핑앰배서더</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/25</guid>
      <comments>https://jun10920.tistory.com/25#entry25comment</comments>
      <pubDate>Tue, 2 Apr 2024 19:41:15 +0900</pubDate>
    </item>
    <item>
      <title>[SW마에스트로] 소마 15기 자소서 &amp;amp; 코딩테스트 후기</title>
      <link>https://jun10920.tistory.com/24</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올해 목표인 메이저 부트캠프 &amp;amp; 취업 중에서 가장 이른 시기에 진행된 소프트웨어 마에스트로 지원 관련해서 &lt;br /&gt;후기를 작성하려고 합니다.&lt;br /&gt;자소서 &amp;amp; 코딩테스트 관련해서 좋은 팁이 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;지원&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SW 마에스트로 과정은&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;1차 코테&lt;/li&gt;
&lt;li&gt;2차 코테&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;h3 data-ke-size=&quot;size23&quot;&gt;자소서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 기수와는 다르게 15기는&lt;b&gt; 2개의 자소서 문항&lt;/b&gt;만 작성하면 됐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 SW마에스트로가 원하는 인재상을 파악하기 위해서 홈페이지의 모든 내용과 채용 설명회, 과거에 합격하신 분들의 후기를 참고하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 각각의 글들에 대해 글을 쭉 작성하고 (처음엔 2500자 이상) 이후에 주변 사람들과 GPT4의 도움으로 내용을 첨삭하였습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. [자기소개] SW분야의 전문성을 키우기 위해 몰입했던 경험과 도전이 무엇인지, 또한 이러한 성장과정을 통해 얻은 배움은 무엇인지를 서술하여 주시기 바랍니다.(최소 400자, 최대 1000자 입력가능)&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;데이터베이스 프로젝트 (투두리스트): Vue.js 및 Express.js 활용, 한 달 만의 프로젝트 완성으로 백엔드 개발 역량 강화.&lt;/li&gt;
&lt;li&gt;고양시 최적 고깃집 위치 분석 프로젝트: 실제 비즈니스 결정에 기여한 데이터 분석 프로젝트를 통해 개발과 실생활 접점 경험.&lt;/li&gt;
&lt;li&gt;기본기 강조 및 지식 공유: C언어, 자료구조, 알고리즘 깊이 있는 학습과 노션 기록, 개발 블로그 운영을 통한 지식 공유 활동.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. [연수계획서] SW마에스트로 과정 참여를 통해 어떠한 프로젝트를 수행하고 싶은가요? 해당 프로젝트를 수행하기 위한 계획과 이루고자 하는 목표가 무엇인지 구체적으로 서술하여 주시기 바랍니다.&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;온라인 소품샵 플랫폼 개발: 홈 인테리어 시장의 성장에 주목하여, 각 소품샵의 독특한 분위기와 특색을 전달하는 플랫폼 구상. 사용자 맞춤형 UI/UX와 소품샵 사장님들의 철학을 공유하는 스토리텔링 섹션 포함.&lt;/li&gt;
&lt;li&gt;프로젝트 성공 전략: 사람들의 니즈를 충족하는 아이디어와 기획의 중요성 인식, 효율적인 소통과 협업을 위한 정기적인 스크럼 미팅과 Git을 통한 체계적인 버전 관리 계획.&lt;/li&gt;
&lt;li&gt;개발 경력 및 SW 마에스트로 과정 참여 목적: 항공정비 전공자로서 개발을 독학, 전문적인 개발 환경에서의 체계적인 멘토링과 실전 프로젝트 수행을 통한 기술적 역량 강화 및 창의적 문제 해결 능력 발전 목표. 우수 연수생으로 선정되어 CES 참관 등 해외 연수 기회 희망.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자소서 작성 팁은&lt;br /&gt;GPT4의 GPTS 중에서 자소서 작성을 첨삭해 주는데 유능한 GPTS들이 있습니다.&lt;br /&gt;이를 잘 이용하면 &lt;b&gt;글 작성 -&amp;gt; 피드백 받기 -&amp;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;h3 data-ke-size=&quot;size23&quot;&gt;코딩테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13기 이전 기수들은 문제 수나 유형이 종종 바뀐 것 같은데, 14기부터 15기는 알고리즘 4문제, SQL 1문제로 총 5문제가 나왔습니다.&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;그래서 이전 기수분들의 후기에서 필요한 정보들을 모아 정리했습니다.&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;보통 커트라인이 1.5 ~ 2솔&lt;/li&gt;
&lt;li&gt;그래서 알고리즘 쉬운 문제 1개, SQL만 맞추고 합격하는 경우가 다수 존재&lt;/li&gt;
&lt;li&gt;유형은 구현, BFS/DFS가 대부분이고, 어려운 유형은 1 ~ 2개 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 위와 같은 부분을 참고해서 이코테 강의를 모두 수강하고 프로그래머스의 고득점 KIT를 푸는 방식으로 준비했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1차 코딩 테스트 문제 정리&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 유출은 불가능하고, 제가 기억에 남는 부분들 위주로 작성했습니다.&lt;br /&gt;저는 1, 3, 5번 문제를 풀었고 나머진 지인과 복기한 내용입니다.&lt;br /&gt;문제에 밑줄이 그어진 것은 시험 당시 못 풀었던 문제입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1번 문제 - 배달 거리에 따른 배달비 문제&lt;/h4&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;나의 풀이: 이전 코테 후기와 마찬가지로 1번 문제는 너무 쉬운 구현 문제여서 10분 만에 풀은 것 같습니다. 그냥 문제 보고 실수하지 않고 작성하면 되는 수준이었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;del&gt;2번 문제 - 연속된 직사각형에서 삼각형으로 나누고 넓이 구하기&lt;/del&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;br /&gt;아래 후기에 적겠지만, 가장 아쉬운 문제였습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3번 문제 - 연산 이후 최종 폰트 크기 구하기&lt;/h4&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;나의 풀이: DICT형에 문제에서 요구한 대로 폰트 크기를 수정하는 코드를 작성하면 됐습니다. 시간이 좀 걸렸지만 난이도 자체가 어려운 편은 아니었습니다.&lt;br /&gt;풀이 과정은 &lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/86971&quot;&gt;전력망을 둘로 나누기&lt;/a&gt; 문제와 비슷했다고 생각합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;del&gt;4번 문제 - n개의 정수를 크기가 n인 배열에 조건대로 저장하기&lt;/del&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;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5번 문제 - 합격자들을 고루 나눈 그룹의 최댓값 구하기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알고리즘: GROUP BY, ORDER BY, LIMIT&lt;/li&gt;
&lt;li&gt;나의 풀이: 프로그래머스 고득점 KIT로 충분히 대비할만한 수준이었고, 다만 문제의 유형이 메서드를 알고 있냐 보다는 이걸 어떻게 응용하는지 고민하게 하는 유형이었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;후기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 정리한 대로, 이제껏 모든 후기에서 1.5 ~ 2개의 합격컷이었다는 얘기가 다수였기 때문에 약 35분 만에 1번 5번을 풀고, 3번을 약 45분간 풀어서 3문제를 다 푸니 약 35분이 남았습니다.&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;/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;고민을 하다가, 이미 기존의 합격 컷보다 많이 맞춘 상황이었기 때문에 테스트 케이스를 추가하며 3문제를 완벽하게 풀려고 노력했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그래서 저는 &lt;b&gt;3문제,&lt;/b&gt; 제 지인은 3.5 솔로 마무리했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 사실 합격할 줄 알고 2차 코테를 준비했는데, 예상외로 저와 제 친구 모두 &lt;b&gt;불합격&lt;/b&gt;이었습니다.&lt;br /&gt;SW 마에스트로 단톡방에서도 통계적으로 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;br /&gt;1차 시험번호로 추측했을 때 4500번이 넘었다는데 작년에 비해 모집인원은 약간 줄고, 지원인원은 2배 늘은 것과 시간이 &lt;b&gt;35분 남았을 때 문제를 더 풀지 않은 것&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;&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;약 1달간 프로그래머스 109 문제&lt;/li&gt;
&lt;li&gt;백준 83 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 풀고, 난이도가 이전보다 쉬워졌다한들 1시간 반동안 3문제를 푼 것에 의미를 두려고 합니다.&lt;br /&gt;다음 기수를 준비하시는 분들께 도움이 됐으면 합니다 &lt;/p&gt;</description>
      <category>개발경험</category>
      <category>SW마에스트로</category>
      <category>부트캠프</category>
      <category>소마</category>
      <category>소프트웨어마에스트로</category>
      <category>자소서</category>
      <category>코딩테스트</category>
      <category>코테</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/24</guid>
      <comments>https://jun10920.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 4 Mar 2024 12:51:09 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 의상 파이썬(python)</title>
      <link>https://jun10920.tistory.com/23</link>
      <description>&lt;h2&gt;시작하며&lt;/h2&gt;
&lt;p&gt;프로그래머스 고득점 kit 카테고리 중 해시에 관련된 문제이므로&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;해시맵 설명&lt;/li&gt;
&lt;li&gt;첫번째 코드 / 해설&lt;/li&gt;
&lt;li&gt;두번째 코드 / 해설&lt;br&gt;이렇게 글을 작성하겠습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;해시맵이란?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;키를 값에 mapping하는 데이터 구조&lt;/li&gt;
&lt;li&gt;키의 hash()를 사용하여 내부의 해시 테이블에 데이터를 저장&lt;/li&gt;
&lt;li&gt;파이썬에서는 dict 타입을 통해서 일반적으로 구현&lt;/li&gt;
&lt;li&gt;평균적으로 상수 O(1) 시간 내에 연산을 해서 매우 효율적&lt;/li&gt;
&lt;li&gt;하지만 시간 복잡도는 O(n)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;자주 사용되는 해시맵의 메서드들&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;dict[key]&lt;/code&gt;&lt;/strong&gt;: 키에 해당하는 값을 반환&lt;br&gt;키가 딕셔너리에 없는 경우 &lt;strong&gt;&lt;code&gt;KeyError&lt;/code&gt;&lt;/strong&gt; 예외를 발생&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;update()&lt;/code&gt;&lt;/strong&gt;: 다른 딕셔너리의 키-값 쌍을 현재 딕셔너리에 추가&lt;br&gt;이미 존재하는 키의 경우, 값을 업데이트&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  dictionary.update(another_dictionary)&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;keys()&lt;/code&gt;&lt;/strong&gt;: 딕셔너리의 키들을 반환하는 뷰(view)를 제공&lt;br&gt;이 뷰는 딕셔너리의 키들을 반복(iteration)하기 위해 사용 가능&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;values()&lt;/code&gt;&lt;/strong&gt;: 딕셔너리의 값들을 반환하는 뷰를 제공&lt;br&gt;이를 통해 딕셔너리의 모든 값들을 반복&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;items()&lt;/code&gt;&lt;/strong&gt;: 딕셔너리의 키-값 쌍을 튜플로 묶은 뷰를 반환&lt;br&gt;이는 딕셔너리를 순회할 때 자주 사용&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;  pythonCopy code
  for key, value in dictionary.items():
      print(key, value)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;pop(key)&lt;/code&gt;&lt;/strong&gt;: 주어진 키에 해당하는 항목을 dict에서 제거하고, 그 값을 반환&lt;br&gt;키가 딕셔너리에 없는 경우 &lt;strong&gt;&lt;code&gt;KeyError&lt;/code&gt;&lt;/strong&gt;를 발생&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;  pythonCopy code
  value = dictionary.pop(key)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;popitem()&lt;/code&gt;&lt;/strong&gt;: 딕셔너리에서 임의의 키-값 쌍을 제거하고 해당 쌍을 튜플로 반환&lt;br&gt;Python 3.7 이상에서는 마지막에 추가된 항목을 반환합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1번째 코드 / get메서드 이용&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def solution(clothes):
    dic= {}
    for c, t in clothes:
        dic[t] = dic.get(t,0) + 1
    answer = 1
    for i in dic:
        answer *= (dic[i] + 1)
    return answer -1&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;옷 종류별 개수 계산 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;for c, t in clothes:&lt;/code&gt;&lt;/strong&gt; 루프를 사용해서 clothes 리스트를 순회하며 각 옷의 종류 별로 개수를 세서 dic에 저장&lt;br&gt;&lt;strong&gt;&lt;code&gt;dic[t] = dic.get(t,0) + 1&lt;/code&gt;&lt;/strong&gt;에서 t(type)이 dic에 존재하면 1을 증가해서 저장하고, 없으면 default값(0)으로 저장한다는 의미&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;조합의 수 계산&lt;br&gt;각 옷 종류별 옷을 입지 않은 경우를 포함하여 조합의 수를 계산&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;answer *= (dic[i] + 1)&lt;/code&gt;&lt;/strong&gt;에서 +1이 해당 옷 종류를 아예 입지 않은 경우를 추가하기 위함이다.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;아무것도 입지 않은 경우 제외&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;return answer -1&lt;/code&gt;&lt;/strong&gt;에서 모든 옷을 입지 않은 경우를 -1 해준다.&lt;/p&gt;
&lt;h3&gt;예시&lt;/h3&gt;
&lt;p&gt;headgear 옷 2벌, eyewear 옷 1벌이 있는 상황&lt;br&gt;headgear1, headgear2, 안 입기 -&amp;gt; 총 3가지 선택지&lt;br&gt;eyewear1, 안 입기 -&amp;gt; 총 2가지 선택지&lt;br&gt;결론적으로 3 * 2 - 1(아무것도 안 입은 경우) = 5가지 &lt;/p&gt;
&lt;h2&gt;2번째 코드 / Counter 이용&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def solution(clothes):
    from collections import Counter
    from functools import reduce
    cnt = Counter([kind for name, kind in clothes])
    answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Counter 사용&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt; pythonCopy code
 cnt = Counter([kind for name, kind in clothes])&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;이 코드는 리스트 컴프리헨션을 사용하여 &lt;strong&gt;&lt;code&gt;clothes&lt;/code&gt;&lt;/strong&gt; 리스트에서 각 옷의 종류(&lt;strong&gt;&lt;code&gt;kind&lt;/code&gt;&lt;/strong&gt;)만 추출&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Counter&lt;/code&gt;&lt;/strong&gt; 객체는 이러한 옷 종류들의 각각의 빈도수를 계산하여, 각 옷 종류별 개수를 담은 &lt;strong&gt;&lt;code&gt;Counter&lt;/code&gt;&lt;/strong&gt; 객체를 생성&lt;br&gt;예를 들어, &lt;strong&gt;&lt;code&gt;clothes&lt;/code&gt;&lt;/strong&gt;가 &lt;strong&gt;&lt;code&gt;[[&amp;quot;hat&amp;quot;, &amp;quot;headgear&amp;quot;], [&amp;quot;sunglasses&amp;quot;, &amp;quot;eyewear&amp;quot;], [&amp;quot;turban&amp;quot;, &amp;quot;headgear&amp;quot;]]&lt;/code&gt;&lt;/strong&gt;라면&lt;/li&gt;
&lt;li&gt;&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;cnt&lt;/code&gt;&lt;/strong&gt;는 &lt;strong&gt;&lt;code&gt;Counter({&amp;#39;headgear&amp;#39;: 2, &amp;#39;eyewear&amp;#39;: 1})&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;reduce 사용&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;pythonCopy code
answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;reduce&lt;/code&gt;&lt;/strong&gt; 함수는 주어진 함수를 시퀀스(&lt;strong&gt;&lt;code&gt;cnt.values()&lt;/code&gt;&lt;/strong&gt;)의 항목에 누적적으로 적용하여 단일 값으로 줄임&lt;br&gt;여기서는 &lt;strong&gt;&lt;code&gt;lambda x, y: x*(y+1)&lt;/code&gt;&lt;/strong&gt; 함수를 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cnt.values()&lt;/code&gt;&lt;/strong&gt;는 &lt;strong&gt;&lt;code&gt;Counter&lt;/code&gt;&lt;/strong&gt; 객체에서 각 옷 종류별 개수를 반환&lt;br&gt;이 예제에서는 &lt;strong&gt;&lt;code&gt;[2, 1]&lt;/code&gt;&lt;/strong&gt;을 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;lambda&lt;/code&gt;&lt;/strong&gt; 함수는 누적값 &lt;strong&gt;&lt;code&gt;x&lt;/code&gt;&lt;/strong&gt;와 현재값 &lt;strong&gt;&lt;code&gt;y&lt;/code&gt;&lt;/strong&gt;를 인자로 받아,&lt;br&gt;각 옷 종류별로 &amp;quot;안 입는 경우&amp;quot;를 포함하여 &lt;strong&gt;&lt;code&gt;(y+1)&lt;/code&gt;&lt;/strong&gt;을 곱한 다음,&lt;br&gt;최종적으로 모든 옷 종류에 대한 조합의 수를 계산&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;reduce&lt;/code&gt;&lt;/strong&gt;의 세 번째 인자인 &lt;strong&gt;&lt;code&gt;1&lt;/code&gt;&lt;/strong&gt;은 초기값으로, 옷을 하나도 입지 않은 경우를 의미&lt;br&gt;이 경우는 마지막에 &lt;strong&gt;&lt;code&gt;1&lt;/code&gt;&lt;/strong&gt;을 통해 제외합니다.&lt;/li&gt;
&lt;li&gt;예를 들어, &lt;strong&gt;&lt;code&gt;[2, 1]&lt;/code&gt;&lt;/strong&gt;에 대해 계산하면, &lt;strong&gt;&lt;code&gt;(1*(2+1))*(1+1) - 1 = 5&lt;/code&gt;&lt;/strong&gt;입니다.&lt;br&gt;이는 가능한 모든 옷의 조합 수에서 아무것도 입지 않은 경우를 뺀 값&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;reduce 메서드&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from functools import reduce

result = reduce(function, sequence[, initial])
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;function&lt;/code&gt;&lt;/strong&gt;: 두 인자를 받는 함수&lt;br&gt;첫 번째 인자는 누적 값(현재까지의 결과)&lt;br&gt;두 번째 인자는 시퀀스에서 현재 처리 중인 요소&lt;br&gt;이 함수의 반환 값은 다음 단계의 누적 값&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sequence&lt;/code&gt;&lt;/strong&gt;: &lt;strong&gt;&lt;code&gt;reduce&lt;/code&gt;&lt;/strong&gt;에 적용할 iterable(리스트, 튜플 등)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;initial&lt;/code&gt;&lt;/strong&gt; (선택적): 누적 작업의 초기값&lt;br&gt;이 값이 제공되면, 시퀀스의 첫 번째 요소 전에 이 값이 위치한 것으로 간주&lt;br&gt;제공되지 않으면, 시퀀스의 첫 번째 요소가 초기값으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;reduce 사용 예시&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;pythonCopy code
from functools import reduce

# 두 숫자를 더하는 함수
def add(x, y):
    return x + y

# 시퀀스 정의
numbers = [1, 2, 3, 4]

# reduce 함수 사용
result = reduce(add, numbers)

print(result)  # 출력: 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 예시에서 &lt;strong&gt;&lt;code&gt;reduce&lt;/code&gt;&lt;/strong&gt; 함수는 &lt;strong&gt;&lt;code&gt;add&lt;/code&gt;&lt;/strong&gt; 함수를 &lt;strong&gt;&lt;code&gt;numbers&lt;/code&gt;&lt;/strong&gt; 리스트의 요소들에 누적적으로 적용 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;처음 두 요소 &lt;strong&gt;&lt;code&gt;1&lt;/code&gt;&lt;/strong&gt;과 &lt;strong&gt;&lt;code&gt;2&lt;/code&gt;&lt;/strong&gt;에 &lt;strong&gt;&lt;code&gt;add&lt;/code&gt;&lt;/strong&gt; 함수 적용: 결과는 &lt;strong&gt;&lt;code&gt;3&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;이전 단계의 결과 &lt;strong&gt;&lt;code&gt;3&lt;/code&gt;&lt;/strong&gt;과 다음 요소 &lt;strong&gt;&lt;code&gt;3&lt;/code&gt;&lt;/strong&gt;에 &lt;strong&gt;&lt;code&gt;add&lt;/code&gt;&lt;/strong&gt; 함수 적용: 결과는 &lt;strong&gt;&lt;code&gt;6&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;이전 단계의 결과 &lt;strong&gt;&lt;code&gt;6&lt;/code&gt;&lt;/strong&gt;과 마지막 요소 &lt;strong&gt;&lt;code&gt;4&lt;/code&gt;&lt;/strong&gt;에 &lt;strong&gt;&lt;code&gt;add&lt;/code&gt;&lt;/strong&gt; 함수 적용: 최종 결과는 &lt;strong&gt;&lt;code&gt;10&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;배운점&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;해시맵의 개념과 자주 사용하는 메서드에 대해서 배웠습니다.&lt;/li&gt;
&lt;li&gt;get 메서드를 사용할 때 초기값을 설정하는 법을 배웠습니다.&lt;/li&gt;
&lt;li&gt;Counter를 사용해 dict를 생성하는 법을 배웠습니다.&lt;/li&gt;
&lt;li&gt;reduce 메서드를 이용하면 누적값을 이용하는 경우 코드를 현저히 줄일 수 있다는 것을 알았습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;h3&gt;해시맵이 알고리즘 문제 해결에 어떻게 도움이 되나요?&lt;/h3&gt;
&lt;p&gt;해시맵은 키-값 쌍을 효율적으로 저장하고 검색할 수 있는 데이터 구조로,&lt;br&gt;다양한 알고리즘 문제를 해결하는 데 있어 핵심적인 역할을 합니다.&lt;br&gt;해시맵의 장점은 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;빠른 검색 시간:&lt;/strong&gt; 평균적으로 O(1)의 시간 복잡도로 데이터를 검색할 수 있어, 대량의 데이터를 다루는 문제에서 시간 효율성을 크게 개선할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;동적 데이터 저장:&lt;/strong&gt; 해시맵은 동적으로 데이터를 추가, 수정, 삭제할 수 있어, 문제의 요구에 따라 유연하게 데이터를 관리할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;키에 의한 직접 접근:&lt;/strong&gt; 키를 사용해 직접 값을 접근할 수 있어, 배열이나 리스트에서 요소를 찾기 위해 순차적으로 탐색하는 것보다 훨씬 빠릅니다.&lt;/p&gt;
&lt;h3&gt;프로그래밍 문제를 해결할 때 dict와 Counter 중 어느 것을 선택해야 하나요?&lt;/h3&gt;
&lt;p&gt;dict와 Counter는 파이썬에서 제공하는 두 가지 유용한 데이터 구조입니다. 각각의 선택은 문제의 특성과 요구 사항에 따라 달라집니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;dict의 경우:&lt;/strong&gt; dict는 키-값 쌍을 저장하는 범용적인 자료 구조로, 유연성이 뛰어나고 사용자 정의 객체를 키로 사용할 수 있습니다. 복잡한 데이터 구조를 구성하거나, 키와 관련된 값이 동적으로 변화하는 경우 dict를 사용하는 것이 좋습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Counter의 경우&lt;/strong&gt;: Counter는 collections 모듈의 일부로, 요소의 등장 횟수를 카운트하는 데 특화된 dict 서브클래스입니다. 주로 요소의 빈도수를 쉽게 계산하고자 할 때 사용됩니다.&lt;br&gt;예를 들어, 문자열이나 리스트에서 각 요소의 출현 횟수를 세어야 하는 경우 Counter가 매우 효율적입니다.&lt;/p&gt;
&lt;h3&gt;reduce 함수는 파이썬에서 어떤 경우에 유용하게 사용되나요?&lt;/h3&gt;
&lt;p&gt;reduce 함수는 functools 모듈에 속해 있으며, 주어진 함수를 시퀀스의 모든 요소에 누적적으로 적용하여 하나의 값으로 축소합니다.&lt;/p&gt;
&lt;p&gt;reduce는 다음과 같은 경우에 유용합니다&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;집계 작업:&lt;/strong&gt; 여러 값들을 하나의 결과값으로 집계해야 할 때&lt;br&gt;예를 들어 합계, 곱셈 등의 연산을 전체 리스트에 적용해야 하는 경우.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;함수형 프로그래밍 패턴:&lt;/strong&gt; 람다 함수와 함께 사용하여 코드를 간결하게 만들고자 할 때&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;파이프라인 작업:&lt;/strong&gt; 여러 처리 단계를 거쳐 최종 결과를 도출해야 하는 경우, 각 단계의 결과를 다음 단계의 입력으로 전달하는 방식으로 reduce를 사용할 수 있습니다.&lt;/p&gt;</description>
      <category>PS</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/23</guid>
      <comments>https://jun10920.tistory.com/23#entry23comment</comments>
      <pubDate>Mon, 12 Feb 2024 01:31:07 +0900</pubDate>
    </item>
    <item>
      <title>자바 예외 처리 / 스프링 입문 전 개념 정리</title>
      <link>https://jun10920.tistory.com/22</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;시작하며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;김영한님의 자바 로드맵을 마치고 스프링 입문 강의를 듣기에 앞서 수강 전 문의로 질문을 드렸습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jun10920/post/76c7eeec-fb72-4d63-8a91-b22f0926e025/image.png&quot; alt=&quot;질문에 대한 답변&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 전공 수업으로 객체지향 프로그래밍 과목을 수강했기에 전공때 배운 서적을 바탕으로 컬렉션 프레임워크를 공부했고, 예외처리 부분은 전공 서적에 자세히 나와있지 않아서 GPT와 함께 공부했습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 예외처리의 깊은 부분까지 다루지는 않고, 저처럼 영한님 스프링 강의를 듣기 전에 이정도만 알고 가자~ 하는 부분까지만 다룹니다!&lt;/p&gt;
&lt;/blockquote&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;/ul&gt;
&lt;/li&gt;
&lt;li&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예외
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;try-catch 문을 통해서 제어할 수 있는 오류&lt;/li&gt;
&lt;li&gt;발생해도 시스템이나 사용자에게 해를 끼치지 않고 정상적으로 프로그램을 종료 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;예외(Exception)는 프로그램 실행 중 발생할 수 예상치 못한 이벤트를 의미합니다.&lt;br /&gt;에러는 아래와 같은 경우에 주로 발생합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예외가 발생하는 경우&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정수를 0으로 나누는 경우&lt;/li&gt;
&lt;li&gt;배열의 크기보다 큰 인덱스로 배열의 원소를 접근하는 경우&lt;/li&gt;
&lt;li&gt;존재하지 않는 파일을 읽으려는 경우&lt;/li&gt;
&lt;li&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;만약 예외 처리를 담당하는 코드 (try - catch)문을 가지고 있지 않다면 응용프로그램을 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예외 처리 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서는 try-catch-finally 구문을 통해 예외를 처리합니다. 기본적인 구조는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class ErrorHandlingExample {
    public static void main(String[] args) {
        try {
            // 예외가 발생할 가능성이 있는 코드 블록
        } catch (ExceptionType e) {
            // 예외 처리 코드 블록
        } finally {
            // 예외 발생 여부와 상관없이 실행되는 코드 블록
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;try 블록 안에는 예외가 발생할 가능성이 있는 코드를 배치합니다.&lt;br /&gt;catch 블록에는 특정 유형의 예외를 처리합니다.&lt;br /&gt;필요한 경우 여러 개의 catch 블록을 사용하여 다양한 유형의 예외를 다르게 처리할 수 있습니다.&lt;br /&gt;finally 블록은 예외 발생 여부와 상관없이 실행되며, 주로 리소스 해제와 같은 정리 작업에 사용됩니다(생략도 가능).&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예외 처리 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 파일을 읽는 과정에서 발생할 수 있는&lt;br /&gt;&lt;code&gt;FileNotFoundException&lt;/code&gt;과 &lt;code&gt;IOException&lt;/code&gt;을 처리하는 예시를 통해서 좀 더 자세히 설명하겠습니다.&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;public class FileReadExample {
    public static void main(String[] args) {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(&quot;nonexistentfile.txt&quot;));
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                line = reader.readLine();
            }
        } catch (FileNotFoundException e) {
            System.err.println(&quot;파일을 찾을 수 없습니다: &quot; + e.getMessage());
        } catch (IOException e) {
            System.err.println(&quot;파일 읽기 오류: &quot; + e.getMessage());
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    System.err.println(&quot;리더 닫기 오류: &quot; + e.getMessage());
                }
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 try 블록에서 파일을 열어 한 줄씩 읽는 코드 입니다.&lt;br /&gt;파일이 존재하지 않거나 읽을 수 없는 경우 catch 블록을 통해 적절하게 예외 처리 로직이 실행됩니다.&lt;br /&gt;마지막으로 finally 블록을 통해서 예외의 발생 여부와 관계없이 항상 안정적으로 파일 리더를 종료하도록 합니다.&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;gt; 오류로 인해 프로그램이 갑자기 종료되지 않는 등..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 예외 처리는 자바 프로그래밍에서 단순한 오류 처리를 넘어서 프로그램의 신뢰성과 유지보수성을 향상시키는 중요한 기법입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;FAQ&lt;/h3&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;예외 처리는 프로그램의 안정성과 신뢰성을 보장하며, 예상치 못한 오류로부터 프로그램을 보호합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;finally&lt;/code&gt; 블록은 언제 사용되나요?&lt;br /&gt;&lt;code&gt;finally&lt;/code&gt;&lt;/b&gt; 블록은 예외 발생 여부와 상관없이 실행되어야 하는 코드, 주로 리소스 해제 코드를 포함하기 위해 사용해요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 정의 예외는 어떻게 만들 수 있나요?&lt;/b&gt;&lt;br /&gt;사용자 정의 예외는 &lt;b&gt;&lt;code&gt;Exception&lt;/code&gt;&lt;/b&gt; 클래스를 상속받아 구현할 수 있으며, 특정 상황에 맞는 예외 처리 로직을 포함할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예외 처리를 잘못하면 어떤 문제가 발생하나요?&lt;/b&gt;&lt;br /&gt;잘못된 예외 처리는 프로그램의 오류를 숨기거나, 오류 발생 시 적절한 대응을 하지 못하여 프로그램이 불안정해지는 원인이 될 수 있어요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예외 처리와 성능의 관계는 어떻게 되나요?&lt;/b&gt;&lt;br /&gt;예외 처리는 프로그램 성능에 영향을 줄 수 있지만 적절히 사용되면 프로그램의 안정성과 유지보수성을 높이는 데 기여해요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;맺으며&lt;/h3&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;/p&gt;</description>
      <category>자바</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/22</guid>
      <comments>https://jun10920.tistory.com/22#entry22comment</comments>
      <pubDate>Wed, 7 Feb 2024 14:28:39 +0900</pubDate>
    </item>
    <item>
      <title>스프링 입문_윈도우에서 스프링 부트 build 에러 문제 해결</title>
      <link>https://jun10920.tistory.com/21</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시작하며&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;김영한 님의 스프링 입문 강의를 듣던 중, build 하는 과정에서 계속 에러가 발생해서 이를 디버깅하는데 3시간을 썼다..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 결국 의지의 한국인답게 해결.. 거창하진 않지만 그 과정을 얘기하려 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;build 과정 중에 해결한 에러는 2개였는데, 스프링 자체를 이제 막 입문한 상황이라 어떤 폴더에 뭐가 있고 왜 있는지 파악을 제대로 못한 상황이라서 쉽지 않았다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 글을 통해서 다음에 같은 문제를 마주할 분들에게 도움이 되는 마음에 공유한다.&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 번째 에러 - &lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;버전 차이로 인한 에러&lt;/span&gt; &lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1706978415039&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A problem occurred configuring root project 'hello-spring'.
&amp;gt; Could not resolve all files for configuration ':classpath'.
   &amp;gt; Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.2.2.
     생략&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전에 자바 로드맵을 하면서 이미 자바 21 버전을 인텔리제이에서 다운로드하여서 사용 중이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;근데 에러 메시지에서 계속 내가 8 버전을 사용 중이니 17 버전 이상의 자바를 사용하라는 에러였다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;b&gt; IDE 설정&lt;/b&gt;&amp;nbsp;변경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 인프런 질문 게시판과 구글링, 챗gpt, 김영한 님 로드맵 FAQ 문서 등 모든 것을 참고해서 gradle과 project 설정을 전부 다운로드한 자바 21 버전으로 맞추었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;환경 변수 변경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 계속 문제가 발생되어서 더욱 검색을 해보니 환경 변수를 확인해 보라는 얘기였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서? 환경 변수도 21 버전으로 바꾸고, 다시 스프링 부트 프로젝트를 init 하고 시작했는데도 같은 문제가 반복되었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;캐시 문제 해결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;gradle 탭을 이용해서 캐시를 clean을 여러 번 진행하고 다시 재시작해도 해결되지 않았다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b&gt;플러그인 및 의존성 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;plugin 내용과 dependencies 부분도 제대로 되어 있나 확인했다. 문제가 없었지만 재설치하고 실행해도 같은 문제가 발생했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아니 도대체 왜 인텔리제이 내의 모든 설정을 자바 21로 맞추고 했는데도 자꾸 8 버전을 쓴다고 나오지!?!?!&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러다 작년에 전공 수업에서 이클립스를 사용할 때 사용했던 8 버전이 생각났다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 프로그램 추가 제거를 통해서 검색해 보니 인텔리제이 내에서는 21 버전을 사용한 게 맞지만, 기본 자바 프로그램으로 깔려있는 버전이 8 버전이라서 build시 프롬프트에서 이를 이용해서 그런 게 아닌가 싶은 생각이 들었다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 21 버전을 제외한 모든 자바를 삭제했다. 그리고 이클립스로 돌아가지 않을 것이니 인텔리제이의 내장되어 있는 시스템을 믿고 디스크 자체에 다운되어 있던 자바도 모두 삭제하였다.&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: #374151; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국 인텔리제이에서는 이미 Java 21을 사용 중이었음에도 시스템의 기본 Java 버전이 8로 설정되어 있어 발생한 문제였다. &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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그러고 나서 실행을 하니..!! 새로운 에러가 또 발생했다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두 번째 에러 - 테스트 파일 인식 문제&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1706979187767&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; Task :test FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
&amp;gt; There were failing tests. See the report at: file:///D:/%EA%B0%9C%EB%B0%9C/Java/%EA%B9%80%EC%98%81%ED%95%9C%20%EB%A1%9C%EB%93%9C%EB%A7%B5/%EC%8A%A4%ED%94%84%EB%A7%81%20%EC%9E%85%
EB%AC%B8_%EC%BD%94%EB%93%9C%EB%A1%9C%20%EB%B0%B0%EC%9A%B0%EB%8A%94%20%EC%8A%A4%ED%94%84%EB%A7%81%20%EB%B6%80%ED%8A%B8,%20%EC%9B%B9MVC,%20DB%20%EC%A0%91%EA%B7%BC%20%EA%B8%B0%EC%88%A0/hello-spring/build/reports/tests/test/index.html

* Try:
&amp;gt; Run with --scan to get full insights.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전체 길이는 너무 길어서 줄여서 적었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;에러 코드의 내용을 요약하자면 test 작업 실행 중 에러가 발생했다는 것이고, reports 폴더에 테스트 보고서를 작성했다는 얘기다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 gradle로 다시 과정마다 나눠서 실행해 보니 test에서만 문제가 생기는 것을 직접 확인하고 테스트 보고서 내용을 참고해서 다시 에러를 분석했다.&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: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GPT가 에러를 분석해 준 내용은 아래와 같다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;제공된 테스트 보고서 내용에 따르면, 총 1개의 테스트가 실행되었으며, 그중 1개가 실패했습니다. 성공률이 0%로, 모든 테스트가 실패한 상태입니다. 특히, &quot;Gradle Test Executor 2&quot;라는 테스트 클래스에서 실패가 발생했음이 언급되어 있습니다.&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후에도 코드를 수정하면 2에서 6으로, 6에서 7로 테스트 클래스 실패한 게 넘어갈 뿐 계속 테스트 클래스에서 문제가 발생했다.&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: #374151; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그런 와중에 테스트를 아예 안 하고 build를 하면 넘어가진다는 인프런 문의 답변 글을 봤다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706979435176&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;Task :test FAILED이 뜹니다. - 인프런&quot; data-og-description=&quot;학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/questions/812955/task-test-failed%EC%9D%B4-%EB%9C%B9%EB%8B%88%EB%8B%A4&quot; data-og-url=&quot;https://www.inflearn.com/questions/812955/task-test-failed%EC%9D%B4-%EB%9C%B9%EB%8B%88%EB%8B%A4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pfSBt/hyVb0LhTWB/RnoG0EWWhWCr5GMpEmyAN1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/cQLe9p/hyVfYE38im/PEl5DezHPS51kVMzLGT7F1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/dVUwOa/hyVgdCcdwE/2wpSbs3cczUl7CTsxPPV1k/img.png?width=1094&amp;amp;height=416&amp;amp;face=0_0_1094_416&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/812955/task-test-failed%EC%9D%B4-%EB%9C%B9%EB%8B%88%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/questions/812955/task-test-failed%EC%9D%B4-%EB%9C%B9%EB%8B%88%EB%8B%A4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pfSBt/hyVb0LhTWB/RnoG0EWWhWCr5GMpEmyAN1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/cQLe9p/hyVfYE38im/PEl5DezHPS51kVMzLGT7F1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/dVUwOa/hyVgdCcdwE/2wpSbs3cczUl7CTsxPPV1k/img.png?width=1094&amp;amp;height=416&amp;amp;face=0_0_1094_416');&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;Task :test FAILED이 뜹니다. - 인프런&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼&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;&lt;span style=&quot;color: #374151; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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: #374151; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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: #374151; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;완벽히 해결하기 위해서 GPT가 해보라는 단계 별로 하나하나 해보다가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; hello.hellospring.HelloSpringApplicationTests&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 클래스를 실행하는 데 실패한 것으로 나타났습니다. 이 문제는 &lt;/span&gt;ClassNotFoundException&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;으로 인해 발생했으며, 이는 &lt;/span&gt;HelloSpringApplicationTests&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt; 클래스를 찾을 수 없음을 의미합니다. 이러한 유형의 오류는 일반적으로 다음과 같은 몇 가지 이유로 발생할 수 있습니다:&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&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: #374151; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이를 일반적인 클래스 경로에 대해서 찾아봤는데, &lt;span style=&quot;color: #111827; text-align: left;&quot;&gt;src/test/java에 주로 있다고 하였다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #111827; text-align: left;&quot;&gt;내 test 클래스는 저 경로에 잘 있는데 왜... 인식을 못하지..?&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;&lt;span style=&quot;color: #111827; text-align: left;&quot;&gt;여기서 또 테스트 라이브러리인 JUnit은 제대로 깔려 있는지, gradle 버전은 최신 버전으로 업그레이드는 됐는지 등등 또 억겁의 디버깅의 시간이 지났다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;&lt;span style=&quot;color: #111827; text-align: left;&quot;&gt;그런 와중에! 자주는 아니지만 가끔 &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; letter-spacing: 0px;&quot;&gt;Windows에서 사용하는 한글 인코딩과 JVM에서 사용하는 file encoding이 달라서 프로젝트의 파일들을 제대로 읽지 못하는 문제&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; letter-spacing: 0px;&quot;&gt;가 발생한다는 내용을 발견했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; letter-spacing: 0px;&quot;&gt;그래서 모든 파일 저장 경로 중에서 한글이 있는 부분을 다 영어로 바꾸고, 스프링 부트 프로젝트를 다시 init하니 드디어 테스트를 생략하지 않고 build를 성공했다.&lt;/span&gt;&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;후기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;장장 3시간에 걸친 디버깅이었고, 원래 나가려던 진도만큼 못 나가게 됐지만 그래도 긴 시간 동안 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;gradle이 뭔지, 의존성은 어디서 확인하는지, 자바에서는 터미널 창을 어떻게 다루는지, 기본 powershell 말고 명령어를 더 다양하게 쓸 수 있는 git bash를 인텔리제이에서 어떻게 바로 쓸 수 있는지, 에러 메시지를 어떻게 파악하고 이를 해결해 나갈지 등등 아주 많은 것을 배운 경험이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 테스트를 생략하는 것과 같은 일시적인 문제 해결이 아닌 근본적인 문제 해결을 위해 한 번도 안 쉬고 이를 해결해 낸 경험 자체가 소중했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;할 때는 정말 머리 아프고 스트레스받지만 끝나면 확 성장하는 게 디버깅 같다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>자바</category>
      <category>build</category>
      <category>java버전에러</category>
      <category>Task :test FAILED</category>
      <category>디버깅</category>
      <category>스프링입문build에러</category>
      <category>스프링입문에러</category>
      <category>스프링트부에러</category>
      <category>에러해결</category>
      <category>테스트보고서</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/21</guid>
      <comments>https://jun10920.tistory.com/21#entry21comment</comments>
      <pubDate>Sun, 4 Feb 2024 02:19:53 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 조이스틱 파이썬</title>
      <link>https://jun10920.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제: &lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42860&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42860&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706429752330&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42860&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bt1LeY/hyVcdbh0IX/lhzTiE6YnGK3PVrSddMvJK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/oG7Yg/hyVb2U84CJ/WmLz6CWDfFrKAWQiYn2fAk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42860&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42860&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bt1LeY/hyVcdbh0IX/lhzTiE6YnGK3PVrSddMvJK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/oG7Yg/hyVb2U84CJ/WmLz6CWDfFrKAWQiYn2fAk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이(간단하게)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조이스틱의 조작 횟수 계산
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;/ul&gt;
&lt;/li&gt;
&lt;li&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;A가 연속적으로 연결된 부분을 찾고 시작과 끝 index 구하기&lt;/li&gt;
&lt;li&gt;A가 연속적인 배열을 기준으로 좌로 움직이든 우로 움직이든 결국 좌/우측 부분 중 한 곳은 2번을 지나야 하므로 좌/우 중 최솟값 구하기&lt;/li&gt;
&lt;li&gt;기본값과 좌측 부분+우측 부분+최솟값(좌측 부분과 우측 부분 중) 중에 더 작은 것을 구해서 조작 횟수 계산&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;상하로 움직이는 조작 횟수 + 좌우로 움직이는 조작 횟수를 더해서 총 조작 횟수를 계산&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;풀이(자세하게)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;상하로 움직이는 조작 횟수 구하기&lt;/h4&gt;
&lt;pre id=&quot;code_1706430254472&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in name:
        answer += min(ord(i)-ord('A'), ord('Z')-ord(i)+1)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목표하는 문자까지 위로 움직이는 횟수 구하기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;둘 다 아스키코드로 변환하고, A부터 움직인 값 구하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;목표하는 문자까지 아래로 움직이는 횟수 구하기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;둘 다 아스키코드로 변환하고 Z부터 움직인 값 구하기&lt;/li&gt;
&lt;li&gt;A에서 Z로 움직일 때 1번 조작하므로 1 더하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;좌우로 움직이는 조작 횟수 구하기&lt;/h4&gt;
&lt;pre id=&quot;code_1706430418839&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;temp=0
    shift=len(name)-1
    for i in range(len(name)):
        if name[i]==&quot;A&quot;:
            temp=i
            while(temp&amp;lt;len(name) and name[temp]==&quot;A&quot;):
                temp+=1
            left=(0 if i==0 else i-1)
            right=len(name)-temp
            shift=min(shift,left+right+min(left,right))&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 값은 전체 문자열의 길이로 설정(배열의 인덱스 값이므로 -1)&lt;/li&gt;
&lt;li&gt;A로 연속된 문자열 찾고 시작과 끝 인덱스 찾기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;끝 인덱스를 설정할 temp 선언&lt;/li&gt;
&lt;li&gt;문자열이 A일 때, 다음 문자도 A이라면 문자열의 끝까지 temp를 증가&lt;/li&gt;
&lt;li&gt;구한 temp를 가지고 A의 연속된 문자열의 왼쪽 부분 left와 right 구하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;결과 값 반환&lt;/h4&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;/ul&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1706430744823&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(name):
    answer = 0
    for i in name:
        answer += min(ord(i)-ord('A'), ord('Z')-ord(i)+1)

    temp=0
    shift=len(name)-1
    for i in range(len(name)):
        if name[i]==&quot;A&quot;:
            temp=i
            while(temp&amp;lt;len(name) and name[temp]==&quot;A&quot;):
                temp+=1
            left=(0 if i==0 else i-1)
            right=len(name)-temp
            shift=min(shift,left+right+min(left,right))
    answer+=shift
    return answer&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS</category>
      <category>고득점kit</category>
      <category>그리디</category>
      <category>백준</category>
      <category>조이스틱</category>
      <category>코테</category>
      <category>탐욕법</category>
      <category>프로그래머스</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/20</guid>
      <comments>https://jun10920.tistory.com/20#entry20comment</comments>
      <pubDate>Thu, 1 Feb 2024 12:34:04 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 소수찾기 파이썬</title>
      <link>https://jun10920.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;문제: &lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42839&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42839&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706428609527&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42839&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ewafhu/hyVb9UgRGy/sc9Mcxg0pvktgF23E8eC9K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/xtpmq/hyVb4k7eXh/t6V6Cv84m2cTGBDfV6ka4k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42839&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42839&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ewafhu/hyVb9UgRGy/sc9Mcxg0pvktgF23E8eC9K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/xtpmq/hyVb4k7eXh/t6V6Cv84m2cTGBDfV6ka4k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;h3 data-ke-size=&quot;size23&quot;&gt;풀이 (간단하게)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;/li&gt;
&lt;li&gt;문자열을 받아서 1자리부터 ~ 문자열 길이만큼의 순열 집합을 생성한다.&lt;/li&gt;
&lt;li&gt;이 집합을 위에 정의한 함수를 가지고 소수인지 아닌지 검증한다&lt;/li&gt;
&lt;li&gt;소수인 부분만 answer 배열에 저장한다&lt;/li&gt;
&lt;li&gt;중복되는 부분을 제거하고 결과 값을 반환한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이 (자세하게)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;소수 검증 함수 선언&lt;/h4&gt;
&lt;pre id=&quot;code_1706429548723&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def check(n):
    if n &amp;lt; 2:
        return False
    for i in range(2, int(n**(1/2))+1):
        if n % i == 0:
            return False
    return True&lt;/code&gt;&lt;/pre&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;size14&quot;&gt;제곱근 판정&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 1보다 큰 임의의 정수 a에 대해, 만일 a가 root(a) 보다 작은 소수에 의해 나누어지지 않으면 소수이다.&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;*20240502 추가&lt;/b&gt;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;왜 제곱근까지만 확인하면 충분한가?&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;약수의 쌍&lt;/b&gt;: 수 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;이 소수가 아닌 경우, &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&amp;times;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 형태로 표현할 수 있다(여기서 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;와 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;의 약수). 만약 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;와 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 둘 다 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;의 제곱근보다 크다면, &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&amp;times;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;보다 커지므로 불가능하다. 따라서 적어도 하나의 약수는 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;의 제곱근 이하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;효율성 증가&lt;/b&gt;: &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;의 제곱근까지만 확인하면 약수가 있는지 없는지를 더 빠르게 판단할 수 있다. 예를 들어, &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;이라면, 100의 제곱근은 10이므로, 단지 2부터 10까지만 검사하면 된다. 만약 10까지 약수가 없다면, 11부터 99까지 어떤 수로도 100을 나누어 떨어뜨릴 수 없다는 것이 자명해진다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문자열 받아서 순열로 처리&lt;/h4&gt;
&lt;pre id=&quot;code_1706429564893&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(numbers):
    answer = set()
    arr = []
    for i in range(1, len(numbers)+1):
        arr+= list(permutations(numbers, i))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복을 제거하기 위해서 후처리 하는 방법도 있지만, 필자는 처음부터 반환할 answer를 집합형으로 생성해 중복을 허용하지 않았다.&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;이후 순열로 처리하기 위해서 itertools 라이브러리의 permutations 메서드를 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;permutations 메서드는 순열로 만들 iterable 한 객체와 몇 자리 순열로 만들지에 대한 숫자로 이루어져 있다.&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;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;문자열을 정수형으로 변환&lt;/h4&gt;
&lt;pre id=&quot;code_1706429574518&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = [int(''.join(x)) for x in arr]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;join 메서드를 통해서 str형을 int형으로 변환해서 새로운 배열에 저장하였다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;각 집합 원소들 검증&lt;/h4&gt;
&lt;pre id=&quot;code_1706429583566&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; for i in num:
        if check(i):
            answer.add(i)&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1706429516972&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from itertools import permutations

def check(n):
    if n &amp;lt; 2:
        return False
    for i in range(2, int(n**(1/2))+1):
        if n % i == 0:
            return False
    return True


def solution(numbers):
    answer = set()
    arr = []
    for i in range(1, len(numbers)+1):
        arr+= list(permutations(numbers, i))
    
    num = [int(''.join(x)) for x in arr]
    
    for i in num:
        if check(i):
            answer.add(i)

    return len(answer)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS</category>
      <category>고득점kit</category>
      <category>백준</category>
      <category>소수찾기</category>
      <category>파이썬</category>
      <category>파이썬코테</category>
      <category>프로그래머스</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/19</guid>
      <comments>https://jun10920.tistory.com/19#entry19comment</comments>
      <pubDate>Tue, 30 Jan 2024 12:13:31 +0900</pubDate>
    </item>
    <item>
      <title>고양시 고깃집 매출 대박을 위하여_중회귀 분석을 통한 고깃집 데이터 분석 프로젝트</title>
      <link>https://jun10920.tistory.com/18</link>
      <description>&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;오랜만에 프로젝트 소개를 주제로 블로그 글을 작성한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이 프로젝트 또한 학기 중에 진행한 프로젝트 새롭게 진행하고 작성하는 글은 아니지만&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;당시 최선을 다해서 프로젝트를 진행했고, 결국 학점 A+도 받았다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터 분석/선형대수학/AI에 대해서는 아직 많이 부족하고 진로로 희망하는 분야도 아니지만 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나름 재밌는 주제의 프로젝트이므로 글을 통해 정리한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;프로젝트 소개&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Pandas/Numpy 등의 파이썬 라이브러리를 이용해 고양시의 어느 행정동에서 고깃집을 차리면 매출 대박이 날 확률이 가장 높을 지에 대해서 데이터 분석하고 결과를 도출한 프로젝트이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;주제 선정 이유&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;지인의 조부모님께서 고깃집을 운영 중&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;-&amp;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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;현재는 백석동에서 운영 중이시므로, 다음엔 고양시의 어느 행정동에서 가장 성공확률이 높을지 분석했다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;개발 기간&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;2023.12.01 ~ 2023.12.15&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;데이터 소스&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://example-link.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;금융 데이터 거래소&lt;/a&gt;의&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;경기도 행정동/업종별 상권 평가 데이터&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;경기도 행정동별 외식 업종 카드 소비 현황&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;경기도 행정동별 배달앱 카드 소비 현황&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;위 데이터를 전처리하고 가공해서 사용하였다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;분석 방법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;행정동의 상권/소비 데이터 조사&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;선형회귀분석(중회귀분석) 기법을 통해 데이터 분석&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;분석 결과를 바탕으로 피드백&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변수 선택법을 통해서 분석&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3~4번 반복&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 분석 결과 도출&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;프로젝트 과정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;선형회귀분석을 선택한 이유&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- 선형 회귀 분석은 쌍으로 관찰된 연속형 변수들 사이의 관계에서 한 변수를 원인으로 다른 변수들을 결과로 하는 분석&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- 종속 변수와 독립 변수 간의 선형 관계를 기반으로 하여 새로운 데이터에 대한 값을 예측할 때 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- 선형회귀분석은 다시 독립변수의 개수에 따라 단순 선형과 다중 선형으로 구분&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- 성공의 기준(매출)을 종속 변수로 잡고, 여러 가지의 요인을 독립 변수로 잡아서 중회귀분석을 시행&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- 이를 통해 순위를 매겨 매점 확장 시 가장 매출이 높을 것으로 예상되는 행정동 순위 도출&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;데이터 전처리 과정&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1823&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTKxgN/btsD2JzzDYe/YLKMK4vGSFbe7o5KX118kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTKxgN/btsD2JzzDYe/YLKMK4vGSFbe7o5KX118kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTKxgN/btsD2JzzDYe/YLKMK4vGSFbe7o5KX118kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTKxgN%2FbtsD2JzzDYe%2FYLKMK4vGSFbe7o5KX118kK%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;1823&quot; height=&quot;429&quot; data-origin-width=&quot;1823&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제 데이터를 모아서 처리한다면 null값이나 너무 낮거나 높은 이상치들을 처리해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 우리가 사용한 데이터는 해당되는 부분은 이미 전처리한 데이터였다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 여러 가지 데이터를 가지고 우리가 필요한 부분(경기도의 여러 행정동 중 고양시만 가져온다는 등)을 추렸다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1621&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZi41U/btsD3Naasl5/ZcU0nkpfKflydphvpgyOkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZi41U/btsD3Naasl5/ZcU0nkpfKflydphvpgyOkk/img.png&quot; data-alt=&quot;데이터 파일의 일부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZi41U/btsD3Naasl5/ZcU0nkpfKflydphvpgyOkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZi41U%2FbtsD3Naasl5%2FZcU0nkpfKflydphvpgyOkk%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;590&quot; height=&quot;322&quot; data-origin-width=&quot;1621&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 파일의 일부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;중회귀분석&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vs9pJ/btsD2uWOym3/TzSuU4AvQxGWWLGqGD701K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vs9pJ/btsD2uWOym3/TzSuU4AvQxGWWLGqGD701K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vs9pJ/btsD2uWOym3/TzSuU4AvQxGWWLGqGD701K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvs9pJ%2FbtsD2uWOym3%2FTzSuU4AvQxGWWLGqGD701K%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;699&quot; height=&quot;461&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;761&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성공의 기준에는 여러 가지가 있겠지만 그중 전체 매출액을 기준으로 잡고 이를 종속변수로 설정하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전체 매출액은 데이터 중 '배달앱 전체 이용금액 + 외식업종카드 결제금액'을 더하여 사용하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현금 결제 금액은 따로 데이터를 제공하지 않기도 하고, 추적하기도 어렵다고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;독립 변수로는 시장성, 성장성, 개폐업 안정성, 경쟁도, 유동인구 시장성, 거주인구 시장성을 잡았다.&lt;/span&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;857&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCBZY1/btsD4IsNPe7/K3eG43AJzoBIaF0ry1VGa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCBZY1/btsD4IsNPe7/K3eG43AJzoBIaF0ry1VGa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCBZY1/btsD4IsNPe7/K3eG43AJzoBIaF0ry1VGa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCBZY1%2FbtsD4IsNPe7%2FK3eG43AJzoBIaF0ry1VGa0%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;627&quot; height=&quot;583&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;797&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;P-value 값을 보면 성장성, 경쟁도, 유동인구 시장성이 0.05를 초과하므로 상관관계에 이상이 있다고 판단했다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;상관관계 분석&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGoGEF/btsD3nv8y3n/Vc0sgH1NeGjl8lW2Ays6O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGoGEF/btsD3nv8y3n/Vc0sgH1NeGjl8lW2Ays6O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGoGEF/btsD3nv8y3n/Vc0sgH1NeGjl8lW2Ays6O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGoGEF%2FbtsD3nv8y3n%2FVc0sgH1NeGjl8lW2Ays6O1%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;530&quot; height=&quot;384&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;723&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGFNd4/btsD1pBosgP/JYz3v3PXY0l0TNiuWJ3CZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGFNd4/btsD1pBosgP/JYz3v3PXY0l0TNiuWJ3CZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGFNd4/btsD1pBosgP/JYz3v3PXY0l0TNiuWJ3CZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGFNd4%2FbtsD1pBosgP%2FJYz3v3PXY0l0TNiuWJ3CZ1%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;406&quot; height=&quot;213&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 코드를 통해서 상관관계를 히트맵 형태로 시각화하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대부분 상관 계수가 낮지만 거주인구 시장성과 유동인구 시장성은 0.5가 넘으므로 상관관계가 있는 것으로 판단하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 변수를 선택하기 위해서 전진단계별 선택법을 사용하였다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;변수 선택&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1563&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ocBi7/btsD2JGkTJI/5P8z9qKrfDZQHu0H87CZVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ocBi7/btsD2JGkTJI/5P8z9qKrfDZQHu0H87CZVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ocBi7/btsD2JGkTJI/5P8z9qKrfDZQHu0H87CZVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FocBi7%2FbtsD2JGkTJI%2F5P8z9qKrfDZQHu0H87CZVK%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;1563&quot; height=&quot;498&quot; data-origin-width=&quot;1563&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전진 단계별 선택법을 통해서 최종적으로 선택된 변수는 '거주인구 시장성'과 '성장성'이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 두 변수가 전체 매출액에 대한 가장 유의미한 영향을 끼치는 것으로 판단하고 다시 분석을 하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUvXyX/btsD1m5IyOG/KvNKAKtXocv9y4Q7jPUHr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUvXyX/btsD1m5IyOG/KvNKAKtXocv9y4Q7jPUHr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUvXyX/btsD1m5IyOG/KvNKAKtXocv9y4Q7jPUHr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUvXyX%2FbtsD1m5IyOG%2FKvNKAKtXocv9y4Q7jPUHr1%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;518&quot; height=&quot;345&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 나온 결과 값에서는 다른 값은 정상이지만 더빈-왓슨 비가 2에 근접하지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그럼 독립성이 높다고 판단할 수 없기에 변수선택을 다시 하기로 결정했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;R에서 step 메서드를 사용하면 변수선택 한 모든 경우의 수를 한 번에 도출하는 방법이 있기에 이를 이용하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cksI1C/btsD3ajyJ2Q/EIvZWlTJKNVJfW4N9kb1Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cksI1C/btsD3ajyJ2Q/EIvZWlTJKNVJfW4N9kb1Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cksI1C/btsD3ajyJ2Q/EIvZWlTJKNVJfW4N9kb1Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcksI1C%2FbtsD3ajyJ2Q%2FEIvZWlTJKNVJfW4N9kb1Yk%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;678&quot; height=&quot;208&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;여러 가지 경우의 수 중에서 시장성, 성장성, 거주인구시장성을 선택한 경우가&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;가장 AIC가 가장 낮게 나와서 이를 선택하는 것이 &lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;가장 이상일 것이라 예상했다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;823&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EF4TK/btsD3kGdCRd/8eqP2dmQzKjxv5JBTw8QC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EF4TK/btsD3kGdCRd/8eqP2dmQzKjxv5JBTw8QC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EF4TK/btsD3kGdCRd/8eqP2dmQzKjxv5JBTw8QC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEF4TK%2FbtsD3kGdCRd%2F8eqP2dmQzKjxv5JBTw8QC1%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;626&quot; height=&quot;429&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;823&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이를 통해서 분석하니 이전보단 지표들이 개선된 것을 확인할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;결과 도출&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;시장성, 성장성, 거주인구 시장성이 범위가 0~100 사이이므로 이를 평균으로 내어 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;내림차순으로 정렬하여 순위를 매겼다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;1048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wZ1SC/btsD6xEpWpG/Ta7ccUX943d39UJISMQXZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wZ1SC/btsD6xEpWpG/Ta7ccUX943d39UJISMQXZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wZ1SC/btsD6xEpWpG/Ta7ccUX943d39UJISMQXZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwZ1SC%2FbtsD6xEpWpG%2FTa7ccUX943d39UJISMQXZk%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;229&quot; height=&quot;497&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;1048&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 결론적으로&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;능곡동&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;풍산동&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;탄현동&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;송산동&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;행주동&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;순으로 고깃집을 차렸을 때 매출액이 높을 것이라고 예상된다는 결과를 도출했다!&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Keep, Problem, try&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;keep&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실생활에서 해결해야 하는 문제를 상정하고, 이를 해결하는 프로젝트를 경험했다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;jupyter notebook, python, numpy, pandas 등 여러 가지 새로운 ide, 언어, 라이브러리를 배웠다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;problem&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;결론의 신뢰성 의문&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;데이터는 전부 0~100까지의 범위 안에 드는 변수를 사용했지만 시장성의 평균적인 점수가 다른 변수들보다 커서 상대적으로 시장성의 영향을 많이 받은 결과를 도출됐다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;try&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터를 전처리할 때 각 데이터의 전체범위로 해야 할지, 아니면 최댓값과 최솟값을 범위로 잡고 데이터를 가공해서 하면 좋을지 고민해 보자&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트 깃허브&lt;/span&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1706424923768&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;GitHub - jun10920/Goyang_BBQ_Analysis: 이 레포지토리는 데이터 사이언스를 활용하여 고양시의 특정 행정&quot; data-og-description=&quot;이 레포지토리는 데이터 사이언스를 활용하여 고양시의 특정 행정동에 고깃집을 차리면 대박이 날지에 대한 분석을 진행한 프로젝트입니다. - GitHub - jun10920/Goyang_BBQ_Analysis: 이 레포지토리는 데&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jun10920/Goyang_BBQ_Analysis&quot; data-og-url=&quot;https://github.com/jun10920/Goyang_BBQ_Analysis&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rW7Y1/hyVb28Esjj/AZYfRdAoRQeQDfDWxw0Kj1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/jun10920/Goyang_BBQ_Analysis&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jun10920/Goyang_BBQ_Analysis&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rW7Y1/hyVb28Esjj/AZYfRdAoRQeQDfDWxw0Kj1/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;GitHub - jun10920/Goyang_BBQ_Analysis: 이 레포지토리는 데이터 사이언스를 활용하여 고양시의 특정 행정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 레포지토리는 데이터 사이언스를 활용하여 고양시의 특정 행정동에 고깃집을 차리면 대박이 날지에 대한 분석을 진행한 프로젝트입니다. - GitHub - jun10920/Goyang_BBQ_Analysis: 이 레포지토리는 데&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>numpy</category>
      <category>pandas</category>
      <category>넘파이</category>
      <category>데이터분석</category>
      <category>데이터사이언스</category>
      <category>매출분석</category>
      <category>판다스</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/18</guid>
      <comments>https://jun10920.tistory.com/18#entry18comment</comments>
      <pubDate>Sun, 28 Jan 2024 15:59:16 +0900</pubDate>
    </item>
    <item>
      <title>백준 16935 파이썬 - 배열 돌리기 3</title>
      <link>https://jun10920.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;문제: &lt;a href=&quot;https://www.acmicpc.net/problem/16935&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/16935&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705817776343&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;16935번: 배열 돌리기 3&quot; data-og-description=&quot;크기가 N&amp;times;M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 &amp;rarr; 4 2 9 3 1 8 7 2 6 9 8 2 &amp;rarr; 9 2 3 6 1 5 1 8 3 4 2 9 &amp;rarr; &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/16935&quot; data-og-url=&quot;https://www.acmicpc.net/problem/16935&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vOnmi/hyU8XlZvKE/kBOQXKSNdWfyK75HFeA161/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/16935&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/16935&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vOnmi/hyU8XlZvKE/kBOQXKSNdWfyK75HFeA161/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;16935번: 배열 돌리기 3&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;크기가 N&amp;times;M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 &amp;rarr; 4 2 9 3 1 8 7 2 6 9 8 2 &amp;rarr; 9 2 3 6 1 5 1 8 3 4 2 9 &amp;rarr;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;조건&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euSasq/btsDKQkkBQI/KEQhCtiREOp2e5dVGd7io1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euSasq/btsDKQkkBQI/KEQhCtiREOp2e5dVGd7io1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euSasq/btsDKQkkBQI/KEQhCtiREOp2e5dVGd7io1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeuSasq%2FbtsDKQkkBQI%2FKEQhCtiREOp2e5dVGd7io1%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;1052&quot; height=&quot;168&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2 &amp;le; N, M &amp;le; 100&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1 &amp;le; R &amp;le; 1,000&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;N, M은 짝수&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1 &amp;le; Aij&amp;nbsp;&amp;le; 108&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입력&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;첫째 줄&lt;/b&gt;에 배열의 크기가 N, M과 수행해야 하는 연산 R 입력&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;둘째 줄&lt;/b&gt;부터 2차원 배열 값 입력&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;마지막 줄&lt;/b&gt;은 수행해야하는 연산 입력 (공백으로 구분되어 있고, 순서대로 적용)&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;출력&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입력으로 주어진 배열에 R개의 연산을 순서대로 수행한 결과를 출력&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705818147064&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline

n, m, r = map(int, input().split())
arr = [[int(x) for x in input().split()] for _ in range(n)]
options = [int(x) for x in input().split()]

for option in options:
    if option == 1:
        arr = arr[::-1]
    elif option == 2:
        arr = list(map(lambda x: x[::-1], arr)) 
    elif option == 3:
        arr = list(zip(*arr[::-1]))  
        n, m = m, n 
    elif option == 4:
        arr = list(map(list, zip(*arr)))[::-1] 
        n, m = m, n
    else:
        arr1 = map(lambda x: x[:m//2], arr[:n//2])  
        arr2 = map(lambda x: x[m//2:], arr[:n//2])  
        arr3 = map(lambda x: x[:m//2], arr[n//2:]) 
        arr4 = map(lambda x: x[m//2:], arr[n//2:])  
        if option == 5: 
            arr = list(zip(arr3, arr1)) + list(zip(arr4, arr2))
        elif option == 6: 
            arr = list(zip(arr2, arr4)) + list(zip(arr1, arr3))
        arr = list(map(lambda x: x[0]+x[1], arr))

for row in arr:
    print(*row)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;풀이&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입출력 부분은 기본적인 것이고, 문제의 메인은 6개의 연산이라고 생각된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 상하 반전&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 2차원 배열이므로 행을 역으로 정렬시키면 상하가 반전된다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705819774756&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr = arr[::-1]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 좌우 반전&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 각 행에 있는 배열을 역으로 정렬시키면 된다. 이때 lambda 함수를 통해서 x를 간단하게 표현했다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705819550161&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr = list(map(lambda x: x[::-1], arr))&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 오른쪽 90도 회전&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 각 행을 상하 반전 하고 이를 zip함수를 통해서 각 리스트의 0번째, 1번째, ... n번째 원소끼리 묶어서 새로 튜플로 만들고, 다시 리스트 형태로 바꾸어서 arr형태로 만든다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 행, 열 사이즈 변환 주의&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705908032464&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr = list(zip(*arr[::-1]))  
n, m = m, n&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 30.2326%; height: 70px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원래 배열&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 30.2326%; height: 34px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상하 반전&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 30.2326%; height: 70px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;zip함수로 새로 정렬해서 다시 리스트로 묶은 형태&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 왼쪽 90도 회전&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 2차원 배열을 대각선을 기준으로 반전하고( zip함수) 상하 반전하는 형태&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt; - 행, 열 사이즈 변환 주의 &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705908086558&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr = list(map(list, zip(*arr)))[::-1] 
n, m = m, n&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원래 배열&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 30.2326%; height: 34px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대각선 반전&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 30.2326%; height: 70px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상하 반전 (왼쪽으로 90도 회전한 형태)&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 30.2326%; height: 70px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5, 6. 각 사분면을 기준으로 원소들을 배열만 시키는 연산&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705908212248&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; arr = list(zip(arr3, arr1)) + list(zip(arr4, arr2))&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5번 예시(6번은 반대로):&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원래 배열&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 30.2326%; height: 34px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;zip 함수로 새로 쌓고 배열끼리 더하기 (오른쪽으로 회전한 상태)&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 30.2326%; height: 70px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;주의할 점: 현재 4*4 2차원 배열 2개를 zip함수로 튜플로 묶고 또 배열로 묶은 상태이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- 리스트(튜플((배열4*4)+(배열4*4)))&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;그래서 2차원 배열로 만들어주기 위해서 튜플[0] + 튜플[1]을 합쳐서 리스트로 바꾸면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1705908516001&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  arr = list(map(lambda x: x[0]+x[1], arr))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS</category>
      <category>16935</category>
      <category>배열돌리기3</category>
      <category>백준</category>
      <category>코딩테스트</category>
      <category>파이썬</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/17</guid>
      <comments>https://jun10920.tistory.com/17#entry17comment</comments>
      <pubDate>Wed, 24 Jan 2024 17:29:17 +0900</pubDate>
    </item>
    <item>
      <title>이운규 변호사님의 주60시간 공부 챌린지 7기 회고</title>
      <link>https://jun10920.tistory.com/15</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시작하며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새해를 시작하면서 이번 방학이 온전히 &lt;b&gt;개발 공부&lt;/b&gt;에만 집중할 수 있는 마지막 기간이라는 생각이 들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;왜냐면 2학기 여름방학부터는 인턴이나 부트 캠프에 할 계획이기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트를 하면서 개발 구현 실력은 늘겠지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CS공부와 같은 기본 기본기를 튼튼히 다지기는 어려울 것이라고 생각하기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 이번 방학에 더욱 개발에만 집중하고 싶었고, 집중하는 것과 더불어 절대적인 시간 투자 역시 최대한 많이 해야겠다는 생각을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;나는 지독한 계획형 인간인데, 이는 내가 부지런해서가 아니라 계획이 없으면 한없이 늘어지는 사람이라는 것을 알기 때문이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이런 와중에 그전부터 즐겨 보던 이운규 변호사님이 새해부터 시작하는 주 60시간 공부 챌린지를 모집한다는 &lt;a href=&quot;https://www.youtube.com/watch?v=QAigFoxYECY&amp;amp;t=10s&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;영상&lt;/a&gt;을 보고 바로 신청하였다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 60시간 챌린지가 뭔데?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일주일간 자율적으로 &lt;b&gt;60시간 이상 공부&lt;/b&gt;를 하고 &lt;b&gt;2주간 지속&lt;/b&gt;한다면 &lt;b&gt;성공&lt;/b&gt;하는 방식의 스터디이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt; 직장인의 경우는 절반인 30시간을 채우면 성공하고 나머진 60시간 이상을 채워야 한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;참가비는 만원&lt;/b&gt;이고, 이를 &lt;b&gt;성공할 경우는 환급해 주고&lt;/b&gt; &lt;b&gt;실패할 경우 전액 기부&lt;/b&gt;된다(변호사님의 유튜브에 기부 내역 참고)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;954&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IRnwn/btsDoqnn7xF/KJ9LkwHLUJt1FhdPH7esA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IRnwn/btsDoqnn7xF/KJ9LkwHLUJt1FhdPH7esA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IRnwn/btsDoqnn7xF/KJ9LkwHLUJt1FhdPH7esA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIRnwn%2FbtsDoqnn7xF%2FKJ9LkwHLUJt1FhdPH7esA0%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;272&quot; height=&quot;444&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;954&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 식으로 게시판에 가서 오늘 얼마나 공부했는지 작성하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나같은 경우는 매일 무엇을 했는지 노션에 정리하는데, 이때 구글 타이머를 이용해서 하루에 1시간씩 10번 측정해서 사용해서 노션에 정리했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsbfg1/btsDrgYPSfn/5sP9tQQM35kOhnig41AF70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsbfg1/btsDrgYPSfn/5sP9tQQM35kOhnig41AF70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsbfg1/btsDrgYPSfn/5sP9tQQM35kOhnig41AF70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsbfg1%2FbtsDrgYPSfn%2F5sP9tQQM35kOhnig41AF70%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;403&quot; height=&quot;540&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;느낀 점&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첫 번째는 &lt;b&gt;언제 공부를 하면 효율적인지&lt;/b&gt;&amp;nbsp;파악할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년 한 해동안 준사관 공부를 하면서 막연하게 하루 10시간 이상 공부한 적은 많았지만 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에 10시간 공부할 때는 한 시간 단위로 나눠서 했는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어느 시간에 집중이 잘되고 안 되는지를 확실히 알 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나 같은 경우는 점심 먹은 후랑, 오후 6시쯤에 집중력이 풀리는 게 느껴져서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오전에 공부하고 점심 먹기 전에 잠깐 낮잠을 자고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오후 6시에는 바로 헬스장에 가 1시간 운동하고 샤워하고 다시 공부하면 집중이 잘 되는 것을 알았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두 번째는 &lt;b&gt;절대적인 공부량(시간의 양)의 중요성&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;효율을 중요하게 생각해서 어떤 걸 하기 전에 후기나 방법에 대해서 엄청 찾아보는 편이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;효율이란 적은 시간 대비 좋은 성과를 의미한다고 생각하는데, 아무리 효율이 좋은 방법을 찾는다 해도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;절대적인 시간을 많이 들이는 것 또한 동반돼야 좋은 성과가 따라온다는 것을 배웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2주가 정말 빨리 지나갔지만, 그동안 개발 도서 2권 (열혈 C, 자료구조), 개념 강의 1개 완강(김영한 님 로드맵 실전 자바), 코테 공부, CS공부 등 많은 것을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하루하루 내가 발전이 있는지 의문인적도 있었지만 정리하고 보니 많은 것을 했다는 것을 알게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;맺으며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 스터디가 끝나고 &lt;b&gt;주 50~60시간 공부&lt;/b&gt;를 유지하면서 남은 방학도 보낼 예정이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약 2주간 본인의 분야에 몰입하는 경험을 하고 싶다면 아래의 링크로 한 번 신청해 보길 바란다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;적극 추천&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705215531078&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; 7기 진행 중, 8기1.18 모집시작 주 60시간 공부 챌린지, 스스로를 '한 단계 더' 성장시키세요 (&quot; data-og-description=&quot;공부에는, 당신의 인생을 펼쳐주는 힘이 있다.&quot; data-og-host=&quot;dreamschoolkr.liveklass.com&quot; data-og-source-url=&quot;https://dreamschoolkr.liveklass.com/classes/151551?isChallenge=false&quot; data-og-url=&quot;https://dreamschoolkr.liveklass.com/classes/151551?isChallenge=false&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gfhNv/hyU5NwQYPT/o1cdfxbkNxC93KzQu0dRsk/img.jpg?width=1802&amp;amp;height=1012&amp;amp;face=1295_247_1542_517&quot;&gt;&lt;a href=&quot;https://dreamschoolkr.liveklass.com/classes/151551?isChallenge=false&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dreamschoolkr.liveklass.com/classes/151551?isChallenge=false&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gfhNv/hyU5NwQYPT/o1cdfxbkNxC93KzQu0dRsk/img.jpg?width=1802&amp;amp;height=1012&amp;amp;face=1295_247_1542_517');&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; 7기 진행 중, 8기1.18 모집시작 주 60시간 공부 챌린지, 스스로를 '한 단계 더' 성장시키세요 (&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;공부에는, 당신의 인생을 펼쳐주는 힘이 있다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dreamschoolkr.liveklass.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;</description>
      <category>회고</category>
      <category>공부스터디</category>
      <category>이운규변호사</category>
      <category>이운규변호사공부법</category>
      <category>주60시간스터디</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/15</guid>
      <comments>https://jun10920.tistory.com/15#entry15comment</comments>
      <pubDate>Tue, 16 Jan 2024 23:29:39 +0900</pubDate>
    </item>
    <item>
      <title>이것이 자료구조 + 알고리즘이다 책 리뷰 / 자료구조 책 추천</title>
      <link>https://jun10920.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리뷰가 연달아 올라왔지만 책을 2~3일 만에 읽은 것은 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;열혈 C 프로그래밍을 2023년 연말까지 열심히 공부한 뒤에 새해에는 코딩 테스트 겸 CS 공부를 위한 자료구조 &amp;amp; 알고리즘 책을 공부했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(아직 안 읽어보셨다면 한 번 읽어봐 주시면.. )&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705207199042&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;윤성우의 열혈 C 프로그래밍 리뷰 - C언어 교재 추천&quot; data-og-description=&quot;이전에 쓴 글인 2023년 회고에서 언급했듯, (아직 안 보신 분은 아래의 링크에서 봐주시면 감사) 항공 학부 출신 개발자 도전기 2023년 회고   준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/13&quot; data-og-url=&quot;https://jun10920.tistory.com/13&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hpYx2/hyU5PnTpok/uhoHCBDbO7eFYRNSF6U6dK/img.png?width=800&amp;amp;height=368&amp;amp;face=0_0_800_368,https://scrap.kakaocdn.net/dn/bXJA0M/hyU5HDnVgN/kSC6kCczHWKLEAgW8qwUhk/img.png?width=800&amp;amp;height=368&amp;amp;face=0_0_800_368,https://scrap.kakaocdn.net/dn/bih8cf/hyU2eXclMk/lL9UNLK93pAr8yQfNhKCvK/img.png?width=750&amp;amp;height=345&amp;amp;face=0_0_750_345&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/13&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/13&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hpYx2/hyU5PnTpok/uhoHCBDbO7eFYRNSF6U6dK/img.png?width=800&amp;amp;height=368&amp;amp;face=0_0_800_368,https://scrap.kakaocdn.net/dn/bXJA0M/hyU5HDnVgN/kSC6kCczHWKLEAgW8qwUhk/img.png?width=800&amp;amp;height=368&amp;amp;face=0_0_800_368,https://scrap.kakaocdn.net/dn/bih8cf/hyU2eXclMk/lL9UNLK93pAr8yQfNhKCvK/img.png?width=750&amp;amp;height=345&amp;amp;face=0_0_750_345');&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;윤성우의 열혈 C 프로그래밍 리뷰 - C언어 교재 추천&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이전에 쓴 글인 2023년 회고에서 언급했듯, (아직 안 보신 분은 아래의 링크에서 봐주시면 감사) 항공 학부 출신 개발자 도전기 2023년 회고   준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번에도 역시 개발자들의 지식의 보고인 구글링을 통해서 교재를 선정했는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;윤성우 님의 자료구조 책을 C언어에 이어서 학습할까 생각했지만 어떤 블로그에서 개발의 고수인 것 같은 분의 추천에 나도 모르게 구매 버튼을 누르고 말았다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;물론 이유는 없던 건 아니었고, &lt;b&gt;가장 최근에 개정&lt;/b&gt;되어 이미지와 함께 보기 좋은 방식으로 자료구조 &amp;amp; 알고리즘을 설명해 준다는 것이 첫 번째였고, 두 번째는 &lt;b&gt;자료구조까지는 C언어로 공부하는 것이 좋다&lt;/b&gt;는 의견이 많았기 때문이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;공부법&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;비교적 C언어는 교재에 나와있는 예제를 전부 구현하면서 공부했지만,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;자료구조는 지금은 완전한 자료구조의 이해 보다 &lt;b&gt;코딩 테스트를 위한 개념 공부&lt;/b&gt;의 의미가 더 커서 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;초반에 자료구조 공부할 때는 구현했지만 이후 알고리즘 부분은 학습법은 그대로 학습하되 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;예제 코드 부분은 정독하면서 이해가 안되는 부분만 구현했다.&lt;/span&gt;&lt;span style=&quot;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;물론 개념 부분은 제대로 정리하면서 학습하기 위해서 이전 글들에서 &lt;a href=&quot;https://jun10920.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여러 번 언급한 학습법&lt;/a&gt;을 적용했다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705208511102&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;2024년의 개발 공부법(INPUT) 정리&quot; data-og-description=&quot;이 글을 쓰게 된 이유 이전에 주로 써왔던 Js나 객제지향 프로그래밍 전공 수업에서 배운 Java는 어느 정도 문법을 익혔지만, 전공에서 응용하면서 주먹구구식으로 배운 C언어와 자료구조를 최대&quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/11&quot; data-og-url=&quot;https://jun10920.tistory.com/11&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kPBNg/hyU5FlgX9G/JrM89Wx6s5gYHqpwlLeFK0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/J7VOb/hyU2oMfVxf/CKNGRAAol8MmnsAhFihWC1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/11&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kPBNg/hyU5FlgX9G/JrM89Wx6s5gYHqpwlLeFK0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/J7VOb/hyU2oMfVxf/CKNGRAAol8MmnsAhFihWC1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;2024년의 개발 공부법(INPUT) 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 글을 쓰게 된 이유 이전에 주로 써왔던 Js나 객제지향 프로그래밍 전공 수업에서 배운 Java는 어느 정도 문법을 익혔지만, 전공에서 응용하면서 주먹구구식으로 배운 C언어와 자료구조를 최대&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;1150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9hr5R/btsDnEM0XU5/AQZKdi0RriPm3iuPwVjpKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9hr5R/btsDnEM0XU5/AQZKdi0RriPm3iuPwVjpKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9hr5R/btsDnEM0XU5/AQZKdi0RriPm3iuPwVjpKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9hr5R%2FbtsDnEM0XU5%2FAQZKdi0RriPm3iuPwVjpKK%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;519&quot; height=&quot;453&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;1150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;좋았던 점&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그림 예제가 많고 친절했다&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자료구조가 실제로 존재하는 것이 아닌 경우가 많아서 머릿속으로 상상하며 개념을 학습해야 하는데 자세한 그림 예제가 있어서 이해하기가 편했다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사설이 은근 재밌다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 개념이 왜 나왔는지 기원에 대해서 이야기들을 같이 설명해 주시는데 그냥 개념 공부만 하는 것보다 훨씬 재밌었다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;아쉬웠던 점&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;크게 아쉬웠던 점은 없고, 굳이 꼽자면 아직 C언어를 공부하고 바로 들어온 상태라 예제 코드를 보면서 해설이 부족하여 이해가 안 된 부분은 가끔 2~3시간씩 고민한 적도 많다.&lt;/span&gt;&lt;span style=&quot;&quot;&gt;(다시 생각해보면 오히려 그러면서 실력이 향상되니까 좋은 것 같기도)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;코딩 테스트를 위한 빠른 개념 학습이 목표였던 만큼 개인적으로는 아쉬웠던 점이지만, C언어 학습을 제대로 이어서 하고 싶은 사람이라면 오히려 장점일 것 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;맺으며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자료구조를 공부하면서 스택이 뭔지, 큐가 뭔지도 몰랐던 내가 이제는 머릿속으로 개략적으로 어떤 구조로 데이터를 저장하고 연산하는지 그릴 수 있게 된 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 막상 코딩 테스트 공부를 시작하니 자료구조나 알고리즘이 이미 구현되어 있는 경우가 너무 많아서 당황스럽기도 했지만..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;C언어로 모래 주머니 차고 공부했더니 파이썬으로 코딩 테스트 공부하니 개발 언어가 아니라 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그냥 영어 쓰는 기분이 들 정도이다ㅋㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;C언어로 자료구조 공부 추천! (나만 당할 수 없지 ㅋㅋ)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS</category>
      <category>알고리즘</category>
      <category>이것이자료구조알고리즘이다</category>
      <category>자료구조</category>
      <category>자료구조공부</category>
      <category>코딩테스트</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/14</guid>
      <comments>https://jun10920.tistory.com/14#entry14comment</comments>
      <pubDate>Tue, 16 Jan 2024 13:02:56 +0900</pubDate>
    </item>
    <item>
      <title>윤성우의 열혈 C 프로그래밍 리뷰 - C언어 교재 추천</title>
      <link>https://jun10920.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전에 쓴 글인 &lt;a href=&quot;https://jun10920.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023년 회고&lt;/a&gt;에서 언급했듯,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(아직 안 보신 분은 아래의 링크에서 봐주시면 감사)&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705205180522&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;항공 학부 출신 개발자 도전기 2023년 회고&quot; data-og-description=&quot;  준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활동하고, 너디너리 컨퍼런스 가고, 프로젝트 3개 하고, 컴공 복수 전공하고, 연말~연초에 주 60시간 공부 시작 이야기 이번 회고를 쓰기 앞서 &quot; data-og-host=&quot;jun10920.tistory.com&quot; data-og-source-url=&quot;https://jun10920.tistory.com/12&quot; data-og-url=&quot;https://jun10920.tistory.com/12&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cAoBEV/hyU5PuD0cC/5nYSFwblM4DwxToQwIayFk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/zSvZL/hyU2s2bf4t/Y0z1wE162i5RJ4rxBEvkOk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bg8CB5/hyU5HXGTZs/V6zIwl4k0GzDxkoe5WRMf1/img.png?width=1080&amp;amp;height=1136&amp;amp;face=0_0_1080_1136&quot;&gt;&lt;a href=&quot;https://jun10920.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jun10920.tistory.com/12&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cAoBEV/hyU5PuD0cC/5nYSFwblM4DwxToQwIayFk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/zSvZL/hyU2s2bf4t/Y0z1wE162i5RJ4rxBEvkOk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bg8CB5/hyU5HXGTZs/V6zIwl4k0GzDxkoe5WRMf1/img.png?width=1080&amp;amp;height=1136&amp;amp;face=0_0_1080_1136');&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;항공 학부 출신 개발자 도전기 2023년 회고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활동하고, 너디너리 컨퍼런스 가고, 프로젝트 3개 하고, 컴공 복수 전공하고, 연말~연초에 주 60시간 공부 시작 이야기 이번 회고를 쓰기 앞서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jun10920.tistory.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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바쁘게 2학기를 마치고 나서 다시 새해가 오기 전까지 C언어를 한 바퀴 빠르게 들어야겠다는 생각을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이유는 전공 수업을 들으면서 아쉬웠고, 자료구조를 배울 때 C로 배워야 좋다는 지인의 조언을 들어서였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;교재는 구글링을 여러 번하고, 지인들도 모두 윤성우 님의 &lt;b&gt;열혈 C 프로그래밍&lt;/b&gt;을 강력 추천해서 이 책으로 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공부 방법&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공부법 역시 &lt;a href=&quot;https://jun10920.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이전에 작성한 글&lt;/a&gt;에서 정리한 것과 같이 이운규 변호사님의 공부법과 다른 개발 분야의 전문가 분들의 의견을 모은 공부법으로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;간략히 요약하자면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 학습&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 체득&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 정리의 세 단계로 나누어서 공부를 하는 것이고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2번과 3번은 동시에 진행하거나 순서가 바뀌는 경우가 많다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;C언어를 가지고 개발하면서 살 건 아니기 때문에 실제로 프로젝트를 진행하는 체득의 단계는 생략하고학습과 정리의 단계만 진행했다(자세한 사항이 궁금하다면 링크를 통해 읽어보길 바란다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;1153&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPnmQM/btsDp3Zuqje/1kTwjIB1U3scsl7qrWjP70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPnmQM/btsDp3Zuqje/1kTwjIB1U3scsl7qrWjP70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPnmQM/btsDp3Zuqje/1kTwjIB1U3scsl7qrWjP70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPnmQM%2FbtsDp3Zuqje%2F1kTwjIB1U3scsl7qrWjP70%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;536&quot; height=&quot;247&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;글에 정리한 학습법대로 학습하고, 노션에 정리를 했다.크게 Part는 4개로 나누어져 있어서 페이지를 4개로 나누었고 각 페이지에는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;966&quot; data-origin-height=&quot;1417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NMjRu/btsDnDm6jw8/KGnZqtPyOg5HkobkNS2GTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NMjRu/btsDnDm6jw8/KGnZqtPyOg5HkobkNS2GTK/img.png&quot; data-alt=&quot;Part02 목차만 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NMjRu/btsDnDm6jw8/KGnZqtPyOg5HkobkNS2GTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNMjRu%2FbtsDnDm6jw8%2FKGnZqtPyOg5HkobkNS2GTK%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;376&quot; height=&quot;552&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;1417&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Part02 목차만 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 식으로 목차를 나누어 세부 내용을 다 요약 및 정리하면서 읽었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;학습법을 통해서 1회독한 내용들을 나만의 방식으로 정리하면서 2 회독하고,최종적으로 다 공부한 뒤에 정리한 내용을 가지고 3회독을 하니 짧은 기간 안에 효율적으로 공부한 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리뷰&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좋았던 점&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;C언어에 대해서 전반적인 개념을 이해하게 되었다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;JS만 조금 다뤄본 상태에서 복수전공을 시작하면서, 이미 C언어를 1학년 때 배우고 온 학생들과 같이 수업을 듣다 보니 대부분의 수업에서 C언어를 안다는 가정 하에 수업을 진행했다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;노력 끝에 학점을 잘 받았지만 C언어와 관련된 부분은 공부하면서 깔끔한 능력이 없었는데 이번 기회에 의문점들이 모두 해소되었다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발 자체를 보는 눈이 좀 넓어졌다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 언어에서는 쓰지 않는 포인터와 구조체의 개념에 대해서 배우면서 다른 언어를 볼 때도 넓은 시각으로 보니 새롭게 보이는 부분이 많았다. (Ex. 배열의 변수가 주소값을 가리키는 포인터 변수였다던가..)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인강을 제공해준다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;책에는 인강의 기간이 제한되어 있다고 나와있는데 내가 공부한 시점에서는 이미 전부 무료로 제한 없이 수강할 수 있었다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강의를 하시는데 나긋나긋 말씀하시다가 각 영상의 중간 부분이 지나가면 엄청 열정 있게 강의하신다. 그래서 나도 같이 열심히 듣게 된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래는 해당 링크&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure id=&quot;og_1705206655629&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;윤성우의 프로그래밍 스터디그룹 [C/... : 네이버 카페&quot; data-og-description=&quot;윤성우의 스터디 공간입니다. C와 JAVA를 공부하시는 분들은 모두 들어오세요. ^^&quot; data-og-host=&quot;cafe.naver.com&quot; data-og-source-url=&quot;https://cafe.naver.com/cstudyjava&quot; data-og-url=&quot;https://cafe.naver.com/cstudyjava&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BlVTD/hyU2ieckp5/K3oaAKmY1key1tvlAD0MK0/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270&quot;&gt;&lt;a href=&quot;https://cafe.naver.com/cstudyjava&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cafe.naver.com/cstudyjava&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BlVTD/hyU2ieckp5/K3oaAKmY1key1tvlAD0MK0/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270');&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;윤성우의 프로그래밍 스터디그룹 [C/... : 네이버 카페&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;윤성우의 스터디 공간입니다. C와 JAVA를 공부하시는 분들은 모두 들어오세요. ^^&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cafe.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아쉬웠던 점&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;은 없다. 추천대로 C언어를 공부하기엔 최고였던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;맺으며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발을 처음 공부할 때부터 C언어로 시작했다면 재미를 느끼기에도 그리고 이해하기에도 어려웠을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미 많은 언어와 약간의 개발 경험을 가지고 공부하니 너무나 재밌게 공부했던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;C언어로 시작하기가 어렵다면 비교적 쉬운 다른 언어들을 한 번 맛보고 오는 것을 추천!&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C언어</category>
      <category>c언어</category>
      <category>C언어공부</category>
      <category>C언어책추천</category>
      <category>개발공부</category>
      <category>열혈C프로그래밍</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/13</guid>
      <comments>https://jun10920.tistory.com/13#entry13comment</comments>
      <pubDate>Sun, 14 Jan 2024 13:34:32 +0900</pubDate>
    </item>
    <item>
      <title>항공 학부 출신 개발자 도전기 2023년 회고</title>
      <link>https://jun10920.tistory.com/12</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  &lt;b&gt;준사관 불합격하고, 복학하고, 멋쟁이 사자처럼 활동하고, 너디너리 컨퍼런스 가고, 프로젝트 3개 하고, 컴공 복수 전공하고, 연말~연초에 주 60시간 공부 시작 이야기&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 회고를 쓰기 앞서 주변의 훌륭한 멘토이자 친구들이 있고, 그들의 1년을 보니 &lt;b&gt;개발자 관점&lt;/b&gt;에서 쓸 게 별로 없어 회고를 적을까 말까 고민했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 다양하게 산개되어있는 일상이 매년 &lt;b&gt;개발로 초점이 맞춰지는 과정&lt;/b&gt;을 나중에 읽어보면 나름대로 즐거울 것 같아 작성하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1분기&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;준사관 불합격&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&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;739&quot; data-origin-height=&quot;1184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l65VQ/btsCZ6ozlVS/OMCvPD0SEDCFxbOJEiZKW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l65VQ/btsCZ6ozlVS/OMCvPD0SEDCFxbOJEiZKW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l65VQ/btsCZ6ozlVS/OMCvPD0SEDCFxbOJEiZKW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl65VQ%2FbtsCZ6ozlVS%2FOMCvPD0SEDCFxbOJEiZKW1%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;337&quot; height=&quot;540&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;1184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(실물 교재 1~20권은 이미 버려서 없고, 수없이 반복해서 풀었던 PDF 파일만 54개정도 남아있다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2022년에는 1년 휴학을 하고 &lt;b&gt;육군항공준사관&lt;/b&gt;을 준비했었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마치 고시생처럼 아침에 일어나자마자 책상에 앉아 자기 전까지 공부하는 1년을 쭉 보내고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2023년 1월에 필기 시험을 봤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;딱 시험을 보고 나왔을 때 시험을 망쳤다는 다른 수험생들과 달리 시험을 꽤나 잘 본 기분이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예상 답안까지 확인하고, 시험에 붙을 것을 예상하고 대학교 기숙사를 철회한 뒤 군휴학을 준비하면서 2월 말의 합격 발표를 기다렸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 작년과 비교해서 1차 합격 인원이 1/3로 줄어서일까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예상과 다르게 떨어졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;위기조신 (위험한 상황이 새로운 변화의 시작일지도 모른다)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1년간 준비한 것이니 마음은 쓰라렸지만, 당장 복학이 1~2주일 뒤였고 결정을 빠르게 내려야 하는 시기여서 슬퍼하고 있을 수만은 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 하루만 슬퍼하고, 다음 날 다시 일어나 사람들에게 의견을 구했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;편입&lt;/b&gt;과 관련해서는&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;편입하고 싶은 경희대 스포츠의학과와 관련 있는 사람들&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작년에 편입을 준비해서 연세대와 성대를 붙은 동기들&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;학과&lt;/b&gt;와 관련해서는&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2023년 당시 4학년이어서 항공 정비사와 엔지니어로 취업 준비 중인 동기들&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막으로 &lt;b&gt;복수 전공/개발&lt;/b&gt;과 관련해서&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발자의 길을 걷고 있는 친구들&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과 약속을 잡아서 물어봤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국 빠른 시간 안에 &lt;b&gt;졸업 및 취업 가능 + 성격과의 궁합&lt;/b&gt;을 고려해서 복학해서 &lt;b&gt;개발자의 길&lt;/b&gt;을 걷기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2분기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;복학과 멋쟁이 사자처럼 11기 가입&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여름방학 이후부턴 본 전공인 &lt;b&gt;항공&lt;/b&gt;과 거리를 두고 &lt;b&gt;개발&lt;/b&gt;에만 매진하고 싶어서 못 채운 본 전공 18학점을 수강 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 학교가 항공에 특성화된 대학교라 개발 관련해서 지원이나 커뮤니티가 거의 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다행히 군대에 입대하기 전에는 없었던 &lt;a title=&quot;멋쟁이사자처럼&quot; href=&quot;https://www.likelion.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;멋쟁이 사자처럼&lt;/b&gt;&lt;/a&gt; 동아리가 생겨서 가입 신청을 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당시 개발에 대해 전혀 모르니까 가입할 때 나를 증명하기 위해서 빠르게 HTML+CSS 강의를 듣고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;노션에 정리하고 개인 블로그라고 제출했었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(지금 보니까 귀엽다..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아무튼 노력한 모습을 좋게 봐줘서 결국 합격했었고, 멋쟁이 사자처럼에서의 1년이 시작됐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가입 직후 개발을 거의 안 해본 팀원들과 프로젝트를 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;여름을 주제로 해수욕 지수를 나타내는 프로젝트&lt;/b&gt;였다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프론트를 담당해서 앞 단은 완성했는데, 당시에 백엔드를 맡은 팀원들이 완성하지 못해서 결국 미완성으로 끝났다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그냥 프론트엔드에서 API 연결해서 완성이라도 시킬 걸 그랬다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 아예 개발에 대해서 무지한 상태에서, JS를 조금이라도 다뤄보게 된 계기였다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3분기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해커톤&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKQkSZ/btsC54bZxRv/FnLZoncdq0ANEopswP7G0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKQkSZ/btsC54bZxRv/FnLZoncdq0ANEopswP7G0K/img.png&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;1358&quot; data-is-animation=&quot;false&quot; width=&quot;405&quot; height=&quot;535&quot; style=&quot;width: 49.648%; margin-right: 10px;&quot; data-widthpercent=&quot;50.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKQkSZ/btsC54bZxRv/FnLZoncdq0ANEopswP7G0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKQkSZ%2FbtsC54bZxRv%2FFnLZoncdq0ANEopswP7G0K%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;1028&quot; height=&quot;1358&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUtpiQ/btsC2AitipI/3KOLUYuZTjKFKMDlaTDkok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUtpiQ/btsC2AitipI/3KOLUYuZTjKFKMDlaTDkok/img.png&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-is-animation=&quot;false&quot; data-filename=&quot;blob&quot; width=&quot;344&quot; height=&quot;459&quot; style=&quot;width: 49.1892%;&quot; data-widthpercent=&quot;49.77&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUtpiQ/btsC2AitipI/3KOLUYuZTjKFKMDlaTDkok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUtpiQ%2FbtsC2AitipI%2F3KOLUYuZTjKFKMDlaTDkok%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;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;멋쟁이 사자처럼에서 주최한 &lt;b&gt;해커톤&lt;/b&gt;을 나갔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;공공서비스를 위한 서비스&lt;/b&gt;를 주제로 한 달 동안 개발해서 나가는 프로젝트였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당시 프론트엔드를 맡아서 몇 개의 페이지를 구현했었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 친구에게 받고 있던 &lt;b&gt;풀스택 스터디&lt;/b&gt;가 개인적으로 더 도움이 될 것 같아서 많은 신경을 쓰진 못했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 큰 규모의 개발 행사에 참여하고 수상한 팀들의 수준 높은 프로젝트를 보니 개발 공부에 대한 의지가 다시 샘솟는 경험이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;너디너리 컨퍼런스&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2522&quot; data-origin-height=&quot;1891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vyeG1/btsC4FcoJpJ/iCMHgFnz0zUkWlKcYbQJI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vyeG1/btsC4FcoJpJ/iCMHgFnz0zUkWlKcYbQJI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vyeG1/btsC4FcoJpJ/iCMHgFnz0zUkWlKcYbQJI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvyeG1%2FbtsC4FcoJpJ%2FiCMHgFnz0zUkWlKcYbQJI0%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;431&quot; height=&quot;323&quot; data-origin-width=&quot;2522&quot; data-origin-height=&quot;1891&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유튜브 채널 &lt;a href=&quot;https://www.youtube.com/@comgongbro&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;컴공선배&lt;/b&gt;&lt;/a&gt;에서 주최한 &lt;b&gt;너디너리 컨퍼런스&lt;/b&gt;에 참여해서 여러 연사들의 강연을 듣고 왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인상 깊었던 강연은 &lt;b&gt;두 가지&lt;/b&gt;인데 우선 커리어리에서 글이 올라오면 자주 읽고 했었던 &lt;b&gt;하조은 님&lt;/b&gt;의 강연이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;lsquo;내가 지키지 못한 조언들&amp;rsquo;&lt;/b&gt;이라는 제목으로 매니저 근무를 하면서 본인이 다른 개발자에게 했던 조언들을 내가 개발할 때는 잘 지키지 못한다는 내용이었다.&lt;/span&gt;&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;1136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvOZAB/btsCTVaB9bh/AchFozDQR6yonUrcyuApwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvOZAB/btsCTVaB9bh/AchFozDQR6yonUrcyuApwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvOZAB/btsCTVaB9bh/AchFozDQR6yonUrcyuApwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvOZAB%2FbtsCTVaB9bh%2FAchFozDQR6yonUrcyuApwk%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;475&quot; height=&quot;500&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;맨 앞에서 집중하며 필기하면서 들었는데, 컨퍼런스가 끝나고 발표 당시 팔로우 했던 조은님의 인스타 계정에서 먼저 연락이 와서 놀랐다. (열심히 들은 거 인증 )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;두 번째는 최연소 LG 이사이신 &lt;b&gt;송주영 님의&lt;/b&gt; &lt;b&gt;&amp;lsquo;주니어들을 위한 너무 늦게 알아버린, 너무 일찍 알게 된&amp;rsquo;&lt;/b&gt; 강연이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 개발자 분들의 모범적이지만 다소 정상적인(?) 모습과는 달리 처음부터 굉장히 좋은 의미로 매드사이언티스트 같은 느낌을 받았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 기술이나 취업, 경험 들을 위주로 얘기하는 게 아니라 &lt;b&gt;개발과 예술은 같다&lt;/b&gt;는 본인의 개발 철학에 대해서 강연하셨는데 굉장히 인상 깊었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;나도 언젠가 실력이 좀 쌓이고 나면 &lt;b&gt;나만의 철학을 가지고 개발을 하는 사람&lt;/b&gt;이 되어야지 다짐했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;풀스택 스터디&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;바닐라 JS로 SPA 구현&lt;/b&gt;하는 스터디를 개발자로 근무 중이던 인수의 코칭을 받으며 진행했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전에 JS로 기능을 구현하는데 급급했던 나였기에 하나하나가 &lt;b&gt;챌린지&lt;/b&gt;였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우선 기본적인 CS지식이 없어서 JS를 공부할 때 나오는 키워드의 대부분을 몰랐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 하나하나 공부해 가며 점차 글들을 이해하기 시작했고, 대부분을 구현했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 10~20% 정도를 학기가 시작하면서 구현하지 못해서 아쉬웠다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;깃허브 링크:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://github.com/jun10920/TodoList-for-DB&quot;&gt;&amp;nbsp;https://github.com/jun10920/TodoList-for-DB&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704337856067&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;GitHub - jun10920/TodoList-for-DB: 데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트&quot; data-og-description=&quot;데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트. Contribute to jun10920/TodoList-for-DB development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jun10920/TodoList-for-DB&quot; data-og-url=&quot;https://github.com/jun10920/TodoList-for-DB&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/os5rl/hyUXT5WBtH/Yq3KV35Bgvv8o9H3e0omaK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/jun10920/TodoList-for-DB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jun10920/TodoList-for-DB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/os5rl/hyUXT5WBtH/Yq3KV35Bgvv8o9H3e0omaK/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;GitHub - jun10920/TodoList-for-DB: 데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트. Contribute to jun10920/TodoList-for-DB 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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3대 440 달성&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20240102_235132914.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GRZCz/btsC4pnbF2y/mqk0ocX4ZpG6HHOvX3ZQ90/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GRZCz/btsC4pnbF2y/mqk0ocX4ZpG6HHOvX3ZQ90/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GRZCz/btsC4pnbF2y/mqk0ocX4ZpG6HHOvX3ZQ90/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGRZCz%2FbtsC4pnbF2y%2Fmqk0ocX4ZpG6HHOvX3ZQ90%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;297&quot; height=&quot;396&quot; data-filename=&quot;KakaoTalk_20240102_235132914.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사실 21살에 군 입대 이후, 22살부터 지금까지 &lt;b&gt;헬스&lt;/b&gt;를 꾸준히 해왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;22년에 준사관을 준비하면서 1년을 쉬긴 했지만 23년에 다시 할 때 머슬메모리 덕인지 금방 중량을 회복했고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;방학 동안 열심히 운동한 결과&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;스쿼트 150kg 데드 190kg 벤치 100kg&lt;/b&gt;를 달성했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;183cm에 70kg였던 내가 83kg까지 근육 위주로 키우면서, 헬린이 시절 벤치 100kg가 꿈같았는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국 들었을 때 꾸준히만 하면 결국 못 이루는 건 없다는 걸 알았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;롯데시네마 드리미&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;2344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXbuNN/btsC32FLRmW/zJbDX7x7RLalrrkAfHTwWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXbuNN/btsC32FLRmW/zJbDX7x7RLalrrkAfHTwWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXbuNN/btsC32FLRmW/zJbDX7x7RLalrrkAfHTwWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXbuNN%2FbtsC32FLRmW%2FzJbDX7x7RLalrrkAfHTwWK%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;375&quot; height=&quot;403&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;2344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;학기 중에 사용할 돈을 벌기 위해서 여름방학 동안 &lt;b&gt;롯데시네마&lt;/b&gt;에서 &lt;b&gt;드리미&lt;/b&gt;로 근무했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;약 3개월 간의 짧은 근무였지만 좋은 사람들을 많이 만났고, 지금도 종종 본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직도 가끔 헬퍼로 도와주고, 직원가로 영화표랑 음식을 구매할 수 있는 혜택이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4분기&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;항공소프트웨어학과 복수전공&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1학기 동안의 노력 끝에 남은 3학기 동안은 소프트웨어 관련 전공만 들을 수 있게 됐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;복수전공을 시작한 2학기에는&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;객체지향프로그래밍&lt;/b&gt; / java / 2학년&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;데이터베이스&lt;/b&gt; / DB 이용한 캡스톤디자인 / 3학년&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;무인항공기시스템&lt;/b&gt; / 2학년&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;항공통신시스템&lt;/b&gt; / 매트랩 이용해서 항공 통신 구현 / 3학년&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;시스템 프로그래밍&lt;/b&gt; / 리눅스 운영체제 다루기 / 2학년&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;인공지능&lt;/b&gt; / 파이썬으로 데이터 분석해서 결과 도출하고 발표 / 4학년&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 2~4학년을 아우르는 전공을 들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;JS&lt;/b&gt;만 알던 나에게는 우선 언어부터 상당히 많이 공부해야 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;JAVA, JS, MYSQL, MATLAB, C, Python&lt;/b&gt; 등 언어만 5개를 공부한 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 열심히 공부한 결과 &lt;b&gt;4.33/4.5&lt;/b&gt; 학점을 받았다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캡스톤 디자인 프로젝트&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터베이스 수업에서 캡스톤 디자인 프로젝트 진행했는데, 같이 조를 결성하게 된 팀원이 아예 개발에 문외한이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국 프론트(디자인, &lt;b&gt;Vue.js&lt;/b&gt;)부터 백엔드(&lt;b&gt;Express.js, MYSQL&lt;/b&gt;)까지 혼자 하느라 매우 매우 고생했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정말 전공 공부하면서, 프론트만 조금 해본 실력으로 개발하느라 2학기 내내 새벽 3~4시까지 개발하고 8~9시에 기상해서 수업 들으러 간 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래도 방학 중에 한 풀스택 스터디가 관련된 내용이 많아서 큰 도움이 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 일부러 레퍼런스가 많은 &lt;b&gt;todolist 프로젝트&lt;/b&gt;를 해서 성공적으로 &lt;b&gt;프론트 - 백 - DB&lt;/b&gt;까지 연결된 프로젝트를 구현했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;할 때는 정말 힘들었지만 동시에 즐거웠고, 고생한 만큼 개발 실력도 많이 늘었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;깃허브 링크:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://github.com/jun10920/TodoList-for-DB&quot;&gt;https://github.com/jun10920/TodoList-for-DB&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704338326775&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;GitHub - jun10920/TodoList-for-DB: 데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트&quot; data-og-description=&quot;데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트. Contribute to jun10920/TodoList-for-DB development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jun10920/TodoList-for-DB&quot; data-og-url=&quot;https://github.com/jun10920/TodoList-for-DB&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/os5rl/hyUXT5WBtH/Yq3KV35Bgvv8o9H3e0omaK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/jun10920/TodoList-for-DB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jun10920/TodoList-for-DB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/os5rl/hyUXT5WBtH/Yq3KV35Bgvv8o9H3e0omaK/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;GitHub - jun10920/TodoList-for-DB: 데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트. Contribute to jun10920/TodoList-for-DB 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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시간이 오래 걸리긴 해도 &lt;b&gt;결국 해결해 낼 수 있다는 자신감&lt;/b&gt;을 얻게 된 소중한 경험이었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;네이버 데이터 사이언스 스터디 수료&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Snapshot_20240104_124247.png&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbrqBH/btsCTUJwLlK/6lPtBARzPygH8WKocHFQK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbrqBH/btsCTUJwLlK/6lPtBARzPygH8WKocHFQK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbrqBH/btsCTUJwLlK/6lPtBARzPygH8WKocHFQK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbrqBH%2FbtsCTUJwLlK%2F6lPtBARzPygH8WKocHFQK1%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;701&quot; height=&quot;493&quot; data-filename=&quot;KakaoTalk_Snapshot_20240104_124247.png&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인공지능 수업을 들으면서 좀 더 깊게 배우고 싶었는데, 마침 &lt;b&gt;네이버 부스트코스&lt;/b&gt;에서 진행하는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[Data Sciene 2023 코칭스터디 13기]&lt;/b&gt;를 같이 진행했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;덕분에 처음 접하는 주피터 노트북으로 Python을 이용해 여러 가지 라이브러리들을 다루는데 큰 도움이 됐고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 과제로 제출한 &lt;b&gt;&amp;ldquo;경기도의 어느 지역에서 고깃집을 열면 가장 성공확률이 높을까?&amp;rdquo;를&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성공적으로 분석하고 발표해서 학점 &lt;b&gt;A+&lt;/b&gt;를 받았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;멋쟁이 사자처럼 수료&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_KakaoTalk_20240102_165059213.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1909&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xBsu2/btsCTUW8c3p/2k2Sp3ekKjAZ5EA6MmrBQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xBsu2/btsCTUW8c3p/2k2Sp3ekKjAZ5EA6MmrBQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xBsu2/btsCTUW8c3p/2k2Sp3ekKjAZ5EA6MmrBQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxBsu2%2FbtsCTUW8c3p%2F2k2Sp3ekKjAZ5EA6MmrBQ0%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;343&quot; height=&quot;606&quot; data-filename=&quot;edited_edited_KakaoTalk_20240102_165059213.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1909&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2학기에 많은 활동을 하진 않았지만, 필수적인 활동은 모두 해서 &lt;b&gt;멋쟁이 사자처럼 11기를 수료&lt;/b&gt;했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발 실력 향상에 큰 도움이 되지는 않았지만 그래도 개발에 흥미를 갖게 해 주고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;항공 특화 대학교에서 개발에 관심 있는 친구들을 알게 해 준 좋은 경험이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;종강 이후~연말&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;C언어 공부 - 열혈 C 프로그래밍&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전공 공부를 하면서 C언어를 배우지 않은 상태로 이를 응용하는 전공들을 들을 때 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;온전히 이해하지 못한 게 너무 아쉬웠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 내년 1학기에 들을 전공도 대비하고, 코테 준비를 위한 자료구조를 공부할 것을 대비해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;12월 중순에 종강하고 2024년이 오기 전에 열혈 C프로그래밍을 끝내는 걸 목표로 공부했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;연말에 약속이 많아서 새해 첫날까지 공부해서 마치긴 했지만, 그래도 성공적으로 C언어에 대한 이해를 할 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 다른 언어에 없는 &lt;b&gt;포인터와 구조체&lt;/b&gt;를 이해하면서 개발을 보는 눈이 한층 넓어진 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개발 블로그 개설&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;계속하려고 생각했지만 바빠서 미뤘던 &lt;b&gt;개발 블로그&lt;/b&gt;를 종강하자마자 개설했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;티스토리, 벨로그, 네이버, 개츠비 블로그 등 고민을 하다가 블로그 만드는 것에도 많은 시간을 쓸 여유는 없어서 가장 대중적이고 이미 많은 기능이 구현되어 있는 &lt;b&gt;티스토리&lt;/b&gt;로 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만든 지 얼마 안돼서 많은 글은 없지만 2024년에 주에 최소 1개 이상의 글을 작성하고 싶다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2024년 계획&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하루하루 열심히 산 것 같은데, 2학기부터 개발을 제대로 시작해서 그런가 막상 적고 보니 좀 아쉬운 한 해인 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 글의 서두에 적었듯이 점점 개발에 초점을 맞춰가는 것을 보니 계획대로 잘 흘러가고 있는 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2024년에는 &lt;b&gt;개발에만 온전히 몰입&lt;/b&gt;하는 한 해가 목표다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 새해가 시작함과 동시에 이운규 변호사님이 모집하는 주 &lt;b&gt;60시간 공부 스터디&lt;/b&gt;에 참여했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://dreamschoolkr.liveklass.com/classes/151551?isChallenge=false&quot;&gt; 7기 모집 중, 프리시즌  주 60시간 공부 챌린지, 눈 딱 감고 2주만 해보세요. 삶이 바뀝니다. (성공 시 전액환급)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704339967459&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; 7기 진행 중, 8기1.18 모집시작 주 60시간 공부 챌린지, 스스로를 '한 단계 더' 성장시키세요 (&quot; data-og-description=&quot;공부에는, 당신의 인생을 펼쳐주는 힘이 있다.&quot; data-og-host=&quot;dreamschoolkr.liveklass.com&quot; data-og-source-url=&quot;https://dreamschoolkr.liveklass.com/classes/151551?isChallenge=false&quot; data-og-url=&quot;https://dreamschoolkr.liveklass.com/classes/151551?isChallenge=false&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3cLIp/hyUXRAjvrF/UBdiCmvhRpNeGnUFcQ2AVk/img.jpg?width=1802&amp;amp;height=1012&amp;amp;face=1295_247_1542_517&quot;&gt;&lt;a href=&quot;https://dreamschoolkr.liveklass.com/classes/151551?isChallenge=false&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dreamschoolkr.liveklass.com/classes/151551?isChallenge=false&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3cLIp/hyUXRAjvrF/UBdiCmvhRpNeGnUFcQ2AVk/img.jpg?width=1802&amp;amp;height=1012&amp;amp;face=1295_247_1542_517');&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; 7기 진행 중, 8기1.18 모집시작 주 60시간 공부 챌린지, 스스로를 '한 단계 더' 성장시키세요 (&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;공부에는, 당신의 인생을 펼쳐주는 힘이 있다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dreamschoolkr.liveklass.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직까진 순탄하게 진행되고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;올해의 첫 번째 목표&lt;/b&gt;는 우선 본 전공과 복수전공을 학점 4점대 이상으로 &lt;b&gt;졸업&lt;/b&gt;하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;두 번째 목표&lt;/b&gt;는 하반기에 1순위는 &lt;b&gt;취업&lt;/b&gt;, 2순위는 &lt;b&gt;메이저 부트캠프&lt;/b&gt;에 들어가는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;졸업&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1학기에 복수전공 18학점 듣기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1학기에 졸업프로젝트 마무리 하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;학점 4점대로 졸업하기 (현재 3.98)&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;취업&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;졸업 프로젝트와 여름방학에 사이드 프로젝트 하나 정도 제대로 해서 포트폴리오에 쓰기&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CS공부&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;혼자서 공부하는 컴퓨터 구조/운영체제 스터디로 1월 7일부터 시작하기&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩테스트&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1월 7일까지 자료구조 책 완독하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이후 코딩테스트 매일 2개씩 풀기&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자격증&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;겨울방학에 정처기 취득&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여름방학에 SQLD 취득&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;맺으며&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2023년 하반기에 주변 지인들로부터 좋은 소식이 많이 들려왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우리 가족 분위기상 &lt;b&gt;대학교 졸업=독립이라는&lt;/b&gt; 느낌이 커서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 나에게는 지나가는 하루하루가 &lt;b&gt;독립&lt;/b&gt;으로 다가가는 것 같아 부담이 크다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;올해도 열심히 달려서 나의 2024년 회고에 좋은 얘기가 많이 있기를 바라며 열심히 성장하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;  긴 글 읽어주셔서 감사합니다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>회고</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/12</guid>
      <comments>https://jun10920.tistory.com/12#entry12comment</comments>
      <pubDate>Fri, 5 Jan 2024 11:50:52 +0900</pubDate>
    </item>
    <item>
      <title>2024년의 개발 공부법(INPUT) 정리</title>
      <link>https://jun10920.tistory.com/11</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;이 글을 쓰게 된 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이전에 주로 써왔던 Js나 객제지향 프로그래밍 전공 수업에서 배운 Java는 어느 정도 문법을 익혔지만, 전공에서 응용하면서 주먹구구식으로 배운 C언어와 자료구조를 최대한 빠르게, 하지만 나름 깊이 있게 배우기 위해서 효율적인 공부법에 대해 수많은 구글링, 유튜브, 공부법 서적을 읽으며 생각해 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그중 가장 많은 참고를 한 곳은&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이운규 변호사님,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://www.youtube.com/@DreamSchool_KR&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/@DreamSchool_KR후&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704117206031&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;profile&quot; data-og-title=&quot;DreamSchool 이윤규&quot; data-og-description=&quot;일본, 대만, 베트남 수출! 대한민국 No.1 공부법 채널 누구든 꿈을 이루실 수 있습니다. 빠르고 쉽게 수험생활에서 벗어나세요.&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://www.youtube.com/@DreamSchool_KR&quot; data-og-url=&quot;https://www.youtube.com/channel/UCnoMoEViyPVWsKch6X-N61w&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UKK4P/hyUXSd6wGZ/VlYglkkAz7kKZm9HWEwgo1/img.jpg?width=900&amp;amp;height=900&amp;amp;face=274_324_548_623,https://scrap.kakaocdn.net/dn/dOu0Zl/hyUTJpyDtD/eO92B1DNjDTAYdsyLzKwSK/img.jpg?width=900&amp;amp;height=900&amp;amp;face=274_324_548_623&quot;&gt;&lt;a href=&quot;https://www.youtube.com/@DreamSchool_KR&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube.com/@DreamSchool_KR&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UKK4P/hyUXSd6wGZ/VlYglkkAz7kKZm9HWEwgo1/img.jpg?width=900&amp;amp;height=900&amp;amp;face=274_324_548_623,https://scrap.kakaocdn.net/dn/dOu0Zl/hyUTJpyDtD/eO92B1DNjDTAYdsyLzKwSK/img.jpg?width=900&amp;amp;height=900&amp;amp;face=274_324_548_623');&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;DreamSchool 이윤규&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일본, 대만, 베트남 수출! 대한민국 No.1 공부법 채널 누구든 꿈을 이루실 수 있습니다. 빠르고 쉽게 수험생활에서 벗어나세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;후디님이다.&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hudi.blog/how-to-deep-dive/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hudi.blog/how-to-deep-dive/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704117217644&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;문제 해결 능력을 위한 깊이 있는 학습 방법에 대해&quot; data-og-description=&quot;자바 공부를 어떻게 하길래, &amp;quot;언체크드 예외 발생시 트랜잭션 롤백?&amp;quot; 백기선님의 유튜브 영상 제목이다. 다소 자극적인 제목의 영상이지만, 영상을 보는 내내 깊이 공감하고 또 깊이 반성했다. &quot; data-og-host=&quot;hudi.blog&quot; data-og-source-url=&quot;https://hudi.blog/how-to-deep-dive/&quot; data-og-url=&quot;https://hudi.blog/how-to-deep-dive/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cxI0kr/hyUXMrpyqd/sqBlqCvwkJXpvKQNHGGiy1/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400&quot;&gt;&lt;a href=&quot;https://hudi.blog/how-to-deep-dive/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hudi.blog/how-to-deep-dive/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cxI0kr/hyUXMrpyqd/sqBlqCvwkJXpvKQNHGGiy1/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400');&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;자바 공부를 어떻게 하길래, &quot;언체크드 예외 발생시 트랜잭션 롤백?&quot; 백기선님의 유튜브 영상 제목이다. 다소 자극적인 제목의 영상이지만, 영상을 보는 내내 깊이 공감하고 또 깊이 반성했다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hudi.blog&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이운규 변호사님의 공부법은 공부법에 관심 있는 사람들에게 유명하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;나 역시 이 방법을 적용하고 나서&lt;b&gt; 짧은 기간 동안&lt;/b&gt; &lt;b&gt;좋은 성적&lt;/b&gt;을 얻을 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 토익 600 후반에서 인강 x 학원 x 한 달 뒤 &lt;b&gt;915점&lt;/b&gt; 취득&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 사이드프로젝트하느라 바빠서(수업시간에는 열심히 들음) 2학기 18학점 전공 시험 1주일 전부터 공부해서 학점&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4.33&lt;/b&gt;/4.5 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기에 개발 분야에 맞게 바꾸기 위해 다른 개발자 분들의 블로그를 참고했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;미래의 내가 과거의 공부법을 보면서 어떤 생각을 할지도 궁금하고, 나와 같은 개발 초보자 분들에게 도움이 될까 싶어 정리해 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;개발 고수분들의 피드백은 언제든 환영입니다.&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 이 공부법은 효율적인 인풋을 위한 공부법이니, 아웃풋에 대한 내용은 다음에 기회가 된다면 설명하겠다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그래서 어떻게 하라고?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공부법에서는 크게&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;1단계 &lt;b&gt;학습&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;2단계 &lt;b&gt;체득&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;3단계 &lt;b&gt;정리&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;세 단계로 구분 짓는다(2단계와 3단계는 순서가 바뀔 때도 많다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;첫 번째는 &lt;b&gt;전체 맥락과 뼈대를 잡는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;목차를 여러 색의 형광펜을 가지고 같은 수준의 목차는 같은 색으로 칠한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;목차들 간의 유기적인 관계에 대해서 머릿속으로 생각하며 칠한다.&lt;/li&gt;
&lt;li&gt;상위 목차의 내용을 이해하기 위한 답을 찾기 위해 하위 목차를 이용한다&lt;/li&gt;
&lt;li&gt;최종적으로 하위 목차의 내용을 이해하기 위해서 줄글을 읽을 때까지 반복한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;두 번째는 &lt;b&gt;세부내용을 파악하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&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;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 2번은 자세한 설명이 필요하다&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;키워드의 정의를 보고 또 모르는 키워드를 정리한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;첫 번째 과정을 반복한다 (1~3번 정도)&lt;/li&gt;
&lt;li&gt;도출된 문장들을 가지고 왜라는 질문을 가지고 해결하기&lt;/li&gt;
&lt;li&gt;이때 최대한 공식문서, 책과 같이 공신력있는 정보를 참고하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;세 번째는 &lt;b&gt;머리 속에 정착시키는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;노션에 정리한 부분을 읽고 스스로 문제 내본다.&lt;/li&gt;
&lt;li&gt;할머니에게 설명할 수 있을 정도로 간단하게 바꿔서 설명한다 -&amp;gt; 이 부분을 블로그에 작성하는 것으로 대체&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이는 공부법의 세 단계 중 학습과 정리의 영역에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;체득&lt;/b&gt;의 경우,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;실질적인 구현 능력&lt;/b&gt;은 프로젝트를 실제로 진행하면서 수많은 디버깅을 해치우면서 성장하는 것 같고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;코딩테스트의 영역&lt;/b&gt;은 이운규변호사님의 아웃풋 부분을 참고해서 하면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재 위에 자세히 작성한 인풋 부분은 열혈 C 프로그래밍을 학습하면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;PART마다 기존의 학습법과 이 학습법을 번갈아 사용하며 검증해보려고 했는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;PART01에서 기존의 학습법(개념 전부 읽고 -&amp;gt; 예제 풀고 -&amp;gt; 이해하고)보다 PART02에서 이 학습법이 월등히 효율이 좋아서 이 방법으로 열혈 C프로그래밍을 공부했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;맺으며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;코테도 자료구조 책 한 권 금방 끝내고 바로 시작할 것인데, 그때 이 학습법의 아웃풋 부분도 검증되면 정리해서 올려보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타/개발생각</category>
      <category>개발공부</category>
      <category>개발공부법</category>
      <category>개발생각</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/11</guid>
      <comments>https://jun10920.tistory.com/11#entry11comment</comments>
      <pubDate>Mon, 1 Jan 2024 23:44:51 +0900</pubDate>
    </item>
    <item>
      <title>CLION에서 왜 UTF-8로 인코딩하면 한글이 깨지는가? - 윤성우의 열혈 C 프로그래밍</title>
      <link>https://jun10920.tistory.com/10</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;궁금증이 생긴 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;책을 공부하면서 Jet brain사의Clion ide를 사용하고 있는데, 영어로는 잘 출력이 되는데 한글로 결과를 출력하면 자꾸 값이 깨져서 출력이 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;구글링을 통해서 UTF-8형식에서 x-windows-949 으로 바꾸면 문제가 해결되는 것을 알았지만,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;UTF-8과 x-windows-949가 정확히 뭔지, 두 형식 간의 차이가 뭐길래 문제가 해결되는 지가 궁금했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&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;size18&quot;&gt;인코딩이랑 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;그 역으로 컴퓨터의 신호를 문자나 기호로 만드는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인코딩의 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;처음 영어로만 컴퓨터를 다룰 때는 아스키 코드만을 사용해도 가능했지만, 한국어를 비롯해 다른 나라의 언어들을 추가하다보니 아스키코드가 다룰 수 있는 1byte의 숫자로는 표현을 할 수 없게 되었다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그래서 1byte가 아닌 여러 byte를 사용하는 &lt;b&gt;멀티바이트 인코딩&lt;/b&gt;을 사용하게 되었다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이 때, 완성형 인코딩(&lt;b&gt;CP949&lt;/b&gt; / MS949, WINDOWS949라고 불리는)과 조합형 인코딩 등 여러 방식을 사용하였는데, 서로 다른 인코딩 방식을 사용한 프로그램 사이에서 호환성 문제가 발생하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 이를 통일하기 위해서 유니코드를 새로 만들었다. 이는 2byte 숫자와 1:1 매핑하는 방식을 사용하는 방식이고, 이 중 하나가&lt;b&gt; UTF-8&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;UTF-8이 CLION에서 default형식으로 되어있기 때문에 CP949형식으로 되어있는 것을 디코딩할 때 깨지는 것이 아닐까 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;jet brain사의 문의 답변들을 보아도 해결을 어떻게 했는지는 나오지만 이유가 무엇인지는 쓰여있는 것이 없어서 이번 기회에 공부한 것을 바탕으로 추론해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;만약 더 자세한 내용을 아시거나 틀린 정보가 있다면 언제든 알려주세요!&lt;/b&gt;&lt;/p&gt;</description>
      <category>C언어</category>
      <category>clion</category>
      <category>c언어</category>
      <category>윤성우의열혈C프로그래밍</category>
      <category>한글깨짐현상</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/10</guid>
      <comments>https://jun10920.tistory.com/10#entry10comment</comments>
      <pubDate>Fri, 29 Dec 2023 14:59:21 +0900</pubDate>
    </item>
    <item>
      <title>main함수가 return 하는 자료형이 왜 void가 아닌 int형인가? - 윤성우의 열혈 C 프로그래밍</title>
      <link>https://jun10920.tistory.com/9</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;C언어를 공부하게 된 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;올해 3월에 개발을 하겠다고 마음을 먹었지만, 1학기에는 본 전공을 졸업하기 위한 준비를 하느라 개발에만 집중하지 못했고, 여름방학에는 Js로 spa 구현하기 프로젝트를 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이후 2학기때 복수전공을 들으면서 Java와 다른 과목들을 열심히 배웠지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;C언어를 직접적으로 배우진 못하고, C언어를 응용하는 전공들만 배워서 이해하지 못하고 사용하는데만 급급했던 순간이 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 내년 1학기에 배울 자료구조와 앞으로 코딩테스트 준비를 하면서 배울 알고리즘 공부를 하기 전에, C언어를 짧고 굵게 배우려고 동기들과 교수님께 추천받은 &lt;b&gt;열혈 C 프로그래밍&lt;/b&gt; 책을 공부하기 시작했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;블로그에 정리할 내용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모든 내용을 다 정리하는 것은 그닥 나에게도, 읽는 사람에게도 도움이 안 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;읽다가 궁금증이 생기는 부분을 한 파트씩 공부하고 정리하는 방식으로 작성할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;물론 최대한 책과 공식 자료를 참고할 예정이지만 부득이하게 다른 블로그를 참고할 수도 있으니 잘못된 정보를 전달할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;언제든 잘못됐거나 틀린 정보가 있다면 댓글로 알려주시면 감사하겠습니다. 더 공부해서 수정하겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;main 함수가 return하는 자료형이 왜 void가 아닌 int형일까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 아무 생각없이 main 함수의 자료형을 int형으로 작성했었지만, 갑자기 궁금해졌다.&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;자료형을 void 형으로 놓고 return형을 생략하거나, retrun;으로 작성해도 되지 않는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 &lt;b&gt;return문을 사용하는 이유&lt;/b&gt;부터 알아보면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;return을 사용하는 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return문을 사용하는 이유를 보면&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;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;이를 생각해보면, main함수를 호출하는 주체가 운영체제인데, 운영체제에게 프로그램의 종료를 알리기 위해서 정수를 반환한다. -&amp;gt; exit status&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 exit status가 0이면 정상적으로 종료된 것이고, 1을 반환하면 정상적으로 종료가 안 됐다는 의미이다.&lt;/p&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;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;첫째로&lt;span&gt; &lt;/span&gt;&lt;/span&gt;호출의 주체인 &lt;b&gt;운영체제에게 프로그램의 종료를 알리기 위함&lt;/b&gt;이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;main 함수의 종료 = 프로그램의 종료를 의미하기 때문&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;둘째로 &lt;b&gt;exit status를 정수형으로 return&lt;/b&gt; 하기 때문에 main 함수가 반환하는 자료형이 int 형인 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;여담&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;내가 했던 질문들에 대한 답을 시간을 들여 찾고 나니, 책에서 다른 부분이지만 정리되어 있던 내용들을 종합해 보면 질문에 오히려 명확하게 답이 나오는 부분들이 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;책을 수동적인 자세가 아니라 능동적인 자세로 읽어버릇해야겠다.&lt;/p&gt;</description>
      <category>C언어</category>
      <category>c언어</category>
      <category>int형</category>
      <category>main함수의자료형</category>
      <category>열혈C</category>
      <category>윤성우의열혈C프로그래밍</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/9</guid>
      <comments>https://jun10920.tistory.com/9#entry9comment</comments>
      <pubDate>Thu, 28 Dec 2023 13:15:51 +0900</pubDate>
    </item>
    <item>
      <title>TodoList_for_DB / Vue.js + Node.js + MYSQL / 투두리스트 프로젝트 회고</title>
      <link>https://jun10920.tistory.com/2</link>
      <description>&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;우선 회고에 앞서, 어떤 방식으로 회고를 할지 참고하기 위해 주간 인프런에 적혀있는&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;KPT 방식을 참고했다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;KPT는 Keep, Problem, Try의 약자로,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #495057;&quot;&gt;&lt;span&gt;&lt;b&gt;Keep&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(프로젝트에서 만족했고, 앞으로의 업무에서 지속하고 싶은 부분)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #495057;&quot;&gt;&lt;span&gt;&lt;b&gt;Problem&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(프로젝트에서 부정적인 요소로 작용했거나 아쉬웠던 점)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #495057;&quot;&gt;&lt;span&gt;&lt;b&gt;Try&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;(Problem에 대한 해결 방식으로 다음 프로젝트에서 시도해 볼 점)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;에 대해서 작성하는 것이다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;대략적인 프로젝트의 소개를 먼저 하고, 이후에 KPT 양식에 맞춰서 작성할 예정이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;(첫 블로그 글이라 KPT 방식을 사용하고, 이후에 여러 방식도 사용해 볼 것이다)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;프로젝트 소개&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;데이터베이스 전공 수업의 캡스톤 디자인에서 진행한 프로젝트로, DB를 이용한 응용 프로그램을 작성하는 과제였다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;개발 기간&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;2023.10.20 ~ 2023.11.20&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;개발 환경&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;FE : HTML, CSS, JavaScript(Vue) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;BE : Node.js, Express.js &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;DB: MYSQL&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;버전 관리 및 협업도구 : Git &amp;amp; Github&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;기능 / 순서도&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;로그인 검증 기능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아이디 3자 이상, 비밀번호 3자 이상, 닉네임 2자 이상인지, null값은 아닌지 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;회원가입 기능&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원가입 기능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아이디, 비밀번호, 닉네임을 입력하여 검증 시작&amp;nbsp;&lt;/li&gt;
&lt;li&gt;회원가입 검증 통과하면 데이터베이스에 등록&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;회원가입 검증 기능 &amp;nbsp;
&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;아이디 3자 이상, 비밀번호 3자 이상, 닉네임 2자 이상인지, null값은 아닌지 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;todolist 기능&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;todo 추가시 중요도 순위도 함께 부여&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;삭제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개별 삭제, 전체 삭제(RESET)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;조회
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 상태인 경우 항상 가장 최근의 todo상태를 갱신해 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;회원정보 기능&lt;/b&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20231218_125512126.jpg&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;963&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4VDcb/btsB6n6qFq9/nZ4qM4B7pgvWRXIKtm8LI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4VDcb/btsB6n6qFq9/nZ4qM4B7pgvWRXIKtm8LI1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4VDcb/btsB6n6qFq9/nZ4qM4B7pgvWRXIKtm8LI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4VDcb%2FbtsB6n6qFq9%2FnZ4qM4B7pgvWRXIKtm8LI1%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;860&quot; height=&quot;963&quot; data-filename=&quot;KakaoTalk_20231218_125512126.jpg&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;963&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DB&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ERD&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;noname02.png&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P8ttI/btsCauwWZwj/iRHroBOKxL9XXSwv1kI5YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P8ttI/btsCauwWZwj/iRHroBOKxL9XXSwv1kI5YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P8ttI/btsCauwWZwj/iRHroBOKxL9XXSwv1kI5YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP8ttI%2FbtsCauwWZwj%2FiRHroBOKxL9XXSwv1kI5YK%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;804&quot; height=&quot;330&quot; data-filename=&quot;noname02.png&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;noname01.png&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EvFR4/btsB7kIxMCI/OUpAWe8kzBAaKWd0ckhk71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EvFR4/btsB7kIxMCI/OUpAWe8kzBAaKWd0ckhk71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EvFR4/btsB7kIxMCI/OUpAWe8kzBAaKWd0ckhk71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEvFR4%2FbtsB7kIxMCI%2FOUpAWe8kzBAaKWd0ckhk71%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;567&quot; height=&quot;272&quot; data-filename=&quot;noname01.png&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;272&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;TABLE 소개&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;user &lt;/span&gt;&lt;span&gt;테이블&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- id: user &lt;/span&gt;&lt;span&gt;테이블의 &lt;/span&gt;&lt;span&gt;attribute&lt;/span&gt;&lt;span&gt;중 &lt;/span&gt;&lt;span&gt;primary key / Not Null, Auto Increment&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- userid: &lt;/span&gt;&lt;span&gt;로그인할 때 사용하는 아이디 &lt;/span&gt;&lt;span&gt;/ Not Null, Unique&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- userpw: &lt;/span&gt;&lt;span&gt;로그인할 때 사용한 비밀번호 &lt;/span&gt;&lt;span&gt;/ Not Null&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- nickname: &lt;/span&gt;&lt;span&gt;로그인 후 소개 페이지에 출력되는 닉네임 &lt;/span&gt;&lt;span&gt;/ Not Null&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;todos &lt;/span&gt;&lt;span&gt;테이블&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- id: todos &lt;/span&gt;&lt;span&gt;테이블의 &lt;/span&gt;&lt;span&gt;attribute &lt;/span&gt;&lt;span&gt;중 &lt;/span&gt;&lt;span&gt;primary key / Not Null, Auto Increment &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- userid: user&lt;/span&gt;&lt;span&gt;의 외래키 참조하는 &lt;/span&gt;&lt;span&gt;attribute&lt;/span&gt;&lt;span&gt;로&lt;/span&gt;&lt;span&gt;, todo&lt;/span&gt;&lt;span&gt;를 저장하는 아이디 &lt;/span&gt;&lt;span&gt;/ Not Null, Unique&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- content: todo&lt;/span&gt;&lt;span&gt;의 내용 &lt;/span&gt;&lt;span&gt;/ Not Null&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- status: &lt;/span&gt;&lt;span&gt;할 일&lt;/span&gt;&lt;span&gt;(1), &lt;/span&gt;&lt;span&gt;하고 있는 일&lt;/span&gt;&lt;span&gt;(2), &lt;/span&gt;&lt;span&gt;한 일&lt;/span&gt;&lt;span&gt;(3)&lt;/span&gt;&lt;span&gt;을 구분 &lt;/span&gt;&lt;span&gt;/ Not Null, Default &lt;/span&gt;&lt;span&gt;값&lt;/span&gt;&lt;span&gt;: 1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- rank: &lt;/span&gt;&lt;span&gt;중요도 순위를 구분 &lt;/span&gt;&lt;span&gt;/ Not Null&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;Keep, Problem, try&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;keep&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화면 및 기능 구현, 서버에서부터 데이터베이스까지 대략적인 과정을 이해했다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번 학기부터 소프트웨어학과를 복수전공을 시작하면서, 제대로 개발을 시작한 지 한 달 반정도 지난 시점이었는데 서버와 데이터베이스와&amp;nbsp; UI/UX와 기능 구현을 제한된 시간 안에 구현하면서 많은 것을 배웠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;내 상황과 수준을 정확히 파악하고 계획을 짜서 결국 성공적으로 프로젝트를 완수했다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'DB를 이용한 응용프로그램 제작' 이라는 넓은 의미를 가진 주제의 캡스톤 디자인 프로젝트였지만, 중간고사 끝나고 기말고사 2주 전까지의 약 한 달이라는 시간 내에 구현해야 했다.&lt;/li&gt;
&lt;li&gt;다른 팀들은 좀 더 어려운 주제의 프로그램을 도전했지만, 기간 내에 구현하기에는 실력과 시간이 모두 부족해 실패한 경우가 많았다.&lt;/li&gt;
&lt;li&gt;1학기에 Js를 이용해 약간의 공부를 해본 것이 전부였던 나에게 거의 제대로 된 프로젝트는 처음이었기에, 레퍼런스가 많아 공부할 게 많으면서, 기본적으로 모든 crud를 구현할 수 있는 todolist 프로젝트를 계획했고 매일 새벽까지 했지만 결국 기간 내에 프로젝트를 완성했다.
&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;problem&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;그래서 거의 모든 부분을 내가 도맡아 하다보니 새벽 3~4시까지 개발하고 아침 일찍 전공 수업 가는 일정을 몇 주간 반복하느라 굉장히 지쳤다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;구현&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;뷰 2 api를 사용&lt;/li&gt;
&lt;li&gt;로그인 기능 구현시 express-session에 대해서 완벽히 이해하지 못하고 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기록
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;당시에 시간과 실력이 부족했기 때문에 하루하루 배우고 구현하는데&amp;nbsp; 급해서, 기록의 중요성에 대해 알면서도 제대로 하지 못했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터베이스 구성에 대해서만 배우고 프로젝트를 시작했기 때문에, 종강할 때까지 지나고 나니 알게된 정석적인 데이터베이스 설계대로 구현하지 못함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;try&lt;/h3&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;외래 키로 보통 PK를 사용&lt;/li&gt;
&lt;li&gt;컴포넌트 단위로 나누어서 구현&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(아토믹 디자인패턴 참고)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt; 뷰 라우터를 통해서 관리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt; 뷰 3 컴포지션 api를 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;express-session에 대해서 좀 더 배우기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mevn 책과 공식문서를 통해서 배우고 블로그에 이에 대해 정리할 예정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;좀 더 복잡한 테이블을 사용할 수 있는 주제로, 요건분석 - 개념적 - 논리적 - 물리적 - 정규화 과정을 거치는 개발을 해봐야겠다.&lt;/li&gt;
&lt;li&gt;다음에는 일정을 좀 더 잘 배분하고 시간이 부족하더라도 오늘 생긴 문제 - 어떻게 해결했는지에 대해서 간략하게 정리해야겠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;깃허브&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702872729656&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;GitHub - jun10920/TodoList-for-DB: 데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트&quot; data-og-description=&quot;데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트. Contribute to jun10920/TodoList-for-DB development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jun10920/TodoList-for-DB&quot; data-og-url=&quot;https://github.com/jun10920/TodoList-for-DB&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bldOcv/hyUPEfGPSD/0qxsF0X15uLx5NG6u4DZHK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/jun10920/TodoList-for-DB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jun10920/TodoList-for-DB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bldOcv/hyUPEfGPSD/0qxsF0X15uLx5NG6u4DZHK/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;GitHub - jun10920/TodoList-for-DB: 데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스와 서버를 이용한 todolist 웹사이트 협업 프로젝트. Contribute to jun10920/TodoList-for-DB 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;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;참고사이트&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702869276990&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;개발자의 공유 문화 이모저모 (2) 회고 문화 - 인프런 | 스토리&quot; data-og-description=&quot;기록도 점검도 셀프!&amp;nbsp;개발자는 왜 회고를 할까요? #오픈소스&amp;nbsp;#기술블로그&amp;nbsp;#회고문화 바쁘게 일하고 공부하다 보면 시간이 훌쩍 지나있기 마련이죠.&amp;nbsp;그렇지만 모든 일을 다 기억할 수는 없는 &quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/pages/weekly-inflearn-41-20220215&quot; data-og-url=&quot;https://www.inflearn.com/pages/weekly-inflearn-41-20220215&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cFahDo/hyUL2bp1dh/klpzl6LIEcEU1z1sy7Ffe1/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/bdSf2p/hyUPLTp9eD/HObPSw9eiM5mSZw4tFJcRK/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/cBJ8nW/hyULX83E0q/u9OVsCLMVea2x9HqpH6s3k/img.png?width=1263&amp;amp;height=906&amp;amp;face=0_0_1263_906&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/pages/weekly-inflearn-41-20220215&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/pages/weekly-inflearn-41-20220215&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cFahDo/hyUL2bp1dh/klpzl6LIEcEU1z1sy7Ffe1/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/bdSf2p/hyUPLTp9eD/HObPSw9eiM5mSZw4tFJcRK/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/cBJ8nW/hyULX83E0q/u9OVsCLMVea2x9HqpH6s3k/img.png?width=1263&amp;amp;height=906&amp;amp;face=0_0_1263_906');&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;개발자의 공유 문화 이모저모 (2) 회고 문화 - 인프런 | 스토리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;기록도 점검도 셀프!&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;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; 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;</description>
      <category>프로젝트</category>
      <category>db</category>
      <category>MySQL</category>
      <category>ToDoList</category>
      <category>Vue</category>
      <category>프로젝트</category>
      <category>회고</category>
      <author>겨울단추</author>
      <guid isPermaLink="true">https://jun10920.tistory.com/2</guid>
      <comments>https://jun10920.tistory.com/2#entry2comment</comments>
      <pubDate>Mon, 18 Dec 2023 13:58:47 +0900</pubDate>
    </item>
  </channel>
</rss>