<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>기억하고싶은것들</title>
    <link>https://joomn11.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 26 May 2026 15:23:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>joomn11</managingEditor>
    <image>
      <title>기억하고싶은것들</title>
      <url>https://tistory1.daumcdn.net/tistory/3920223/attach/705053568bea4010893f37da97a9b979</url>
      <link>https://joomn11.tistory.com</link>
    </image>
    <item>
      <title>백엔드 기술 면접 준비</title>
      <link>https://joomn11.tistory.com/132</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JOFlU/btrH0uEMIwi/haXY8cjiI8Ar5x09U1liHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JOFlU/btrH0uEMIwi/haXY8cjiI8Ar5x09U1liHk/img.png&quot; data-alt=&quot;출처 :&amp;amp;nbsp;https://velog.io/@kk1112k/백엔드-개발-기술면접-정리-Java-추가중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JOFlU/btrH0uEMIwi/haXY8cjiI8Ar5x09U1liHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJOFlU%2FbtrH0uEMIwi%2FhaXY8cjiI8Ar5x09U1liHk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;https://velog.io/@kk1112k/백엔드-개발-기술면접-정리-Java-추가중&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;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;면접도 보통은 2번으로 나뉘어서 보게 됩니다.&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;&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;경력직의 기술 면접의 경우에는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;프로젝트 사용 언어, 기술에 대한 설명 각각의 장단점&amp;nbsp;&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;/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;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;크게 카테고리를 나누면 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CS&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Spring&lt;/li&gt;
&lt;/ul&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;/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;&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;제가 준비하면서 알아둔 몇몇 url을 공유하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;a href=&quot;https://velog.io/@woo0_hooo/컴공-취준생에게-유용한-링크들-정리&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@woo0_hooo/컴공-취준생에게-유용한-링크들-정리&lt;/a&gt;&amp;nbsp; &amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도움이 되는 다양한 링크들이 정리되어 있습니다&lt;br /&gt;모두 방문하면서 자신에게 맞는 링크를 정하고 학습하면 좋을 거 같습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ksundong/backend-interview-question&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/ksundong/backend-interview-question&lt;/a&gt;&amp;nbsp; &amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/devham76/tech-interview-study&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/devham76/tech-interview-study&lt;/a&gt;&amp;nbsp; &amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@hygoogi/기술-면접-질문-모음&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@hygoogi/기술-면접-질문-모음&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&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;/p&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.youtube.com/channel/UCW9WO6kfWQlz_D3NwU3j4Dg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/channel/UCW9WO6kfWQlz_D3NwU3j4Dg&lt;/a&gt; &amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCHFz--glnVVP1xBLA-8kltg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/channel/UCHFz--glnVVP1xBLA-8kltg&lt;/a&gt; &amp;nbsp;&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;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;p data-ke-size=&quot;size18&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Career</category>
      <category>backend</category>
      <category>Career</category>
      <category>Developer</category>
      <category>interview</category>
      <category>개발자</category>
      <category>기술면접</category>
      <category>면접</category>
      <category>백엔드</category>
      <category>이직</category>
      <author>joomn11</author>
      <guid isPermaLink="true">https://joomn11.tistory.com/132</guid>
      <comments>https://joomn11.tistory.com/132#entry132comment</comments>
      <pubDate>Wed, 27 Jul 2022 22:49:26 +0900</pubDate>
    </item>
    <item>
      <title>개발자 코딩 테스트 준비</title>
      <link>https://joomn11.tistory.com/131</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;요즘 대부분의 it 회사의 채용 프로세스에는 코딩 테스트가 포함되어있습니다.&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;/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;/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;&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;그중에 유명한 사이트를 몇 개 나열해 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;a href=&quot;https://leetcode.com/problemset/all/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problemset/all/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/challenges&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/challenges&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acmicpc.net/problemset&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problemset&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;이런 문제는 어떠한 알고리즘 문제에 속한다라는 개념을 익히는 것이 중요하다고 생각합니다.&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;저는 코딩 테스트 연습을 위한 사이트는 leetcode를 선택하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;leetcode에는&amp;nbsp; 알고리즘 문제 이외에도 게시판 기능이 존재하여서 해당 게시판에&amp;nbsp;다양한 글들이 공유됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그중에 leetcode에서 제공하는 문제들을 알고리즘 유형에 맞게 먼저 풀면 좋은 문제들을 모아놓은 게시글들이 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://leetcode.com/discuss/general-discussion/665604/Important-and-Useful-links-from-all-over-the-LeetCode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/discuss/general-discussion/665604/Important-and-Useful-links-from-all-over-the-LeetCode&lt;/a&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;&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;1067&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGH4yD/btrHROSnHU5/qHaZ87ZdgB9yy2eRHyQBYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGH4yD/btrHROSnHU5/qHaZ87ZdgB9yy2eRHyQBYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGH4yD/btrHROSnHU5/qHaZ87ZdgB9yy2eRHyQBYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGH4yD%2FbtrHROSnHU5%2FqHaZ87ZdgB9yy2eRHyQBYK%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;1067&quot; height=&quot;611&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;611&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;유용한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;유튜브&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;영상&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&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;a href=&quot;https://www.youtube.com/c/NeetCode/playlists&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/c/NeetCode/playlists&lt;/a&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;leetcode 문제 해법, 접근 방식 등을 알려주는 영상 위주&lt;/li&gt;
&lt;li&gt;재생목록을 알고리즘 유형별로 나눠두었음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg/playlists&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg/playlists&lt;/a&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;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;하지만 문제 유형에 익숙해지고 적응하기 위해서는 반드시 필요한 과정이라고 생각합니다.&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;저 같은 경우에는 leetcode에 문제를 풀어서 개인 github에 해당 내용을 커밋하면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;github 계정에 푸시 잔디를 심는 것을 목표로 했었습니다.&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;또한, leetcode에 문제 푼 내용들을 블로그에 정리하면서&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Career</category>
      <category>Algorithm</category>
      <category>Career</category>
      <category>Developer</category>
      <category>개발자</category>
      <category>이직</category>
      <category>코딩테스트</category>
      <author>joomn11</author>
      <guid isPermaLink="true">https://joomn11.tistory.com/131</guid>
      <comments>https://joomn11.tistory.com/131#entry131comment</comments>
      <pubDate>Mon, 25 Jul 2022 23:55:27 +0900</pubDate>
    </item>
    <item>
      <title>경력 백엔드 개발자 이력서 작성</title>
      <link>https://joomn11.tistory.com/130</link>
      <description>&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보통 경력의 경우 3~6개월에 한 번씩 자신의 이력서를 업데이트하는 것이 좋다고 합니다.&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;&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;/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;/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;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;a href=&quot;https://techblog.woowahan.com/2531/&quot;&gt;https://techblog.woowahan.com/2531/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.outsider.ne.kr/1234&quot;&gt;https://blog.outsider.ne.kr/1234&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wonny.space/writing/work/engineer-resume&quot;&gt;https://wonny.space/writing/work/engineer-resume&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://taltube.tistory.com/23&quot;&gt;https://taltube.tistory.com/23&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.google.com/document/d/1Y2Y7-DWO-0F68nsUxB-ObYbXTdQgBHu-Fw48yTYG6R0/edit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.google.com/document/d/1Y2Y7-DWO-0F68nsUxB-ObYbXTdQgBHu-Fw48yTYG6R0/edit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/Yc56NpYW1DM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/Yc56NpYW1DM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/PJGsPohDuoA&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/PJGsPohDuoA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;저 같은 경우에는 회사에 분기마다 제출했던 분기 보고서들을 참고하거나 git 레포지토리의 커밋 내역들을 참고하였습니다.&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;&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;요즘에는 이력서를 notion, github과 같은 기능들을 많이 활용하는 것 같습니다.&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;/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;1312&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vXKt5/btrHPfgCHHH/mXLARMGYI7bmKjnDahjm60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vXKt5/btrHPfgCHHH/mXLARMGYI7bmKjnDahjm60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vXKt5/btrHPfgCHHH/mXLARMGYI7bmKjnDahjm60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvXKt5%2FbtrHPfgCHHH%2FmXLARMGYI7bmKjnDahjm60%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;1312&quot; height=&quot;878&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;878&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;</description>
      <category>Career</category>
      <category>backend</category>
      <category>Career</category>
      <category>Developer</category>
      <category>개발자</category>
      <category>경력</category>
      <category>이력서</category>
      <category>이직</category>
      <author>joomn11</author>
      <guid isPermaLink="true">https://joomn11.tistory.com/130</guid>
      <comments>https://joomn11.tistory.com/130#entry130comment</comments>
      <pubDate>Fri, 22 Jul 2022 23:18:11 +0900</pubDate>
    </item>
    <item>
      <title>백엔드 개발자 이직 준비</title>
      <link>https://joomn11.tistory.com/129</link>
      <description>&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;첫 직장에서 5년 정도 다니면서, 이직이라는 단계에 대해서 막연하게 생각만 있었지&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;처음 사회생활을 같이한 동료들이 몇 명 남지 않았을 때&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;이직 준비를 하는 과정에서 첫 직장에 다니며 5년 동안 경력 관리를 하나도 못했다는 생각이 많이 들었습니다.&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;960&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEQN8V/btrHDPhYTHP/0XlEuwakGbyIlLNpk2xMsK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEQN8V/btrHDPhYTHP/0XlEuwakGbyIlLNpk2xMsK/img.jpg&quot; data-alt=&quot;출처 :&amp;amp;nbsp;https://ppss.kr/archives/149603&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEQN8V/btrHDPhYTHP/0XlEuwakGbyIlLNpk2xMsK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEQN8V%2FbtrHDPhYTHP%2F0XlEuwakGbyIlLNpk2xMsK%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;960&quot; height=&quot;408&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;https://ppss.kr/archives/149603&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;github 계정 관리&amp;nbsp;&lt;/li&gt;
&lt;li&gt;코딩 테스트 연습&lt;/li&gt;
&lt;li&gt;기술 블로그&amp;nbsp;&lt;/li&gt;
&lt;li&gt;면접 준비&lt;/li&gt;
&lt;/ul&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;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;자신의 work experience 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;구글에 &quot;백엔드 개발자 이력서&quot;와 같이 검색해서 다양한 레퍼런스를 참고할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://techblog.woowahan.com/2531/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://techblog.woowahan.com/2531/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.outsider.ne.kr/1234&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.outsider.ne.kr/1234&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wonny.space/writing/work/engineer-resume&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wonny.space/writing/work/engineer-resume&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://taltube.tistory.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://taltube.tistory.com/23&lt;/a&gt;&amp;nbsp;&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;github 계정 관리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;자신이 개인적으로 진행 한 프로젝트나 코딩테스트 연습한 내역들 등을 잘 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대표적으로 README.md 파일을 잘 정리해두는것이 필요합니다.&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;대표적인 사이트에서 여러 문제를 풀며 연습이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://leetcode.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://programmers.co.kr/&lt;/a&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;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;/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;기본적으로 백엔드 면접 질문 리스트도 공부를 해야합니다.&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;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Career</category>
      <category>backend</category>
      <category>Career</category>
      <category>개발자</category>
      <category>이직</category>
      <author>joomn11</author>
      <guid isPermaLink="true">https://joomn11.tistory.com/129</guid>
      <comments>https://joomn11.tistory.com/129#entry129comment</comments>
      <pubDate>Mon, 18 Jul 2022 23:56:46 +0900</pubDate>
    </item>
    <item>
      <title>[DesignPattern] Observer Pattern (옵저버 패턴)</title>
      <link>https://joomn11.tistory.com/128</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Observer Pattern&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;옵저버 패턴이란&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 &lt;br /&gt;상태 변화가 있을 때마다 옵저버들에게 통지하도록 하는 디자인 패턴입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&amp;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;357&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lFqgQ/btrDdnwFBGK/PvlS6L9EN28cFUeAjzf6hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lFqgQ/btrDdnwFBGK/PvlS6L9EN28cFUeAjzf6hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lFqgQ/btrDdnwFBGK/PvlS6L9EN28cFUeAjzf6hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlFqgQ%2FbtrDdnwFBGK%2FPvlS6L9EN28cFUeAjzf6hK%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;357&quot; height=&quot;290&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;290&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;옵저버 패턴에는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)가 존재하며&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이들의 관계는 보통 1:N이다. ( 1:1도 가능 )&amp;nbsp;&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;Observer Pattern 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Loose Coupling : 상호작용을 하긴 하지만, 서로에 대해 잘 모른다&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 객체 간의 의존성을 제거할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;객체 간의 의존성을 줄이기 위해서 interface를 정의한다 ( Subject, Observer )&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653553343785&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface Subject {

	public void registerObserver(Observer o);

	public void removeObserver(Observer o);

	public void notifyObserver();
}

public interface Observer {

	public void update(float tmp, float humidity, float pressure);
	
}

public interface DisplayElement {
	public void display();
}&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;Subject의 구현체, Observer List를 가지고 있다&lt;/p&gt;
&lt;pre id=&quot;code_1653553360146&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class WeatherData implements Subject {

	private List&amp;lt;Observer&amp;gt; observers;
	private float temperature;
	private float humidity;
	private float pressure;

	public WeatherData() {
		observers = new ArrayList&amp;lt;Observer&amp;gt;();
	}

	@Override
	public void registerObserver(Observer o) {
		observers.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		int idx = observers.indexOf(o);

		if (idx &amp;gt;= 0) {
			observers.remove(idx);
		}
	}

	@Override
	public void notifyObserver() {
		for (Observer observer : observers) {
			observer.update(temperature, humidity, pressure);
		}
	}
	
	public void measurementsChanged() {
		notifyObserver();
	}
	
	public void setMeasurements(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		
		measurementsChanged();
	}

}&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;Observer의 구현체, subject를 가지고 있고, 그를 통해 자신을 등록한다&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653553388110&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CurrentConditionsDisplay implements Observer, DisplayElement {

	private float temperature;
	private float humidity;
	private WeatherData weatherData;

	public CurrentConditionsDisplay(WeatherData weatherData) {
		this.weatherData = weatherData;
		this.weatherData.registerObserver(this);
	}

	@Override
	public void display() {
		System.out.println(&quot;Current Condition : &quot; + temperature + &quot; F degrees , &quot; 
        						+ humidity + &quot; % humidity&quot;);

	}

	@Override
	public void update(float tmp, float humidity, float pressure) {
		this.temperature = tmp;
		this.humidity = humidity;

		display();
	}

}&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;수행 코드&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653553423883&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public static void main(String[] args) {
		WeatherData weatherData = new WeatherData();
		
		CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
		
		weatherData.setMeasurements(80, 65, 30.4f);
		weatherData.setMeasurements(82, 70, 29.2f);
		weatherData.setMeasurements(78, 90, 28.4f);
	}&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;Java 개발자라면, java.util에서 제공하는 Observer 패턴 관련 코드를 이용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다만, Subject에 해당하는 Observable은 인터페이스가 아니고 상속받아야 해서 사용하는데 제한이 있을 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;import java.util.Observable; &lt;br /&gt;import java.util.Observer;&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;&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;</description>
      <category>DesignPattern/HeadFirst-DesignPattern</category>
      <author>joomn11</author>
      <guid isPermaLink="true">https://joomn11.tistory.com/128</guid>
      <comments>https://joomn11.tistory.com/128#entry128comment</comments>
      <pubDate>Wed, 1 Jun 2022 22:30:30 +0900</pubDate>
    </item>
    <item>
      <title>[DesignPattern] Strategy Pattern (전략 패턴)</title>
      <link>https://joomn11.tistory.com/127</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Strategy Pattern&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여, 객체의&amp;nbsp;행위를&amp;nbsp;동적으로&amp;nbsp;바꾸고&amp;nbsp;싶은&amp;nbsp;경우&amp;nbsp;직접&amp;nbsp;행위를&amp;nbsp;수정하지&amp;nbsp;않고&amp;nbsp;전략을&amp;nbsp;바꿔주기만&amp;nbsp;함으로써&amp;nbsp;행위를&amp;nbsp;유연하게&amp;nbsp;확장하는&amp;nbsp;방법을&amp;nbsp;말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;간단히&amp;nbsp;말해서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;패턴입니다.&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;927&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KOXQ2/btrC7Mwvlzg/lqkKHdkhKps2EHLtAawpU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KOXQ2/btrC7Mwvlzg/lqkKHdkhKps2EHLtAawpU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KOXQ2/btrC7Mwvlzg/lqkKHdkhKps2EHLtAawpU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKOXQ2%2FbtrC7Mwvlzg%2FlqkKHdkhKps2EHLtAawpU1%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;927&quot; height=&quot;596&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;596&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;size18&quot;&gt;객체지향 원칙&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바뀌는 부분은 캡슐화한다&lt;/li&gt;
&lt;li&gt;상속보다는 구성을 활용한다&lt;/li&gt;
&lt;li&gt;구현이 아닌 인터페이스에 맞춰서 프로그래밍한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전략 패턴에서는 위의 원칙들을 포함하는 구조가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653463475180&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public abstract class Duck {
	
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
	
	public Duck() {
		
	}
	
	public void performFly() {
		flyBehavior.fly();
	}
	
	public void performQuack() {
		quackBehavior.quack();
	}
	
	public abstract void display();
	
	public void swim() {
		System.out.println(&quot;s w i m ~ ~ &quot;);
	}
	
	public void setFlyBehavior(FlyBehavior fb) {
		flyBehavior = fb;
	}
	
	public void setQuackBehavior(QuackBehavior qb) {
		quackBehavior = qb;
	}
	
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Duck에서는 FlyBehavior, QuackBehavior에 해당하는 전략을 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653463534636&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface FlyBehavior {
	public void fly();
}

public interface QuackBehavior {
	public void quack();
}&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;그리고 마지막으로, Duck과 전략들의 구현체들을 보자&lt;/p&gt;
&lt;pre id=&quot;code_1653463647832&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class FlyNoWay implements FlyBehavior {
	@Override
	public void fly() {
		System.out.println(&quot; I cannot fly ~ &quot;);
	}
}

public class FlyWithWings implements FlyBehavior {
	@Override
	public void fly() {
		System.out.println(&quot; fly in the moon ~ &quot;);
	}
}

public class Quack implements QuackBehavior {
	@Override
	public void quack() {
		System.out.println(&quot;Quack ~~ Quack ~&quot;);
	}
}

public class Squeak implements QuackBehavior{
	@Override
	public void quack() {
		System.out.println(&quot;Squeak ~~ squeak ~ &quot;);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653463669160&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MallardDuck extends Duck {

	public MallardDuck() {
		quackBehavior = new Quack();
		flyBehavior = new FlyWithWings();
	}
	
	@Override
	public void display() {
		System.out.println(&quot;I'm MallarDuck~~ ~&quot;);
	}

}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>DesignPattern/HeadFirst-DesignPattern</category>
      <category>designpattern</category>
      <category>strategy</category>
      <author>joomn11</author>
      <guid isPermaLink="true">https://joomn11.tistory.com/127</guid>
      <comments>https://joomn11.tistory.com/127#entry127comment</comments>
      <pubDate>Thu, 26 May 2022 22:29:40 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Mybatis란, SpringBoot에서 Mybatis 사용해보기</title>
      <link>https://joomn11.tistory.com/126</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Mybatis란&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Mybatis는 Psersistence Framework 중에 하나로 SQL Mapper Framework에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://joomn11.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://joomn11.tistory.com/34&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Mybatis 특징&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;비즈니스 코드와 SQL 쿼리를 분리해서 관리 가능하다 ( 간결성, 코드 유지 보수성 향상 )&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;SpringBoot + Mybatis&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;spring-boot의 mybatis-spring-boot-starter를 활용하여 스프링 프로젝트에서 손쉽게 Mybatis를 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;mybatis-spring-boot-starter의 장점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;spring에서 추가된 mybatis bean 등록을 자동으로 해준다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SqlSessionFactoryBean, SqlSessionTemplate&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;h3 data-ke-size=&quot;size23&quot;&gt;pom.xml&lt;/h3&gt;
&lt;pre id=&quot;code_1652855354987&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;2.2.2&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;mapper.xml&lt;/h3&gt;
&lt;pre id=&quot;code_1652855500015&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot; &amp;gt;
&amp;lt;mapper namespace=&quot;com.sample.dao.MapperDAO&quot;&amp;gt;
	&amp;lt;select id=&quot;selectAll&quot;
		resultType=&quot;com.sample.dto.UserDto&quot;&amp;gt;
		SELECT *
		FROM user_test
	&amp;lt;/select&amp;gt;
	&amp;lt;insert id=&quot;insert&quot; parameterType=&quot;com.sample.dto.UserDto&quot;&amp;gt;
		INSERT INTO user_test (seq, name, country) values ( #{seq}, #{name},
		#{country})
	&amp;lt;/insert&amp;gt;
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Mapper interface&lt;/h3&gt;
&lt;pre id=&quot;code_1652855556432&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Repository
@Mapper
public interface MapperDAO {
    List&amp;lt;UserDto&amp;gt; selectAll() throws Exception;
    void insert(UserDto user);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Service&amp;nbsp;&lt;/h3&gt;
&lt;pre id=&quot;code_1652855602669&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public class UserService {

    @Autowired
    private MapperDAO mapperDao;
    
    public List&amp;lt;UserDto&amp;gt; selectAll() throws Exception {
        return mapperDao.selectAll();
    }
    
    public void insert(UserDto user) {
        mapperDao.insert(user);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;application.yml 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1652855645623&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mybatis:
  mapper-locations:
  - com/sample/mapper/*.xml
  config-location: classpath:mybatis-config.xml&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;mybatis.mapper-locations : mapper관련 xml 파일이 존재하는 디렉터리의 위치&lt;/li&gt;
&lt;li&gt;mybatis.config-location : mapper configuration관련 xml을 사용한다면 해당 위치에 대한 정보&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;size18&quot;&gt;mybatis github sample&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://github.com/mybatis/spring/tree/master/src/test/java/org/mybatis/spring/sample&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/mybatis/spring/tree/master/src/test/java/org/mybatis/spring/sample&lt;/a&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;mybatis사이트 가이드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/#&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/etc</category>
      <author>joomn11</author>
      <guid isPermaLink="true">https://joomn11.tistory.com/126</guid>
      <comments>https://joomn11.tistory.com/126#entry126comment</comments>
      <pubDate>Wed, 18 May 2022 20:46:09 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Spring Cloud Netflix Eureka 사용해보기</title>
      <link>https://joomn11.tistory.com/124</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Spring Cloud Netflix Eureka&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;MSA 환경에서는 Service의 Ip, Port 정보가 일정하지 않고 지속적으로 변화할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 환경에서 Service의 정보를 수동으로 입력하고 관리하는 것은 한계가 분명하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 Service Discovery를 통해 해결할 수 있다.&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;Eureka의 구성 요소&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Service Discovery&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;h4 data-ke-size=&quot;size20&quot;&gt;Service Registry&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각각의 서비스가 자신의 위치(Ip, Port) 정보를 특정 버서에 등록(Registry)하는 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Eureka 사용 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기존에 작성한 포스팅에서 API Gateway를 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(&lt;a href=&quot;https://joomn11.tistory.com/123&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://joomn11.tistory.com/123&lt;/a&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;해당 설정에서 API Gateway의 설정에 각각의 서비스들의 물리적인 정보가 그대로 적혀있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 경우 서비스의 물리적 정보가 변경되는 경우 API Gateway도 변경되어야 하는 디펜던시가 생기게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 상황을 방지하기 위해 Service Discovery를 사용해보자.&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;Eureka Server&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;dependency 추가 (build.gradle)&lt;/p&gt;
&lt;pre id=&quot;code_1649740766352&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
}&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;application.yml 설정&lt;/p&gt;
&lt;pre id=&quot;code_1649740846491&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server:
  port: 8761
eureka:
  client:
    register-with-eureka: false
    service-url:
      default-zone: http://${eureka.instance.hostname}:${server.port}/eureka
    fetch-registry: false
  instance:
    hostname: localhost&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;Annotation 추가&lt;/p&gt;
&lt;pre id=&quot;code_1649740891579&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class, args);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Eureka Client&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;dependency 추가 (build.gradle)&lt;/p&gt;
&lt;pre id=&quot;code_1649741194024&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}&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;application.yml 설정&lt;/p&gt;
&lt;pre id=&quot;code_1649741228715&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eureka:
  instance:
    appname: product-service
  client:
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka&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;Annotation 추가&lt;/p&gt;
&lt;pre id=&quot;code_1649741264689&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SpringBootApplication
@EnableEurekaClient
public class ProductServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(ProductServiceApplication.class, args);
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;API Gateway&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위와 같이 Eureka Server, Client를 설정해두면, API Gateway의 설정 정보 중에 물리적인 주소를 하드 코딩한 부분을 수정해 줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649741713095&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: product-service
          # uri: http://localhost:8045
          uri: lb://PRODUCT-SERVICE
          predicates:
            - Path=/product/**
        - id: cartservice
          # uri: http://localhost:8050
          uri: lb://CARTSERVICE
          predicates:
            - Path=/cart/**&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLWnt7/btrzacs8ZEj/IqGg7VM5q8R3gVsoGdPkX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLWnt7/btrzacs8ZEj/IqGg7VM5q8R3gVsoGdPkX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLWnt7/btrzacs8ZEj/IqGg7VM5q8R3gVsoGdPkX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLWnt7%2Fbtrzacs8ZEj%2FIqGg7VM5q8R3gVsoGdPkX0%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;794&quot; height=&quot;462&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Spring/spring-cloud</category>
      <category>Eureka</category>
      <category>MSA</category>
      <category>Spring</category>
      <author>joomn11</author>
      <guid isPermaLink="true">https://joomn11.tistory.com/124</guid>
      <comments>https://joomn11.tistory.com/124#entry124comment</comments>
      <pubDate>Fri, 15 Apr 2022 20:46:24 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Spring Cloud Gateway(SCG) 사용해보기</title>
      <link>https://joomn11.tistory.com/123</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Spring Cloud Gateway란&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;API Gateway이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp; (사용자의 요청을 받고 적절한 MicroService에게 라우팅 해주는 서버)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp; (API Gateway는 Reverse Proxy 기능을 향상한 것이다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (Reverse Proxy : 클라이언트의 요청을 받고 이 요청을 적절한 Backend 서버로 라우팅 해주는 서버)&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;API Gateway 특성상 모든 요청이 거쳐가는 곳이기 때문에 성능이 매우 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 비동기식 이벤트 기반의 WAS인 Netty를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Spring5, SpringBoot2, ProjectReactor로 구축되었다&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;Spring Cloud Gateway 주요 특징&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Route&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;클라이언트의 요청을 어느 서버로 라우팅 할 것인지를 나타내는 내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;목적지 URI, Predicates, Filter로 이루어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Predicate&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;요청이 어떤 Path인지 또는 어떤 헤더를 가지고 있는지에 대한 조건&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Filter&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Spring WebFilter 인스턴스, Filter를 통해서 요청 또는 응답을 변경할 수 있다&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;사용 예시 - application.yml&lt;/p&gt;
&lt;pre id=&quot;code_1649672056498&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  cloud:
    gateway:
      routes:
        - id: product-service
          uri: http://localhost:8045
          predicates:
            - Path=/product/**
        - id: cartservice
          uri: http://localhost:8050
          predicates:
            - Path=/cart/**&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;Microservice를 구축할 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다양한 서비스들이 존재할 텐데 사용자가 각각의 서비스들의 주소를 모두 알 수도 없고 알아서도 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이런 경우에는 사용자의 요청을 API Gateway에서 받고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 요청을 받은 API Gateway가 각각의 요청을 적당한 microservice로 라우팅 해주어야 한다&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUPDLo/btry67SKxQh/Q7iiDyY80LNGAttNQq0K1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUPDLo/btry67SKxQh/Q7iiDyY80LNGAttNQq0K1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUPDLo/btry67SKxQh/Q7iiDyY80LNGAttNQq0K1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUPDLo%2Fbtry67SKxQh%2FQ7iiDyY80LNGAttNQq0K1k%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;713&quot; height=&quot;403&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;403&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;size18&quot;&gt;API Gateway 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649672405597&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  cloud:
    gateway:
      routes:
        - id: product-service
          uri: http://localhost:8045
          predicates:
            - Path=/product/**
        - id: cartservice
          uri: http://localhost:8050
          predicates:
            - Path=/cart/**&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;Dependency 추가 ( gradle )&lt;/p&gt;
&lt;pre id=&quot;code_1649672478192&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Spring/spring-cloud</category>
      <category>APIGateway</category>
      <category>Spring</category>
      <category>springcloud</category>
      <category>SpringCloudGateway</category>
      <author>joomn11</author>
      <guid isPermaLink="true">https://joomn11.tistory.com/123</guid>
      <comments>https://joomn11.tistory.com/123#entry123comment</comments>
      <pubDate>Tue, 12 Apr 2022 22:26:18 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] ActiveMQ - Spring 사용해보기</title>
      <link>https://joomn11.tistory.com/122</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;ActiveMQ란&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;간단하게 ActiveMQ는 메시지 브로커이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;JMS를 지원한다( JMS: Java Message Service) ( JMS는 스펙이고, 그것을 구현해 좋은 제품이 ActiveMQ)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7isb/btryLIlT91R/0Xh6iXcIFUYuxU2PiPMqe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7isb/btryLIlT91R/0Xh6iXcIFUYuxU2PiPMqe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7isb/btryLIlT91R/0Xh6iXcIFUYuxU2PiPMqe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7isb%2FbtryLIlT91R%2F0Xh6iXcIFUYuxU2PiPMqe0%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;639&quot; height=&quot;101&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;101&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ActiveMQ를 사용하는 이유&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대부분의 동기식 통신 방식은 사용자로부터 받은 요청을 전부 처리할 때까지 Blocking 상태에 빠진다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;요청을 모두 처리해야 사용자에게 응답을 줄 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 메시지 큐 사용 시 요청을 큐에 넣고 Block상태에 빠지지 않고 응답을 줄 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;후에 다른 서비스에서 큐에 쌓인 요청을 Consume 하여 요청을 처리할 수 있다&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;ActiveMQ 설치&lt;/h3&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;a href=&quot;https://activemq.apache.org/components/classic/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://activemq.apache.org/components/classic/download/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1649401899548&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;ActiveMQ&quot; data-og-description=&quot;&quot; data-og-host=&quot;activemq.apache.org&quot; data-og-source-url=&quot;https://activemq.apache.org/components/classic/download/&quot; data-og-url=&quot;https://activemq.apache.org/components/classic/download/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bYeYqi/hyNYLlyUhK/RNUIje3wVNF0usDMMs9lEK/img.png?width=1295&amp;amp;height=2288&amp;amp;face=0_0_1295_2288,https://scrap.kakaocdn.net/dn/cr6CZ7/hyNYLlyUgd/MDKBkKYfTookaQAbFGDBlK/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://activemq.apache.org/components/classic/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://activemq.apache.org/components/classic/download/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bYeYqi/hyNYLlyUhK/RNUIje3wVNF0usDMMs9lEK/img.png?width=1295&amp;amp;height=2288&amp;amp;face=0_0_1295_2288,https://scrap.kakaocdn.net/dn/cr6CZ7/hyNYLlyUgd/MDKBkKYfTookaQAbFGDBlK/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&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;ActiveMQ&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;activemq.apache.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다운로드한 파일을 unzip후에 bin폴더에 activemq 실행&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;527&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsSUHG/btryPBZRgEQ/kyL7KIYUJ7utuHwr4e3xi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsSUHG/btryPBZRgEQ/kyL7KIYUJ7utuHwr4e3xi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsSUHG/btryPBZRgEQ/kyL7KIYUJ7utuHwr4e3xi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsSUHG%2FbtryPBZRgEQ%2FkyL7KIYUJ7utuHwr4e3xi1%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;527&quot; height=&quot;28&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;28&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wfQQM/btryPqKVAiG/pnCLLu6vCasWgWYc9bhEhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wfQQM/btryPqKVAiG/pnCLLu6vCasWgWYc9bhEhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wfQQM/btryPqKVAiG/pnCLLu6vCasWgWYc9bhEhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwfQQM%2FbtryPqKVAiG%2FpnCLLu6vCasWgWYc9bhEhk%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;1023&quot; height=&quot;460&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ActiveMQ TCP prot : 61616&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;ActiveMQ&lt;span&gt; WebConsole : http://127.0.0.1:8161 ( default user : admin / admin )&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span&gt;이제부터 실전 예제를 보자&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span&gt;예제로는 Product-Service와 Cart-Service가 존재한다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span&gt;두 서비스 사이에 ActiveMQ를 두고&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span&gt;Product에서 ActiveMQ에 메시지를 produce 하고&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span&gt;Cart에서 ActiveMQ에 쌓인 메시지를 consume 한다.&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;1184&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5o4A7/btryOj61WSw/My4eIgiqDLcK595cMyhWEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5o4A7/btryOj61WSw/My4eIgiqDLcK595cMyhWEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5o4A7/btryOj61WSw/My4eIgiqDLcK595cMyhWEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5o4A7%2FbtryOj61WSw%2FMy4eIgiqDLcK595cMyhWEk%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;222&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ActiveMQ - Producer&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649402454431&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
@RequestMapping(&quot;/product&quot;)
@RequiredArgsConstructor
public class ProductController {

    private final ProductRepository productRepository;
    private final JmsTemplate jmsTemplate;
    private final ObjectMapper mapper;

    // get value from yaml file
    @Value(&quot;${product.jms.destination}&quot;)
    private String jmsQueue;

    @GetMapping(&quot;/sendToCart/{id}&quot;)
    public ResponseEntity&amp;lt;Product&amp;gt; sendToCart(@PathVariable long id) {
        Optional&amp;lt;Product&amp;gt; product = productRepository.findById(id);

        if (!product.isPresent()) {
            return new ResponseEntity&amp;lt;&amp;gt;(HttpStatus.NOT_FOUND);
        }

        try {
            String jsonInString = mapper.writeValueAsString(product.get());

            jmsTemplate.convertAndSend(jmsQueue, jsonInString);

            return new ResponseEntity&amp;lt;&amp;gt;(product.get(), HttpStatus.OK);
        } catch (Exception e) {
            e.printStackTrace();
            return new ResponseEntity&amp;lt;&amp;gt;(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}&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;application.yml&lt;/p&gt;
&lt;pre id=&quot;code_1649402547737&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server:
  port: 8045
spring:
  activemq:
    user: admin
    password: admin
    broker-url: tcp://localhost:61616
  application:
    name: product-service
product:
  jms:
    destination: product&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;ActiveMQ&lt;span&gt; 설정 정보는 간단하다&lt;/span&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;ActiveMQ의 위치정보 (IP, Port)&lt;/li&gt;
&lt;li&gt;ActiveMQ에 접근하기 위한 권한 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외에 product.jms.destination은 특정값을 설정값으로 분리하여 관리하기 위해 임의로 추가한 값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(코드에 해당 값을 String으로 선언해도 되지만, yml 설정으로 분리)&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;h3 data-ke-size=&quot;size23&quot;&gt;ActiveMQ - Consumer&lt;/h3&gt;
&lt;pre id=&quot;code_1649402647111&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
@RequiredArgsConstructor
@Slf4j
public class JmsConsumer {

    private final ProductRepository productRepository;
    private final ObjectMapper mapper;

    @JmsListener(destination = &quot;${product.jms.destination}&quot;)
    public void consumeMessage(String data) {
        try {
            Product product = mapper.readValue(data, Product.class);

            log.info(&quot;data: {}&quot;, data);
            productRepository.save(product);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}&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;application.yml&lt;/p&gt;
&lt;pre id=&quot;code_1649402676296&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server:
  port: 8050
spring:
  application:
    name: cartservice
  activemq:
    user: admin
    password: admin
    broker-url: tcp://localhost:61616
product:
  jms:
    destination: product&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;background-color: #fafafa;&quot;&gt;참고&amp;amp;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;git&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sofienebk.medium.com/building-microservices-with-spring-boot-753be739ca7d&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sofienebk.medium.com/building-microservices-with-spring-boot-753be739ca7d&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git code&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/joomn11/microservice-cart-product&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/joomn11/microservice-cart-product&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/spring-cloud</category>
      <category>activemq</category>
      <category>JMS</category>
      <category>MessageQueue</category>
      <category>Spring</category>
      <author>joomn11</author>
      <guid isPermaLink="true">https://joomn11.tistory.com/122</guid>
      <comments>https://joomn11.tistory.com/122#entry122comment</comments>
      <pubDate>Sun, 10 Apr 2022 21:40:23 +0900</pubDate>
    </item>
  </channel>
</rss>