<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>WantAirpod</title>
    <link>https://wantairpod.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 7 May 2026 13:56:51 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>WantAirpod</managingEditor>
    <image>
      <title>WantAirpod</title>
      <url>https://tistory1.daumcdn.net/tistory/4010889/attach/5fbf501c09874a768da6959a5505f610</url>
      <link>https://wantairpod.tistory.com</link>
    </image>
    <item>
      <title>갤럭시 S25 울트라, 한 달 사용 후기</title>
      <link>https://wantairpod.tistory.com/453</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;## 도입부: 반갑습니다! 갤럭시 S25 울트라에 대한 첫인상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! 스마트폰을 새로 바꾸기 위해 고민하던 중 갤럭시 S25 울트라를 한 달간 사용하게 되었습니다. 갤럭시 시리즈를 줄곧 쓰면서 만족해왔기 때문에 이번에도 기대가 컸어요. 처음엔 '정말 이게 그렇게 좋을까?' 싶었지만, 실제로 사용해보니 기대 이상이더라고요. 오늘은 제 경험을 바탕으로 이 스마트폰이 어떤 장점과 단점을 가지고 있는지, 그리고 실제로 사용해보니 어떤 느낌이었는지를 솔직하게 전해드릴게요.&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;![이미지1](https://postfiles.pstatic.net/MjAyNTAzMTNfMjg4/MDAxNzQxNzkyOTEzMzk2.PI-W7kgzaF0UYjc1M8ogULNQI1-mcvi3o92UPrl_cckg.l1MdJziLEthAqqkPe6cCFAUXbU3OtROcDdZgGvTEC74g.JPEG/1-3.jpg)&lt;/p&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;갤럭시 S25 울트라를 처음 꺼내어 손에 쥐었을 때 느낀 첫인상은 단연 고급스러움이었습니다. 6.9인치 QHD+ AMOLED 디스플레이는 정말로 눈을 사로잡았고, 베젤이 매우 얇아서 화면이 시원하게 꽉 찬 느낌이 들더라고요. 블루 색상을 선택했는데, 은은하면서도 세련된 느낌이 마음에 쏙 들었어요. 특히 이전 모델들과 비교했을 때 플랫한 화면이 주는 그립감이 상당히 좋았습니다. 이 부분은 사용하면서도 계속 만족스러웠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또, 디자인에서 가장 마음에 들었던 부분은 후면 카메라 배치였어요. 세련되고 깔끔한 디자인 덕에 어디서든 자신 있게 꺼내들 수 있겠더라고요. 물론, 카메라가 다소 돌출되어 있어 테이블에 놓았을 때 살짝 흔들릴 수 있다는 점은 약간의 아쉬움이 있지만, 전체적인 디자인을 봤을 때는 크게 문제가 되지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;## 사용 경험&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;![이미지2](https://postfiles.pstatic.net/MjAyNTAzMTNfMjQ5/MDAxNzQxNzkyOTIxNjAw.yco-D11Ubz0JaMbI1ik4BVegnqI54A37dKRcHvlyGOQg.-M829ilS7X6nF9oRoDBFVnq9i7f4bA47laHOuGUIKCQg.JPEG/1-1.jpg)&lt;/p&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;한 달간 사용하면서 가장 인상 깊었던 것은 갤럭시 S25 울트라의 성능이었습니다. 퀄컴 스냅드래곤 8 엘리트 칩셋 덕분인지, 앱을 여러 개 동시에 실행하더라도 빠르게 동작했고, 고사양 게임도 끊김 없이 돌아갔습니다. 사실 게임을 자주 하진 않지만, 종종 즐기는 모바일 레이싱 게임에서 프레임 드랍이 전혀 없어 깜짝 놀랐어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 이 스마트폰의 발열 관리도 상당히 잘 되어 있다는 점도 체감되었습니다. 이전 모델인 갤럭시 S24 울트라를 사용할 때는 오래 사용하면 약간의 발열이 느껴졌었는데, S25 울트라는 장시간 사용해도 손이 뜨겁지 않더라고요. 배터리는 5,000mAh의 용량을 자랑하는데, 하루 종일 사용해도 배터리가 넉넉해서 배터리 걱정 없이 스마트폰을 사용할 수 있었어요. 30분 정도의 짧은 시간 충전으로 65% 이상 충전되는 초고속 충전 기능도 매우 편리했습니다.&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;![이미지3](https://postfiles.pstatic.net/MjAyNTAzMTNfNjMg/MDAxNzQxNzkyOTI2MTY1.FqdxA7x4G2AyJqJjP0ZkbPs5y0WdC2SrbBpO7CwfWLYg.Ifep3LI4yxRDqGw75bf6kzA8t1lnYz9RUqDGiObi0VMg.JPEG/1-2.jpg)&lt;/p&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;갤럭시 S25 울트라의 가장 큰 장점은 역시 디스플레이였어요. QHD+ 해상도와 120Hz 주사율 덕분에 영상 감상이나 게임 플레이 시 몰입감이 훨씬 더 좋아졌습니다. 특히, 야외에서도 선명하게 보이는 밝기 덕에 햇빛 아래에서도 시인성이 뛰어난 점이 마음에 들었습니다. AI 기능도 강화되어, 사진을 찍을 때의 선명함과 자연스러움이 정말 돋보이더라고요. '서클 투 서치' 기능은 사진이나 영상에서 직접 정보를 검색할 수 있어, 인스타그램이나 패션 관련 앱을 즐겨보는 저에게는 굉장히 유용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라는 특히 놀라웠어요. 2억 화소의 메인 카메라가 탑재되어 있어서, 저조도 환경에서도 깔끔한 사진이 나와서 인상적이었습니다. 여행을 가거나 일상 사진을 찍을 때, 더 이상 DSLR을 들고 다닐 필요가 없겠다는 생각이 들 정도로 만족스러웠습니다.&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;![이미지4](https://postfiles.pstatic.net/MjAyNTAzMTNfMTE2/MDAxNzQxNzkyOTMwMTU0._ucf1wjsvDQLnu8LbYerJESmisB0s2TtJgAYxkYkWcQg.xPVVengWSsjaOGxEEYE3GG6L_NFR3ID8PM-RzIzjYtAg.JPEG/1-4.jpg)&lt;/p&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;그러나 완벽한 제품은 없듯이, 갤럭시 S25 울트라에도 몇 가지 아쉬운 부분이 있었습니다. 우선, 가격이 꽤 고가라는 점이 부담이 되었어요. 물론, 그만큼의 가치를 충분히 제공하고 있다는 생각은 들지만, 처음 구매를 고려할 때는 가격이 다소 걸림돌이 될 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 제 경우는 아니지만, 손이 작은 친구가 사용했을 때는 약간 무겁다는 의견도 있었어요. 218g의 무게로, 큰 화면을 선호하는 사용자에게는 큰 문제는 아니지만, 작고 가벼운 휴대폰을 원하는 분들에게는 고려해야 할 사항일 수 있겠습니다.&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;![이미지5](https://postfiles.pstatic.net/MjAyNTAzMTNfOTcg/MDAxNzQxNzkyOTQxOTgw.HXgEga5i3lh9PPs5QNz6jSNjkiSyrKkDRmesaiDccSQg.qTGCLdVkysg9J1vMngkgFZRQbeV9J4u6MITAb-_YFrsg.JPEG/1-5.jpg)&lt;/p&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;현재 갤럭시 S25 울트라는 약 150만원대로 구매할 수 있습니다. [구매링크: 쿠팡], [구매링크: 네이버]에서 다양한 혜택과 함께 구매할 수 있으니, 관심 있으신 분들은 해당 링크를 참고하시면 좋을 것 같습니다. 가격대가 높긴 하지만, 제공하는 기능과 성능을 고려했을 때 충분히 값어치를 한다고 생각합니다.&lt;/p&gt;
&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;갤럭시 S25 울트라는 고급스러운 디자인과 뛰어난 성능, 그리고 다양한 기능들을 매우 잘 조화시킨 스마트폰이라고 생각합니다. 대화면을 선호하시거나, 사진 촬영을 즐기시는 분들, 혹은 모바일 게임을 즐기는 분들에게 특히 추천하고 싶습니다. 가격이 부담스러울 수 있지만, 그만큼의 가치를 충분히 얻을 수 있는 제품이라고 확신합니다. 스마트폰 교체를 고민 중이시라면, S25 울트라도 고려해보시는 것을 추천드립니다!&lt;/p&gt;</description>
      <author>WantAirpod</author>
      <guid isPermaLink="true">https://wantairpod.tistory.com/453</guid>
      <comments>https://wantairpod.tistory.com/453#entry453comment</comments>
      <pubDate>Sun, 29 Mar 2026 20:44:13 +0900</pubDate>
    </item>
    <item>
      <title>[Spring-&amp;gt;kotlin] JPA를 함께 사용할 때 이야기거리 3가지</title>
      <link>https://wantairpod.tistory.com/438</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;setter에 관한 이야기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CgH6a/btrTlsbp4Sm/jRZPZh8mhuk2Fyv90vIYd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CgH6a/btrTlsbp4Sm/jRZPZh8mhuk2Fyv90vIYd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CgH6a/btrTlsbp4Sm/jRZPZh8mhuk2Fyv90vIYd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCgH6a%2FbtrTlsbp4Sm%2FjRZPZh8mhuk2Fyv90vIYd0%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;1019&quot; height=&quot;327&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;var 프로퍼티가 public으로 열려있어 &lt;b&gt;setter를 쓸 수 있지만 setter 대신 좋은 이름의 함수(=updateName)을 사용하는 것이 훨씬 clean하다&lt;/b&gt;. 하지만 name에 대한 setter는 public이기 때문에 유저 이름 업데이트 기능에서 sette r를 사용할'&lt;b&gt;수도&lt;/b&gt;' 있다. (=updateName=setName) 따라서 setter만 private하게 만드는 것이 좋다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;첫 번째 방법(backing property 사용)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부에서는 _name(언더바name)을 사용해서 이름 값을 바꿀 수 있고 외부에서는 불변이 (val) name에 접근해서 Get할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7NvjM/btrThHACj40/ATaWBa5KnTcgp73rqNOSrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7NvjM/btrThHACj40/ATaWBa5KnTcgp73rqNOSrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7NvjM/btrThHACj40/ATaWBa5KnTcgp73rqNOSrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7NvjM%2FbtrThHACj40%2FATaWBa5KnTcgp73rqNOSrK%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;385&quot; height=&quot;310&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;두 번째 방법(custom setter 이용하기)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3LTTw/btrTltIbjcu/sdVA6X7eoGaZvglxplt7hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3LTTw/btrTltIbjcu/sdVA6X7eoGaZvglxplt7hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3LTTw/btrTltIbjcu/sdVA6X7eoGaZvglxplt7hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3LTTw%2FbtrTltIbjcu%2FsdVA6X7eoGaZvglxplt7hk%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;249&quot; height=&quot;307&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 두 방법 모두 property가 많아질수록 번거롭다. 따라서 setter를 열어는 두지만 사용하지 않는 방법을 선호 -&amp;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;생성자 안의 프로퍼티. 클래스 body 안의 프로퍼티&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼭 primary constructor 안에 모든 프로퍼티를 넣어야 할까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2Baxp/btrTGa86EjD/6l7KXr2dY4ktCh5FzOqPe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2Baxp/btrTGa86EjD/6l7KXr2dY4ktCh5FzOqPe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2Baxp/btrTGa86EjD/6l7KXr2dY4ktCh5FzOqPe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2Baxp%2FbtrTGa86EjD%2F6l7KXr2dY4ktCh5FzOqPe1%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;818&quot; height=&quot;335&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;body에 만들어도 잘 동작한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCrVLA/btrTDmwmjJo/iEhhanTTM6qkBbTcGj9xc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCrVLA/btrTDmwmjJo/iEhhanTTM6qkBbTcGj9xc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCrVLA/btrTDmwmjJo/iEhhanTTM6qkBbTcGj9xc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCrVLA%2FbtrTDmwmjJo%2FiEhhanTTM6qkBbTcGj9xc1%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;827&quot; height=&quot;377&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추천&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;모든 프로퍼티를 생성자에 넣거나&lt;/li&gt;
&lt;li&gt;프로퍼티를 생성자 혹은 클래스 body 안에 구분해서 넣을 때 &lt;b&gt;명확한 기준&lt;/b&gt;이 있거나&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JPA와 data class&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity는 data class를 피하는 것이 좋다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;equals, hashCode, toString 모두 JPA Entity와는 100% 어울리지 않는 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHwCt3/btrTF9WF2o1/Rhr2OYKa3IgMDXWDodIDBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHwCt3/btrTF9WF2o1/Rhr2OYKa3IgMDXWDodIDBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHwCt3/btrTF9WF2o1/Rhr2OYKa3IgMDXWDodIDBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHwCt3%2FbtrTF9WF2o1%2FRhr2OYKa3IgMDXWDodIDBk%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;542&quot; height=&quot;100&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경우에서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;User의 quals가 UserLoanHistory의 equals를 부른다.&lt;/li&gt;
&lt;li&gt;UserLoanHisoty의 equals가 User의 quals를 부른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TIP&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Entity가 생성되는 로직을 찾고 싶으면 constructor 지시어를 명시적(임의로)으로 작성하고 추적하자!&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oHs2b/btrTGZ0t9FV/5IohMLbBnKtj0j7RDvUuT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oHs2b/btrTGZ0t9FV/5IohMLbBnKtj0j7RDvUuT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oHs2b/btrTGZ0t9FV/5IohMLbBnKtj0j7RDvUuT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoHs2b%2FbtrTGZ0t9FV%2F5IohMLbBnKtj0j7RDvUuT1%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;790&quot; height=&quot;210&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 Book으로 눌러봤을 때는 모든 class가 나오고 constructor를 임의로 작성하고 내부를 눌러보면 딱 '생성'한 부분만 추적가능하다.&lt;/p&gt;</description>
      <category>Back-end/Spring+Kotlin</category>
      <author>WantAirpod</author>
      <guid isPermaLink="true">https://wantairpod.tistory.com/438</guid>
      <comments>https://wantairpod.tistory.com/438#entry438comment</comments>
      <pubDate>Sun, 11 Dec 2022 22:29:55 +0900</pubDate>
    </item>
    <item>
      <title>[Spring -&amp;gt; Kotlin] 리팩토링</title>
      <link>https://wantairpod.tistory.com/437</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Domain 코드 변경하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 : POJO, JPA Entity 객체&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Repository&amp;nbsp; 코드 변경하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 : Spring Bean, 의존성 X&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Service 코드 변경하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 : Spring Bean, 의존성 O, 비즈니스 로직&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Controller, DTO 코드 변경하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 : Spring Bean, 의존성 O, DTO의 경우 그 숫자가 많음&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;Book 코틀린 변경 코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;book 변경 commit&quot; href=&quot;https://github.com/WantAirpod/Kotlin/commit/b8b353f373aadc79e978897a7cb428cfc77e49b9#diff-56052074ae54fdd8138685dde12fe0d723909f3890c2de412f408e50e83d42a7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/WantAirpod/Kotlin/commit/b8b353f373aadc79e978897a7cb428cfc77e49b9#diff-56052074ae54fdd8138685dde12fe0d723909f3890c2de412f408e50e83d42a7&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;User 코틀린 변경 코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;asfd&quot; href=&quot;https://github.com/WantAirpod/Kotlin/pull/5/commits/be811187dfb3deebee2704c859a4f8db54a9e6e3#diff-57400e043967f14691c6a655d55c4fb1c76fca87f7d93601827c3a3b7cadf25a&quot; rel=&quot;noopener&quot;&gt;https://github.com/WantAirpod/Kotlin/pull/5/commits/be811187dfb3deebee2704c859a4f8db54a9e6e3#diff-57400e043967f14691c6a655d55c4fb1c76fca87f7d93601827c3a3b7cadf25a&lt;/a&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;Issue : 코틀린 리플렉션 발생 수정&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 java-&amp;gt;kotlin으로 코드 변경 시 reflect 이슈가 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC57yL/btrThHUWL3Z/QOxlyfyQcFWDubI2wzBWtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC57yL/btrThHUWL3Z/QOxlyfyQcFWDubI2wzBWtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC57yL/btrThHUWL3Z/QOxlyfyQcFWDubI2wzBWtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC57yL%2FbtrThHUWL3Z%2FQOxlyfyQcFWDubI2wzBWtk%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;757&quot; height=&quot;78&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코틀린 reflect 관련 의존성 주입으로 해결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pyPqa/btrTqg2nstS/NmMGErLyyB7WonQNO5RUU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pyPqa/btrTqg2nstS/NmMGErLyyB7WonQNO5RUU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pyPqa/btrTqg2nstS/NmMGErLyyB7WonQNO5RUU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpyPqa%2FbtrTqg2nstS%2FNmMGErLyyB7WonQNO5RUU0%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;864&quot; height=&quot;97&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;97&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;코틀린은 null에 대해서 무자비하다.&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tourspace.tistory.com/114&quot;&gt;https://tourspace.tistory.com/114&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670764227517&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;[Kotlin] 코틀린 null 처리 - ? ?. ?: !!, let, lateinit, 제너릭, 플랫폼 타입&quot; data-og-description=&quot;이 글은 Kotlin In Action을 참고 하였습니다.더욱 자세한 설명이나 예제는 직접 책을 구매하여 확인 하시기 바랍니다 코틀린에서는 자바보다 null 처리를 좀더 명확하게 합니다. 따라서 NPE(NullPointerEx&quot; data-og-host=&quot;tourspace.tistory.com&quot; data-og-source-url=&quot;https://tourspace.tistory.com/114&quot; data-og-url=&quot;https://tourspace.tistory.com/114&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cw0OnY/hyQRMPy9ru/gdQgnP8RMZUC8tRAUQ45kK/img.jpg?width=318&amp;amp;height=159&amp;amp;face=0_0_318_159,https://scrap.kakaocdn.net/dn/euKwXL/hyQQzEj3X7/KRSQRfsaA6nnPLHyNPYo3K/img.jpg?width=318&amp;amp;height=159&amp;amp;face=0_0_318_159,https://scrap.kakaocdn.net/dn/PamPn/hyQRNHHGTJ/kGnxiHIPlL7Yhb24FJncO1/img.png?width=750&amp;amp;height=750&amp;amp;face=0_0_750_750&quot;&gt;&lt;a href=&quot;https://tourspace.tistory.com/114&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tourspace.tistory.com/114&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cw0OnY/hyQRMPy9ru/gdQgnP8RMZUC8tRAUQ45kK/img.jpg?width=318&amp;amp;height=159&amp;amp;face=0_0_318_159,https://scrap.kakaocdn.net/dn/euKwXL/hyQQzEj3X7/KRSQRfsaA6nnPLHyNPYo3K/img.jpg?width=318&amp;amp;height=159&amp;amp;face=0_0_318_159,https://scrap.kakaocdn.net/dn/PamPn/hyQRNHHGTJ/kGnxiHIPlL7Yhb24FJncO1/img.png?width=750&amp;amp;height=750&amp;amp;face=0_0_750_750');&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;[Kotlin] 코틀린 null 처리 - ? ?. ?: !!, let, lateinit, 제너릭, 플랫폼 타입&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 Kotlin In Action을 참고 하였습니다.더욱 자세한 설명이나 예제는 직접 책을 구매하여 확인 하시기 바랍니다 코틀린에서는 자바보다 null 처리를 좀더 명확하게 합니다. 따라서 NPE(NullPointerEx&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tourspace.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;</description>
      <category>Back-end/Spring+Kotlin</category>
      <author>WantAirpod</author>
      <guid isPermaLink="true">https://wantairpod.tistory.com/437</guid>
      <comments>https://wantairpod.tistory.com/437#entry437comment</comments>
      <pubDate>Sun, 11 Dec 2022 22:21:51 +0900</pubDate>
    </item>
    <item>
      <title>도메인 분석 설계 (N:N 뿌시기)</title>
      <link>https://wantairpod.tistory.com/436</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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;회원 기능
&lt;ul style=&quot;list-style-type: circle;&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;상품 기능
&lt;ul style=&quot;list-style-type: circle;&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;li&gt;주문 기능
&lt;ul style=&quot;list-style-type: circle;&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;li&gt;기타 요구사항
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상품은 재고 관리가 필요하다.&lt;/li&gt;
&lt;li&gt;상품의 종류는 도서, 음반, 영화가 있다.&lt;/li&gt;
&lt;li&gt;상품을 카테고리로 구분할 수 있다.&lt;/li&gt;
&lt;li&gt;상품 주문시 배송 정보를 입력할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다대다&lt;/h2&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;background-color: #f6e199;&quot;&gt;관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야함&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;자체적으로 다대다를 할 수는 있지만 @ManyToMany 하지만 실무에서는 권장하지 않음&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHW0di/btrRCWTnB3W/cCkwSiznX22yB8WDOkHzAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHW0di/btrRCWTnB3W/cCkwSiznX22yB8WDOkHzAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHW0di/btrRCWTnB3W/cCkwSiznX22yB8WDOkHzAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHW0di%2FbtrRCWTnB3W%2FcCkwSiznX22yB8WDOkHzAK%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;350&quot; height=&quot;83&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 한명이 여러 개의 상품을 구매했다고 가정하자. 그렇다면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;회원 입장
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 명의 회원이 다양한 상품을 구매할 수있다. 1:n 관계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;상품 입장
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&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;결론 관계형 데이터 베이스에선 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. 그렇지만 객체에서는 가능하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Member 쪽에서 products쪽과 ManyToMany로 연결해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ow4hD/btrRH7fgkQt/grSBk5qCbOWtZsmH8XwcEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ow4hD/btrRH7fgkQt/grSBk5qCbOWtZsmH8XwcEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ow4hD/btrRH7fgkQt/grSBk5qCbOWtZsmH8XwcEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOw4hD%2FbtrRH7fgkQt%2FgrSBk5qCbOWtZsmH8XwcEK%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;350&quot; height=&quot;45&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Product 쪽에서 JoinTable(Member_product)을 선언하여 링크테이블을 생성해주는 어노테이션을 단다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFQhgy/btrRALygTyf/L6LN76x74hm7k62s0pmcRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFQhgy/btrRALygTyf/L6LN76x74hm7k62s0pmcRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFQhgy/btrRALygTyf/L6LN76x74hm7k62s0pmcRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFQhgy%2FbtrRALygTyf%2FL6LN76x74hm7k62s0pmcRk%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;350&quot; height=&quot;50&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자동으로 1:n, n:1 관계를 만드는 것과 같은 원리이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KCTgF/btrRHB8xtMb/qcA8ENK7k8fPYjpj2r4131/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KCTgF/btrRHB8xtMb/qcA8ENK7k8fPYjpj2r4131/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KCTgF/btrRHB8xtMb/qcA8ENK7k8fPYjpj2r4131/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKCTgF%2FbtrRHB8xtMb%2FqcA8ENK7k8fPYjpj2r4131%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;350&quot; height=&quot;58&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;오! 편리하다. 생각하고 사용하면 안된다.&lt;br /&gt;- 연결 테이블이 단순히 연결만 하고 끝나지 않는다. (무슨말이지? &lt;span style=&quot;background-color: #f6e199;&quot;&gt;단순히 연결만 하고 끝나지 않고 추가 데이터가 들어간다. 별에별게 들어간다. 또한 중간 테이블이 예상할 수가 없다.)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;- 주문시간, 수량 같은 데이터가 추가로 들어올 수 있다. (Member_Product에 들어감)&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;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Member : 링크 테이블과 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDSkxT/btrRCX5Pm9V/IRKqcr4KjRmxK9KrkW5LM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDSkxT/btrRCX5Pm9V/IRKqcr4KjRmxK9KrkW5LM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDSkxT/btrRCX5Pm9V/IRKqcr4KjRmxK9KrkW5LM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDSkxT%2FbtrRCX5Pm9V%2FIRKqcr4KjRmxK9KrkW5LM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;481&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Product : 링크 테이블과 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MxP1B/btrRAC2lL5h/HTTC0pSYcx3QQEK13WogH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MxP1B/btrRAC2lL5h/HTTC0pSYcx3QQEK13WogH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MxP1B/btrRAC2lL5h/HTTC0pSYcx3QQEK13WogH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMxP1B%2FbtrRAC2lL5h%2FHTTC0pSYcx3QQEK13WogH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;148&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;MemberProduct : 링크 테이블 추가
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;count, price, OrderDateTime을 넣을 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0aQH0/btrRFe0hfXM/mkUK3maRbW05djqLkQDEz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0aQH0/btrRFe0hfXM/mkUK3maRbW05djqLkQDEz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0aQH0/btrRFe0hfXM/mkUK3maRbW05djqLkQDEz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0aQH0%2FbtrRFe0hfXM%2FmkUK3maRbW05djqLkQDEz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;462&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #ee2323;&quot;&gt;결론&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f6e199; color: #ee2323;&quot;&gt;양방향으로 여러개를 가질 수 있을 때 고민해야된다. 주인 한명에 강아지 2개 반대로 강아지 한마리에 주인이 여러명일 경우 우리가 그렇네! 그럴 경우 링크테이블을 걸어야한다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도메인 모델과 테이블 설계&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOCNEt/btrRyVVizgL/a3cay5bIB6Zxw4ox9gZy2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOCNEt/btrRyVVizgL/a3cay5bIB6Zxw4ox9gZy2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOCNEt/btrRyVVizgL/a3cay5bIB6Zxw4ox9gZy2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOCNEt%2FbtrRyVVizgL%2Fa3cay5bIB6Zxw4ox9gZy2k%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;569&quot; height=&quot;234&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;234&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;회원 &amp;lt;-&amp;gt; 주문 : 회원은 주문을 여러 건 할 수 있기 때문에 1:n의 관계이다.&lt;/li&gt;
&lt;li&gt;주문&amp;lt;-&amp;gt; 배송 : 주문과 배송은 1:1 의 관계이다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;주문&amp;lt;-&amp;gt;상품 : 주문과 상품은 n:n의 관계이다. 왜냐하면 한 번 고객이 한 번 주문 할때 여러 상품을 선택할 수 있기 때문이다.&amp;nbsp; 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티티에서도 거의 사용하지 않는다. 따라서 주문상품을 추가하여 주문 &amp;lt;-&amp;gt; 주문상품 &amp;lt;-&amp;gt;상품(물품)으로 1:n, n:1로 풀어냈다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;엔티티 설계&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sUago/btrRAMpiOHZ/KeIZuGT0zS8jixk1FaLCy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sUago/btrRAMpiOHZ/KeIZuGT0zS8jixk1FaLCy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sUago/btrRAMpiOHZ/KeIZuGT0zS8jixk1FaLCy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsUago%2FbtrRAMpiOHZ%2FKeIZuGT0zS8jixk1FaLCy0%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;577&quot; height=&quot;375&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;375&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;회원(Member) : 이름과 임베디드 타입인 주소(Address), 그리고 주문(orders)리스트를 가진다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;주문(Order) : 한 번 주문시 여러 상품을 주문할 수 있으므로 주문과 주문상품(OrderItem)을 일대다 관계다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;주문상품(OrderItem) : 주문한 상품정보와 주문 금액(OrderPrice), 주문수량(count) 정보를 가지고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;상품(Item) :이름, 가격, 재고수량(stockQuantity)을 가지고 있다. 상품을 주문하면 재고수량이 줄어든다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;테이블 설계&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwQLx4/btrRAMCPsog/Ky7pEgNTArZNKxnaDz2vIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwQLx4/btrRAMCPsog/Ky7pEgNTArZNKxnaDz2vIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwQLx4/btrRAMCPsog/Ky7pEgNTArZNKxnaDz2vIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwQLx4%2FbtrRAMCPsog%2FKy7pEgNTArZNKxnaDz2vIk%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;578&quot; height=&quot;500&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Back-end/JPA</category>
      <author>WantAirpod</author>
      <guid isPermaLink="true">https://wantairpod.tistory.com/436</guid>
      <comments>https://wantairpod.tistory.com/436#entry436comment</comments>
      <pubDate>Sat, 19 Nov 2022 10:27:55 +0900</pubDate>
    </item>
    <item>
      <title>[Java -&amp;gt; Kotlin] Junit5 Test로 코드 짜기</title>
      <link>https://wantairpod.tistory.com/435</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도서관리 어플리케이션 이해하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;우선 자바로 되어있는 코드를 코틀린으로 바꾼다고 생각하면 된다. 하단은 대략적인 프로젝트의 (흔한)플로우이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGHHf/btrRFgcHoAg/kt3HbsKzkVPDuOP76JOIqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGHHf/btrRFgcHoAg/kt3HbsKzkVPDuOP76JOIqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGHHf/btrRFgcHoAg/kt3HbsKzkVPDuOP76JOIqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGHHf%2FbtrRFgcHoAg%2Fkt3HbsKzkVPDuOP76JOIqK%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;350&quot; height=&quot;315&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;localhost:8080/h2-console 접속 및 로그인 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdV3YT/btrRDVtabXr/EkEymeaHrV7NfEVAtlKWkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdV3YT/btrRDVtabXr/EkEymeaHrV7NfEVAtlKWkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdV3YT/btrRDVtabXr/EkEymeaHrV7NfEVAtlKWkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdV3YT%2FbtrRDVtabXr%2FEkEymeaHrV7NfEVAtlKWkK%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;350&quot; height=&quot;247&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;테스트 코드란 무엇인가? 그리고 왜 필요한가?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&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;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;A라는 API는 25개의 다른 로직에 영향을 미친다. 어느날 A라는 API를 수정할 일이 생겼다. 그렇다면...?? 눈물이난다...&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코틀린 코드 작성 준비하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;코틀린 build gradle 생성&lt;/li&gt;
&lt;/ul&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;pre id=&quot;code_1668954838000&quot; class=&quot;clean&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    id 'org.springframework.boot' version '2.6.8'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.6.21'
    id 'org.jetbrains.kotlin.plugin.jpa' version '1.6.21'
    id 'org.jetbrains.kotlin.plugin.spring' version '1.6.21'
    id 'org.jetbrains.kotlin.kapt' version '1.6.21'
}

group = 'com.group'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'

    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' // 코틀린을 사용하기 위한 의존성 추가
    implementation 'org.jetbrains.kotlin:kotlin-reflect:1.6.21' // 코틀린을 사용하기 위한 의존성 추가
    implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3' // 코틀린을 사용하기 위한 의존성 추가
    implementation 'org.junit.jupiter:junit-jupiter:5.8.1' // 코틀린을 사용하기 위한 의존성 추가
    implementation 'com.querydsl:querydsl-jpa:5.0.0' //querydsl 의존성
    kapt(&quot;com.querydsl:querydsl-apt:5.0.0:jpa&quot;)
    kapt(&quot;org.springframework.boot:spring-boot-configuration-processor&quot;)

    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

/**
 * 코틀린에 필요한 compile 옵션 추가
 */
compileKotlin {
    kotlinOptions {
        jvmTarget = &quot;11&quot;
    }
}

compileTestKotlin {
    kotlinOptions {
        jvmTarget = &quot;11&quot;
    }
}&lt;/code&gt;&lt;/pre&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;size16&quot;&gt;1. 계산기는 정수만 취급한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 계산기가 생성될 때 숫자를 1개 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 최초 숫자가 기록된 이후에는 연산자 함수를 통해 숫자를 받아 지속적으로 계산한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 클래스로 테스트 코드 검증하기&lt;/h3&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;검증하고자 하는 클래스에 data를 붙여준다.&lt;/p&gt;
&lt;pre id=&quot;code_1669033567084&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.group.libraryapp.calculator

import java.lang.IllegalArgumentException

data class Calculator (
    private var number: Int
){

    fun add(operand: Int){
        this.number += operand
    }

    fun minus(operand: Int){
        this.number -= operand
    }

    fun multiply(operand: Int){
        this.number *= operand
    }

    fun divide(operand: Int){
        if(operand == 0){
            throw IllegalArgumentException(&quot;0으로 못나눔&quot;)
        }
        this.number /= operand
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인을 만들어 테스트를 진행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1669033583143&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.group.libraryapp.calculator

import java.util.Calendar

/**
 * main 생성
 */

fun main(){
    val calculatorTest = CalculatorTest()
    calculatorTest.addTest();
}
class CalculatorTest {
    fun addTest(){
        val calculator = Calculator(5)
        calculator.add(3)

        val expectedCalculator = Calculator(8)
        if(calculator != expectedCalculator){
            throw IllegalStateException()
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data를 지우고 number를 public으로 하거나 get을 열어주어 test에서도 접근가능하도록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 컨벤션 _number&lt;/p&gt;
&lt;pre id=&quot;code_1669033820413&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.group.libraryapp.calculator

import java.lang.IllegalArgumentException

class Calculator (
    //private var number: Int
    //var number: Int // setter를 연 상태
    private var _number: Int

){

    /**
     * getter를 연상태
     */
    val number: Int
        get() = this._number

    fun add(operand: Int){
        this._number += operand
    }

    fun minus(operand: Int){
        this._number -= operand
    }

    fun multiply(operand: Int){
        this._number *= operand
    }

    fun divide(operand: Int){
        if(operand == 0){
            throw IllegalArgumentException(&quot;0으로 못나눔&quot;)
        }
        this._number /= operand
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test쪽에서 바로 get 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1669033852756&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.group.libraryapp.calculator

import java.util.Calendar

/**
 * main 생성
 */

fun main(){
    val calculatorTest = CalculatorTest()
    calculatorTest.addTest();
}
class CalculatorTest {
    fun addTest(){
        // given
        val calculator = Calculator(5)

        //when
        calculator.add(3)
        /*
        val expectedCalculator = Calculator(8)
        if(calculator != expectedCalculator){
            throw IllegalStateException()
        }  */
        //then
        if(calculator.number != 8 ){
            throw  IllegalStateException()
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Junit5 사용법과 테스트 코드 리팩토링&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Junit5에서 사용되는 5가지 어노테이션&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dw9PxH/btrSHwePpJj/Vnsn2Vzlj3h1xAeQbK3UCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dw9PxH/btrSHwePpJj/Vnsn2Vzlj3h1xAeQbK3UCk/img.png&quot; data-alt=&quot;6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dw9PxH/btrSHwePpJj/Vnsn2Vzlj3h1xAeQbK3UCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdw9PxH%2FbtrSHwePpJj%2FVnsn2Vzlj3h1xAeQbK3UCk%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;242&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;6&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;@Test : 테스트&amp;nbsp;&lt;/li&gt;
&lt;li&gt;@BeforeEach : 각 테스트 메소드가 수행되기 전에 실행되는 메소드를 지정한다.&lt;/li&gt;
&lt;li&gt;@AfterEach : 각 테스트가 수행된 후에 실행되는 메소드를 지정한다.&lt;/li&gt;
&lt;li&gt;@BeforeAll : 모든 테스트를 수행하기 전에 최초 1회 수행되는 메소드를 지정한다.&lt;/li&gt;
&lt;li&gt;@AfterAll : 모든 테스트를 수행한 후 최후 1회 수행되는 메소드를 지정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test Code 작성&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;pre id=&quot;code_1669967838678&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.group.libraryapp.calculator

import org.junit.jupiter.api.*

class JunitTest {
    companion object {
        @BeforeAll
        @JvmStatic
        fun beforeAll() {
            println(&quot;모든 테스트 시작 전&quot;)
        }

        @AfterAll
        @JvmStatic
        fun afterAll() {
            println(&quot;모든 테스트 종료 후&quot;)
        }
    }

    @BeforeEach
    fun beforeEach() {
        println(&quot;각 테스트 시작 전&quot;)
    }

    @AfterEach
    fun afterEach() {
        println(&quot;각 테스트 종료 후&quot;)
    }

    @Test
    fun test1() {
        println(&quot;테스트 1&quot;)
    }

    @Test
    fun test2() {
        println(&quot;테스트 2&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNW06S/btrSHWc0fDf/YwmUkKJGG8OAkfnsibYSk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNW06S/btrSHWc0fDf/YwmUkKJGG8OAkfnsibYSk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNW06S/btrSHWc0fDf/YwmUkKJGG8OAkfnsibYSk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNW06S%2FbtrSHWc0fDf%2FYwmUkKJGG8OAkfnsibYSk0%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;436&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;계산기에 적용하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;assertThat Imort 하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;AssertProvider 선택하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yb7if/btrSIQDptwH/29isKYERbuBvdclQBCQuz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yb7if/btrSIQDptwH/29isKYERbuBvdclQBCQuz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yb7if/btrSIQDptwH/29isKYERbuBvdclQBCQuz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYb7if%2FbtrSIQDptwH%2F29isKYERbuBvdclQBCQuz1%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;133&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;테스트 코드 작성하기&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;@Test
fun addTest(){
    // given
    val calculator = Calculator(5)

    // when
    calculator.add(3)

    // then
    assertThat(calculator.number).isEqualTo(7);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;테스트 코드 결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LHtFr/btrSGSCLJ4t/4DW8kt4oGEvsHm1ISz6JS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LHtFr/btrSGSCLJ4t/4DW8kt4oGEvsHm1ISz6JS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LHtFr/btrSGSCLJ4t/4DW8kt4oGEvsHm1ISz6JS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLHtFr%2FbtrSGSCLJ4t%2F4DW8kt4oGEvsHm1ISz6JS1%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;459&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추가로 사용하는 단언문&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;isTrue/isFalse : true/false 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// then
val isNew = true
assertThat(isNew).isTrue();
assertThat(isNew).isFalse();&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;hasSize(n) : size 검증 (주로 list의 갯수를 확인)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXI3et/btrSGSCN6lL/ptmEgGPJBG4PRspTYW9IO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXI3et/btrSGSCN6lL/ptmEgGPJBG4PRspTYW9IO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXI3et/btrSGSCN6lL/ptmEgGPJBG4PRspTYW9IO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXI3et%2FbtrSGSCN6lL%2FptmEgGPJBG4PRspTYW9IO1%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;107&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;extracting/containsExactlyInAnyOrder : 주어진 컬렉션 안의 Item 들에서 name 이라는 프로퍼티를 추출한 후, 그 값이 A와 B인지를 검증한다.(AnyOrder : 이 때 순서는 중요하지 않다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ouTJ5/btrSE80uG8J/i4HSyItxIHQHjrv90bbL20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ouTJ5/btrSE80uG8J/i4HSyItxIHQHjrv90bbL20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ouTJ5/btrSE80uG8J/i4HSyItxIHQHjrv90bbL20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FouTJ5%2FbtrSE80uG8J%2Fi4HSyItxIHQHjrv90bbL20%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;109&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;assertThrows : funtion1 함수를 실행했을 때 liigalArgumentException이 나오는지 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uHYyE/btrSHh99oQD/2kcTChB8okWYKDHNcedOx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uHYyE/btrSHh99oQD/2kcTChB8okWYKDHNcedOx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uHYyE/btrSHh99oQD/2kcTChB8okWYKDHNcedOx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuHYyE%2FbtrSHh99oQD%2F2kcTChB8okWYKDHNcedOx1%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;126&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 나온다면 message로 던져주는 메서드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRn0sl/btrSHky4F0q/FzjuWpl4XVWRCEBYmb2A81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRn0sl/btrSHky4F0q/FzjuWpl4XVWRCEBYmb2A81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRn0sl/btrSHky4F0q/FzjuWpl4XVWRCEBYmb2A81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRn0sl%2FbtrSHky4F0q%2FFzjuWpl4XVWRCEBYmb2A81%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;128&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Junit5으로 Spring Boot 테스트 하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Controller&amp;nbsp;- bean 관리 대상이므로 @SpringBootTest로 진행&lt;/li&gt;
&lt;li&gt;Service&amp;nbsp;- bean 관리 대상이므로 @SpringBootTest로 진행&lt;/li&gt;
&lt;li&gt;Repository - bean 관리 대상이므로 @SpringBootTest로 진행&lt;/li&gt;
&lt;li&gt;Domain - bean 관리 대상이 아니므로 @Test 진행&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;보통은 Service 계층을 테스트한다. 보통 A를 보냈을 때 B가 잘 나오는지, 원하는 로직을 잘 수행하는지 검증할 수 있기 때문이다.&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;@Autowired 해주기&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class UserServiceTest @Autowired constructor(
    private val userRepository: UserRepository
    ,private val userService: UserService
) {&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 contrructor를 사용해서 한 번에 Autowired 해줄 수 있다.&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;&lt;a href=&quot;https://github.com/WantAirpod/Kotlin/pull/3/commits/35e20c228d495727618f448c3975b4e3f0d97a8c#diff-a1095aafa7b56e864742fd8dee781e9e1629d3b70e7239ec2a6b7bddf06d2f7a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1. 사칙연산 테스트 코드 작성&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;a href=&quot;https://github.com/WantAirpod/Kotlin/pull/3/commits/02f50faaa68294cc84f43b796f8900b2b51e829f#diff-f2d44e5e47c5499a0eda1cbfd32808639f50e3b36f94b430d020532a1eb9df9c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;UserTest 작성&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.1 &lt;a href=&quot;https://github.com/WantAirpod/Kotlin/commit/b7e77603bede3412dfd2d9afad2652dd4fcaa580#diff-f2d44e5e47c5499a0eda1cbfd32808639f50e3b36f94b430d020532a1eb9df9c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;UserTest 작성(get)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.2 &lt;a href=&quot;https://github.com/WantAirpod/Kotlin/commit/bc4cbebe3cc18a2efcbed26e02c8ef10d34a7c99&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;UserTest 작성(Delete)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;a href=&quot;https://github.com/WantAirpod/Kotlin/commit/4f603711a741c2f07754366371c7f73f4f062e1b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Book관련 Loan 관련 테스트 작성&lt;/a&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;모든 테스트 Terminal로 실행하는 방법&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;./gradlew test&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yT4Ys/btrS6fi4Oft/YqEvxlgMl8RK350wUFPC81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yT4Ys/btrS6fi4Oft/YqEvxlgMl8RK350wUFPC81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yT4Ys/btrS6fi4Oft/YqEvxlgMl8RK350wUFPC81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyT4Ys%2FbtrS6fi4Oft%2FYqEvxlgMl8RK350wUFPC81%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;1072&quot; height=&quot;77&quot; data-origin-width=&quot;1072&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;결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckDTRn/btrS5N1pMbD/SzXA8wXdDKUcATuod7I8WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckDTRn/btrS5N1pMbD/SzXA8wXdDKUcATuod7I8WK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckDTRn/btrS5N1pMbD/SzXA8wXdDKUcATuod7I8WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckDTRn%2FbtrS5N1pMbD%2FSzXA8wXdDKUcATuod7I8WK%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;195&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;195&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpZWKF/btrS6ZUs9HT/MIKg6rFinSUjbkDPrLespK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpZWKF/btrS6ZUs9HT/MIKg6rFinSUjbkDPrLespK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpZWKF/btrS6ZUs9HT/MIKg6rFinSUjbkDPrLespK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpZWKF%2FbtrS6ZUs9HT%2FMIKg6rFinSUjbkDPrLespK%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;550&quot; height=&quot;279&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;다음의 test를 눌러 본다. 더 권장 되는 방법으로 어디서 틀렸는지 쉽게 확인 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdcC3e/btrS5QqcUeg/XsqIcWVEj85s4gV6vy1vgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdcC3e/btrS5QqcUeg/XsqIcWVEj85s4gV6vy1vgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdcC3e/btrS5QqcUeg/XsqIcWVEj85s4gV6vy1vgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdcC3e%2FbtrS5QqcUeg%2FXsqIcWVEj85s4gV6vy1vgk%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;350&quot; height=&quot;450&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nTF2P/btrS1J0kpYX/MbGhRHzfFWuW9KTIvxkSnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nTF2P/btrS1J0kpYX/MbGhRHzfFWuW9KTIvxkSnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nTF2P/btrS1J0kpYX/MbGhRHzfFWuW9KTIvxkSnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnTF2P%2FbtrS1J0kpYX%2FMbGhRHzfFWuW9KTIvxkSnk%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;251&quot; height=&quot;404&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Back-end/Spring+Kotlin</category>
      <author>WantAirpod</author>
      <guid isPermaLink="true">https://wantairpod.tistory.com/435</guid>
      <comments>https://wantairpod.tistory.com/435#entry435comment</comments>
      <pubDate>Fri, 18 Nov 2022 10:50:48 +0900</pubDate>
    </item>
    <item>
      <title>스프링 배치 시작</title>
      <link>https://wantairpod.tistory.com/434</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바의 표준 기술&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;I.O(Input/Output) 기술&lt;/li&gt;
&lt;li&gt;Network - TCP, UDP 기술&lt;/li&gt;
&lt;li&gt;스레드 - 병렬, 멀티&lt;/li&gt;
&lt;li&gt;JDBC&lt;/li&gt;
&lt;li&gt;+++ 배치&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배치 핵심 패턴&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Read - 데이터베이스, 파일, 큐에서 다량의 데이터를 조회한다.&lt;/li&gt;
&lt;li&gt;Process - 특정 방법으로 데이터를 가공한다.&lt;/li&gt;
&lt;li&gt;Write - 데이터를 수정된 양식으로 다시 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배치 시나리오&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;배치 프로세스를 주기적으로 커밋&lt;/li&gt;
&lt;li&gt;동시 다발적인 Job의 배치 처리, 대용량 병렬 처리&lt;/li&gt;
&lt;li&gt;실패 후 수동 또는 스케줄링에 의한 재시작&lt;/li&gt;
&lt;li&gt;의존관계가 있는 step 여러 개를 순차적으로 처리&lt;/li&gt;
&lt;li&gt;조건적 Flow 구성을 통한 체계적이고 유연한 배치 모델 구성&lt;/li&gt;
&lt;li&gt;반복, 재시도, Skip 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Back-end/SpringBatch</category>
      <author>WantAirpod</author>
      <guid isPermaLink="true">https://wantairpod.tistory.com/434</guid>
      <comments>https://wantairpod.tistory.com/434#entry434comment</comments>
      <pubDate>Sun, 30 Oct 2022 12:54:53 +0900</pubDate>
    </item>
    <item>
      <title>스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch</title>
      <link>https://wantairpod.tistory.com/433</link>
      <description>&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 192px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 6.82167%; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25.2713%; height: 18px;&quot;&gt;완료여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 6.82167%; height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 18px;&quot;&gt;스프링 배치 시작&lt;/td&gt;
&lt;td style=&quot;width: 25.2713%; height: 18px;&quot;&gt;2022.10.30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 6.82167%; height: 18px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 18px;&quot;&gt;스프링 배치 도메인 이해&lt;/td&gt;
&lt;td style=&quot;width: 25.2713%; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 6.82167%; height: 20px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 20px;&quot;&gt;스프링 배치 실행&lt;/td&gt;
&lt;td style=&quot;width: 25.2713%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 6.82167%; height: 20px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 20px;&quot;&gt;스프링 배치 정크 프로세스&lt;/td&gt;
&lt;td style=&quot;width: 25.2713%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 6.82167%; height: 20px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 20px;&quot;&gt;스프링 배치 반복 및 오류제어&lt;/td&gt;
&lt;td style=&quot;width: 25.2713%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 6.82167%; height: 20px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 20px;&quot;&gt;스프링 배치 멀티 스레드 포로세싱&lt;/td&gt;
&lt;td style=&quot;width: 25.2713%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 6.82167%; height: 20px;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 20px;&quot;&gt;스프링 배치 리스너&lt;/td&gt;
&lt;td style=&quot;width: 25.2713%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 6.82167%; height: 20px;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 20px;&quot;&gt;스프링 배치 테스트 및 운영&lt;/td&gt;
&lt;td style=&quot;width: 25.2713%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발환경&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;JDK 1.8 이상&lt;/li&gt;
&lt;li&gt;Spring Boot 2.5.1&lt;/li&gt;
&lt;li&gt;DB - H2, Mysql&lt;/li&gt;
&lt;li&gt;IDE - Intellij or STS&lt;/li&gt;
&lt;li&gt;Maven&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;선수지식&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Spring Boot&lt;/li&gt;
&lt;li&gt;Spring Data JPA&lt;/li&gt;
&lt;li&gt;Spring JDBC&lt;/li&gt;
&lt;li&gt;Mysql&lt;/li&gt;
&lt;li&gt;Lombok&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Back-end/SpringBatch</category>
      <author>WantAirpod</author>
      <guid isPermaLink="true">https://wantairpod.tistory.com/433</guid>
      <comments>https://wantairpod.tistory.com/433#entry433comment</comments>
      <pubDate>Sun, 30 Oct 2022 11:09:06 +0900</pubDate>
    </item>
    <item>
      <title>Jenkins를 이용한 CI/CD 자동화 도구 사용</title>
      <link>https://wantairpod.tistory.com/432</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CI/CD를 위한 Git 설정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;github plugin 설치 확인 (Dashboard-&amp;gt;jenkins관리-&amp;gt;Plugin Manager)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs28Aw/btrPzjW1u4c/j2mX5yAkL9ayYNycVDDBM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs28Aw/btrPzjW1u4c/j2mX5yAkL9ayYNycVDDBM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs28Aw/btrPzjW1u4c/j2mX5yAkL9ayYNycVDDBM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs28Aw%2FbtrPzjW1u4c%2Fj2mX5yAkL9ayYNycVDDBM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;320&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;git config 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Name : Default&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Path to Git executable : git&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSdk6Y/btrPzlgedwl/KSUTM2JeABxrthoufn2wR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSdk6Y/btrPzlgedwl/KSUTM2JeABxrthoufn2wR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSdk6Y/btrPzlgedwl/KSUTM2JeABxrthoufn2wR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSdk6Y%2FbtrPzlgedwl%2FKSUTM2JeABxrthoufn2wR1%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;350&quot; height=&quot;435&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;container에 접속해서 git 버전을 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 jenkins가 git을 사용가능한지 체크한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQgQvm/btrPzkIpoYE/SYtJMsNFZ45Sp1NpS93g3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQgQvm/btrPzkIpoYE/SYtJMsNFZ45Sp1NpS93g3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQgQvm/btrPzkIpoYE/SYtJMsNFZ45Sp1NpS93g3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQgQvm%2FbtrPzkIpoYE%2FSYtJMsNFZ45Sp1NpS93g3K%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;480&quot; height=&quot;95&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CI/CD를 위한 Maven 설정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Plugin Maven Integration 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dL5u7J/btrPzkhly0J/Lemxt6zSN1HcdvYXetlue1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dL5u7J/btrPzkhly0J/Lemxt6zSN1HcdvYXetlue1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dL5u7J/btrPzkhly0J/Lemxt6zSN1HcdvYXetlue1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdL5u7J%2FbtrPzkhly0J%2FLemxt6zSN1HcdvYXetlue1%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;180&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;maven conf 설정
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 maven apply를 안해주면 mvn --version이 not found 뜸&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhUl5k/btrPApWK12s/1MWIWKwiazpPHlTvfs09Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhUl5k/btrPApWK12s/1MWIWKwiazpPHlTvfs09Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhUl5k/btrPApWK12s/1MWIWKwiazpPHlTvfs09Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhUl5k%2FbtrPApWK12s%2F1MWIWKwiazpPHlTvfs09Z0%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;430&quot; height=&quot;508&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Exercise #2 Jenkins Job 2/4&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;maven을 설치하면 다음과 같이 Maven Project가 생긴다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZcFWW/btrPy8g2DWi/RV8AlfNGla42SY7OD8sXT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZcFWW/btrPy8g2DWi/RV8AlfNGla42SY7OD8sXT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZcFWW/btrPy8g2DWi/RV8AlfNGla42SY7OD8sXT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZcFWW%2FbtrPy8g2DWi%2FRV8AlfNGla42SY7OD8sXT1%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;550&quot; height=&quot;329&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;build Goals and options 설정
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;clean : 기존 빌드 삭제&lt;/li&gt;
&lt;li&gt;compile : 빌드&lt;/li&gt;
&lt;li&gt;package : package 한다.(war, jar)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;spring boot 라면&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jar : local tomcat&lt;/li&gt;
&lt;li&gt;war : remote tomcat&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;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSzMh5/btrPyn52pZk/KQCrD9VJyjS2KvVNexBrs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSzMh5/btrPyn52pZk/KQCrD9VJyjS2KvVNexBrs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSzMh5/btrPyn52pZk/KQCrD9VJyjS2KvVNexBrs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSzMh5%2FbtrPyn52pZk%2FKQCrD9VJyjS2KvVNexBrs0%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;350&quot; height=&quot;313&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;git 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djhjYn/btrPzMScw3U/VxjGzCC3UOzKfBZ83QXERk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djhjYn/btrPzMScw3U/VxjGzCC3UOzKfBZ83QXERk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djhjYn/btrPzMScw3U/VxjGzCC3UOzKfBZ83QXERk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjhjYn%2FbtrPzMScw3U%2FVxjGzCC3UOzKfBZ83QXERk%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;350&quot; height=&quot;297&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;결과 값 확인 (target)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;war 파일이 잘 떨어진 것을 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AjO7R/btrPApvH7WK/obCorBpFsMjnz0Pgp7fqk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AjO7R/btrPApvH7WK/obCorBpFsMjnz0Pgp7fqk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AjO7R/btrPApvH7WK/obCorBpFsMjnz0Pgp7fqk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAjO7R%2FbtrPApvH7WK%2FobCorBpFsMjnz0Pgp7fqk1%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;240&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;240&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;h2 data-ke-size=&quot;size26&quot;&gt;CI/CD 작업을 위한 Tomcat 연동&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jenkins 관리 -&amp;gt; 플러그인 관리 -&amp;gt; deploy -&amp;gt; deploy to container 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;목적은 떨어지는 war 파일을 톰캣 서버에 배포하는 것이다.&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;853&quot; data-origin-height=&quot;1655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvdPJG/btrQVzp1Go0/RZEB4HJJvpBHakNmsdGD1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvdPJG/btrQVzp1Go0/RZEB4HJJvpBHakNmsdGD1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvdPJG/btrQVzp1Go0/RZEB4HJJvpBHakNmsdGD1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvdPJG%2FbtrQVzp1Go0%2FRZEB4HJJvpBHakNmsdGD1K%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;350&quot; height=&quot;679&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;1655&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ojh10/btrQVBg5omw/03w207k2qOXd88cEzdaknK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ojh10/btrQVBg5omw/03w207k2qOXd88cEzdaknK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ojh10/btrQVBg5omw/03w207k2qOXd88cEzdaknK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fojh10%2FbtrQVBg5omw%2F03w207k2qOXd88cEzdaknK%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;350&quot; height=&quot;190&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기존 프로젝트의 내용을 가져올수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;1094&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cu4Svt/btrQTRZBMmw/2jkR2s0am4Dzv5YvdHeLx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cu4Svt/btrQTRZBMmw/2jkR2s0am4Dzv5YvdHeLx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cu4Svt/btrQTRZBMmw/2jkR2s0am4Dzv5YvdHeLx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcu4Svt%2FbtrQTRZBMmw%2F2jkR2s0am4Dzv5YvdHeLx1%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;350&quot; height=&quot;1094&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;1094&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;git setting&lt;br /&gt;&lt;a href=&quot;https://github.com/joneconsulting/cicd-web-project&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/joneconsulting/cicd-web-project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfXnWT/btrQV1zWpa1/20kxu8guBVaX2QD9lqaid0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfXnWT/btrQV1zWpa1/20kxu8guBVaX2QD9lqaid0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfXnWT/btrQV1zWpa1/20kxu8guBVaX2QD9lqaid0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfXnWT%2FbtrQV1zWpa1%2F20kxu8guBVaX2QD9lqaid0%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;350&quot; height=&quot;447&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Build&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3p808/btrQ0wg44dy/fBfi7lRtIKPSlu6Mycuewk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3p808/btrQ0wg44dy/fBfi7lRtIKPSlu6Mycuewk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3p808/btrQ0wg44dy/fBfi7lRtIKPSlu6Mycuewk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3p808%2FbtrQ0wg44dy%2FfBfi7lRtIKPSlu6Mycuewk%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;200&quot; height=&quot;212&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;빌드 후 조치
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tomcat-user.xml 설정하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l7TWz/btrRtUnkFaL/Nkz8PhvcAwdi48HP8dktf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l7TWz/btrRtUnkFaL/Nkz8PhvcAwdi48HP8dktf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l7TWz/btrRtUnkFaL/Nkz8PhvcAwdi48HP8dktf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl7TWz%2FbtrRtUnkFaL%2FNkz8PhvcAwdi48HP8dktf1%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;350&quot; height=&quot;454&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;1306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;빌드 후 조치
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;username : deployer&lt;/li&gt;
&lt;li&gt;pw : deployer&lt;/li&gt;
&lt;li&gt;ID : deployer_user&lt;/li&gt;
&lt;li&gt;Description : user to deploy on tomcat VM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PK92E/btrRuoIuysH/WBVYJKp0nWFC8YIO53l7q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PK92E/btrRuoIuysH/WBVYJKp0nWFC8YIO53l7q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PK92E/btrRuoIuysH/WBVYJKp0nWFC8YIO53l7q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPK92E%2FbtrRuoIuysH%2FWBVYJKp0nWFC8YIO53l7q1%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;350&quot; height=&quot;676&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;우리가 가진 war파일을 젠킨스를 통해 톰캣 서버에 배포하려고 하면 127.0.0.1:8088(Tomcat)으로 하면 안된다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;젠킨스가 해당 주소를 모르기 때문이다.&lt;/li&gt;
&lt;li&gt;해결방법 : http://[windows IP]:8088(Tomcat)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnImKy/btrRrnkfZDy/SfHnVqaIAKUgLsbRgzTtRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnImKy/btrRrnkfZDy/SfHnVqaIAKUgLsbRgzTtRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnImKy/btrRrnkfZDy/SfHnVqaIAKUgLsbRgzTtRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnImKy%2FbtrRrnkfZDy%2FSfHnVqaIAKUgLsbRgzTtRk%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;350&quot; height=&quot;239&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;본인의 ip주소 알아내는 방법&lt;/b&gt;&lt;br /&gt;iterm에 ifconfig 명령어 사용&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpuqSq/btrRrnR5wCc/4WIjaExBKbv8HBkyveNsu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpuqSq/btrRrnR5wCc/4WIjaExBKbv8HBkyveNsu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpuqSq/btrRrnR5wCc/4WIjaExBKbv8HBkyveNsu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpuqSq%2FbtrRrnR5wCc%2F4WIjaExBKbv8HBkyveNsu0%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;611&quot; height=&quot;138&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>CICD/Jenkins + CI&amp;amp;CD</category>
      <author>WantAirpod</author>
      <guid isPermaLink="true">https://wantairpod.tistory.com/432</guid>
      <comments>https://wantairpod.tistory.com/432#entry432comment</comments>
      <pubDate>Wed, 26 Oct 2022 11:45:45 +0900</pubDate>
    </item>
    <item>
      <title>DevOps와 CI/CD의 이해</title>
      <link>https://wantairpod.tistory.com/431</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;WaterFall vs Agile vs DevOps&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WaterFall&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항정의-&amp;gt;분석/설계-&amp;gt;구현-&amp;gt;테스트-&amp;gt;운영&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agile&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WateFall을 보완하고자 생겨난 SW방법론&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lP3NY/btrOP0dP9g3/lu1Ia3vtELm0a2MNGqYIH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lP3NY/btrOP0dP9g3/lu1Ia3vtELm0a2MNGqYIH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lP3NY/btrOP0dP9g3/lu1Ia3vtELm0a2MNGqYIH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlP3NY%2FbtrOP0dP9g3%2Flu1Ia3vtELm0a2MNGqYIH0%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;739&quot; height=&quot;454&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cloud Native - Containerzation&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MjyLj/btrOP9IRIUR/RIedOtaN7vlbuYcHW4pVg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MjyLj/btrOP9IRIUR/RIedOtaN7vlbuYcHW4pVg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MjyLj/btrOP9IRIUR/RIedOtaN7vlbuYcHW4pVg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMjyLj%2FbtrOP9IRIUR%2FRIedOtaN7vlbuYcHW4pVg0%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;899&quot; height=&quot;438&quot; data-origin-width=&quot;899&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;Cloud Native - DevOps&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Development + Operations&lt;/li&gt;
&lt;li&gt;지속적인 통합 및 배포 운동 -&amp;gt; CI, CD&lt;/li&gt;
&lt;li&gt;엔지니어가 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;프로그래밍&lt;/span&gt;하고, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;빌드&lt;/span&gt;하고, 직접 시스템에 배포 및 서비스를 RUN&lt;/li&gt;
&lt;li&gt;사용자와 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;끊임 없이&lt;/span&gt; Interaction하면서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;서비스를 개선&lt;/span&gt;해 나가는 일련의 과정, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;문화&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4EPp2/btrOP929EKy/wIo6axT0DKXy3fFfIDvkqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4EPp2/btrOP929EKy/wIo6axT0DKXy3fFfIDvkqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4EPp2/btrOP929EKy/wIo6axT0DKXy3fFfIDvkqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4EPp2%2FbtrOP929EKy%2FwIo6axT0DKXy3fFfIDvkqK%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;968&quot; height=&quot;359&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 서비스별 주로 사용하는 Tool&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xzn0P/btrOP7xw7f8/Qa8QmF1Bo0NPXljuhrpaeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xzn0P/btrOP7xw7f8/Qa8QmF1Bo0NPXljuhrpaeK/img.png&quot; data-alt=&quot;\&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xzn0P/btrOP7xw7f8/Qa8QmF1Bo0NPXljuhrpaeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxzn0P%2FbtrOP7xw7f8%2FQa8QmF1Bo0NPXljuhrpaeK%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;948&quot; height=&quot;455&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;\&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cloud Native - CI/CD&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;CI(Continuous Intergration)&lt;/li&gt;
&lt;li&gt;CD(Continuous Delivery)&lt;/li&gt;
&lt;li&gt;CD(Continuous Deployment)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CI/CD Flow&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ak5qW/btrOR6KT6Ew/OxPqpmrK9VnKmLtccg9V6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ak5qW/btrOR6KT6Ew/OxPqpmrK9VnKmLtccg9V6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ak5qW/btrOR6KT6Ew/OxPqpmrK9VnKmLtccg9V6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAk5qW%2FbtrOR6KT6Ew%2FOxPqpmrK9VnKmLtccg9V6k%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;941&quot; height=&quot;508&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ANSIBLE/TERAFORM 같은 경우는 로컬 환경에서 배포하고 운영에선 aws로 해본다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Deploy On Docker Using Jenkins&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz9cYc/btrOTvbV2CC/o2qozXKCWMkG0zQkFeAiS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz9cYc/btrOTvbV2CC/o2qozXKCWMkG0zQkFeAiS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz9cYc/btrOTvbV2CC/o2qozXKCWMkG0zQkFeAiS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz9cYc%2FbtrOTvbV2CC%2Fo2qozXKCWMkG0zQkFeAiS0%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;980&quot; height=&quot;492&quot; data-origin-width=&quot;980&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;sonarQube : jenkins에서 지원하는 정적 테스트 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon ECR : 도커 허브 같은 것&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Jenkins&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;지속적인 통합과 배포 -&amp;gt; Work Flow를 제어&lt;/li&gt;
&lt;li&gt;Continuous Integration Server
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Continuous Developmnet, Build, Test, Deploy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다양한 Plugin 연동
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bild Plugin : Maven, Ant, Gradle...&lt;/li&gt;
&lt;li&gt;VCS Pluginb : git, svn&lt;/li&gt;
&lt;li&gt;Languages Plugins : Java, Python, Node.js...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step1) Dock destTop 설치하기 &lt;a href=&quot;https://www.jenkins.io/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.jenkins.io/download/&lt;/a&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRuWDl/btrPbDvCCHw/Ks0OWwv2BsWt59kkHY0d6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRuWDl/btrPbDvCCHw/Ks0OWwv2BsWt59kkHY0d6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRuWDl/btrPbDvCCHw/Ks0OWwv2BsWt59kkHY0d6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRuWDl%2FbtrPbDvCCHw%2FKs0OWwv2BsWt59kkHY0d6K%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;914&quot; height=&quot;695&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step2) pull docker jenkins&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;jenkins/jenkins란?&lt;br /&gt;만들고자하는 계정Id/Jenkins Repository&lt;br /&gt;docker pull jenkins/jenkins?&lt;br /&gt;docker에서 jenkins계정의 jenkins Repo를 다운로드 받겠다. 라는 의미&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biAhuU/btrPaMsPQuk/TardqdwkHRkgPvEfwwOK41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biAhuU/btrPaMsPQuk/TardqdwkHRkgPvEfwwOK41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biAhuU/btrPaMsPQuk/TardqdwkHRkgPvEfwwOK41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiAhuU%2FbtrPaMsPQuk%2FTardqdwkHRkgPvEfwwOK41%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;1057&quot; height=&quot;735&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;735&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAbThR/btrPeIQdvVO/p31rkxL1tNknZaFsCyrMk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAbThR/btrPeIQdvVO/p31rkxL1tNknZaFsCyrMk1/img.png&quot; data-alt=&quot;docker pull jenkins/jenkins&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAbThR/btrPeIQdvVO/p31rkxL1tNknZaFsCyrMk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAbThR%2FbtrPeIQdvVO%2Fp31rkxL1tNknZaFsCyrMk1%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;577&quot; height=&quot;338&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker pull jenkins/jenkins&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;step3) docker run -p 8080:8080 -p 50000:50000 --restrart=on-failure jenkins/jenkins:lts-jdk11&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;8080:8080 : 컨테이너 밖 쪽에서 8080포트를 사용하면 컨테이너 내부로 8080접속이 되겠다.&lt;/li&gt;
&lt;li&gt;50000:50000 : 컨테이너 외부에서 50000번을 입력하면 컨테이너 내부에서 50000번을 응답하겠다는 의미&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;estrart=on-failure&lt;span&gt;&amp;nbsp; : &lt;/span&gt;&lt;/span&gt;restart이 on 이면 failure를 하겠다는 의미&lt;/li&gt;
&lt;li&gt;jenkins:lts-jdk11 : 버전&lt;/li&gt;
&lt;li&gt;-v 옵션 : 연결 작업 설정(마운트 작업)&lt;/li&gt;
&lt;li&gt;-d 옵션 : 데몬으로 백그라운드에서 돌게 끔 하겠다는 의미, 터미널을 종료해도 도커는 떠 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step4) docker를 띄었다면 localhost:8080 접속하기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;비밀번호는 docker logs 에서 확인하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1772&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfg91Y/btrPuOX0vf1/kGeS1ki0XKGh5OYbl01vkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfg91Y/btrPuOX0vf1/kGeS1ki0XKGh5OYbl01vkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfg91Y/btrPuOX0vf1/kGeS1ki0XKGh5OYbl01vkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfg91Y%2FbtrPuOX0vf1%2FkGeS1ki0XKGh5OYbl01vkk%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;1772&quot; height=&quot;596&quot; data-origin-width=&quot;1772&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;plug in 설치 - 모든 플러그인 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl71a7/btrPxIv4Tjr/zUD4BsZ7sJCjhUbmmqu5J1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl71a7/btrPxIv4Tjr/zUD4BsZ7sJCjhUbmmqu5J1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl71a7/btrPxIv4Tjr/zUD4BsZ7sJCjhUbmmqu5J1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl71a7%2FbtrPxIv4Tjr%2FzUD4BsZ7sJCjhUbmmqu5J1%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;524&quot; height=&quot;375&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Create First Admin User&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLHg8N/btrPzA4ACKN/9uaGNulH0hk91C7Gm7t8f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLHg8N/btrPzA4ACKN/9uaGNulH0hk91C7Gm7t8f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLHg8N/btrPzA4ACKN/9uaGNulH0hk91C7Gm7t8f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLHg8N%2FbtrPzA4ACKN%2F9uaGNulH0hk91C7Gm7t8f1%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;550&quot; height=&quot;446&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;jenkins 실행 완료 (localhost:8080)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;787&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qBKFj/btrPukv9ew7/rLjhsgV9yAIkkM0Cdlo4k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qBKFj/btrPukv9ew7/rLjhsgV9yAIkkM0Cdlo4k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qBKFj/btrPukv9ew7/rLjhsgV9yAIkkM0Cdlo4k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqBKFj%2FbtrPukv9ew7%2FrLjhsgV9yAIkkM0Cdlo4k1%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;2560&quot; height=&quot;787&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;787&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step5) Jenkins Item 생성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;FreeStyle Project로 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2vMff/btrPuPbFZjL/qKfAltqzcfPh5ArQVfkGK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2vMff/btrPuPbFZjL/qKfAltqzcfPh5ArQVfkGK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2vMff/btrPuPbFZjL/qKfAltqzcfPh5ArQVfkGK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2vMff%2FbtrPuPbFZjL%2FqKfAltqzcfPh5ArQVfkGK1%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;1444&quot; height=&quot;765&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Build 설정하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Build Steps -&amp;gt; execute shell&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EPBG5/btrPwy1GW4C/4Y53s6VZEkgU9AkCpgfSK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EPBG5/btrPwy1GW4C/4Y53s6VZEkgU9AkCpgfSK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EPBG5/btrPwy1GW4C/4Y53s6VZEkgU9AkCpgfSK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEPBG5%2FbtrPwy1GW4C%2F4Y53s6VZEkgU9AkCpgfSK1%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;322&quot; height=&quot;308&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Shell 입력하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리의 jenkins는 Linux위에 docker에서 동작하고 있기 때문에 Linux의 shell명령어를 이용하여 build 설정을 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm5dwY/btrPyGqTOWH/gp0Yqk0URtxWPtwbSX0Owk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm5dwY/btrPyGqTOWH/gp0Yqk0URtxWPtwbSX0Owk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm5dwY/btrPyGqTOWH/gp0Yqk0URtxWPtwbSX0Owk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm5dwY%2FbtrPyGqTOWH%2Fgp0Yqk0URtxWPtwbSX0Owk%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;1610&quot; height=&quot;466&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O1rvJ/btrPyGErdaj/EVI1c2yVblb9cC9SDfOLF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O1rvJ/btrPyGErdaj/EVI1c2yVblb9cC9SDfOLF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O1rvJ/btrPyGErdaj/EVI1c2yVblb9cC9SDfOLF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO1rvJ%2FbtrPyGErdaj%2FEVI1c2yVblb9cC9SDfOLF1%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;271&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;271&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;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;docker ps&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 돌아가고 있는지 확인&lt;/p&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;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZvJ7A/btrPyAYpgVs/KmnkHHHfdPICmfhaqPU6OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZvJ7A/btrPyAYpgVs/KmnkHHHfdPICmfhaqPU6OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZvJ7A/btrPyAYpgVs/KmnkHHHfdPICmfhaqPU6OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZvJ7A%2FbtrPyAYpgVs%2FKmnkHHHfdPICmfhaqPU6OK%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;81&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;docker logs [컨테이너ID] - ad8afa98d44a4c478feeb9807144433c&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커의 정보확인 (비밀번호 확인)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clMDLe/btrPxHjEehE/0mdWgxgU8Q1SiEf9tPcQg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clMDLe/btrPxHjEehE/0mdWgxgU8Q1SiEf9tPcQg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clMDLe/btrPxHjEehE/0mdWgxgU8Q1SiEf9tPcQg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclMDLe%2FbtrPxHjEehE%2F0mdWgxgU8Q1SiEf9tPcQg0%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;653&quot; height=&quot;86&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;docker&amp;nbsp;exec&amp;nbsp;-it&amp;nbsp;9fbe23d2df0e&amp;nbsp;bash&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 도커 내부 젠킨스로 들어가기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XDllO/btrPybSs3MZ/hNGgHSrWiAEZ9Us7vuPEL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XDllO/btrPybSs3MZ/hNGgHSrWiAEZ9Us7vuPEL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XDllO/btrPybSs3MZ/hNGgHSrWiAEZ9Us7vuPEL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXDllO%2FbtrPybSs3MZ%2FhNGgHSrWiAEZ9Us7vuPEL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;48&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sg0SQ/btrPyHi3aDC/ETQzf4kUQeFrCBJj8ee3Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sg0SQ/btrPyHi3aDC/ETQzf4kUQeFrCBJj8ee3Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sg0SQ/btrPyHi3aDC/ETQzf4kUQeFrCBJj8ee3Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsg0SQ%2FbtrPyHi3aDC%2FETQzf4kUQeFrCBJj8ee3Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;399&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q2c17/btrPujxkP79/94QyOVQIdT6gkTKlLWrncK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q2c17/btrPujxkP79/94QyOVQIdT6gkTKlLWrncK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q2c17/btrPujxkP79/94QyOVQIdT6gkTKlLWrncK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq2c17%2FbtrPujxkP79%2F94QyOVQIdT6gkTKlLWrncK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;139&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>CICD/Jenkins + CI&amp;amp;CD</category>
      <author>WantAirpod</author>
      <guid isPermaLink="true">https://wantairpod.tistory.com/431</guid>
      <comments>https://wantairpod.tistory.com/431#entry431comment</comments>
      <pubDate>Tue, 18 Oct 2022 10:02:12 +0900</pubDate>
    </item>
    <item>
      <title>Jenkinks를 이용한 CD/CD Pipeline 구축</title>
      <link>https://wantairpod.tistory.com/430</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 39px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 7.17051%; height: 18px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 43.7984%; height: 18px;&quot;&gt;강의&lt;/td&gt;
&lt;td style=&quot;width: 49.031%; height: 18px;&quot;&gt;수강완료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 7.17051%; height: 21px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 43.7984%; height: 21px;&quot;&gt;&amp;nbsp;DevOps와 CI/CD의 이해&lt;/td&gt;
&lt;td style=&quot;width: 49.031%; height: 21px;&quot;&gt;2022.10.26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 7.17051%; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 43.7984%;&quot;&gt;Jenkins를 이용한 CI/CD 자동화 도구 사용&lt;/td&gt;
&lt;td style=&quot;width: 49.031%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CICD/Jenkins + CI&amp;amp;CD</category>
      <author>WantAirpod</author>
      <guid isPermaLink="true">https://wantairpod.tistory.com/430</guid>
      <comments>https://wantairpod.tistory.com/430#entry430comment</comments>
      <pubDate>Mon, 17 Oct 2022 18:13:04 +0900</pubDate>
    </item>
  </channel>
</rss>