<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>hoon DevLog</title>
    <link>https://psip31.tistory.com/</link>
    <description>생각을 계획으로,
계획은 실천으로.
문의 : hooney1103@gmail.com</description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 23:00:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개발한기발자</managingEditor>
    <image>
      <title>hoon DevLog</title>
      <url>https://tistory1.daumcdn.net/tistory/4390320/attach/dee7cf3f5f654a86a555133d6754c56e</url>
      <link>https://psip31.tistory.com</link>
    </image>
    <item>
      <title>유튜브 프리미엄 싸게 할인 가족계정 공유하는 방법</title>
      <link>https://psip31.tistory.com/254</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;본 포스팅은&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;파트너스 활동을 통해&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일정액의 수수료를&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;제공받을 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년이 되면서 점점 주머니 사정이 쉽지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브 프리미엄이 아니더라도,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷플릭스를 비롯한 OTT 종류도,&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;이것도 모자라 안드로이드는 14,900원, iOS는 19,500원으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하는 기기에 따라 금액도 천차만별이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 환율도 오르고, 유튜브 정책에 따라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요금도 인상된다면 월 15,000원에서 20,000원은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우습게 올라갈 것으로 예측되는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 필자가 몇 년째 사용하는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;공유 스트리밍 플랫폼인 &lt;i&gt;&lt;b&gt;Goingbus!!&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월 10,000원이 넘는 금액대에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월 4,000원 대로 사용하는 방법을&lt;/p&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-filename=&quot;edited_blob&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;1269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OI95X/btsLPlQUwch/1gN3S46Eo6XFY5ktQKLmp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OI95X/btsLPlQUwch/1gN3S46Eo6XFY5ktQKLmp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OI95X/btsLPlQUwch/1gN3S46Eo6XFY5ktQKLmp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOI95X%2FbtsLPlQUwch%2F1gN3S46Eo6XFY5ktQKLmp0%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;1279&quot; height=&quot;1269&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;1269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Goingbus 공식 홈페이지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에서 볼 수 있듯 유튜브 프리미엄뿐만 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷플릭스, 스포티파이, 챗지피티 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스별로 합리적인 금액으로 이용할 수 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구독공유 플랫폼을 이용하지 않는 분들은 다소 생소하게 느껴질 수 있지만,&lt;br /&gt;글로벌 결제를 통해 100개 이상의 국가에서 안전한 결제가 가능하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제 즉시 해당 OTT를 이용할 수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원치 않을 경우 24시간 내에 빠른 환불도 가능하기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;믿고 이용해 볼 수 있다.&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://goingbus.com/?s=bwQMlZKv&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt; GoingBus 바로가기&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1;&quot; href=&quot;https://goingbus.com/?s=bwQMlZKv&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/a&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 링크로 들어가 공식 홈페이지에 들어가 구글이나 라인으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 회원가입을 진행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_Image_2025-01-15-16-59-18_001.jpeg&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vCNer/btsLOav6Y5F/u8yL1sxTrgK1aEV3TennnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vCNer/btsLOav6Y5F/u8yL1sxTrgK1aEV3TennnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vCNer/btsLOav6Y5F/u8yL1sxTrgK1aEV3TennnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvCNer%2FbtsLOav6Y5F%2Fu8yL1sxTrgK1aEV3TennnK%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;2160&quot; height=&quot;2160&quot; data-filename=&quot;edited_KakaoTalk_Image_2025-01-15-16-59-18_001.jpeg&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'지금 구매하기'를 클릭하면 위와 같이 1년 치 한 번에 결제로 진행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;i&gt;&lt;b&gt;1년에 39.99 달러는 58,465원으로(2025.01.15 환율 1,462원 기준)&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;한 달에 약 4,800원&lt;/b&gt;&lt;/span&gt; 돈으로 이용할 수 있다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SVdnu/btsLPwxVOxO/ORE9kwInHuoBByB23UHyl1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SVdnu/btsLPwxVOxO/ORE9kwInHuoBByB23UHyl1/img.jpg&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2880&quot; data-is-animation=&quot;false&quot; data-filename=&quot;KakaoTalk_Image_2025-01-15-16-59-18_002.jpeg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SVdnu/btsLPwxVOxO/ORE9kwInHuoBByB23UHyl1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSVdnu%2FbtsLPwxVOxO%2FORE9kwInHuoBByB23UHyl1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2880&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlnINS/btsLOTf9ImE/kboexVh2InjKNMRIF882m0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlnINS/btsLOTf9ImE/kboexVh2InjKNMRIF882m0/img.jpg&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2880&quot; data-is-animation=&quot;false&quot; data-filename=&quot;KakaoTalk_Image_2025-01-15-16-59-19_003.jpeg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlnINS/btsLOTf9ImE/kboexVh2InjKNMRIF882m0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlnINS%2FbtsLOTf9ImE%2FkboexVh2InjKNMRIF882m0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;2880&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 여기서 프로모션 코드까지 입력한다면?!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'프로모션 코드 입력'&lt;/b&gt;을 클릭해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;프로모션 코드에 'hoon'&lt;/b&gt;&lt;/span&gt;을 입력하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;4달러를 추가로 할인해 준다!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 계정당 최초 1회만 적용되니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 생각하고 본인이 가장 많이 사용하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 할인을 높게 받을 플랫폼을 선택해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능한 많은 할인을 받기 바란다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btX8ea/btsLOMIlKPK/WwVbWnVrEbx9BQXzU2eL31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btX8ea/btsLOMIlKPK/WwVbWnVrEbx9BQXzU2eL31/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;693&quot; data-filename=&quot;스크린샷 2025-01-15 17.07.34.png&quot; style=&quot;width: 40.5018%; margin-right: 10px;&quot; data-widthpercent=&quot;40.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btX8ea/btsLOMIlKPK/WwVbWnVrEbx9BQXzU2eL31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtX8ea%2FbtsLOMIlKPK%2FWwVbWnVrEbx9BQXzU2eL31%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;703&quot; height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwBQGH/btsLPu70IgV/pqWBbrXyDC5zwFRi7PU8W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwBQGH/btsLPu70IgV/pqWBbrXyDC5zwFRi7PU8W0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;707&quot; data-filename=&quot;스크린샷 2025-01-15 17.08.16.png&quot; data-widthpercent=&quot;59.02&quot; style=&quot;width: 58.3355%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwBQGH/btsLPu70IgV/pqWBbrXyDC5zwFRi7PU8W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwBQGH%2FbtsLPu70IgV%2FpqWBbrXyDC5zwFRi7PU8W0%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;1033&quot; height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제는 위와 같이 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;신용카드, 카카오페이, 네이버페이 등등&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;다양한 결제수단&lt;/b&gt;&lt;/span&gt;으로 결제 가능하다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnQMl7/btsLPvMCuud/drUW2YnuK0kByIfSYk1qrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnQMl7/btsLPvMCuud/drUW2YnuK0kByIfSYk1qrk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;478&quot; data-filename=&quot;edited_스크린샷 2024-12-16 13.27.58.png&quot; data-widthpercent=&quot;30.27&quot; style=&quot;width: 29.5703%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnQMl7/btsLPvMCuud/drUW2YnuK0kByIfSYk1qrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnQMl7%2FbtsLPvMCuud%2FdrUW2YnuK0kByIfSYk1qrk%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;591&quot; height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nC1om/btsLN7TK9m4/hYWm9fOwYykIhfefNYBW00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nC1om/btsLN7TK9m4/hYWm9fOwYykIhfefNYBW00/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;735&quot; data-filename=&quot;edited_스크린샷 2024-12-16 13.31.58.png&quot; data-widthpercent=&quot;31.62&quot; style=&quot;width: 30.8799%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nC1om/btsLN7TK9m4/hYWm9fOwYykIhfefNYBW00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnC1om%2FbtsLN7TK9m4%2FhYWm9fOwYykIhfefNYBW00%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;949&quot; height=&quot;735&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Axbkl/btsLN9igMW7/4OYvk3mrMwjCURoq135iVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Axbkl/btsLN9igMW7/4OYvk3mrMwjCURoq135iVK/img.png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;381&quot; data-filename=&quot;edited_스크린샷 2024-12-16 13.32.23.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.2243%;&quot; data-widthpercent=&quot;38.11&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Axbkl/btsLN9igMW7/4OYvk3mrMwjCURoq135iVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAxbkl%2FbtsLN9igMW7%2F4OYvk3mrMwjCURoq135iVK%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;593&quot; height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제를 완료하면 위처럼 이메일 입력란이 보이는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 내가 유튜브 프리미엄 &lt;b&gt;혜택을 받을 메일 주소를 입력&lt;/b&gt;하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-12-16 13.33.04.png&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDgXrq/btsLN1Y6c0Z/aaD5b3osgrKUKbhQY3nwmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDgXrq/btsLN1Y6c0Z/aaD5b3osgrKUKbhQY3nwmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDgXrq/btsLN1Y6c0Z/aaD5b3osgrKUKbhQY3nwmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDgXrq%2FbtsLN1Y6c0Z%2FaaD5b3osgrKUKbhQY3nwmk%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;965&quot; height=&quot;648&quot; data-filename=&quot;edited_스크린샷 2024-12-16 13.33.04.png&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메일을 입력하면 내가 입력한 메일 주소로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고잉버스 초대링크가 오게 된다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzjyPe/btsLNv0E6Is/0QH6sVhkQWjPKZAoo8V6E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzjyPe/btsLNv0E6Is/0QH6sVhkQWjPKZAoo8V6E1/img.png&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;867&quot; data-filename=&quot;edited_스크린샷 2024-12-16 13.33.48.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 60.2422%; margin-right: 10px;&quot; data-widthpercent=&quot;60.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzjyPe/btsLNv0E6Is/0QH6sVhkQWjPKZAoo8V6E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzjyPe%2FbtsLNv0E6Is%2F0QH6sVhkQWjPKZAoo8V6E1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;927&quot; height=&quot;867&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rXUJh/btsLM5OKj7r/s1OwpKK3GiLQ76GW0ZvArK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rXUJh/btsLM5OKj7r/s1OwpKK3GiLQ76GW0ZvArK/img.png&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;600&quot; data-filename=&quot;edited_스크린샷 2024-12-16 13.34.02.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 38.595%;&quot; data-widthpercent=&quot;39.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rXUJh/btsLM5OKj7r/s1OwpKK3GiLQ76GW0ZvArK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrXUJh%2FbtsLM5OKj7r%2Fs1OwpKK3GiLQ76GW0ZvArK%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;411&quot; height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/div&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;&lt;b&gt;'가족가입'&lt;/b&gt;을 누르면 끝!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엄청 간단하지 않은가?!?!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvREyf/btsLO9wiCQB/aCIPFiSGiazBKQ1atVke81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvREyf/btsLO9wiCQB/aCIPFiSGiazBKQ1atVke81/img.png&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2880&quot; data-is-animation=&quot;false&quot; data-filename=&quot;edited_KakaoTalk_Image_2025-01-15-17-16-14_001.jpeg&quot; data-widthpercent=&quot;57.89&quot; style=&quot;width: 57.2215%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvREyf/btsLO9wiCQB/aCIPFiSGiazBKQ1atVke81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvREyf%2FbtsLO9wiCQB%2FaCIPFiSGiazBKQ1atVke81%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;2160&quot; height=&quot;2880&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUx8ib/btsLOonnrWv/fdp0LEVPCtlq2BZqe2G7rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUx8ib/btsLOonnrWv/fdp0LEVPCtlq2BZqe2G7rk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2145&quot; data-filename=&quot;edited_KakaoTalk_Image_2025-01-15-17-16-14_002.jpeg&quot; data-widthpercent=&quot;42.11&quot; style=&quot;width: 41.6157%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUx8ib/btsLOonnrWv/fdp0LEVPCtlq2BZqe2G7rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUx8ib%2FbtsLOonnrWv%2Ffdp0LEVPCtlq2BZqe2G7rk%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;1170&quot; height=&quot;2145&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 웹이든 모바일이든 해당 계정으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브를 들어가면 프리미엄 상태임을&lt;/p&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-filename=&quot;edited_edited_KakaoTalk_Photo_2025-01-15-17-22-13.jpeg&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZxFjE/btsLOrxJAmg/gZFlSy8kqksVUMaZqo9E91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZxFjE/btsLOrxJAmg/gZFlSy8kqksVUMaZqo9E91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZxFjE/btsLOrxJAmg/gZFlSy8kqksVUMaZqo9E91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZxFjE%2FbtsLOrxJAmg%2FgZFlSy8kqksVUMaZqo9E91%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;2160&quot; height=&quot;2208&quot; data-filename=&quot;edited_edited_KakaoTalk_Photo_2025-01-15-17-22-13.jpeg&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2208&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;혹은 &quot;가족 그룹에 문제가 있습니다.&quot;라는 메일 알림을 받는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우 발생한 시점에 바로 &lt;i&gt;&lt;b&gt;챗봇 고객문의&lt;/b&gt;&lt;/i&gt;를 통해 2~3일에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길게는 5일 안에 조치가 되고 사용하지 못한 만큼 만료 기간을 연장해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;문제가 발생하면, 반드시!!! 고객센터에 먼저 문의&lt;/b&gt;&lt;/span&gt;해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조치받기 바란다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;돈 걱정 없이 모두 재밌는 OTT 즐기기를 바라며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 포스팅은 끝!&lt;/p&gt;</description>
      <category>IT/Etc &amp;amp; Tool</category>
      <category>GoingBus</category>
      <category>goingbus 사용법</category>
      <category>OTT 공유</category>
      <category>고잉버스</category>
      <category>고잉버스 사용법</category>
      <category>유튜브 VPN</category>
      <category>유튜브 프리미엄 싸게</category>
      <author>개발한기발자</author>
      <guid isPermaLink="true">https://psip31.tistory.com/254</guid>
      <comments>https://psip31.tistory.com/254#entry254comment</comments>
      <pubDate>Wed, 15 Jan 2025 17:30:02 +0900</pubDate>
    </item>
    <item>
      <title>Kotlin array 코틀린 배열 참조 및 사용 emptyArray arrayOf</title>
      <link>https://psip31.tistory.com/253</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2nLu/btsIXJUhRDK/nRtS5lgNd8KUmO7IcuBFLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2nLu/btsIXJUhRDK/nRtS5lgNd8KUmO7IcuBFLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2nLu/btsIXJUhRDK/nRtS5lgNd8KUmO7IcuBFLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2nLu%2FbtsIXJUhRDK%2FnRtS5lgNd8KUmO7IcuBFLk%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;180&quot; height=&quot;180&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;배열&amp;nbsp; 정의하기, arrayOf()&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코틀린에서도 역시 배열 구조를 구현하는 타입은 Array&lt;/li&gt;
&lt;li&gt;배열 크기를 미리 안다면 표준 함수 중 하나를 사용해 배열을 생성 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;배열 정의&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;val a = 배열명&amp;lt;배열타입&amp;gt;&lt;br /&gt;val b = arrayOf(&quot;배열원소1&quot;, &quot;배열원소2&quot;, ...)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722319912321&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main(){
    val a = emptyArray&amp;lt;String&amp;gt;()        // Array&amp;lt;String&amp;gt; (원소 0개)
    val b = arrayOf(&quot;Hello&quot;, &quot;World&quot;)   // Array&amp;lt;String&amp;gt; (원소 2개)
    val c = arrayOf(1, 4, 9)            // Array&amp;lt;Int&amp;gt; (원소 3개)

    // 방법 1: contentToString 사용
    println(a.contentToString())
    println(b.contentToString())
    println(c.contentToString())

    // 방법 2: for 루프 사용
    for (item in a) {
        println(item)
    }

    for (item in b) {
        println(item)
    }

    for (item in c) {
        println(item)
    }

    // 방법 3: joinToString 사용
    println(a.joinToString(&quot;, &quot;))
    println(b.joinToString(&quot;, &quot;))
    println(c.joinToString(&quot;, &quot;))

    // 방법 4: forEach 사용
    a.forEach { println(it) }
    b.forEach { println(it) }
    c.forEach { println(it) }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3xQGd/btsIUK8qQe7/UOICxK30CJl1YejfYHFX30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3xQGd/btsIUK8qQe7/UOICxK30CJl1YejfYHFX30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3xQGd/btsIUK8qQe7/UOICxK30CJl1YejfYHFX30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3xQGd%2FbtsIUK8qQe7%2FUOICxK30CJl1YejfYHFX30%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;658&quot; height=&quot;485&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;485&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;필요에 맞게 contentToString(), jointoString(&quot;구분자&quot;), for, forEach문을 이용해서 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;람다식과 Array()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 사용자가 입력한 값에 이르는 정수의 제곱으로 이뤄진 배열을 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1722320000393&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val size = readLine()!!.toInt()
val squares = Array(size) { (it + 1)*(it + 1) }

println(squares.contentToString())  // [1, 4, 9, 16, 25]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;size에 배열의 크기를 입력받음.&lt;/li&gt;
&lt;li&gt;!!는 null 안전성 연산자로 readLine()이 null을 반환할 수 있기 때문에 !!를 사용하여 null이 아닌 값을 보장한다.&lt;/li&gt;
&lt;li&gt;{ (it + 1) * (it + 1) } : 배열의 각 요소를 초기화하는 람다 함수 &lt;/li&gt;
&lt;li&gt;it는 배열의 인덱스를 표현하는 변수로 자동 선언되며, 0부터 시작!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;원시타입(primitive type), &lt;/b&gt;박싱타입(boxing type)&lt;br /&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원시타입(primitive type) : 실제 값이 스택 메모리에 저장되는 타입&lt;br /&gt;ex). Int, Long, Short, Byte, Float, Double, Char, Boolean
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원시 타입은 박싱 되지 않은 상태로 메모리에 직접 저장&lt;/li&gt;
&lt;li&gt;즉, 이러한 타입의 변수는 실제 값 자체를 저장하고 있어 성능이 우수하고 메모리 사용이 효율적이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;박싱타입(boxing type) : 원시 타입을 객체로 감싸는 래퍼 클래스&lt;br /&gt;ex). Integer, Long, Float, Double 등
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체로 감싸져 힙 메모리에 저장되고, 추가적인 메모리 오버헤드가 발생한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722320219763&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
    // 원시 타입
    val primitiveInt: Int = 100
    println(primitiveInt)  // 출력: 100

    // 박싱 타입
    val boxedInt: Int? = primitiveInt
    println(boxedInt)  // 출력: 100

    // 박싱된 타입의 null 처리
    val nullInt: Int? = null
    println(nullInt)  // 출력: null

    // 박싱 타입을 사용하는 리스트
    val intList: List&amp;lt;Int?&amp;gt; = listOf(1, 2, null, 4)
    println(intList)  // 출력: [1, 2, null, 4]
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원시 타입은 메모리와 성능 면에서 더 효율적이며, null 값을 가질 수 없음.&lt;/li&gt;
&lt;li&gt;박싱 타입은 객체로 감싸져 힙 메모리에 저장되며, null 값을 가질 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;배열 사용하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;배열타입&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열 타입은 문자열 타입과 꽤 비슷하여, size와 lastIndex 프로퍼티가 있고,. 과 인덱스 연산으로 원소에 접근하는 점이 비슷하다.&lt;/li&gt;
&lt;li&gt;잘못 인덱스를 사용하면 런타임에 IndexOutOfBoundsException이 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722321358968&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val squares = arrayOf( 1, 4, 9, 16 )  
squares.size 	 // 4 
squares.lastIndex // 3
squares[3]       // 16
squares[1]       // 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;배열 원소 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에 이어서 배열의 원소를 변경해 보겠다.&lt;/p&gt;
&lt;pre id=&quot;code_1722321451053&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;squares[2] = 100 // squares : 1, 4, 100, 16
squares[3] += 9  // squares : 1, 4, 100, 25
squares[0]--     // squares : 0, 4, 100, 16&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코틀린에서는 배열의 원소에 직접 연산을 하여, 원본 배열을 변경할 수 있다!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;참조형 데이터&lt;br /&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바처럼 배열 타입의 변수 자체에는 실제 데이터에 대한 참조를 저장한다.&lt;/li&gt;
&lt;li&gt;이로 인해 배열 변수에 다른 배열을 대입하면 같은 데이터 집합을 공유한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722321895041&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val numbers = squares // numbers에 squares 배열을 대입하며 [0, 4, 9, 16]
numbers[0] = 1000     // 바뀐 데이터가 squares와 numbers에 공유됨 [1000, 4, 9, 16]
println(squares[0])   // 1000&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;배열 복제&lt;br /&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원본과 별도의 배열을 만들고 싶다면 copyOf() 함수를 사용해야 한다.&lt;/li&gt;
&lt;li&gt;copyOf()는 필요시 다른 크기의 배열을 만들어 내기도 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722322011036&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val numbers = squares.copyOf()
numbers[0] = 1000 // squares에는 영향이 없다.
squares.copyOf(2) // 뒤가 잘림 [1, 4]
squares.copyOf(5) // 부족한 부분에 0이 채워짐 [1, 4, 9, 16, 0]&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;다른 타입의 배열은 대입 X&lt;br /&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열 타입 변수에 타입이 다른 배열 대입 X&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722322141268&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val a = arrayOf(1, 4, 9, 16)
a = arrayOf(&quot;one&quot;, &quot;two&quot;) // Error : can't assign Array&amp;lt;String&amp;gt; to Array&amp;lt;Int&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바는 상위 타입의 배열에서 하위 타입 배열을 대입할 수 있었다.&lt;/li&gt;
&lt;li&gt;코틀린에서는 배열이 가변 데이터 구조 이므로 이런 대입은 런타임시 문제가 될 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;배열 원소 추가&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열을 생성하면 길이를 바꿀 수 없지만 + 연산자로 원소를 추가한 새로운 배열을 만들 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722996595471&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val b = intArrayOf(1, 2, 3) + 4                // 원소를 하나만 추가 : 1, 2, 3, 4
val c = intArrayOf(1, 2, 3) + intArrayOf(5, 6) // 다른 배열을 추가 : 1, 2, 3, 5, 6&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;배열 비교&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열과 달리 배열에 대한 ==, != 연산자는 원소자체를 비교하지 않고 참조를 비교한다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;배열 내용을 비교하려면 contentEquals() 함수를 사용하자.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722323017531&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;intArrayOf(1, 2, 3) == intArrayOf(1, 2, 3)             // false
intArrayOf(1, 2, 3).contentEquals(intArrayOf(1, 2, 3)) // true&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;배열 표준 함수&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;background-color: #ffffff; color: #24292f; text-align: start; border-collapse: collapse; width: 88.9535%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.9535%;&quot;&gt;함수&lt;/td&gt;
&lt;td style=&quot;width: 40.814%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 26.7442%;&quot;&gt;메서드&lt;/td&gt;
&lt;td style=&quot;width: 7.32559%;&quot;&gt;결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.9535%;&quot;&gt;isEmpty&lt;/td&gt;
&lt;td style=&quot;width: 40.814%;&quot;&gt;배열이 비었는지 검사&lt;/td&gt;
&lt;td style=&quot;width: 26.7442%;&quot;&gt;intArrayOf(1, 2).isEmpty()&lt;/td&gt;
&lt;td style=&quot;width: 7.32559%;&quot;&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.9535%;&quot;&gt;isNotEmpty&lt;/td&gt;
&lt;td style=&quot;width: 40.814%;&quot;&gt;배열에 원소가 있는지 검사&lt;/td&gt;
&lt;td style=&quot;width: 26.7442%;&quot;&gt;intArrayOf(1, 2).isNotEmpty()&lt;/td&gt;
&lt;td style=&quot;width: 7.32559%;&quot;&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.9535%;&quot;&gt;indexOf&lt;/td&gt;
&lt;td style=&quot;width: 40.814%;&quot;&gt;인자와 일치하는 최초의 배열 아이템의 인덱스를 반환&lt;br /&gt;(일치하는 원소가 없으면 -1)&lt;/td&gt;
&lt;td style=&quot;width: 26.7442%;&quot;&gt;intArrayOf(1, 2, 3).indexOf(2)&lt;br /&gt;intArrayOf(1, 2, 3).indexOf(4)&lt;/td&gt;
&lt;td style=&quot;width: 7.32559%;&quot;&gt;1&lt;br /&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c1bef9; color: #000000; text-align: start;&quot;&gt;&lt;i&gt;&lt;b&gt;언제나 새로운 정보 공유와 잘못된 정보&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c1bef9; color: #000000; text-align: start;&quot;&gt;&lt;i&gt;&lt;b&gt;비판/지적/태클은 환영입니다!&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;i&gt;&lt;b&gt;도움이 되셨다면 공감&amp;hearts;️, 댓글 부탁드려요:)&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;끝.&lt;/b&gt;&lt;/p&gt;</description>
      <category>IT/Kotlin</category>
      <category> kotlin 메서드</category>
      <category>arrayOf</category>
      <category>kotlin  array</category>
      <category>Kotlin</category>
      <category>kotlin method</category>
      <category>kotlin 배열</category>
      <category>코틀린 배열 원소 추가</category>
      <category>코틀린 배열 함수</category>
      <author>개발한기발자</author>
      <guid isPermaLink="true">https://psip31.tistory.com/253</guid>
      <comments>https://psip31.tistory.com/253#entry253comment</comments>
      <pubDate>Wed, 7 Aug 2024 11:14:33 +0900</pubDate>
    </item>
    <item>
      <title>Kotlin 코틀린 문자열 템플릿 및 기본 문자열 연산</title>
      <link>https://psip31.tistory.com/252</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQvgN2/btsIGrm3nDc/9rHONQ02DzvTiKgrc3gfU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQvgN2/btsIGrm3nDc/9rHONQ02DzvTiKgrc3gfU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQvgN2/btsIGrm3nDc/9rHONQ02DzvTiKgrc3gfU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQvgN2%2FbtsIGrm3nDc%2F9rHONQ02DzvTiKgrc3gfU0%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;180&quot; height=&quot;180&quot; data-origin-width=&quot;180&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;문자열 리터럴 정의&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 리터럴의 정의는 큰따옴표(&quot;)로 문자를 감싸는 것&lt;/p&gt;
&lt;pre id=&quot;code_1722319912321&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val test = &quot;Hello, world!&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열에 특수 문자가 들어가면 백슬래시(\) 뒤에 한 문자나 숫자 조합이 오는 문자 조합을 이루는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이스케이프 시퀀스(Escape Sequence)&lt;/b&gt;를 사용해야 함!&lt;/p&gt;
&lt;pre id=&quot;code_1722320000393&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val text = &quot;Hello, world!\nThis is \&quot;multiline\&quot; string&quot;
// Hello, world!
// This is &quot;multiline&quot; string
println(&quot;\u03C0 \u2248 3.14&quot;) // &amp;pi; &amp;asymp; 3.14&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문자열 템플릿&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 자바에서 사용하는 문자열과 비슷하나,&amp;nbsp;&lt;br /&gt;코틀린은&amp;nbsp;여러&amp;nbsp;식에서&amp;nbsp;문자열을&amp;nbsp;합성해&amp;nbsp;내는&amp;nbsp;훨씬&amp;nbsp;강력한&amp;nbsp;방법을&amp;nbsp;지원한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드는 이름을 입력받아, 개행 후 오늘 날짜를 출력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1722320219763&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Date

fun main() {
    val name = readLine()
    println(&quot;Hello, ${name}!\nToday is {Date()}&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w5dXW/btsIR208ynu/KfWqkBG35Lxo06uhcPnze1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w5dXW/btsIR208ynu/KfWqkBG35Lxo06uhcPnze1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w5dXW/btsIR208ynu/KfWqkBG35Lxo06uhcPnze1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw5dXW%2FbtsIR208ynu%2FKfWqkBG35Lxo06uhcPnze1%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;1804&quot; height=&quot;608&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;608&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;기본적으로 ${} 의 중괄호 사이에 넣기만 하면 어떤 코틀린 식이든 문자열에 넣을 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;간단한 변수 참조인 경우 $name 같이 중괄호를 생략하고 달러($) 기호만 붙여도 된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이런 기능을 &lt;b&gt;문자열 템플릿&lt;/b&gt;이라고 한다.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;로우 문자열(raw string)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로우 문자열을 사용하면 이스케이프 시퀀스를 사용하지 않고도 문자열을 작성할 수 있다.&lt;/li&gt;
&lt;li&gt;이런 리터럴은 큰 따옴표 세 개로 둘러 싸여 있고, 새 줄 문자를 포함한 사용자가 입력한 문자를 포함할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722321358968&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Date

fun main() {
    val name = readLine()
    val message = &quot;&quot;&quot; Hello, $name,
    Today is${Date() } &quot;&quot;&quot;.trimIndent()
    println(message)
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;trimIndent()는 여러줄에 공통된 최소 들여 쓰기를 제거해 주는 표준 코틀린 함수이다.&lt;/li&gt;
&lt;li&gt;로우 문자열에 특수문자를 추가하고 싶은 경우 ${} 안에 특수문자를 넣으면 된다.&lt;/li&gt;
&lt;li&gt;JVM으로 컴파일 되는 애플리케이션에서 문자열은 JVM의 String클래스로 표현된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722321451053&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
    val message = &quot;&quot;&quot;This is triple quote : ' ${&quot;\&quot;\&quot;\&quot;&quot;} '&quot;&quot;&quot;.trimIndent()
    // This is triple quote : ' &quot;&quot;&quot; '
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;length, lastIndex 프로퍼티&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;length&lt;/b&gt; : &lt;b&gt;모든 String 인스턴스는 문자열에 든 문자 수&lt;/b&gt;를 표현&lt;/li&gt;
&lt;li&gt;&lt;b&gt;lastIndex&lt;/b&gt;&amp;nbsp;:&amp;nbsp;&lt;b&gt;문자열의&amp;nbsp;마지막&amp;nbsp;문자&amp;nbsp;인덱스&lt;/b&gt;를&amp;nbsp;표현하는&amp;nbsp;&amp;nbsp;프로퍼티를&amp;nbsp;제공&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722321895041&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;Hello!&quot;.length     // 6
&quot;Hello!&quot;.lastIndex  // 5 (첫번째 문자의 인덱스가 0 이므로)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[] 연산자로 개별문자 접근&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[] 연산자&lt;/b&gt;에 인덱스를 넣어 개별문자에 접근하고, 인덱스는 0부터 시작!&lt;/li&gt;
&lt;li&gt;잘못된 인덱스를 넘기면 자바와 마찬가지로 &lt;b&gt;StringIndexOutOfBoundsException&lt;/b&gt; 예외가 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722322011036&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; val s = &quot;Hello! &quot;
 println(s[0])  // H
 println(s[1])  // e
 println(s[5])  // !
 println(s[10]) // 잘못된 인덱스&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필자는 Java의 char 배열(char [])과 비슷한 맥락으로 이해했다!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;두&amp;nbsp;문자&amp;nbsp;연결&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;+ 연산자&lt;/b&gt;로 두 문자를 연결 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722322141268&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; val s = &quot;The sum is : &quot; + sum // &quot;The sum is $sum&quot; 으로 대체 가능&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;두&amp;nbsp;문자열&amp;nbsp;비교&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열은 == 와 != 를 사용해서 동등성 비교 가능&lt;/li&gt;
&lt;li&gt;이들 연산은 문자열의 내용을 비교하므로 문자의 순서와 같이 길이가 같으면 다른 객체의 인스턴스를 같은 문자열로 간주한다!!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722322204067&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; val s1 = &quot;Hello!&quot;
 val s2 = &quot;Hel&quot; + &quot;lo!&quot;
 println(s1 == s2) // ture&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참조동등성을 비교하려면 === 와 !== 연산자를 사용하면 된다.&lt;/li&gt;
&lt;li&gt;&amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;= 같은 연산자를 사용해 문자열을 비교할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722322233866&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; println(&quot;abc&quot; &amp;lt; &quot;cba&quot;) // true
 println(&quot;123&quot; &amp;gt; &quot;34&quot;) // false&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열은 사전식 순서(오름차순)로 정렬되므로 정렬된 순서대로 커진다고 생각하면 된다!&lt;/li&gt;
&lt;li&gt;숫자 비교가 아닌 문자열 숫자(&quot;숫자&quot;)를 비교하는 것이므로 &quot;34&quot;가 더 나중에 정렬되므로 false&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;타입 변환 함수&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;말 그대로 기존의 타입을 바꿔주는 함수로 to변환할 타입()으로 명명된다!&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;toByte(), toShort(), toInt(), toLong(), toFloat(), toDouble(), toBoolean()&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;기타 문자열 함수&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;isEmpty : 문자열이 비어있는지 검사&lt;/li&gt;
&lt;li&gt;isNotEmpty : 문자열이 비어있지 않은지 검사&lt;/li&gt;
&lt;li&gt;substring : 부분 문자열 추출&lt;/li&gt;
&lt;li&gt;startsWith : 접두사(prefix) 검사&lt;/li&gt;
&lt;li&gt;endsWith : 접미사(suffix) 검사&lt;/li&gt;
&lt;li&gt;indexOf : 인자로 받은 문자나 문자열이 수신 객체인 문자열에 나타나는 첫번째 인덱스를 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722323017531&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;println(&quot;Hello&quot;.isEmpty())         // &quot;Hello&quot; 문자열이 비어있는지 확인 (false 반환)
println(&quot;&quot;.isEmpty())              // 빈 문자열이 비어있는지 확인 (true 반환)
println(&quot;Hello&quot;.substring(2))      // &quot;Hello&quot; 문자열의 인덱스 2부터 끝까지 부분 문자열 반환 (&quot;llo&quot;)
println(&quot;Hello&quot;.substring(1, 3))   // &quot;Hello&quot; 문자열의 인덱스 1부터 3 전까지 부분 문자열 반환 (&quot;el&quot;)
println(&quot;Hello&quot;.startsWith(&quot;Hel&quot;)) // &quot;Hello&quot; 문자열이 &quot;Hel&quot;로 시작하는지 확인 (true 반환)
println(&quot;Hello&quot;.endsWith(&quot;lo&quot;))    // &quot;Hello&quot; 문자열이 &quot;lo&quot;로 끝나는지 확인 (true 반환)
println(&quot;abcabc&quot;.indexOf('b'))     // &quot;abcabc&quot; 문자열에서 문자 'b'의 첫 번째 인덱스 반환 (1)
println(&quot;abcabc&quot;.indexOf(&quot;ca&quot;))    // &quot;abcabc&quot; 문자열에서 문자열 &quot;ca&quot;의 첫 번째 인덱스 반환 (2)
println(&quot;abcabc&quot;.indexOf(&quot;cd&quot;))    // &quot;abcabc&quot; 문자열에서 문자열 &quot;cd&quot;를 찾을 수 없으므로 -1 반환
println(&quot;abcabc&quot;.indexOf('b', 2))  // &quot;abcabc&quot; 문자열에서 인덱스 2부터 문자 'b'를 검색하여 첫 번째 인덱스 반환 (4)
println(&quot;abcabc&quot;.indexOf(&quot;ab&quot;, 2)) // &quot;abcabc&quot; 문자열에서 인덱스 2부터 문자열 &quot;ab&quot;를 검색하여 첫 번째 인덱스 반환 (3)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfhdRP/btsIPTSkk99/Tc7xSIfluPGJvEk8qqUmE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfhdRP/btsIPTSkk99/Tc7xSIfluPGJvEk8qqUmE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfhdRP/btsIPTSkk99/Tc7xSIfluPGJvEk8qqUmE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfhdRP%2FbtsIPTSkk99%2FTc7xSIfluPGJvEk8qqUmE0%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;1654&quot; height=&quot;794&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;뭔가 문법적으로 정확하게 딱딱 들어맞는 Java와 달리,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교적 자유도가 높은 코틀린이 좀 더 편해 보이는 듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 아직 익숙지 않아 계속해서 코딩을 직접 하면서 익혀 나가야겠다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c1bef9; color: #000000; text-align: start;&quot;&gt;&lt;i&gt;&lt;b&gt;언제나 새로운 정보 공유와 잘못된 정보&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c1bef9; color: #000000; text-align: start;&quot;&gt;&lt;i&gt;&lt;b&gt;비판/지적/태클은 환영입니다!&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;i&gt;&lt;b&gt;도움이 되셨다면 공감&amp;hearts;️, 댓글 부탁드려요:)&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;끝.&lt;/b&gt;&lt;/p&gt;</description>
      <category>IT/Kotlin</category>
      <category>indexof</category>
      <category>isEmpty</category>
      <category>Kotlin</category>
      <category>kotlin literal</category>
      <category>kotlin 문자열</category>
      <category>SubString</category>
      <category>코틀린 문자열</category>
      <category>코틀린 문자열 템플릿</category>
      <author>개발한기발자</author>
      <guid isPermaLink="true">https://psip31.tistory.com/252</guid>
      <comments>https://psip31.tistory.com/252#entry252comment</comments>
      <pubDate>Wed, 31 Jul 2024 08:58:20 +0900</pubDate>
    </item>
    <item>
      <title>YouTube Premium 유튜브 프리미엄 싸게 월 4000원대 저렴한 겜스고 사용법</title>
      <link>https://psip31.tistory.com/251</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIsMED/btsIDwOW8T7/e12MkhjzVBzc4ESOnF3WK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIsMED/btsIDwOW8T7/e12MkhjzVBzc4ESOnF3WK1/img.png&quot; data-alt=&quot;유튜브 프리미엄 가입 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIsMED/btsIDwOW8T7/e12MkhjzVBzc4ESOnF3WK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIsMED%2FbtsIDwOW8T7%2Fe12MkhjzVBzc4ESOnF3WK1%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;484&quot; height=&quot;896&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유튜브 프리미엄 가입 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유튜브 프리미엄 구독 금액&lt;/b&gt;이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어마어마하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;월 19,500원&lt;/b&gt;이면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년에 234,000원 정도가&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;우회 VPN을 사용하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 방법을 보고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 시간 따라 해봤는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;막히고 안돼서 너무 답답&lt;/b&gt;했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;금액도 고정되지 않고 계속 인상&lt;/b&gt;되며,&lt;br /&gt;터키가 최근 막혀, 이집트 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 가본 적 없는 나라들로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;계속 이주해야 한다고&lt;/b&gt; 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 어떤 VPN은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결제수단으로 비자카드만 가능&lt;/b&gt;하거나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우회 사용 시 계정정지 및 막힘&lt;/b&gt;으로&lt;br /&gt;내가 서비스를 사용하는 데 있어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어려움이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 따라 요즘 수많은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쉐어 플랫폼&lt;/b&gt;이 나오고 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소비자인 우리의 입장에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 요금과 신뢰도에 따라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택하게 되는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 &lt;b&gt;Gamsgo&lt;/b&gt;!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2964&quot; data-origin-height=&quot;2968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vh9kO/btsIBg7kodC/keoJBRzikDk1Q0kK47S7s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vh9kO/btsIBg7kodC/keoJBRzikDk1Q0kK47S7s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vh9kO/btsIBg7kodC/keoJBRzikDk1Q0kK47S7s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvh9kO%2FbtsIBg7kodC%2FkeoJBRzikDk1Q0kK47S7s1%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;635&quot; height=&quot;636&quot; data-origin-width=&quot;2964&quot; data-origin-height=&quot;2968&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각종 수많은 OTT 서비스를 제공하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 화면에서도 보시다시피&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 OTT들 금액의 절반도 안 되는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저렴한 금액으로 OTT를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;너무 저렴하니 사기 아닌가?!?!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 생각할 수도 있겠지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자를 포함한 많은 사람들의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각종 사용후기들도 많고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자체적으로 운영하는 챗봇도 있어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애로사항을 조치받을 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[회원가입]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1136&quot;&gt;&lt;a href=&quot;https://www.gamsgo.com/partner/jcs9z&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp7Ryk/btsIBkV61Kv/KFwDFpTNSNImve3aeK1ngk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp7Ryk%2FbtsIBkV61Kv%2FKFwDFpTNSNImve3aeK1ngk%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;696&quot; height=&quot;1136&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1136&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://www.gamsgo.com/partner/jcs9z&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;겜스고 바로가기&lt;/b&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 위의 겜스고 링크로 들어가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구글 or 페이스북 or 카카오톡을 통해&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;회원가입&lt;/b&gt;을 한다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[서비스 선택]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2722&quot; data-origin-height=&quot;2900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ml7rv/btsICgzRNRb/WEJKc0OrK2kWBnz8gD94Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ml7rv/btsICgzRNRb/WEJKc0OrK2kWBnz8gD94Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ml7rv/btsICgzRNRb/WEJKc0OrK2kWBnz8gD94Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fml7rv%2FbtsICgzRNRb%2FWEJKc0OrK2kWBnz8gD94Y1%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;602&quot; height=&quot;2900&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2722&quot; data-origin-height=&quot;2900&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 홈페이지에 들어가서 유튜브를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택하면 아래와 같은 모달창이 뜬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;1172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byWYqi/btsID27JXeS/jUyHMOpqKgJSfQwcEck5O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byWYqi/btsID27JXeS/jUyHMOpqKgJSfQwcEck5O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byWYqi/btsID27JXeS/jUyHMOpqKgJSfQwcEck5O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyWYqi%2FbtsID27JXeS%2FjUyHMOpqKgJSfQwcEck5O0%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;570&quot; height=&quot;1172&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;1172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오잉 &lt;b&gt;82.99 달러&lt;/b&gt;??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것도 &lt;b&gt;24개월&lt;/b&gt;에??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘&amp;nbsp;환율&amp;nbsp;1380원으로&lt;br /&gt;계산하면 114,526원.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무 할인이 없어도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브 공식 홈페이지 요금과 비교하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2년을 1년 요금보다 더 싸게 하는 격!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 거기에 프로모션 코드를 입력하면??&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[ 요금 선택]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byeS2g/btsIAV3tv06/nlvhDwcfE1Mvm58BSt11g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byeS2g/btsIAV3tv06/nlvhDwcfE1Mvm58BSt11g0/img.png&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;1356&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.7034%; margin-right: 10px;&quot; data-widthpercent=&quot;33.48&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byeS2g/btsIAV3tv06/nlvhDwcfE1Mvm58BSt11g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyeS2g%2FbtsIAV3tv06%2FnlvhDwcfE1Mvm58BSt11g0%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;1380&quot; height=&quot;1356&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfMuZy/btsIBX0tf06/C46ktMynISMUmtbkk9PHA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfMuZy/btsIBX0tf06/C46ktMynISMUmtbkk9PHA1/img.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1374&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5557%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfMuZy/btsIBX0tf06/C46ktMynISMUmtbkk9PHA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfMuZy%2FbtsIBX0tf06%2FC46ktMynISMUmtbkk9PHA1%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;1392&quot; height=&quot;1374&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RyJAm/btsIBBQTxaO/dwI7WAExEPIQ6YiBVqeOwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RyJAm/btsIBBQTxaO/dwI7WAExEPIQ6YiBVqeOwk/img.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;1374&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.4153%;&quot; data-widthpercent=&quot;33.19&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RyJAm/btsIBBQTxaO/dwI7WAExEPIQ6YiBVqeOwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRyJAm%2FbtsIBBQTxaO%2FdwI7WAExEPIQ6YiBVqeOwk%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;1386&quot; height=&quot;1374&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안 그래도 저렴한 요금이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 할인이 적용되는 걸 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더욱더 할인이 된다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 할인 프로모션 코드를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력하지 않을 이유가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(단, 1인 1회 한정!)&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;프로모션 코드&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;b&gt;PHR6X&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼭 입력해서 할인 놓치지 말자!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;프로모션 코드나 쿠폰이 있나요?&lt;/u&gt;를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클릭하여 위의 프로모션 코드를 입력하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할인이 적용되는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;참고로 자동갱신 활성화&lt;/u&gt;를 누르면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 할인이 들어가니 참고하기 바란다!!&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[결제 수단]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btM84O/btsIEeNIGXX/On7DiJAPCZN9cSZBG9oGM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btM84O/btsIEeNIGXX/On7DiJAPCZN9cSZBG9oGM1/img.png&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;1310&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4418%; margin-right: 10px;&quot; data-widthpercent=&quot;50.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btM84O/btsIEeNIGXX/On7DiJAPCZN9cSZBG9oGM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtM84O%2FbtsIEeNIGXX%2FOn7DiJAPCZN9cSZBG9oGM1%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;1892&quot; height=&quot;1310&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/65CH4/btsIB4zAV7I/GpWWIckxk5Ljvj1LipEMR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/65CH4/btsIB4zAV7I/GpWWIckxk5Ljvj1LipEMR1/img.png&quot; data-origin-width=&quot;1896&quot; data-origin-height=&quot;1314&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.3955%;&quot; data-widthpercent=&quot;49.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/65CH4/btsIB4zAV7I/GpWWIckxk5Ljvj1LipEMR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F65CH4%2FbtsIB4zAV7I%2FGpWWIckxk5Ljvj1LipEMR1%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;1896&quot; height=&quot;1314&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 결제 방식을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;카카오페이, 네이버페이, 삼성페이&lt;/b&gt; 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 자주 사용하는 결제 수단으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더욱 신뢰를 가지고 결제할 수 있다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[결제 완료]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-07-12 18.53.13.png&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;869&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWs9ht/btsIB7oitD1/C2AOXarkZ4kpeELxaBMsR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWs9ht/btsIB7oitD1/C2AOXarkZ4kpeELxaBMsR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWs9ht/btsIB7oitD1/C2AOXarkZ4kpeELxaBMsR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWs9ht%2FbtsIB7oitD1%2FC2AOXarkZ4kpeELxaBMsR0%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;676&quot; height=&quot;869&quot; data-filename=&quot;edited_스크린샷 2024-07-12 18.53.13.png&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;869&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 필자는 6개월&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유튜브 프리미엄 구독 완료!!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우측 상단 구독 탭&lt;/b&gt;에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인의 구독 및 결제 내역을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 여기서 &lt;b&gt;이메일 인증&lt;/b&gt;을 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유튜브 계정과 연결&lt;/b&gt;해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 보이는 로그인 이메일,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 유튜브를 연결할 계정을 입력하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 주소로 초대 메일이 발송된다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[초대 메일 수신 확인]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-07-12 18.54.40.png&quot; data-origin-width=&quot;2346&quot; data-origin-height=&quot;2290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZZSe0/btsICEy4n0G/fNAkWHykaxgKXwW8PONyJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZZSe0/btsICEy4n0G/fNAkWHykaxgKXwW8PONyJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZZSe0/btsICEy4n0G/fNAkWHykaxgKXwW8PONyJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZZSe0%2FbtsICEy4n0G%2FfNAkWHykaxgKXwW8PONyJk%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;664&quot; height=&quot;2290&quot; data-filename=&quot;edited_스크린샷 2024-07-12 18.54.40.png&quot; data-origin-width=&quot;2346&quot; data-origin-height=&quot;2290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겜스고에서 발송한 초대 메일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 초대 메일의 주황색 버튼을 클릭해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 단계로 넘어간다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[가족 그룹 참여]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DioD6/btsIBbrxs48/5oxz4KiL6jhT51RfFCTqx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DioD6/btsIBbrxs48/5oxz4KiL6jhT51RfFCTqx1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2068&quot; data-origin-height=&quot;1496&quot; data-filename=&quot;스크린샷 2024-07-12 18.55.03.png&quot; style=&quot;width: 35.1753%; margin-right: 10px;&quot; data-widthpercent=&quot;36.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DioD6/btsIBbrxs48/5oxz4KiL6jhT51RfFCTqx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDioD6%2FbtsIBbrxs48%2F5oxz4KiL6jhT51RfFCTqx1%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;2068&quot; height=&quot;1496&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uTACU/btsICopHyuu/Jo32kHTYJhiklifORhAqCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uTACU/btsICopHyuu/Jo32kHTYJhiklifORhAqCK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1996&quot; data-origin-height=&quot;1628&quot; data-filename=&quot;edited_스크린샷 2024-07-12 18.54.54.png&quot; data-widthpercent=&quot;31.94&quot; style=&quot;width: 31.1978%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uTACU/btsICopHyuu/Jo32kHTYJhiklifORhAqCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuTACU%2FbtsICopHyuu%2FJo32kHTYJhiklifORhAqCK%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;1996&quot; height=&quot;1628&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r086A/btsIAQVtRTe/um6eX8vygKNsLT1TXIgiKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r086A/btsIAQVtRTe/um6eX8vygKNsLT1TXIgiKK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2010&quot; data-origin-height=&quot;1634&quot; data-filename=&quot;edited_스크린샷 2024-07-12 18.54.49.png&quot; data-widthpercent=&quot;32.05&quot; style=&quot;width: 31.3013%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r086A/btsIAQVtRTe/um6eX8vygKNsLT1TXIgiKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr086A%2FbtsIAQVtRTe%2Fum6eX8vygKNsLT1TXIgiKK%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;2010&quot; height=&quot;1634&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 나오는 내용을 숙지하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서대로 가족 가입을 진행하면,&lt;/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;836&quot; data-origin-height=&quot;1568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HS0dX/btsIEcbjAyl/C7upzok6kvF0z7O5iHcf81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HS0dX/btsIEcbjAyl/C7upzok6kvF0z7O5iHcf81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HS0dX/btsIEcbjAyl/C7upzok6kvF0z7O5iHcf81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHS0dX%2FbtsIEcbjAyl%2FC7upzok6kvF0z7O5iHcf81%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;504&quot; height=&quot;1568&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;1568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 겜스고를 이용해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유튜브 프리미엄&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용법을 알아봤는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 가이드 순서대로만 따라온다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어려움 없이 유튜브 프리미엄을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저렴한 금액에, 싸게 즐길 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로모션 코드까지 적절히 사용해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 할인 혜택까지 받아서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부담 없는 금액으로 유튜브를&lt;/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;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffffff; color: #333333; text-align: center;&quot;&gt;본 포스팅은 파트너스 활동을 통해&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffffff; color: #333333; text-align: center;&quot;&gt;일정액의 수수료를 제공받을 수 있음.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>IT/Etc &amp;amp; Tool</category>
      <category>Gamsgo</category>
      <category>youtube premium</category>
      <category>유튜브 프리미엄 겜스고</category>
      <category>유튜브싸게</category>
      <category>유튜브저렴하게</category>
      <category>유튜브프리미엄</category>
      <category>유튜브프리미엄싸게</category>
      <category>유튜브프리미엄요금</category>
      <category>유튜브프리미엄할인</category>
      <category>유튜브프리미엄혜택</category>
      <author>개발한기발자</author>
      <guid isPermaLink="true">https://psip31.tistory.com/251</guid>
      <comments>https://psip31.tistory.com/251#entry251comment</comments>
      <pubDate>Thu, 18 Jul 2024 08:31:54 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT 챗지피티처럼 질문수 제한 없는 MT GPT 저렴한 사용법</title>
      <link>https://psip31.tistory.com/250</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddDCqz/btsIrbqm3qN/nvT7vMda3EsRyckuijM7Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddDCqz/btsIrbqm3qN/nvT7vMda3EsRyckuijM7Rk/img.png&quot; data-alt=&quot;필자가 ChatGPT에게 챗지피티를 물어본 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddDCqz/btsIrbqm3qN/nvT7vMda3EsRyckuijM7Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddDCqz%2FbtsIrbqm3qN%2FnvT7vMda3EsRyckuijM7Rk%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;958&quot; height=&quot;870&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;870&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;필자가 ChatGPT에게 챗지피티를 물어본 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;챗지피티를 사용하면 알겠지만, 질문을 하다 보면 꼬리에 꼬리를 물게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;결국 질문은 또 다른 질문을 하게 되며 많은 질문을 하게 되어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;챗지피티 질문 개수 한도에 다다르게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;때문에 오늘은 한도 없이 질문하는 법에 대해 알아볼 텐데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;바로 GoingBus의 MT-GPT에 대해 알아보겠다!&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ChatGPT와 MT-GPT의 차이점&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;b&gt;둘 다 동일하게 최신 버전인 1.0, 4o 모두 사용 가능&lt;/b&gt;하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;단지 MT-GPT의 경우 고잉버스 &lt;b&gt;자체 솔루션인 MTLogin 웹 브라우저&lt;/b&gt;를&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;별도로 사용하여 챗지피티를 쓰는 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;뭔가 더 복잡해 보이는 듯 하지만, 그럼에도 불구하고 사용하는 이유는 질문수 제한이 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;아, 그리고 이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;MT-GPT는 Window에서만 사용 가능&lt;/b&gt;&lt;/span&gt;하므로, Mac 유저는 뒤로가기.....ㅠㅠ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그렇다면 고잉버스에서 이 MT-GPT를 사용하는 방법을 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #6bacce;&quot; href=&quot;https://goingbus.com/?s=bwQMlZKv&quot;&gt;&lt;b&gt;​GoingBus 공식 페이지로 이동&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[회원가입]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l9aYm/btsIqyM8zDs/lXTYLgfrHXE6TKii16mOE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l9aYm/btsIqyM8zDs/lXTYLgfrHXE6TKii16mOE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l9aYm/btsIqyM8zDs/lXTYLgfrHXE6TKii16mOE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl9aYm%2FbtsIqyM8zDs%2FlXTYLgfrHXE6TKii16mOE1%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;491&quot; height=&quot;527&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입은 기본이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용을 위해선 결제를 해야 하고, 결제를 위해선 회원가입은 필수다!&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[MT-GPT 선택]&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z9nAj/btsIpZ5vjiv/TdbZJVO4FkRf4CbWp6RUYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z9nAj/btsIpZ5vjiv/TdbZJVO4FkRf4CbWp6RUYK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1619&quot; data-origin-height=&quot;817&quot; data-filename=&quot;스크린샷 2024-06-06 172627.png&quot; style=&quot;width: 37.7364%; margin-right: 10px;&quot; data-widthpercent=&quot;38.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z9nAj/btsIpZ5vjiv/TdbZJVO4FkRf4CbWp6RUYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ9nAj%2FbtsIpZ5vjiv%2FTdbZJVO4FkRf4CbWp6RUYK%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;1619&quot; height=&quot;817&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uuyff/btsIrgkTHo2/PYHyXSgkPKcwRbOBl3XNNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uuyff/btsIrgkTHo2/PYHyXSgkPKcwRbOBl3XNNk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;688&quot; data-filename=&quot;스크린샷 2024-06-06 173122.png&quot; width=&quot;416&quot; style=&quot;width: 24.5788%; margin-right: 10px;&quot; data-widthpercent=&quot;25.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uuyff/btsIrgkTHo2/PYHyXSgkPKcwRbOBl3XNNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuuyff%2FbtsIrgkTHo2%2FPYHyXSgkPKcwRbOBl3XNNk%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;888&quot; height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zr5tO/btsIqCIL5YM/m9QKTBuoQlbowBv89XA3Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zr5tO/btsIqCIL5YM/m9QKTBuoQlbowBv89XA3Z1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1608&quot; data-origin-height=&quot;866&quot; data-filename=&quot;스크린샷 2024-06-06 173051.png&quot; style=&quot;width: 35.3593%;&quot; data-widthpercent=&quot;36.21&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zr5tO/btsIqCIL5YM/m9QKTBuoQlbowBv89XA3Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZr5tO%2FbtsIqCIL5YM%2Fm9QKTBuoQlbowBv89XA3Z1%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;1608&quot; height=&quot;866&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MT-GPT 한 달은 12.99 달러, 1년은 129.99 달러.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년을 결제하면 자체적으로 할인이 더 들어가는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;이렇게 프로모션 코드(&lt;/span&gt;&lt;i&gt;&lt;b&gt;hoon&lt;/b&gt;&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;)를 입력하면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;아래와 같이 또 추가 할인을 받을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs0n5m/btsIp0Dl6rr/mYnOHNJVFy6VyfBveu3dN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs0n5m/btsIp0Dl6rr/mYnOHNJVFy6VyfBveu3dN0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;684&quot; data-filename=&quot;스크린샷 2024-06-06 173216.png&quot; style=&quot;width: 32.6227%; margin-right: 10px;&quot; data-widthpercent=&quot;33.4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs0n5m/btsIp0Dl6rr/mYnOHNJVFy6VyfBveu3dN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs0n5m%2FbtsIp0Dl6rr%2FmYnOHNJVFy6VyfBveu3dN0%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;894&quot; height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7lCpN/btsIoRAErdD/ab3h46A2RKJK1zv2KqZkq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7lCpN/btsIoRAErdD/ab3h46A2RKJK1zv2KqZkq0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;685&quot; data-filename=&quot;스크린샷 2024-06-06 173207.png&quot; style=&quot;width: 32.575%; margin-right: 10px;&quot; data-widthpercent=&quot;33.35&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7lCpN/btsIoRAErdD/ab3h46A2RKJK1zv2KqZkq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7lCpN%2FbtsIoRAErdD%2Fab3h46A2RKJK1zv2KqZkq0%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;894&quot; height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/my1lb/btsIpGSJKJz/9g065eLKqzZAiydV85kMnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/my1lb/btsIpGSJKJz/9g065eLKqzZAiydV85kMnK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;684&quot; data-filename=&quot;스크린샷 2024-06-06 173156.png&quot; data-widthpercent=&quot;33.25&quot; style=&quot;width: 32.4767%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/my1lb/btsIpGSJKJz/9g065eLKqzZAiydV85kMnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmy1lb%2FbtsIpGSJKJz%2F9g065eLKqzZAiydV85kMnK%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;890&quot; height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할인은 똑같이 13 달러로 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인 사용량에 맞게 결제하면 되겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 GPT사용량이 최근에 많아지며 1년 치를 결제했다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[결제]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bePxke/btsIrf7msTF/4hza8D7v7H0pkq8VMTAlwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bePxke/btsIrf7msTF/4hza8D7v7H0pkq8VMTAlwK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1301&quot; data-origin-height=&quot;960&quot; data-filename=&quot;스크린샷 2024-06-06 173621.png&quot; style=&quot;width: 48.2279%; margin-right: 10px;&quot; data-widthpercent=&quot;49.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bePxke/btsIrf7msTF/4hza8D7v7H0pkq8VMTAlwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbePxke%2FbtsIrf7msTF%2F4hza8D7v7H0pkq8VMTAlwK%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;1301&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yqraH/btsIrd9xpJR/aohegyKuAoExaY0J1G5Df1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yqraH/btsIrd9xpJR/aohegyKuAoExaY0J1G5Df1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;901&quot; data-filename=&quot;스크린샷 2024-06-06 173649.png&quot; style=&quot;width: 23.5799%; margin-right: 10px;&quot; data-widthpercent=&quot;24.14&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yqraH/btsIrd9xpJR/aohegyKuAoExaY0J1G5Df1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyqraH%2FbtsIrd9xpJR%2FaohegyKuAoExaY0J1G5Df1%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;597&quot; height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6sWU3/btsIrhqAn52/AwkkvjJiKNV1AWvnnTF3e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6sWU3/btsIrhqAn52/AwkkvjJiKNV1AWvnnTF3e1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;864&quot; data-filename=&quot;스크린샷 2024-06-06 173836.png&quot; style=&quot;width: 25.8666%;&quot; data-widthpercent=&quot;26.48&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6sWU3/btsIrhqAn52/AwkkvjJiKNV1AWvnnTF3e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6sWU3%2FbtsIrhqAn52%2FAwkkvjJiKNV1AWvnnTF3e1%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;628&quot; height=&quot;864&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제는 삼성페이나 카카오페이, 쓱페이 등 우리가 주로 많이 사용하는 매체를 사용해 결제를 하면 된다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고잉버스 경험이 많은 필자는 카카오페이를 즐겨 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년 6월 1일 결제 기준 환율은 약 1400원 정도인 듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_스크린샷 2024-06-06 174014.png&quot; data-origin-width=&quot;1665&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOxFqT/btsIpKOjQGX/ZUn1wPnIMTkdJUi6jqRJtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOxFqT/btsIpKOjQGX/ZUn1wPnIMTkdJUi6jqRJtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOxFqT/btsIpKOjQGX/ZUn1wPnIMTkdJUi6jqRJtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOxFqT%2FbtsIpKOjQGX%2FZUn1wPnIMTkdJUi6jqRJtK%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;1665&quot; height=&quot;859&quot; data-filename=&quot;edited_edited_스크린샷 2024-06-06 174014.png&quot; data-origin-width=&quot;1665&quot; data-origin-height=&quot;859&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;벌써 5개나 구독한 필자는 OTT중독이 아닐까 싶다....ㅎㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 고잉버스의 저렴한 운영정책에 경제적 부담이 많이 줄었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알아서 주머니 형편에 맞게 이용하길!&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[MT-GPT 사용]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-06 174821.png&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wKzJr/btsIpL0H0n8/2KgkFZM8hkilszUKckYAgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wKzJr/btsIpL0H0n8/2KgkFZM8hkilszUKckYAgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wKzJr/btsIpL0H0n8/2KgkFZM8hkilszUKckYAgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwKzJr%2FbtsIpL0H0n8%2F2KgkFZM8hkilszUKckYAgK%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;1524&quot; height=&quot;856&quot; data-filename=&quot;스크린샷 2024-06-06 174821.png&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;856&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이후, MT-GPT 항목 우측상단에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;&lt;span style=&quot;color: #99cefa;&quot;&gt;&lt;b&gt;사용 방법은?&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;링크를 클릭하면 상세하게 이용가이드가 나와있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;추후 이 가이드를 한번 정리 및 실제로 필자가 사용하는 방법을 포스팅하겠다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;순서를 잘 따라가며 먼저 웹브라우저를 &lt;b&gt;윈도우버전&lt;/b&gt;으로 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k8Njq/btsIrdBH8pg/H3KntcUPaRbizXhgYEkrU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k8Njq/btsIrdBH8pg/H3KntcUPaRbizXhgYEkrU0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;273&quot; data-filename=&quot;스크린샷 2024-06-06 174851.png&quot; style=&quot;width: 52.195%; margin-right: 10px;&quot; data-widthpercent=&quot;52.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k8Njq/btsIrdBH8pg/H3KntcUPaRbizXhgYEkrU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk8Njq%2FbtsIrdBH8pg%2FH3KntcUPaRbizXhgYEkrU0%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;453&quot; height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rvf1T/btsIqU3rE35/fjHBOZaoKXyYYTPRyIXn5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rvf1T/btsIqU3rE35/fjHBOZaoKXyYYTPRyIXn5K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;669&quot; data-filename=&quot;스크린샷 2024-06-06 174914.png&quot; style=&quot;width: 46.6422%;&quot; data-widthpercent=&quot;47.19&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rvf1T/btsIqU3rE35/fjHBOZaoKXyYYTPRyIXn5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frvf1T%2FbtsIqU3rE35%2FfjHBOZaoKXyYYTPRyIXn5K%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;992&quot; height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKRyBb/btsIruQMgdw/78EiYOyfSWi04h5ATwI5d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKRyBb/btsIruQMgdw/78EiYOyfSWi04h5ATwI5d0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;671&quot; data-filename=&quot;스크린샷 2024-06-06 174930.png&quot; data-widthpercent=&quot;47.3&quot; style=&quot;width: 46.7467%; margin-right: 10px; margin-top: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKRyBb/btsIruQMgdw/78EiYOyfSWi04h5ATwI5d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKRyBb%2FbtsIruQMgdw%2F78EiYOyfSWi04h5ATwI5d0%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;1002&quot; height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJUF4I/btsIpG6hB7J/CXLCvcXpGP3dpHSY4RwBpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJUF4I/btsIpG6hB7J/CXLCvcXpGP3dpHSY4RwBpK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;500&quot; data-filename=&quot;스크린샷 2024-06-06 174947.png&quot; style=&quot;width: 52.0905%; margin-top: 10px;&quot; data-widthpercent=&quot;52.7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJUF4I/btsIpG6hB7J/CXLCvcXpGP3dpHSY4RwBpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJUF4I%2FbtsIpG6hB7J%2FCXLCvcXpGP3dpHSY4RwBpK%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;832&quot; height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-06-06 175059.png&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;1014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mGGj1/btsIpx2JqSd/gw5FpYaTSmdtq9gURZ2kf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mGGj1/btsIpx2JqSd/gw5FpYaTSmdtq9gURZ2kf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mGGj1/btsIpx2JqSd/gw5FpYaTSmdtq9gURZ2kf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmGGj1%2FbtsIpx2JqSd%2Fgw5FpYaTSmdtq9gURZ2kf1%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;1534&quot; height=&quot;1014&quot; data-filename=&quot;edited_스크린샷 2024-06-06 175059.png&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 MT-GPT는 고잉버스에서 별도로 관리하는 웹 브라우저를 통해 ChatGPT를 더욱 원활하게 사용할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기존에 ChatGPT도 사용하고 있었는데, &lt;b&gt;확실히 질문수 제한이 없다 보니, 사용 시 편의성이 확 올라감&lt;/b&gt;을 느꼈다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;역시 돈을 써야 하는가 싶지만, 요즘 같은 세상은 정보의 유무로 정말 천지 차이인 것 같다 ㅎㅎ&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아무튼 오늘은 이렇게 MT-GPT에 대해서 알아봤는데,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;더 이상 ChatGPT의 질문수 제한의 고통을 받지 않고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자유롭게 원 없이 질문하며 작업해 보자!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;끝.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 파트너스 활동을 통해&lt;br /&gt;일정액의 수수료를 제공받을 수 있음.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>IT/Etc &amp;amp; Tool</category>
      <category>GoingBus</category>
      <category>mt-gpt</category>
      <category>mt-gpt 고잉버스</category>
      <category>고잉버스</category>
      <category>저렴하게ott사용</category>
      <category>챗지피티</category>
      <author>개발한기발자</author>
      <guid isPermaLink="true">https://psip31.tistory.com/250</guid>
      <comments>https://psip31.tistory.com/250#entry250comment</comments>
      <pubDate>Sat, 6 Jul 2024 17:36:24 +0900</pubDate>
    </item>
    <item>
      <title>Spring gradle project 스프링 핵심 원리 기본편 | Bean Scope 빈 스코프</title>
      <link>https://psip31.tistory.com/249</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biWac9/btsHXMEK67R/qAjyqBx6aVSBFSINThTxH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biWac9/btsHXMEK67R/qAjyqBx6aVSBFSINThTxH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biWac9/btsHXMEK67R/qAjyqBx6aVSBFSINThTxH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiWac9%2FbtsHXMEK67R%2FqAjyqBx6aVSBFSINThTxH1%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;355&quot; height=&quot;239&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;본 포스팅은 인프런에 있는 인터넷 강좌인,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8#&quot;&gt;&lt;b&gt;김영한 강사님의 스프링 핵심 원리 기본편&lt;/b&gt;&lt;/a&gt;을 공부하며,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개인적으로 공부하고, 정리하는 용도로 포스팅을 해보겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/228&quot;&gt;Spring&amp;nbsp;gradle&amp;nbsp;project&amp;nbsp;환경설정&amp;nbsp;및&amp;nbsp;회원&amp;nbsp;가입&amp;nbsp;서비스&amp;nbsp;예제&amp;nbsp;만들기&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/229&quot;&gt;Spring gradle project 주문/할인 도메인 설계&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/230&quot;&gt;Spring gradle project 객체 지향 원리 적용&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/231&quot;&gt;Spring gradle project AppConfig&amp;nbsp;리팩토링&amp;nbsp;OCP&amp;nbsp;위반&amp;nbsp;해결&amp;nbsp;및&amp;nbsp;중복&amp;nbsp;제거&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/233&quot;&gt;Spring gradle project 좋은 객체 지향 설계 5가지 원칙 적용 및 스프링 전환&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/235&quot;&gt;Spring gradle project 스프링 컨테이너와 스프링 빈&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/240&quot;&gt;Spring gradle project BeanFactory, ApplicationContext 이해 및 차이&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/241&quot;&gt;Spring gradle project XML 설정 사용, BeanDefinition, 스프링 빈 설정 메타 정보&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/242&quot;&gt;Spring gradle project 웹 애플리케이션과 싱글톤, WebApplication and Singleton&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://psip31.tistory.com/243&quot;&gt;Spring gradle project 싱글톤 컨테이너, @Configuration&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://psip31.tistory.com/245&quot;&gt;Spring gradle project 컴포넌트 스캔 의존관계, @Autowired, @ComponentScan&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://psip31.tistory.com/248&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Spring gradle project Java Bean Lifecycle and Callback&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Bean Scope&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring에서 지원하는 스코프&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로토타입 : 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고, 더는 관리하지 않는 매우 짧은 범위의 스코프&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 관련 스코프&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;request : 웹 요청이 들어오고 나갈 때까지 유지되는 스코프&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;session : 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;application : 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트 스캔 자동 등록 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지금까지는 싱글톤 스코프를 사용 했었고, 지금은 프로토타입 스코프를 예제를 통해 알아보자&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718173318316&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Scope(&quot;prototype&quot;)
@Bean
PrototypeBean HelloBean() {
    return new HelloBean();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트 스캔 자동 등록 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다.&lt;/li&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-filename=&quot;blob&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PZPEC/btsHXhR5BRq/MMoWVwW2htdGkrvvg2yPlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PZPEC/btsHXhR5BRq/MMoWVwW2htdGkrvvg2yPlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PZPEC/btsHXhR5BRq/MMoWVwW2htdGkrvvg2yPlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPZPEC%2FbtsHXhR5BRq%2FMMoWVwW2htdGkrvvg2yPlK%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;661&quot; height=&quot;835&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;835&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;li&gt;스프링 컨테이너는 본인이 관리하는 스프링 빈을 반환한다.&lt;/li&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;1556&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckfjDJ/btsHVsOB9Gb/xUArDbMBwdo0VhCAmXwyz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckfjDJ/btsHVsOB9Gb/xUArDbMBwdo0VhCAmXwyz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckfjDJ/btsHVsOB9Gb/xUArDbMBwdo0VhCAmXwyz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckfjDJ%2FbtsHVsOB9Gb%2FxUArDbMBwdo0VhCAmXwyz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;840&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;840&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;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;1580&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/50zHY/btsHXop82Km/wp2Ejlh49IqpkM1cQIrUUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/50zHY/btsHXop82Km/wp2Ejlh49IqpkM1cQIrUUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/50zHY/btsHXop82Km/wp2Ejlh49IqpkM1cQIrUUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F50zHY%2FbtsHXop82Km%2Fwp2Ejlh49IqpkM1cQIrUUk%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;654&quot; height=&quot;345&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;834&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;li&gt;이후에 스프링 컨테이너에 같은 요청이 오면, 항상 새로운 프로토타입 빈을 생성해서 반환한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;핵심은 스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지만 처리한다는 것&lt;/b&gt;이다.&lt;/li&gt;
&lt;li&gt;클라이 언트에 빈을 반환하고, 이후 스프링 컨테이너는 생성된 프로토타입 빈을 관리하지 않는다.&lt;/li&gt;
&lt;li&gt;프로토타입 빈 관리 책임은 프로토타입 빈을 받은 클라이언트에 있기 때문에, @PreDestroy 같은 종료 메서드가 호출되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;싱글톤 스코프 빈 테스트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718174092610&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.core.scope;

import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import static org.assertj.core.api.Assertions.assertThat;

public class SingletonTest {
    @Test
    public void singletonBeanFind() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class);
        SingletonBean singletonBean1 = ac.getBean(SingletonBean.class);
        SingletonBean singletonBean2 = ac.getBean(SingletonBean.class);
        
        System.out.println(&quot;singletonBean1 = &quot; + singletonBean1);
        System.out.println(&quot;singletonBean2 = &quot; + singletonBean2);
        
        assertThat(singletonBean1).isSameAs(singletonBean2);
        
        ac.close(); // 종료
    }

    @Scope(&quot;singleton&quot;)
    static class SingletonBean {
        @PostConstruct
        public void init() {
            System.out.println(&quot;SingletonBean.init&quot;);
        }

        @PreDestroy
        public void destroy() {
            System.out.println(&quot;SingletonBean.destroy&quot;);
        }
    }
}

// 결과
// SingletonBean.init
// singletonBean1 = hello.core.scope.PrototypeTest$SingletonBean@54504ecd
// singletonBean2 = hello.core.scope.PrototypeTest$SingletonBean@54504ecd
// org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing SingletonBean.destroy&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 보면 빈 초기화 메서드를 실행하고, 같은 인스턴스의 빈을 조회해서, 종료&amp;nbsp;메서드까지&amp;nbsp;정상&amp;nbsp;호출&amp;nbsp;된&amp;nbsp;것을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;프로토타입 스코프 빈 테스트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718178479286&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.core.scope;

import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import static org.assertj.core.api.Assertions.*;

public class PrototypeTest {
    @Test
    public void prototypeBeanFind() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);
        
        System.out.println(&quot;find prototypeBean1&quot;);
        PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class);
        
        System.out.println(&quot;find prototypeBean2&quot;);
        PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class);
        
        System.out.println(&quot;prototypeBean1 = &quot; + prototypeBean1);
        System.out.println(&quot;prototypeBean2 = &quot; + prototypeBean2);
        
        assertThat(prototypeBean1).isNotSameAs(prototypeBean2);
        
        ac.close(); // 종료
    }

    @Scope(&quot;prototype&quot;)
    static class PrototypeBean {
        @PostConstruct
        public void init() {
            System.out.println(&quot;PrototypeBean.init&quot;);
        }

        @PreDestroy
        public void destroy() {
            System.out.println(&quot;PrototypeBean.destroy&quot;);
        }
    }
}

// 결과
// find prototypeBean1
// PrototypeBean.init
// find prototypeBean2
// PrototypeBean.init
// prototypeBean1 = hello.core.scope.PrototypeTest$PrototypeBean@13d4992d
// prototypeBean2 = hello.core.scope.PrototypeTest$PrototypeBean@302f7971
// org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;싱글톤 빈은 스프링 컨테이너 생성 시점에 초기화 메서드가 실행되지만, 프로토타입 스코프의 빈은 스프링 컨테이너에서 빈을 조회할 때 생성되고, 초기화 메서드도 실행된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로토타입 빈을 2번 조회했으므로 완전히 다른 스프링 빈이 생성되고, 초기화도 2번 실행된 것을 확인할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;싱글톤 빈은 스프링 컨테이너가 관리하기 때문에 스프링 컨테이너가 종료될 때 빈의 종료 메서드가 실행되지만, 프로토타입 빈은 스프링 컨테이너가 생성과 의존관계 주입 그리고 초기화까지만 관여하고, 더는 관리하지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로토타입 빈은 스프링 컨테이너가 종료될 때 @PreDestroy 같은 종료 메서드가 전혀 실행되지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로토타입 빈의 특징 정리&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스프링 컨테이너에 요청할 때 마다 새로 생성된다.&lt;/li&gt;
&lt;li&gt;스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입 그리고 초기화까지만 관여&lt;/li&gt;
&lt;li&gt;종료 메서드가 호출 X&lt;/li&gt;
&lt;li&gt;프로토타입 빈을 조회한 클라이언트가 관리해야 한고, 종료 메서드에 대한 호출도 클라이언트가 직접 해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;프로토타입 스코프 - 싱글톤 빈과 함께 사용 시 문제점&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IRhoG/btsHXmF1hTq/Q2gykdqL3ndNeiWwdyAsCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IRhoG/btsHXmF1hTq/Q2gykdqL3ndNeiWwdyAsCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IRhoG/btsHXmF1hTq/Q2gykdqL3ndNeiWwdyAsCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIRhoG%2FbtsHXmF1hTq%2FQ2gykdqL3ndNeiWwdyAsCK%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;880&quot; height=&quot;470&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;842&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;클라이언트 A는 스프링 컨테이너에 프로토타입 빈을 요청한다.&lt;/li&gt;
&lt;li&gt;스프링 컨테이너는 프로토타입 빈을 새로 생성해서 반환(x01)한다. 해당 빈의 count 필드 값은 0&lt;/li&gt;
&lt;li&gt;클라이언트는 조회한 프로토타입 빈에 addCount()를 호출하면서 count 필드를 +1 한다.&lt;/li&gt;
&lt;li&gt;결과적으로 프로토타입 빈(x01)의 count는 1이 된다.&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;1558&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mmYUy/btsHXknQ2Hf/eTEY1NN1fOK49pX3uaGgv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mmYUy/btsHXknQ2Hf/eTEY1NN1fOK49pX3uaGgv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mmYUy/btsHXknQ2Hf/eTEY1NN1fOK49pX3uaGgv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmmYUy%2FbtsHXknQ2Hf%2FeTEY1NN1fOK49pX3uaGgv1%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;806&quot; height=&quot;430&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;832&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;클라이언트 B는 스프링 컨테이너에 프로토타입 빈을 요청한다.&lt;/li&gt;
&lt;li&gt;스프링 컨테이너는 프로토타입 빈을 새로 생성해서 반환(x02)한다. 해당 빈의 count 필드 값은 0&lt;/li&gt;
&lt;li&gt;클라이언트는 조회한 프로토타입 빈에 addCount()를 호출하면서 count 필드를 +1 한다.&lt;/li&gt;
&lt;li&gt;결과적으로&amp;nbsp;프로토타입&amp;nbsp;빈(**x02**)의&amp;nbsp;count는&amp;nbsp;1이&amp;nbsp;된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림을 코드로 확인해 보면 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1718242842707&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import static org.assertj.core.api.Assertions.assertThat;

public class SingletonWithPrototypeTest1 {
    
    @Test
    void prototypeFind() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);
        
        PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class);
        prototypeBean1.addCount();
        assertThat(prototypeBean1.getCount()).isEqualTo(1);
        
        PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class);
        prototypeBean2.addCount();
        assertThat(prototypeBean2.getCount()).isEqualTo(1);
    }

    @Scope(&quot;prototype&quot;)
    static class PrototypeBean {
        private int count = 0;

        public void addCount() {
            count++;
        }

        public int getCount() {
            return count;
        }

        @PostConstruct
        public void init() {
            System.out.println(&quot;PrototypeBean.init &quot; + this);
        }

        @PreDestroy
        public void destroy() {
            System.out.println(&quot;PrototypeBean.destroy&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PrototypeBean 클래스를 설정으로 사용해서, 프로토타입 빈이 요청 시마다 새로운 인스턴스를 생성하고, 각 인스턴스가 독립적인 상태를 유지하는 것을 테스트한다.&lt;/li&gt;
&lt;li&gt;프로토타입 빈 조회 및 테스트
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;prototypeBean1을 조회하고, addCount() 메서드를 호출하여 카운트를 1 증가시키고, getCount()를 통해 값이 1인지 확인&lt;/li&gt;
&lt;li&gt;prototypeBean2를 조회하고, 마찬가지로 addCount() 메서드를 호출하여 카운트를 1 증가 후, getCount()를 통해 값이 1인지 확인한다.&lt;/li&gt;
&lt;li&gt;프로토타입 스코프는 매번 새로운 인스턴스를 생성하므로, 두 빈의 카운트 값이 독립적으로 유지된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;@Scope(&quot;prototype&quot;) 어노테이션을 사용하여 프로토타입 스코프 빈을 정의한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;싱글톤 빈에서 프로토타입 빈 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 clientBean이라는 싱글톤 빈이 의존관계 주입을 통해서 프로토타입 빈을 주입받아서 사용하는 예를 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bffiMC/btsHV7XQIBX/LEZ2k4HRZ82DRsSLFg5EU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bffiMC/btsHV7XQIBX/LEZ2k4HRZ82DRsSLFg5EU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bffiMC/btsHV7XQIBX/LEZ2k4HRZ82DRsSLFg5EU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbffiMC%2FbtsHV7XQIBX%2FLEZ2k4HRZ82DRsSLFg5EU1%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;738&quot; height=&quot;736&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;736&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;clientBean은 싱글톤이므로, 보통 스프링 컨테이너 생성 시점에 함께 생성되고, 의존관계 주입도 발생한다.&lt;/li&gt;
&lt;li&gt;clientBean은 의존관계 자동 주입을 사용한다. 주입 시점에 스프링 컨테이너에 프로토타입 빈을 요청한다.&lt;/li&gt;
&lt;li&gt;스프링 컨테이너는 프로토타입 빈을 생성해서 `clientBean` 에 반환한다. 프로토타입 빈의 count 필드 값은 0&lt;/li&gt;
&lt;li&gt;clientBean은 프로토타입 빈을 내부 필드에 보관한다. (정확히는 참조값을 보관)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;싱글톤 빈에서 프로토타입 빈 사용2&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyvOsk/btsHXEz5ce4/eZkxO446km7L2IsEzScTcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyvOsk/btsHXEz5ce4/eZkxO446km7L2IsEzScTcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyvOsk/btsHXEz5ce4/eZkxO446km7L2IsEzScTcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyvOsk%2FbtsHXEz5ce4%2FeZkxO446km7L2IsEzScTcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;748&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;748&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;클라이언트 A는 clientBean을 스프링 컨테이너에 요청해서 받는다.(싱글톤이므로 항상 같은 clientBean 반환)&lt;/li&gt;
&lt;li&gt;클라이언트 A는 `clientBean.logic()` 을 호출한다.&lt;/li&gt;
&lt;li&gt;clientBean은 prototypeBean의 addCount()를 호출해서 프로토타입 빈의 count를 증가한다. count값은 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;싱글톤에서 프로토타입 빈 사용3&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6Dl72/btsHVX2eqVD/QaHokWXItPKklKD1jY7ogK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6Dl72/btsHVX2eqVD/QaHokWXItPKklKD1jY7ogK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6Dl72/btsHVX2eqVD/QaHokWXItPKklKD1jY7ogK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6Dl72%2FbtsHVX2eqVD%2FQaHokWXItPKklKD1jY7ogK%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;693&quot; height=&quot;790&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;790&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;클라이언트 B는 clientBean을 스프링 컨테이너에 요청해서 받는다.(싱글톤이므로 항상 같은 clientBean 반환)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;clientBean이 내부에 가지고 있는 프로토타입 빈은 이미 과거에 주입이 끝난 빈이다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주입 시점에 스프링 컨테이너에 요청해서 프로토타입 빈이 새로 생성이 된 것이지, 사용할 때마다 새로 생성되는 것이 아니다!&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;클라이언트 B는 `clientBean.logic()` 을 호출한다.&lt;/li&gt;
&lt;li&gt;clientBean` 은 prototypeBean의 `addCount()` 를 호출해서 프로토타입 빈의 count를 증가해서, 원래 count 값이 1이었으므로 2가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1718243493389&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.core.scope;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import static org.assertj.core.api.Assertions.*;

public class SingletonWithPrototypeTest1 {

    @Test
    void singletonClientUsePrototype() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);
        
        ClientBean clientBean1 = ac.getBean(ClientBean.class);
        int count1 = clientBean1.logic();
        assertThat(count1).isEqualTo(1);
        
        ClientBean clientBean2 = ac.getBean(ClientBean.class);
        int count2 = clientBean2.logic();
        assertThat(count2).isEqualTo(1);
        
        ac.close();
    }

    static class ClientBean {
        private final PrototypeBean prototypeBean;

        @Autowired
        public ClientBean(PrototypeBean prototypeBean) {
            this.prototypeBean = prototypeBean;
        }

        public int logic() {
            prototypeBean.addCount();
            return prototypeBean.getCount();
        }
    }

    @Scope(&quot;prototype&quot;)
    static class PrototypeBean {
        private int count = 0;

        public void addCount() {
            count++;
        }

        public int getCount() {
            return count;
        }

        @PostConstruct
        public void init() {
            System.out.println(&quot;PrototypeBean.init &quot; + this);
        }

        @PreDestroy
        public void destroy() {
            System.out.println(&quot;PrototypeBean.destroy&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;싱글톤 빈이 프로토타입 빈을 사용할 때, 매번 새로운 프로토타입 빈 인스턴스를 주입받도록 설계된 동작을 확인한다.&lt;/li&gt;
&lt;li&gt;clientBean1.logic() 호출 시, 주입된 프로토타입 빈의 count가 1로 설정된다.&lt;/li&gt;
&lt;li&gt;clientBean2.logic() 호출 시, 새로 주입된 프로토타입 빈의 count가 다시 1로 설정&lt;/li&gt;
&lt;li&gt;각각의 ClientBean 인스턴스는 서로 다른 프로토타입 빈 인스턴스를 주입받으므로, count는 독립적으로 유지 된다.&lt;/li&gt;
&lt;li&gt;여러 빈에서 같은 프로토타입 빈을 주입 받으면, &lt;b&gt;주입 받는 시점에 각각 새로운 프로토타입 빈이 생성&lt;/b&gt;&lt;br /&gt;예를 들어서 clientA, clientB가 각각 의존관계 주입을 받으면 각각 다른 인스턴스의 프로토타입 빈을 주입 받는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 이렇게 새로 생성된 프로토타입 빈과 함께 유지되는 싱글톤 빈에 대한 문제를 해결하려면??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 스프링 컨테이너에 요청하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글톤 빈이 프로토 타입을 사용할 때 마다 스프링 컨테이너에 새로 요청하는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1718243784493&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.core.scope;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import static org.assertj.core.api.Assertions.assertThat;

public class PrototypeProviderTest {
    
    @Test
    void providerTest() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);
        
        ClientBean clientBean1 = ac.getBean(ClientBean.class);
        int count1 = clientBean1.logic();
        assertThat(count1).isEqualTo(1);
        
        ClientBean clientBean2 = ac.getBean(ClientBean.class);
        int count2 = clientBean2.logic();
        assertThat(count2).isEqualTo(1);
        
        ac.close();
    }

    static class ClientBean {
        @Autowired
        private ApplicationContext ac;

        public int logic() {
            PrototypeBean prototypeBean = ac.getBean(PrototypeBean.class);
            prototypeBean.addCount();
            return prototypeBean.getCount();
        }
    }

    @Scope(&quot;prototype&quot;)
    static class PrototypeBean {
        private int count = 0;

        public void addCount() {
            count++;
        }

        public int getCount() {
            return count;
        }

        @PostConstruct
        public void init() {
            System.out.println(&quot;PrototypeBean.init &quot; + this);
        }

        @PreDestroy
        public void destroy() {
            System.out.println(&quot;PrototypeBean.destroy&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ApplicationContext를 사용하여 프로토타입 빈을 동적으로 요청하는 방법이다.&lt;/li&gt;
&lt;li&gt;providerTest() 메서드에서 clientBean1과 clientBean2는 각각 logic() 메서드를 호출&lt;/li&gt;
&lt;li&gt;logic() 메서드 내부에서 ApplicationContext를 사용하여 PrototypeBean 인스턴스를 매번 새롭게 요청&lt;/li&gt;
&lt;li&gt;각 ClientBean 인스턴스는 독립적으로 새로운 PrototypeBean 인스턴스를 주입받으므로, 두 PrototypeBean 인스턴스는 서로 다른 상태를 유지&lt;/li&gt;
&lt;li&gt;assertThat(count1).isEqualTo(1)과&amp;nbsp;assertThat(count2).isEqualTo(1)을&amp;nbsp;통해,&amp;nbsp;두&amp;nbsp;프로토타입&amp;nbsp;빈의&amp;nbsp;카운트&amp;nbsp;값이&amp;nbsp;각각&amp;nbsp;1임을&amp;nbsp;확인한다.&lt;/li&gt;
&lt;li&gt;핵심코드는 ClientBean이다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;실행해보면 ac.getBean()을 통해서 항상 새로운 프로토타입 빈이 생성되는 것을 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;의존관계를 외부에서 주입(DI) 받는게 아니라 이렇게 직접 필요한 의존관계를 찾는 것을 Dependency Lookup (DL) 의존관계 조회(탐색)라고 한다.&lt;/li&gt;
&lt;li&gt;그런데&amp;nbsp;이렇게&amp;nbsp;스프링의&amp;nbsp;애플리케이션&amp;nbsp;컨텍스트&amp;nbsp;전체를&amp;nbsp;주입받게&amp;nbsp;되면,&amp;nbsp;스프링&amp;nbsp;컨테이너에&amp;nbsp;종속적인&amp;nbsp;코드가&amp;nbsp;되고,&amp;nbsp;단위&amp;nbsp;테스트도&amp;nbsp;어려워진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ObjectFactory, ObjectProvider&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ObjectFactory : 기능이 단순, 별도의 라이브러리 필요 없음, 스프링에 의존&lt;/li&gt;
&lt;li&gt;ObjectProvider : ObjectFactory 상속, 옵션, 스트림 처리등 편의 기능이 많고, 별도의 라이브러리 필요 없음, 스프링에 의존&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1718244004390&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Autowired
private ObjectProvider&amp;lt;PrototypeBean&amp;gt; prototypeBeanProvider;

public int logic() {
    PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
    prototypeBean.addCount();
    int count = prototypeBean.getCount();
    return count;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스프링에서 지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공하는 것이 바로 ObjectProvider이다.&lt;br /&gt;(참고로 과거에는 ObjectFactory가 있었는데, 여기에 편의 기능을 추가해서 ObjectProvider가 만들어졌다.)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;실행해보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;prototypeBeanProvider.getObject()&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;을 통해서 항상 새로운 프로토타입 빈이 생성되는 것을 확인할 수 있다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;ObjectProvider의 getObject()를 호출하면 내부에서는 스프링 컨테이너를 통해 해당 빈을 찾아서 반환 한다. (DL)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;스프링이&amp;nbsp;제공하는&amp;nbsp;기능을&amp;nbsp;사용하지만,&amp;nbsp;기능이&amp;nbsp;단순하므로&amp;nbsp;단위테스트를&amp;nbsp;만들거나&amp;nbsp;mock&amp;nbsp;코드를&amp;nbsp;만들기는&amp;nbsp;훨씬&amp;nbsp;쉬워진다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;스프링을 사용하다 보면 이 기능뿐만 아니라 다른 기능들도 자바 표준과 스프링이 제공하는 기능이 겹칠 때가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;하지만 결국 스프링이 더 다양하고 편리한 기능을 제공해주기 때문에, 스프링이 제공하는 기능을 잘 사용하면 되겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;그러려면....계속해서 꾸준히 공부하자!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;끝.&lt;/span&gt;&lt;/p&gt;</description>
      <category>IT/Spring</category>
      <category>@Scope</category>
      <category>objectFactory</category>
      <category>ObjectProvider</category>
      <category>Prototype Scope</category>
      <category>Spring bean scope</category>
      <category>빈 스코프</category>
      <category>스프링 기본 핵심원리</category>
      <category>자동 컴포넌트스캔</category>
      <category>프로토타입 스코프</category>
      <author>개발한기발자</author>
      <guid isPermaLink="true">https://psip31.tistory.com/249</guid>
      <comments>https://psip31.tistory.com/249#entry249comment</comments>
      <pubDate>Thu, 13 Jun 2024 11:14:04 +0900</pubDate>
    </item>
    <item>
      <title>Spring gradle project 스프링 핵심 원리 기본편 | Java Bean Lifecycle and Callback 생명 주기 콜백</title>
      <link>https://psip31.tistory.com/248</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ahm7S/btsHTA68jOw/1yOvekRNV3f05YEcZplYb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ahm7S/btsHTA68jOw/1yOvekRNV3f05YEcZplYb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ahm7S/btsHTA68jOw/1yOvekRNV3f05YEcZplYb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAhm7S%2FbtsHTA68jOw%2F1yOvekRNV3f05YEcZplYb0%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;355&quot; height=&quot;239&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;본 포스팅은 인프런에 있는 인터넷 강좌인,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8#&quot;&gt;&lt;b&gt;김영한 강사님의 스프링 핵심 원리 기본편&lt;/b&gt;&lt;/a&gt;을 공부하며,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개인적으로 공부하고, 정리하는 용도로 포스팅을 해보겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/228&quot;&gt;Spring&amp;nbsp;gradle&amp;nbsp;project&amp;nbsp;환경설정&amp;nbsp;및&amp;nbsp;회원&amp;nbsp;가입&amp;nbsp;서비스&amp;nbsp;예제&amp;nbsp;만들기&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/229&quot;&gt;Spring gradle project 주문/할인 도메인 설계&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/230&quot;&gt;Spring gradle project 객체 지향 원리 적용&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/231&quot;&gt;Spring gradle project AppConfig&amp;nbsp;리팩토링&amp;nbsp;OCP&amp;nbsp;위반&amp;nbsp;해결&amp;nbsp;및&amp;nbsp;중복&amp;nbsp;제거&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/233&quot;&gt;Spring gradle project 좋은 객체 지향 설계 5가지 원칙 적용 및 스프링 전환&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/235&quot;&gt;Spring gradle project 스프링 컨테이너와 스프링 빈&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/240&quot;&gt;Spring gradle project BeanFactory, ApplicationContext 이해 및 차이&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/241&quot;&gt;Spring gradle project XML 설정 사용, BeanDefinition, 스프링 빈 설정 메타 정보&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/242&quot;&gt;Spring gradle project 웹 애플리케이션과 싱글톤, WebApplication and Singleton&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://psip31.tistory.com/243&quot;&gt;Spring gradle project 싱글톤 컨테이너, @Configuration&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://psip31.tistory.com/245&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Spring gradle project 컴포넌트 스캔 의존관계, @Autowired, @ComponentScan&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;빈 생명주기 콜백 시작&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;이번 포스팅에서는 스프링을 통해, &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;이러한 초기화 작업과 종료 작업을 어떻게 진행하는지 예제로 알아보자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터베이스 Connection Pool이나, 네트워크 소켓처럼, 애플리케이션 시작 시점에 필요한 연결을 미리 해두고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.&lt;br /&gt;&lt;br /&gt;간단하게 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정해 보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실제로 네트워크에 연결하는 것은 아니 고, 단순히 문자만 출력하도록 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 NetworkClient는 애플리케이션 시작 시점에 connect()를 호출해서 연결을 맺어두어야 하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;애플리케이션이 종료되면 `disConnect()` 를 호출해서 연결을 끊어야 한다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;테스트 하위에 생성한 예제코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718080399152&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class NetworkClient {
    private String url;
    
    public NetworkClient() {
        System.out.println(&quot;생성자 호출, url = &quot; + url); connect();
        call(&quot;초기화 연결 메시지&quot;);
    }
    
    public void setUrl(String url) {
        this.url = url;
    }
    
    //서비스 시작시 호출
    public void connect() {
        System.out.println(&quot;connect: &quot; + url);
    }
    
    public void call(String message) {
        System.out.println(&quot;call: &quot; + url + &quot; message = &quot; + message);
    }
    
    //서비스 종료시 호출
    public void disconnect() {
        System.out.println(&quot;close: &quot; + url);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring 환경설정과 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718080516551&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class BeanLifeCycleTest {
    @Test
    public void lifeCycleTest() {
        
        ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
        
        NetworkClient client = ac.getBean(NetworkClient.class); ac.close(); //스프링 컨테이너를 종료, ConfigurableApplicationContext 필요
    }
    
    @Configuration
    static class LifeCycleConfig {
        @Bean
        public NetworkClient networkClient() {
            NetworkClient networkClient = new NetworkClient();
            networkClient.setUrl(&quot;http://hello-spring.dev&quot;);
            return networkClient;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Spring 애플리케이션 컨텍스트를 생성하고 LifeCycleConfig 설정 클래스를 로드하여 NetworkClient Bean을 등록하고 초기화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;NetworkClient Bean의 초기화와 소멸 과정을 확인하기 위해 ac.close()로 컨테이너를 종료하여 소멸 Callback을 실행&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실행 결과는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718080690788&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;생성자 호출, url = null
connect: null
call: null message = 초기화 연결 메시지&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;url&amp;nbsp;정보&amp;nbsp;없이&amp;nbsp;connect가&amp;nbsp;호출되는&amp;nbsp;것을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다&lt;/li&gt;
&lt;li&gt;객체를 생성하는 단계에는 url이 없고, 객체를 생성한 다음에 외부에서 수정자 주입을 통해서 setUrl()이 호출되어야 url이 존재!&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;SpringBean의 Lifecycle&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링 컨테이너 생성&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt; 스프링 빈 생성&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&amp;rarr; 의존관계 주입&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;초기화 콜백 &lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;사용 &lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;소멸 전 콜백&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt; 스프링 종료&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;초기화 콜백 : 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;소멸전 콜백 : 빈이 소멸되기 직전에 호출&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;SpringBean은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료&lt;/li&gt;
&lt;li&gt;따라서 &lt;b&gt;초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출&lt;/b&gt;해야 한다!&lt;/li&gt;
&lt;li&gt;Spring은 의존관계 주입이 완료되면 Spring Bean에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다.&lt;/li&gt;
&lt;li&gt;또한 Spring은 Spring Container가 종료되기 직전에 소멸 콜백을 주면서, 안전하게 종료 작업을 진행할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;객체의 생성과 초기화 분리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성자는 필수 정보(파라미터)를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가진다.&lt;/li&gt;
&lt;li&gt;반면에 초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행한다.&lt;/li&gt;
&lt;li&gt;따라서 생성자 안에서 무거운 초기화 작업을 함께 하는 것보다는 객체를 생성하는 부분과 초기화하는 부분을 명확하게 나누는 것이 유지보수 관점에서 좋다. (초기화 작업이 내부 값들만 약간 변경하는 정도로 단순한 경우)&lt;/li&gt;
&lt;li&gt;싱글톤&amp;nbsp;빈들은&amp;nbsp;스프링&amp;nbsp;컨테이너가&amp;nbsp;종료될&amp;nbsp;때&amp;nbsp;싱글톤&amp;nbsp;빈들도&amp;nbsp;함께&amp;nbsp;종료되기&amp;nbsp;때문에&amp;nbsp;스프링&amp;nbsp;컨테이너가&amp;nbsp;종료되기&amp;nbsp;직전에&amp;nbsp;소멸 전&amp;nbsp;콜백이&amp;nbsp;일어난다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Spring의 빈 생명주기 콜백 지원 3가지&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인터페이스(InitializingBean, DisposableBean)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설정 정보에 초기화 메서드, 종료 메서드 지정&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;@PostConstruct, @PreDestroy&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;InitializingBean, DisposableBean 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718081216626&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.core.lifecycle;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class NetworkClient implements InitializingBean, DisposableBean {
    
    private String url;

    public NetworkClient() {
        System.out.println(&quot;생성자 호출, url = &quot; + url);
    }

    public void setUrl(String url) {
        this.url = url;
    }

    // 서비스 시작시 호출
    public void connect() {
        System.out.println(&quot;connect: &quot; + url);
    }

    public void call(String message) {
        System.out.println(&quot;call: &quot; + url + &quot; message = &quot; + message);
    }

    // 서비스 종료시 호출
    public void disConnect() {
        System.out.println(&quot;close + &quot; + url);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        connect();
        call(&quot;초기화 연결 메시지&quot;);
    }

    @Override
    public void destroy() throws Exception {
        disConnect();
    }
}

// 결과
// 생성자 호출, url = null
// NetworkClient.afterPropertiesSet
// connect: http://hello-spring.dev
// call: http://hello-spring.dev message = 초기화 연결 메시지
// 13:48:49.043 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing NetworkClient.destroy
// close + http://hello-spring.dev&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;InitializingBean은 afterPropertiesSet() 메서드로 초기화를 지원한다.&lt;/li&gt;
&lt;li&gt;DisposableBean은 destroy() 메서드로 소멸을 지원한다.&lt;/li&gt;
&lt;li&gt;출력 결과를 보면 초기화 메서드가 주입 완료 후에 적절하게 호출된 것을 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;스프링 컨테이너의 종료가 호출되자 소멸 메서드가 호출 된 것도 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;초기화, 소멸 인터페이스 단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 인터페이스는 스프링 전용 인터페이스다. 해당 코드가 스프링 전용 인터페이스에 의존한다.&lt;/li&gt;
&lt;li&gt;초기화, 소멸 메서드의 이름을 변경할 수 없다.&lt;/li&gt;
&lt;li&gt;내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;빈 등록 초기화, 소멸 메서드 지정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예제 코드에 초기화와 소멸 메서드를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1718081530354&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.core.lifecycle;

public class NetworkClient {
    private String url;

    public NetworkClient() {
        System.out.println(&quot;생성자 호출, url = &quot; + url);
    }

    public void setUrl(String url) {
        this.url = url;
    }

    // 서비스 시작시 호출
    public void connect() {
        System.out.println(&quot;connect: &quot; + url);
    }

    public void call(String message) {
        System.out.println(&quot;call: &quot; + url + &quot; message = &quot; + message);
    }

    // 서비스 종료시 호출
    public void disConnect() {
        System.out.println(&quot;close + &quot; + url);
    }

    public void init() {
        System.out.println(&quot;NetworkClient.init&quot;);
        connect();
        call(&quot;초기화 연결 메시지&quot;);
    }

    public void close() {
        System.out.println(&quot;NetworkClient.close&quot;);
        disConnect();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 환경설정 예제를 아래와 같이 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1718081583896&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
static class LifeCycleConfig {
    @Bean(initMethod = &quot;init&quot;, destroyMethod = &quot;close&quot;)
    public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        networkClient.setUrl(&quot;http://hello-spring.dev&quot;);
        return networkClient;
    }
}

// 결과
// 생성자 호출, url = null
// NetworkClient.init
// connect: http://hello-spring.dev
// call: http://hello-spring.dev message = 초기화 연결 메시지
// 13:58:47.215 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing NetworkClient.close
// close + http://hello-spring.dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;설정 정보 사용 특징&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드 이름을 자유롭게 줄 수 있다.&lt;/li&gt;
&lt;li&gt;스프링 빈이 스프링 코드에 의존하지 않는다.&lt;/li&gt;
&lt;li&gt;코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;@PostConstruct, @PreDestroy&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718081844726&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package hello.core.lifecycle;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class NetworkClient {
    private String url;

    public NetworkClient() {
        System.out.println(&quot;생성자 호출, url = &quot; + url);
    }

    public void setUrl(String url) {
        this.url = url;
    }

    // 서비스 시작시 호출
    public void connect() {
        System.out.println(&quot;connect: &quot; + url);
    }

    public void call(String message) {
        System.out.println(&quot;call: &quot; + url + &quot; message = &quot; + message);
    }

    // 서비스 종료시 호출
    public void disConnect() {
        System.out.println(&quot;close + &quot; + url);
    }

    @PostConstruct
    public void init() {
        System.out.println(&quot;NetworkClient.init&quot;);
        connect();
        call(&quot;초기화 연결 메시지&quot;);
    }

    @PreDestroy
    public void close() {
        System.out.println(&quot;NetworkClient.close&quot;);
        disConnect();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1718081914949&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
static class LifeCycleConfig {
    @Bean
    public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        networkClient.setUrl(&quot;http://hello-spring.dev&quot;);
        return networkClient;
    }
}

// 결과
// 생성자 호출, url = null
// NetworkClient.init
// connect: http://hello-spring.dev
// call: http://hello-spring.dev message = 초기화 연결 메시지
// 13:58:47.215 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing NetworkClient.close
// close + http://hello-spring.dev&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@PostConstruct, @PreDestroy 애노테이션은 최신 스프링에서 가장 권장하는 방법이다.&lt;/li&gt;
&lt;li&gt;가장 편리한 방법으로 초기화와 종료를 실행할 수 있다.&lt;/li&gt;
&lt;li&gt;패키지를 잘 보면 javax.annotation.PostConstruct이다.&lt;br /&gt;(스프링에 종속적인 기술이 아니라 JSR-250라는 자바 표준이다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작한다.)&lt;/li&gt;
&lt;li&gt;컴포넌트 스캔과 잘 어울린다.&lt;/li&gt;
&lt;li&gt;유일한&amp;nbsp;단점은&amp;nbsp;외부&amp;nbsp;라이브러리에는&amp;nbsp;적용하지&amp;nbsp;못한다는&amp;nbsp;것이다.&amp;nbsp;외부&amp;nbsp;라이브러리를&amp;nbsp;초기화,&amp;nbsp;종료해야&amp;nbsp;하면&amp;nbsp;@Bean의&amp;nbsp;기능을&amp;nbsp;사용하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 거의 끝이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인강을 다 듣는다고 다 알아지는 게 아니니, 계속해서 반복 또 반복, 실행하는 수밖에 없다.&lt;/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;</description>
      <category>IT/Spring</category>
      <category>@PostConstruct</category>
      <category>@PreDestroy</category>
      <category>Callback</category>
      <category>Lifecycle</category>
      <category>김영한 스프링 기본 핵심원리</category>
      <category>라이프사이클</category>
      <category>생명주기 콜백</category>
      <category>스프링</category>
      <category>스프링 컨테이너 소멸</category>
      <category>스프링 컨테이너 초기화</category>
      <author>개발한기발자</author>
      <guid isPermaLink="true">https://psip31.tistory.com/248</guid>
      <comments>https://psip31.tistory.com/248#entry248comment</comments>
      <pubDate>Tue, 11 Jun 2024 14:04:12 +0900</pubDate>
    </item>
    <item>
      <title>Spotify 스포티파이 싸게 저렴하게 월 2000원대 요금 및 사용법</title>
      <link>https://psip31.tistory.com/247</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;음원 스트리밍 서비스는 다양하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 국내에서는 멜론, 지니 바이브, FLO 등이 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해외는 스포티파이, 유튜브뮤직, 타이들 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 음원 스트리밍 서비스를 갈아탈 일이 있을까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-29 10.15.31.png&quot; data-origin-width=&quot;2514&quot; data-origin-height=&quot;1564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pAG4w/btsHHdQcMxK/94WlQEMbRoVyhQROSLm7e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pAG4w/btsHHdQcMxK/94WlQEMbRoVyhQROSLm7e1/img.png&quot; data-alt=&quot;Spotify 공식 홈페이지에 공시한 요금&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pAG4w/btsHHdQcMxK/94WlQEMbRoVyhQROSLm7e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpAG4w%2FbtsHHdQcMxK%2F94WlQEMbRoVyhQROSLm7e1%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;2514&quot; height=&quot;1564&quot; data-filename=&quot;스크린샷 2024-05-29 10.15.31.png&quot; data-origin-width=&quot;2514&quot; data-origin-height=&quot;1564&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Spotify 공식 홈페이지에 공시한 요금&lt;/figcaption&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;UI야 내가 익숙해지기만 하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음원스트리밍 UI는 비슷비슷하다.&lt;/p&gt;
&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;가장 저렴한 게 월 7,900원으로&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;Goingbus, 고잉버스!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다양한 OTT 서비스를 제공하는 고잉버스는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 스포티파이와 같은 음원 스트리밍 서비스도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공유하는 방식으로 저렴하게 서비스를 제공하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;a style=&quot;background-color: #ffffff; color: #6bacce; text-align: start;&quot; href=&quot;https://goingbus.com/?s=bwQMlZKv&quot;&gt;​GoingBus 공식 페이지로 이동&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[회원가입]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9n3LQ/btsHHocXrt6/7bY3o8kndHT6RF5IGkkzyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9n3LQ/btsHHocXrt6/7bY3o8kndHT6RF5IGkkzyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9n3LQ/btsHHocXrt6/7bY3o8kndHT6RF5IGkkzyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9n3LQ%2FbtsHHocXrt6%2F7bY3o8kndHT6RF5IGkkzyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;892&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;892&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;위해&amp;nbsp;반드시&amp;nbsp;가입은&amp;nbsp;필수.&lt;br /&gt;구글이나 네이버 로그인으로 간편하게 가입할 수 있다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[스포티파이 선택]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스포티파이를 클릭하면 아래와 같이 창이 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로모션 코드 입력을 클릭해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 프로모션 코드를 입력하면 할인이 적용된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;프로모션 코드 : hoon&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyacYg/btsHGYeGSFu/AsUtJFzY6xf9DZ2kxOQsKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyacYg/btsHGYeGSFu/AsUtJFzY6xf9DZ2kxOQsKK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;1108&quot; data-filename=&quot;스크린샷 2024-05-29 10.07.16.png&quot; style=&quot;width: 49.4632%; margin-right: 10px;&quot; data-widthpercent=&quot;50.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyacYg/btsHGYeGSFu/AsUtJFzY6xf9DZ2kxOQsKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyacYg%2FbtsHGYeGSFu%2FAsUtJFzY6xf9DZ2kxOQsKK%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;1432&quot; height=&quot;1108&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch2UeG/btsHE0SFfoy/gNqpeoxhWfGbKr3dr83IE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch2UeG/btsHE0SFfoy/gNqpeoxhWfGbKr3dr83IE1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;1110&quot; data-filename=&quot;스크린샷 2024-05-29 10.08.18.png&quot; style=&quot;width: 49.374%;&quot; data-widthpercent=&quot;49.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch2UeG/btsHE0SFfoy/gNqpeoxhWfGbKr3dr83IE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch2UeG%2FbtsHE0SFfoy%2FgNqpeoxhWfGbKr3dr83IE1%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;1432&quot; height=&quot;1110&quot;/&gt;&lt;/span&gt;&lt;/div&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;스포티파이 공식 홈페이지에서 베이직으로 결제 시 월 7,900원으로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년이면 9만 원에 육박하는 금액인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고잉버스를 이용한다면 약 29,000원&lt;/b&gt;인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;월 2,500원&lt;/b&gt;도 안 되는 요금으로 사용할 수 있는 셈이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로모션 코드 입력 시 약 10프로 가까이 할인되니,&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-filename=&quot;스크린샷 2024-05-29 10.08.08.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;1112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VS7P4/btsHGCQvIDc/a4XmQERa1t3MXExB5tD6mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VS7P4/btsHGCQvIDc/a4XmQERa1t3MXExB5tD6mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VS7P4/btsHGCQvIDc/a4XmQERa1t3MXExB5tD6mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVS7P4%2FbtsHGCQvIDc%2Fa4XmQERa1t3MXExB5tD6mk%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;479&quot; height=&quot;1112&quot; data-filename=&quot;스크린샷 2024-05-29 10.08.08.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;1112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년은 좀 많은 것 같아,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3개월만 결제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금액대비 할인율만 다를 뿐,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 할인 금액인 2.38 달러는 똑같다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[결제]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-29 10.09.46.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;1116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k8won/btsHEWJsNZj/3KeBM8JChhya81BejsNKHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k8won/btsHEWJsNZj/3KeBM8JChhya81BejsNKHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k8won/btsHEWJsNZj/3KeBM8JChhya81BejsNKHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk8won%2FbtsHEWJsNZj%2F3KeBM8JChhya81BejsNKHk%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;494&quot; height=&quot;1116&quot; data-filename=&quot;스크린샷 2024-05-29 10.09.46.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;1116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제는 신용카드뿐만 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼성페이, 카카오페이, 페이코, 쓱 페이까지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국내에서 믿고 쓸 수 있는,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제 수단으로 사용 가능하다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 카카오페이로 결제하겠다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZVc2b/btsHHJOB99F/aB7Lj7kiS3Qe2izCAnhlpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZVc2b/btsHHJOB99F/aB7Lj7kiS3Qe2izCAnhlpK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;964&quot; data-filename=&quot;스크린샷 2024-05-29 10.10.32.png&quot; data-widthpercent=&quot;50.31&quot; style=&quot;width: 49.7233%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZVc2b/btsHHJOB99F/aB7Lj7kiS3Qe2izCAnhlpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZVc2b%2FbtsHHJOB99F%2FaB7Lj7kiS3Qe2izCAnhlpK%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;958&quot; height=&quot;964&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o7Ejf/btsHFLgsVcR/6jLIaVv6CS6D2Fn48NTCE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o7Ejf/btsHFLgsVcR/6jLIaVv6CS6D2Fn48NTCE1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;978&quot; data-filename=&quot;스크린샷 2024-05-29 10.11.43.png&quot; data-widthpercent=&quot;49.69&quot; style=&quot;width: 49.1139%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o7Ejf/btsHFLgsVcR/6jLIaVv6CS6D2Fn48NTCE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo7Ejf%2FbtsHFLgsVcR%2F6jLIaVv6CS6D2Fn48NTCE1%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;960&quot; height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제하기를 클릭하면 이런 창이 뜨는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 약관 동의를 하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오페이머니나 카드 결제를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러고 결제 진행하면 끝!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[결제완료]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-29 10.14.21.png&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;2350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfaVry/btsHGVvywae/vgf5bShrKZsSSME7DBbxyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfaVry/btsHGVvywae/vgf5bShrKZsSSME7DBbxyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfaVry/btsHGVvywae/vgf5bShrKZsSSME7DBbxyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfaVry%2FbtsHGVvywae%2Fvgf5bShrKZsSSME7DBbxyk%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;593&quot; height=&quot;2350&quot; data-filename=&quot;edited_스크린샷 2024-05-29 10.14.21.png&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;2350&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;화면과 같이 내가 사용하는 서비스를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 순서를 잘 따라왔다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스포티파이가 정상적으로 구독이 되어있다!&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;[주의할 점]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스포티파이 같은 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고잉버스에서 지급한 아이디 / 비밀번호를 사용하면 되니,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳이 새로운 계정을 만들어 가입할 필요 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기타 발생하는 이슈 사항 대처법은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 필자의 포스팅 링크를 확인하기 바란다!&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1;&quot; href=&quot;https://psip31.tistory.com/209&quot;&gt;넷플릭스 유튜브 프리미엄 우회 싸게, 저렴하게, 고잉버스 GoingBus 사용법&lt;/a&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[스포티파이 사용법]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;1793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDTewV/btsHG9UJfKp/8dorpDISP1JNYSfqCwvCGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDTewV/btsHG9UJfKp/8dorpDISP1JNYSfqCwvCGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDTewV/btsHG9UJfKp/8dorpDISP1JNYSfqCwvCGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDTewV%2FbtsHG9UJfKp%2F8dorpDISP1JNYSfqCwvCGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;376&quot; height=&quot;585&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;1793&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹이나 앱 모두 사용 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 앱을 자주 사용하므로 앱을 다운로드한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buAhtY/btsHGVoMeMC/kk8y9HlzHKaW7JbLeQT5M1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buAhtY/btsHGVoMeMC/kk8y9HlzHKaW7JbLeQT5M1/img.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-is-animation=&quot;false&quot; width=&quot;373&quot; height=&quot;807&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buAhtY/btsHGVoMeMC/kk8y9HlzHKaW7JbLeQT5M1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuAhtY%2FbtsHGVoMeMC%2Fkk8y9HlzHKaW7JbLeQT5M1%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;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k402G/btsHG9mYbIV/U2ycUDtkaHFAObkzSRqLKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k402G/btsHG9mYbIV/U2ycUDtkaHFAObkzSRqLKK/img.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-is-animation=&quot;false&quot; width=&quot;370&quot; height=&quot;801&quot; data-widthpercent=&quot;50&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k402G/btsHG9mYbIV/U2ycUDtkaHFAObkzSRqLKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk402G%2FbtsHG9mYbIV%2FU2ycUDtkaHFAObkzSRqLKK%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;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 화면에서 맨 밑에 로그인하기를 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아까 고잉버스 홈페이지에서 확인한,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스포티파이 사용자와 비밀번호 내용을 잘 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crdQRT/btsHHjQjzwR/Pv10Xz42AjPjQDtKZGeK61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crdQRT/btsHHjQjzwR/Pv10Xz42AjPjQDtKZGeK61/img.png&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; width=&quot;410&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crdQRT/btsHHjQjzwR/Pv10Xz42AjPjQDtKZGeK61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrdQRT%2FbtsHHjQjzwR%2FPv10Xz42AjPjQDtKZGeK61%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;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VnACp/btsHFIYmjTn/A0wF9T3NHveA9TtHDRKREk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VnACp/btsHFIYmjTn/A0wF9T3NHveA9TtHDRKREk/img.png&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; width=&quot;402&quot; height=&quot;870&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VnACp/btsHFIYmjTn/A0wF9T3NHveA9TtHDRKREk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVnACp%2FbtsHFIYmjTn%2FA0wF9T3NHveA9TtHDRKREk%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;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZKFKZ/btsHHsGd2ux/NXSwslgvlZUyYC3tUKPBC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZKFKZ/btsHHsGd2ux/NXSwslgvlZUyYC3tUKPBC1/img.png&quot; style=&quot;width: 32.5581%;&quot; width=&quot;411&quot; height=&quot;889&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2532&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZKFKZ/btsHHsGd2ux/NXSwslgvlZUyYC3tUKPBC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZKFKZ%2FbtsHHsGd2ux%2FNXSwslgvlZUyYC3tUKPBC1%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;1170&quot; height=&quot;2532&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인이 정상적으로 되었다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 음악을 좋아하는지 묻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 선택한 언어 및 가수로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비슷한 취향의 노래를 추천해 주는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 예시로 걸그룹을 선택하고 완료 버튼 클릭!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;2364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFaFdK/btsHFqp4Ozi/zT8YZlXJLw7VhE5QxeJDwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFaFdK/btsHFqp4Ozi/zT8YZlXJLw7VhE5QxeJDwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFaFdK/btsHFqp4Ozi/zT8YZlXJLw7VhE5QxeJDwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFaFdK%2FbtsHFqp4Ozi%2FzT8YZlXJLw7VhE5QxeJDwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;2364&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;2364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 디폴트 세팅이 끝나고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자유롭게 음악 스트리밍 서비스를 이용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 걸그룹 노래도 좋지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘이 갑자기 데이식스와 같은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인디밴드 노래도 추천해 준 바람에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;듣게 됐다 ㅎㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실히 뭔가 다른 음악 스트리밍 서비스 앱들에 비해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노래도 방대하고, 음질도 좋은 느낌이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고잉버스가 요금을 절약해 준 만큼,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 귀도 스포티파이를 통해 호강한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 읽고 보시는 분들도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다 저렴하게 다양한 구독 서비스를 이용하고 싶다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고잉버스를 이용하기를 추천한다~&lt;/p&gt;
&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;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;본&amp;nbsp;포스팅은&amp;nbsp;파트너스&amp;nbsp;활동을&amp;nbsp;통해&lt;br /&gt;일정액의&amp;nbsp;수수료를&amp;nbsp;제공받을&amp;nbsp;수&amp;nbsp;있음.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>IT/Etc &amp;amp; Tool</category>
      <category>GoingBus</category>
      <category>spotify</category>
      <category>spotify 고잉버스</category>
      <category>spotify 싸게</category>
      <category>spotify 요금</category>
      <category>spotify 할인</category>
      <category>고잉버스</category>
      <category>스포티파이</category>
      <category>음원스트리밍</category>
      <category>음원스트리밍 서비스 추천</category>
      <author>개발한기발자</author>
      <guid isPermaLink="true">https://psip31.tistory.com/247</guid>
      <comments>https://psip31.tistory.com/247#entry247comment</comments>
      <pubDate>Wed, 29 May 2024 16:08:02 +0900</pubDate>
    </item>
    <item>
      <title>AWS IAM 루트 계정 및 사용자 그룹 정책 사용</title>
      <link>https://psip31.tistory.com/246</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번 시간에는 AWS에서 &lt;b&gt;사용자 및 사용자 그룹 정책&lt;/b&gt;과 관련이 있는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;IAM&lt;/b&gt; 기능에 대해서 알아보도록 하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;IAM 이란?&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IAM은 Identity and Access Management의 약자로 IAM에서는 사용자를 생성하고 그룹에 배치한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가장 기본적인 기능으로 Region 상관없이 글로벌 서비스에 해당한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;계정을 생성할 때 루트 계정을 만들었는데, &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이는 기본으로 생성되는 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IAM을 통해, 사용자와 그룹을 만들 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용자(user)는 복수 그룹에 속할 수 있고, 그룹 안에 그룹을 넣을 수 없다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 아무 그룹에 속하지 않은 사용자가 있을 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그룹을 지정하는 이유는 권한(permissions)부여 때문이다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;쉽게 말해 사용자 접근, 권한 설정인데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개발자는 백문이 불여일타,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;직접 해보면서 알아보도록 하자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;우측 상단에 내 계정정보&lt;/b&gt;가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 처음에 회원가입시, 디폴트로 만들어진 루트 계정이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.09.47.png&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/plAlu/btsHD8pisXw/wyTWkEI7ODi4AYoE0vx9S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/plAlu/btsHD8pisXw/wyTWkEI7ODi4AYoE0vx9S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/plAlu/btsHD8pisXw/wyTWkEI7ODi4AYoE0vx9S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FplAlu%2FbtsHD8pisXw%2FwyTWkEI7ODi4AYoE0vx9S1%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;488&quot; height=&quot;848&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.09.47.png&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[IAM]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;먼저 상단 검색에서 IAM을 검색해서 클릭한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아직 생성한 특별한 사용자가 없기 때문에, 표시할 리소스가 없다고 나온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;우측에 사용자 생성을 클릭한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-22 16.09.39.png&quot; data-origin-width=&quot;3004&quot; data-origin-height=&quot;1866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8mwzv/btsHD7KJsFv/6SjSKqefSyChjoJ8PgkKvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8mwzv/btsHD7KJsFv/6SjSKqefSyChjoJ8PgkKvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8mwzv/btsHD7KJsFv/6SjSKqefSyChjoJ8PgkKvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8mwzv%2FbtsHD7KJsFv%2F6SjSKqefSyChjoJ8PgkKvK%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;3004&quot; height=&quot;1866&quot; data-filename=&quot;스크린샷 2024-05-22 16.09.39.png&quot; data-origin-width=&quot;3004&quot; data-origin-height=&quot;1866&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[사용자 세부 정보 설정]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;사용자 생성을 클릭&lt;/b&gt;하면, 아래와 같은 화면이 나온다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;AWS Management Consol에 대한 사용자 액세스 권한 제공&lt;/b&gt;을 체크하고&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;사용자 유형&lt;/b&gt;에 &lt;b&gt;IAM 사용자를 생성하고 싶음&lt;/b&gt;을 클릭한 뒤,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;사용자 이름과 사용자 암호를 입력&lt;/b&gt;한다.&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.10.26.png&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;2228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6xBHn/btsHETdUvVK/18UGwCdfIhcOA7NOhiOSuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6xBHn/btsHETdUvVK/18UGwCdfIhcOA7NOhiOSuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6xBHn/btsHETdUvVK/18UGwCdfIhcOA7NOhiOSuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6xBHn%2FbtsHETdUvVK%2F18UGwCdfIhcOA7NOhiOSuK%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;2880&quot; height=&quot;2228&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.10.26.png&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;2228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 실무에서 한다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새롭게 생성된 사용자의 보안을 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용자는 다음 로그인 시 새 암호를 생성해야 합니다를&lt;/b&gt; 체크해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 번거로움을 생략하기 위해 체크를 하지 않고 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 정보를 모두 입력했으면 다음을 누른다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[사용자 그룹 생성]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 만들어진 사용자 그룹이 없기 때문에 사용자 그룹을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용자 그룹이름&lt;/b&gt;을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정책은 아무거나 선택해 주고 사용자 그룹 생성을 눌러준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-22 16.10.42.png&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;2750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xl5Ww/btsHElWmeVm/A95t2oSCJeZO9ZyLSJiQkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xl5Ww/btsHElWmeVm/A95t2oSCJeZO9ZyLSJiQkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xl5Ww/btsHElWmeVm/A95t2oSCJeZO9ZyLSJiQkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxl5Ww%2FbtsHElWmeVm%2FA95t2oSCJeZO9ZyLSJiQkk%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;1786&quot; height=&quot;2750&quot; data-filename=&quot;스크린샷 2024-05-22 16.10.42.png&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;2750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[권한설정]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그룹에 사용자 추가&lt;/b&gt;를 체크하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방금 만든 그룹 이름을 체크&lt;/b&gt;하고 다음 클릭!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3OGkF/btsHEPQb6NH/ecxKOgUke4QT2gyVbHyHtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3OGkF/btsHEPQb6NH/ecxKOgUke4QT2gyVbHyHtK/img.png&quot; data-origin-width=&quot;2244&quot; data-origin-height=&quot;1372&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2024-05-22 16.10.58.png&quot; style=&quot;width: 49.5816%; margin-right: 10px;&quot; data-widthpercent=&quot;50.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3OGkF/btsHEPQb6NH/ecxKOgUke4QT2gyVbHyHtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3OGkF%2FbtsHEPQb6NH%2FecxKOgUke4QT2gyVbHyHtK%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;2244&quot; height=&quot;1372&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1U4QD/btsHD9PgxaG/pBWsmCKxtyTvHZDO7eeUZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1U4QD/btsHD9PgxaG/pBWsmCKxtyTvHZDO7eeUZk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2226&quot; data-origin-height=&quot;1370&quot; data-filename=&quot;스크린샷 2024-05-22 16.11.42.png&quot; style=&quot;width: 49.2556%;&quot; data-widthpercent=&quot;49.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1U4QD/btsHD9PgxaG/pBWsmCKxtyTvHZDO7eeUZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1U4QD%2FbtsHD9PgxaG%2FpBWsmCKxtyTvHZDO7eeUZk%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;2226&quot; height=&quot;1370&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[검토 및 생성]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 입력한 정보를 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그는 키-값 형태로 입력하여 추가할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력한 정보를 확인하고 태그 값을 입력했으면 &lt;b&gt;사용자 생성을 클릭&lt;/b&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/56p2k/btsHFcjWc7J/yqiRbpVQognhQsbtKkIf41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/56p2k/btsHFcjWc7J/yqiRbpVQognhQsbtKkIf41/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2884&quot; data-origin-height=&quot;1616&quot; data-filename=&quot;스크린샷 2024-05-22 16.11.57.png&quot; style=&quot;width: 49.5758%; margin-right: 10px;&quot; data-widthpercent=&quot;50.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/56p2k/btsHFcjWc7J/yqiRbpVQognhQsbtKkIf41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F56p2k%2FbtsHFcjWc7J%2FyqiRbpVQognhQsbtKkIf41%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;2884&quot; height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oyVP9/btsHFafowQj/oWgB3zl10ybS1IrxUXQOyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oyVP9/btsHFafowQj/oWgB3zl10ybS1IrxUXQOyK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2926&quot; data-origin-height=&quot;1650&quot; data-filename=&quot;스크린샷 2024-05-22 16.12.31.png&quot; style=&quot;width: 49.2614%;&quot; data-widthpercent=&quot;49.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oyVP9/btsHFafowQj/oWgB3zl10ybS1IrxUXQOyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoyVP9%2FbtsHFafowQj%2FoWgB3zl10ybS1IrxUXQOyK%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;2926&quot; height=&quot;1650&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[사용자 생성 완료]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용자 생성을 클릭&lt;/b&gt;하면 아래와 같은 화면이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 루트 계정이 아닌 계정으로 로그인을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 이 계정으로 로그인 하기 위해,&lt;b&gt; 콘솔 로그인 URL을 복사해 놓는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 우선&lt;b&gt; 사용자 목록으로 돌아가기를 클릭&lt;/b&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.12.49.png&quot; data-origin-width=&quot;2886&quot; data-origin-height=&quot;1332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKDAA8/btsHEjYyohr/cKXgXT95lDCDj4tOrnxDL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKDAA8/btsHEjYyohr/cKXgXT95lDCDj4tOrnxDL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKDAA8/btsHEjYyohr/cKXgXT95lDCDj4tOrnxDL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKDAA8%2FbtsHEjYyohr%2FcKXgXT95lDCDj4tOrnxDL1%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;2886&quot; height=&quot;1332&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.12.49.png&quot; data-origin-width=&quot;2886&quot; data-origin-height=&quot;1332&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;IAM 목록에도 아래와 같이 보인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.13.28.png&quot; data-origin-width=&quot;2932&quot; data-origin-height=&quot;1736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dc5qPx/btsHGjh9dNg/lhtgj79c4R6GQflhR4bmk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dc5qPx/btsHGjh9dNg/lhtgj79c4R6GQflhR4bmk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dc5qPx/btsHGjh9dNg/lhtgj79c4R6GQflhR4bmk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdc5qPx%2FbtsHGjh9dNg%2Flhtgj79c4R6GQflhR4bmk0%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;2932&quot; height=&quot;1736&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.13.28.png&quot; data-origin-width=&quot;2932&quot; data-origin-height=&quot;1736&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;아래 사용자 또한 위의 설정을 통해 admin 그룹에 포함되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 이름에 있는 &lt;b&gt;사용자를 클릭&lt;/b&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.13.44.png&quot; data-origin-width=&quot;2926&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccFCtz/btsHEorT3RN/osIuZU3kBp24OD0Y82cuLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccFCtz/btsHEorT3RN/osIuZU3kBp24OD0Y82cuLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccFCtz/btsHEorT3RN/osIuZU3kBp24OD0Y82cuLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccFCtz%2FbtsHEorT3RN%2FosIuZU3kBp24OD0Y82cuLk%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;2926&quot; height=&quot;1728&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.13.44.png&quot; data-origin-width=&quot;2926&quot; data-origin-height=&quot;1728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 속한 그룹 및 정책을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외에 &lt;b&gt;그룹, 태그, 보안자격 증명 등의 내용&lt;/b&gt;도 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.14.17.png&quot; data-origin-width=&quot;2864&quot; data-origin-height=&quot;2098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dk0ceN/btsHF9tjPd9/Dwmg8EVl1CkEm3SQslSmZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dk0ceN/btsHF9tjPd9/Dwmg8EVl1CkEm3SQslSmZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dk0ceN/btsHF9tjPd9/Dwmg8EVl1CkEm3SQslSmZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdk0ceN%2FbtsHF9tjPd9%2FDwmg8EVl1CkEm3SQslSmZ0%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;2864&quot; height=&quot;2098&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.14.17.png&quot; data-origin-width=&quot;2864&quot; data-origin-height=&quot;2098&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[IAM 대시보드]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 IAM을 검색해서 들어가면 아래와 같이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 만든 사용자, 사용자 그룹이 생겼기 때문에 해당 정보가 보이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 계정 접속을 위한 ID와 URL도 우측에 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 ID 정보 밑에 &lt;b&gt;계정 별칭을 생성&lt;/b&gt;해 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.14.35.png&quot; data-origin-width=&quot;2914&quot; data-origin-height=&quot;2178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cusQc5/btsHEmnsSRb/pbJMuzHNvZ2paZKcRhlKNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cusQc5/btsHEmnsSRb/pbJMuzHNvZ2paZKcRhlKNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cusQc5/btsHEmnsSRb/pbJMuzHNvZ2paZKcRhlKNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcusQc5%2FbtsHEmnsSRb%2FpbJMuzHNvZ2paZKcRhlKNK%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;2914&quot; height=&quot;2178&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.14.35.png&quot; data-origin-width=&quot;2914&quot; data-origin-height=&quot;2178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[계정 별칭 생성]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진과 같이 별칭을 생성해 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pRlQB/btsHGkuyhxI/wO8Xpvjs2WuarYaDlfQEC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pRlQB/btsHGkuyhxI/wO8Xpvjs2WuarYaDlfQEC1/img.png&quot; data-origin-width=&quot;2384&quot; data-origin-height=&quot;2010&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2024-05-22 16.15.02.png&quot; style=&quot;width: 42.3127%; margin-right: 10px;&quot; data-widthpercent=&quot;42.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pRlQB/btsHGkuyhxI/wO8Xpvjs2WuarYaDlfQEC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpRlQB%2FbtsHGkuyhxI%2FwO8Xpvjs2WuarYaDlfQEC1%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;2384&quot; height=&quot;2010&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckUog6/btsHFNKPp5b/KoFiuGasoDBoJYknuBaPLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckUog6/btsHFNKPp5b/KoFiuGasoDBoJYknuBaPLK/img.png&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;1054&quot; data-is-animation=&quot;false&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.15.25.png&quot; data-widthpercent=&quot;57.19&quot; style=&quot;width: 56.5245%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckUog6/btsHFNKPp5b/KoFiuGasoDBoJYknuBaPLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckUog6%2FbtsHFNKPp5b%2FKoFiuGasoDBoJYknuBaPLK%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;1670&quot; height=&quot;1054&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별칭을 생성하면 아래와 같이 계정 ID+URL이 아닌,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 별칭+URL로 AWS 콘솔 로그인이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_스크린샷 2024-05-22 16.15.42.png&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;1126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqzCxs/btsHEBxOups/1tEAe3nqfEfoPdMyCOYDFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqzCxs/btsHEBxOups/1tEAe3nqfEfoPdMyCOYDFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqzCxs/btsHEBxOups/1tEAe3nqfEfoPdMyCOYDFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqzCxs%2FbtsHEBxOups%2F1tEAe3nqfEfoPdMyCOYDFK%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;534&quot; height=&quot;1126&quot; data-filename=&quot;edited_edited_스크린샷 2024-05-22 16.15.42.png&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;1126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[계정별칭과 사용자 이름으로 로그인]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 등록한 정보로 로그인을 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.17.54.png&quot; data-origin-width=&quot;2066&quot; data-origin-height=&quot;1590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xVOZZ/btsHEXNYQLO/lSLUwAGSdZsSYmlPooBlK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xVOZZ/btsHEXNYQLO/lSLUwAGSdZsSYmlPooBlK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xVOZZ/btsHEXNYQLO/lSLUwAGSdZsSYmlPooBlK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxVOZZ%2FbtsHEXNYQLO%2FlSLUwAGSdZsSYmlPooBlK1%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;2066&quot; height=&quot;1590&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.17.54.png&quot; data-origin-width=&quot;2066&quot; data-origin-height=&quot;1590&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.24.26.png&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw94UK/btsHF3NAiHx/D024oVsrbCeSjKlLRmpBV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw94UK/btsHF3NAiHx/D024oVsrbCeSjKlLRmpBV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw94UK/btsHF3NAiHx/D024oVsrbCeSjKlLRmpBV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw94UK%2FbtsHF3NAiHx%2FD024oVsrbCeSjKlLRmpBV1%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;2334&quot; height=&quot;1274&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.24.26.png&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[루트계정과 IAM 사용자 로그인]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 한쪽이 로그인 상태일 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트계정 혹은 IAM 사용자로 로그인 시, 다른 쪽 세션이 종료되어 로그아웃된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 양쪽 모두 로그인하여 정보를 확인해야 할 경우,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chrome, Edge, Safari 등의 &lt;b&gt;웹 브라우저에서 새 시크릿 창 or 새 프라이빗 창&lt;/b&gt;으로 로그인하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 루트계정과 IAM 사용자가 동시에 로그인 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.25.26.png&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WS6PZ/btsHFn6TZqY/AI7hJqQcq15W5OrUF5ogH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WS6PZ/btsHFn6TZqY/AI7hJqQcq15W5OrUF5ogH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WS6PZ/btsHFn6TZqY/AI7hJqQcq15W5OrUF5ogH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWS6PZ%2FbtsHFn6TZqY%2FAI7hJqQcq15W5OrUF5ogH1%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;3000&quot; height=&quot;1453&quot; data-filename=&quot;edited_스크린샷 2024-05-22 16.25.26.png&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적인 기능이면서,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안적으로 가장 중요한 기능이니,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;절차 하나하나 유의하여 잘 사용해 보도록 하자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IAM 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝!&lt;/p&gt;</description>
      <category>IT/AWS</category>
      <category>AWS</category>
      <category>AWS IAM</category>
      <category>aws iam user</category>
      <category>aws iam 사용</category>
      <category>aws 그룹정책</category>
      <category>aws 루트계정</category>
      <category>aws 별칭</category>
      <category>aws 사용자 계정</category>
      <category>aws 접근권한</category>
      <category>사용자 관리</category>
      <author>개발한기발자</author>
      <guid isPermaLink="true">https://psip31.tistory.com/246</guid>
      <comments>https://psip31.tistory.com/246#entry246comment</comments>
      <pubDate>Tue, 28 May 2024 16:52:20 +0900</pubDate>
    </item>
    <item>
      <title>Spring gradle project 스프링 핵심 원리 기본편 | 컴포넌트 스캔 의존관계 자동 주입, @Autowired, @ComponentScan</title>
      <link>https://psip31.tistory.com/245</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pQZ41/btsHA0RH3S9/NXN4MKCwa0iUPtd9CvsU41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pQZ41/btsHA0RH3S9/NXN4MKCwa0iUPtd9CvsU41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pQZ41/btsHA0RH3S9/NXN4MKCwa0iUPtd9CvsU41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpQZ41%2FbtsHA0RH3S9%2FNXN4MKCwa0iUPtd9CvsU41%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;355&quot; height=&quot;239&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;본 포스팅은 인프런에 있는 인터넷 강좌인,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8#&quot;&gt;&lt;b&gt;김영한 강사님의 스프링 핵심 원리 기본편&lt;/b&gt;&lt;/a&gt;을 공부하며,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개인적으로 공부하고, 정리하는 용도로 포스팅을 해보겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/228&quot;&gt;Spring&amp;nbsp;gradle&amp;nbsp;project&amp;nbsp;환경설정&amp;nbsp;및&amp;nbsp;회원&amp;nbsp;가입&amp;nbsp;서비스&amp;nbsp;예제&amp;nbsp;만들기&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/229&quot;&gt;Spring gradle project 주문/할인 도메인 설계&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/230&quot;&gt;Spring gradle project 객체 지향 원리 적용&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/231&quot;&gt;Spring gradle project AppConfig&amp;nbsp;리팩토링&amp;nbsp;OCP&amp;nbsp;위반&amp;nbsp;해결&amp;nbsp;및&amp;nbsp;중복&amp;nbsp;제거&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/233&quot;&gt;Spring gradle project 좋은 객체 지향 설계 5가지 원칙 적용 및 스프링 전환&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/235&quot;&gt;Spring gradle project 스프링 컨테이너와 스프링 빈&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/240&quot;&gt;Spring gradle project BeanFactory, ApplicationContext 이해 및 차이&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/241&quot;&gt;Spring gradle project XML 설정 사용, BeanDefinition, 스프링 빈 설정 메타 정보&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0593d3;&quot; href=&quot;https://psip31.tistory.com/242&quot;&gt;Spring gradle project 웹 애플리케이션과 싱글톤, WebApplication and Singleton&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://psip31.tistory.com/243&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Spring gradle project 싱글톤 컨테이너, @Configuration&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;컴포넌트 스캔&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;컴포넌트 스캔과 의존관계 자동 주입 시작하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지금까지 스프링 빈을 등록할 때, 자바 코드의 @Bean이나 XML의 &amp;lt;bean&amp;gt; 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 등록해야 할 스프링 빈이 수십, 수백 개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 &lt;b&gt;컴포넌트 스캔&lt;/b&gt;이라는 기능을 제공한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의존관계도 자동으로 주입하는 &lt;b&gt;@Autowired&lt;/b&gt;라는 기능도 제공한다.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;SpringBootAutoAppConfig.java&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716528795749&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import static org.springframework.context.annotation.ComponentScan.*;

@Configuration
@ComponentScan(excludeFilters = @Filter(type=FilterType.ANNOTATION, classes=Configuration.class))
public class AutoAppConfig {

}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@ComponentScan 어노테이션은 Spring이 어노테이션이 붙은 클래스를 스캔하고 빈으로 등록할 패키지를 지정한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;excludeFilters 속성은 스캔 대상에서 특정 유형의 컴포넌트를 제외한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서는 @Filter 어노테이션을 사용하여 type을 FilterType.ANNOTATION으로 설정하고, classes를 Configuration.class로 설정해서, @Configuration 어노테이션이 붙은 클래스는 컴포넌트 스캔 과정에서 제외된다.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트 스캔을 사용하면 &lt;b&gt;@Configuration&lt;/b&gt;이 붙은 설정 정보도 자동으로 등록되기 때문에, AppConfig, TestConfig 등 앞서 만들어두었던 설정 정보도 함께 등록되고, 실행되어 버린다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 &lt;b&gt;excludeFilters&lt;/b&gt;를 이용해서 설정정보는 컴포넌트 스캔 대상에서 제외했다.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;MemoryMemberRepository @Component 추가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716531170099&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class MemoryMemberRepository implements MemberRepository {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;RateDiscountPolicy @Component 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716531180480&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; @Component
 public class RateDiscountPolicy implements DiscountPolicy {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;MemberServiceImpl @Component, @Autowired 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716531214412&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class MemberServiceImpl implements MemberService {
    
    private final MemberRepository memberRepository;
    
    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전에 AppConfig에서는 @Bean으로 직접 설정 정보를 작성했고, 의존관계도 직접 명시했다.&lt;/li&gt;
&lt;li&gt;이제는 이런 설정 정보 자체가 없기 때문에, 의존관계 주입도 이 클래스 안에서 해결해야 한다.&lt;/li&gt;
&lt;li&gt;@Autowired는 의존관계를 자동으로 주입해 준다&lt;/li&gt;
&lt;li&gt;@Autowired를 사용하면, 아래와 같이 생성자에서 여러 의존관계도 한 번에 주입받을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;OrderServiceImpl @Component, @Autowired 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716531335804&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
    
    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;AutoAppConfigTest.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716531457120&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import hello.core.AutoAppConfig;
import hello.core.member.MemberService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.*;

public class AutoAppConfigTest {

    @Test
    void basicScan() {
        ApplicationContext ac = new
        
        AnnotationConfigApplicationContext(AutoAppConfig.class);
        
        MemberService memberService = ac.getBean(MemberService.class);
        
        assertThat(memberService).isInstanceOf(MemberService.class);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AnnotationConfigApplicationContext를 사용하는 것은 기존과 동일하다.&lt;/li&gt;
&lt;li&gt;설정 정보로 AutoAppConfig 클래스를 넘겨준다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 실행하면, 로그를 통해 컴포넌트 스캔이 잘 동작하는지 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 이제 컴포넌트 스캔과 자동 의존관계 주입이 어떻게 동작하는지 그림으로 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;@ComponentScan&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqkR9g/btsHAr3id2h/iYSAXuS845cwZ4N7PAvq6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqkR9g/btsHAr3id2h/iYSAXuS845cwZ4N7PAvq6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqkR9g/btsHAr3id2h/iYSAXuS845cwZ4N7PAvq6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqkR9g%2FbtsHAr3id2h%2FiYSAXuS845cwZ4N7PAvq6K%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;1560&quot; height=&quot;692&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위에서 설명했듯, @ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빈 이름 기본 전략 : MemberServiceImpl 클래스 &amp;rarr; memberServiceImpl&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빈 이름 직접 지정 : 만약 스프링 빈의 이름을 직접 지정하고 싶으면 @Component(&quot;memberService2&quot;) 이런 식으로 이름을 부여하면 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;@Autowired 의존관계 자동 주입&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPv915/btsHBSrMrRQ/WzdKk3kg9L5dEVVrtCK4qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPv915/btsHBSrMrRQ/WzdKk3kg9L5dEVVrtCK4qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPv915/btsHBSrMrRQ/WzdKk3kg9L5dEVVrtCK4qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPv915%2FbtsHBSrMrRQ%2FWzdKk3kg9L5dEVVrtCK4qk%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;1550&quot; height=&quot;676&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;676&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;생성자에 @Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.&lt;/li&gt;
&lt;li&gt;이때 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다.&lt;br /&gt;(getBean(MemberRepository.class)` 와 동일하다고 이해하면 된다.)&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;1548&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xgceo/btsHz06bpzg/k4u76yV9A9DgWYGUkIFK41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xgceo/btsHz06bpzg/k4u76yV9A9DgWYGUkIFK41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xgceo/btsHz06bpzg/k4u76yV9A9DgWYGUkIFK41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXgceo%2FbtsHz06bpzg%2Fk4u76yV9A9DgWYGUkIFK41%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;1548&quot; height=&quot;678&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;678&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 data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;탐색할 패키지의 시작 위치 지정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716532004323&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; @ComponentScan(basePackages={&quot;hello.core&quot;, &quot;hello.service&quot;})&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;basePackages&lt;/b&gt; : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다.&lt;br /&gt;위 코드와 같이 여러 시작 위치를 지정할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;basePackageClasses&lt;/b&gt; : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.&lt;/li&gt;
&lt;li&gt;만약 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권장하는 방법&lt;/b&gt;으로는 &lt;b&gt;설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것&lt;/b&gt;이다.&amp;nbsp;최근&amp;nbsp;스프링&amp;nbsp;부트도&amp;nbsp;이&amp;nbsp;방법을&amp;nbsp;기본으로&amp;nbsp;제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서 프로젝트가 다음과 같이 구조가 되어 있다고 가정하자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;com.hello&lt;/li&gt;
&lt;li&gt;com.hello.serivce&lt;/li&gt;
&lt;li&gt;com.hello.repository&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;com.hello &amp;rarr; 프로젝트 시작 루트, 여기에 AppConfig 같은 메인 설정 정보를 두고, @ComponentScan 어노테이션을 붙이고, basePackages 지정은 생략한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이렇게 하면 com.hello를 포함한 하위는 모두 자동으로 컴포넌트 스캔의 대상이 된다.&lt;/li&gt;
&lt;li&gt;그리고 프로젝트 메인 설정 정보는 프로젝트를 대표하는 정보이기 때문에 프로젝트 시작 루트 위치에 두는 것이 좋다 생각한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 참고로 스프링 부트를 사용하면 스프링 부트의 대표 시작 정보인 @SpringBootApplication를 이 프로젝트 시작 루트 위치에 두는 것이 관례이다. (그리고 이 설정 안에 바로 @ComponentScan이 들어있다!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;컴포넌트 스캔 기본 대상&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컴포넌트 스캔은 @Component 뿐만 아니라 다음과 내용도 추가로 대상에 포함한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;@Component&lt;/b&gt; : 컴포넌트 스캔에서 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Controller&lt;/b&gt; : 스프링 MVC 컨트롤러에서 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Service&lt;/b&gt; : 스프링 비즈니스 로직에서 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Repository&lt;/b&gt; : 스프링 데이터 접근 계층에서 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Configuration&lt;/b&gt; : 스프링 설정 정보에서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 어노테이션에는 상속관계라는 것이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이렇게 어노테이션이 특정 어노테이션을 들고 있는 것을 인식할 수 있는 것은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 언어가 지원하는 기능은 아니고, &lt;b&gt;스프링이 지원하는 기능&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;컴포넌트 스캔의 용도뿐만 아니라 다음 어노테이션이 있으면 스프링은 부가 기능을 수행한다&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;@Controller&lt;/b&gt; : 스프링 MVC 컨트롤러로 인식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Repository&lt;/b&gt; : 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해 준다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Configuration&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; : 앞서 보았듯이 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가 처리&lt;/span&gt;를 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Service&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; : 사실 @Service는 특별한 처리를 하지 않는다. 대신 개발자들이 '핵심 비즈니스 로직이 여기에 있&lt;/span&gt;겠구나' 정도로 비즈니스 계층을 인식하는데 도움이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 필터를 이용하여 컴포넌트 스캔대상을 추가/제외 지정할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;includeFilters : 컴포넌트 스캔에서 추가 대상 지정&lt;/li&gt;
&lt;li&gt;excludeFilters : 컴포넌트 스캔에서 제외 대상 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;컴포넌트 스캔 대상에 추가할 어노테이션&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716532676651&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeComponent {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;컴포넌트 스캔 대상에 제외할 어노테이션&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716532737780&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;컴포넌트 스캔 대상에 추가할 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716532773658&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@MyIncludeComponent
public class BeanA {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;컴포넌트 스캔 대상에 제외할 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716532790910&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@MyExcludeComponent
public class BeanB {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;설정 정보와 전체 테스트 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716533135375&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.context.annotation.ComponentScan.Filter;

public class ComponentFilterAppConfigTest {

    @Test
    void filterScan() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);
        BeanA beanA = ac.getBean(&quot;beanA&quot;, BeanA.class);
        assertThat(beanA).isNotNull();
        Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -&amp;gt; ac.getBean(&quot;beanB&quot;, BeanB.class));
    }
                 
    @Configuration
    @ComponentScan(includeFilters=@Filter(type=FilterType.ANNOTATION, classes=MyIncludeComponent.class),
                   excludeFilters=@Filter(type=FilterType.ANNOTATION, classes=MyExcludeComponent.class))
    static class ComponentFilterAppConfig {
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;includeFilters에 MyIncludeComponent 어노테이션을 추가해서 BeanA가 스프링 빈에 등록된다.&lt;/li&gt;
&lt;li&gt;excludeFilter에 MyExcludeComponent 어노테이션을 추가해서 BeanB는 스프링 빈에 등록되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;FilterType 옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FilterType은 5가지 옵션이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ANNOTATION&lt;/b&gt; : 기본값, 애노테이션을 인식해서 동작한다. ex) org.example.SomeAnnotation&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ASSIGNABLE_TYPE&lt;/b&gt; : 지정한 타입과 자식 타입을 인식해서 동작한다. ex) org.example.SomeClass&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ASPECTJ&lt;/b&gt; : AspectJ 패턴 사용 ex) org.example..*Service+&lt;/li&gt;
&lt;li&gt;&lt;b&gt;REGEX&lt;/b&gt; : 정규 표현식 ex) org\.example\.Default.*&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CUSTOM&lt;/b&gt; : TypeFilter이라는 인터페이스를 구현해서 처리 ex) org.example.MyTypeFilter&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;최근 스프링 부트는 컴포넌트 스캔을 기본으로 제공하는데&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;개인적으로는 옵션을 변경하면서 사용하기보다,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;스프링의 기본 설정에 최대한 맞추어 사용하는 것을 권장하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;선호하는 편이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;말 그대로 사용하기 좋게 만든 프레임워크이기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;스프링 개발자의 의도를 따라 기본 설정에 맞춰 사용하는 것이,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;가장 안전하고 유지 보수에도 좋을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아무튼 오늘은 이렇게 ComponentScan에 대해서 알아봤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;끝.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>IT/Spring</category>
      <category>@ component</category>
      <category>@Autowired</category>
      <category>@ComponentScan</category>
      <category>@Filter</category>
      <category>Annotation</category>
      <category>ComponentScan</category>
      <category>filtertype</category>
      <category>스프링 핵심원리 기본편</category>
      <category>어노테이션</category>
      <category>컴포넌트 스캔</category>
      <author>개발한기발자</author>
      <guid isPermaLink="true">https://psip31.tistory.com/245</guid>
      <comments>https://psip31.tistory.com/245#entry245comment</comments>
      <pubDate>Mon, 27 May 2024 08:52:46 +0900</pubDate>
    </item>
  </channel>
</rss>