<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>오늘이라도</title>
    <link>https://upcake.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 28 Jul 2026 19:41:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>upcake_</managingEditor>
    <image>
      <title>오늘이라도</title>
      <url>https://tistory1.daumcdn.net/tistory/3733046/attach/7dd7f634117a407da9a1c3c86c365d43</url>
      <link>https://upcake.tistory.com</link>
    </image>
    <item>
      <title>불행하지 않는 법</title>
      <link>https://upcake.tistory.com/531</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;i&gt;&amp;lt;회복탄력성&amp;gt;을 읽고&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgB0M6/btsFUb19RMw/yZISR0qQRKtOukkpOQgKZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgB0M6/btsFUb19RMw/yZISR0qQRKtOukkpOQgKZk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgB0M6/btsFUb19RMw/yZISR0qQRKtOukkpOQgKZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgB0M6%2FbtsFUb19RMw%2FyZISR0qQRKtOukkpOQgKZk%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;1024&quot; height=&quot;1024&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;올해에는&amp;nbsp;독서&amp;nbsp;습관을&amp;nbsp;만들고자&amp;nbsp;독서&amp;nbsp;소모임을&amp;nbsp;하나&amp;nbsp;가입했다.&amp;nbsp;그곳에서&amp;nbsp;만난&amp;nbsp;첫&amp;nbsp;책이&amp;nbsp;바로&amp;nbsp;&amp;lt;회복탄력성&amp;gt;이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;요즘&amp;nbsp;서점에는&amp;nbsp;우울을&amp;nbsp;극복하는&amp;nbsp;주제를&amp;nbsp;다루는&amp;nbsp;책들을&amp;nbsp;쉽게&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;이&amp;nbsp;책&amp;nbsp;또한&amp;nbsp;그런&amp;nbsp;책인&amp;nbsp;줄&amp;nbsp;알았는데&amp;nbsp;아니더라.&amp;nbsp;훌륭한&amp;nbsp;책이었다.&amp;nbsp;불행하지&amp;nbsp;않는&amp;nbsp;법을&amp;nbsp;논리적으로&amp;nbsp;정리하여&amp;nbsp;분류하고&amp;nbsp;그것을&amp;nbsp;예시와&amp;nbsp;생활에&amp;nbsp;적용하는&amp;nbsp;방법까지&amp;nbsp;소개하는&amp;nbsp;책이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;회복탄력성이란&amp;nbsp;용어가&amp;nbsp;어렵게&amp;nbsp;느껴졌지만,&amp;nbsp;쉽게&amp;nbsp;풀어서&amp;nbsp;말하자면&amp;nbsp;좌절에서&amp;nbsp;일어나는&amp;nbsp;힘,&amp;nbsp;행복함을&amp;nbsp;오래&amp;nbsp;유지하는&amp;nbsp;힘이다.&amp;nbsp;이&amp;nbsp;힘을&amp;nbsp;이루는&amp;nbsp;구성&amp;nbsp;요소를&amp;nbsp;세&amp;nbsp;가지,&amp;nbsp;자기&amp;nbsp;조절능력,&amp;nbsp;대인관계능력,&amp;nbsp;긍정성으로&amp;nbsp;나눠서&amp;nbsp;파트&amp;nbsp;별로&amp;nbsp;알려주는&amp;nbsp;게&amp;nbsp;주&amp;nbsp;내용이&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;각&amp;nbsp;파트를&amp;nbsp;모두&amp;nbsp;설명하려면&amp;nbsp;길어지니&amp;nbsp;생략하고&amp;nbsp;실생활에&amp;nbsp;적용할만한&amp;nbsp;방법들만&amp;nbsp;골라서&amp;nbsp;정리해&amp;nbsp;보자면&amp;nbsp;다음과&amp;nbsp;같다. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;부정적인&amp;nbsp;사건은&amp;nbsp;모두에게&amp;nbsp;일어나는&amp;nbsp;일시적인&amp;nbsp;일로&amp;nbsp;받아들이기 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;긍정적인&amp;nbsp;사건은&amp;nbsp;나에게&amp;nbsp;일어나는,&amp;nbsp;나로&amp;nbsp;인해&amp;nbsp;일어나는&amp;nbsp;일로&amp;nbsp;받아들이기 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;원만한&amp;nbsp;인간관계&amp;nbsp;유지하기 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;지금&amp;nbsp;함께&amp;nbsp;경험하는&amp;nbsp;것에&amp;nbsp;대한&amp;nbsp;대화&amp;nbsp;(좋은&amp;nbsp;대화&amp;nbsp;시작&amp;nbsp;주제) &lt;br /&gt;&amp;nbsp;-&amp;nbsp;말하는&amp;nbsp;사람의&amp;nbsp;표정을&amp;nbsp;따라&amp;nbsp;하는&amp;nbsp;습관&amp;nbsp;(공감적&amp;nbsp;경청) &lt;br /&gt;&amp;nbsp;-&amp;nbsp;약점보다는&amp;nbsp;강점을&amp;nbsp;찾아&amp;nbsp;강화하기 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;감사하는&amp;nbsp;마음&amp;nbsp;갖기&amp;nbsp;(감사함을&amp;nbsp;쥐어짜다&amp;nbsp;보면&amp;nbsp;점점&amp;nbsp;감사에&amp;nbsp;대한&amp;nbsp;역치가&amp;nbsp;낮아지고&amp;nbsp;행복의&amp;nbsp;빈도가&amp;nbsp;올라간다!) &lt;br /&gt;&amp;nbsp;-&amp;nbsp;운동하기 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;행복해지는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;고민들을&amp;nbsp;해소해&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;좋은&amp;nbsp;책이었다.&lt;/p&gt;</description>
      <category>일상/독후감</category>
      <author>upcake_</author>
      <guid isPermaLink="true">https://upcake.tistory.com/531</guid>
      <comments>https://upcake.tistory.com/531#entry531comment</comments>
      <pubDate>Tue, 19 Mar 2024 21:08:50 +0900</pubDate>
    </item>
    <item>
      <title>하여튼 책을 읽고 글을 써라! (역행자)</title>
      <link>https://upcake.tistory.com/530</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt; &lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&amp;lt;역행자&amp;gt;를 읽고&lt;/span&gt; &lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TaPlg/btsFy8KBWBl/dZdv7Ga4dRkK61GzDoeWw0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TaPlg/btsFy8KBWBl/dZdv7Ga4dRkK61GzDoeWw0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TaPlg/btsFy8KBWBl/dZdv7Ga4dRkK61GzDoeWw0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTaPlg%2FbtsFy8KBWBl%2FdZdv7Ga4dRkK61GzDoeWw0%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;1024&quot; height=&quot;1024&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&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;아는&amp;nbsp;형의&amp;nbsp;추천으로&amp;nbsp;역행자를&amp;nbsp;읽게&amp;nbsp;되었다.&amp;nbsp;내용은&amp;nbsp;뭐..&amp;nbsp;다른&amp;nbsp;자기&amp;nbsp;계발서들과&amp;nbsp;유사하다.&amp;nbsp;나는&amp;nbsp;이런&amp;nbsp;사람이었고&amp;nbsp;어떠한&amp;nbsp;계기를&amp;nbsp;통해&amp;nbsp;인생의&amp;nbsp;변화가&amp;nbsp;생겨서&amp;nbsp;어마어마하게&amp;nbsp;성공했다.&amp;nbsp;그리고&amp;nbsp;그&amp;nbsp;방법을&amp;nbsp;당신들한테&amp;nbsp;알려준다.&amp;nbsp;이런&amp;nbsp;내용이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;책&amp;nbsp;후기,&amp;nbsp;리뷰에는&amp;nbsp;이&amp;nbsp;책의&amp;nbsp;저자,&amp;nbsp;자청이란&amp;nbsp;사람에&amp;nbsp;대한&amp;nbsp;부정적인&amp;nbsp;글이&amp;nbsp;많아서&amp;nbsp;책&amp;nbsp;읽기&amp;nbsp;전에는&amp;nbsp;의구심이&amp;nbsp;좀&amp;nbsp;있었지만,&amp;nbsp;읽은&amp;nbsp;후에는&amp;nbsp;배울&amp;nbsp;점이&amp;nbsp;있는&amp;nbsp;내용이라고&amp;nbsp;느꼈다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;일단은&amp;nbsp;역행자에서&amp;nbsp;가장&amp;nbsp;강조하는&amp;nbsp;것은&amp;nbsp;독서를&amp;nbsp;하고&amp;nbsp;글을&amp;nbsp;쓰라는&amp;nbsp;것이다.&amp;nbsp;이&amp;nbsp;독후감을&amp;nbsp;쓰기&amp;nbsp;시작한&amp;nbsp;이유도&amp;nbsp;역행자의&amp;nbsp;영향이다.&amp;nbsp;평소에&amp;nbsp;독서와&amp;nbsp;작문을&amp;nbsp;하긴&amp;nbsp;해야겠다고&amp;nbsp;생각하던&amp;nbsp;나로서는&amp;nbsp;역행자를&amp;nbsp;계기로&amp;nbsp;삼아&amp;nbsp;실천에&amp;nbsp;옮기기로&amp;nbsp;하였다. &lt;br /&gt;&lt;br /&gt;그&amp;nbsp;외에는&amp;nbsp;뭐&amp;nbsp;유전자의&amp;nbsp;영향,&amp;nbsp;본능의&amp;nbsp;영향에서&amp;nbsp;벗어나라,&amp;nbsp;남들과&amp;nbsp;다른&amp;nbsp;생각을&amp;nbsp;해라&amp;nbsp;이런&amp;nbsp;내용들&amp;nbsp;뿐이었다.&amp;nbsp;이것들에&amp;nbsp;대해서는&amp;nbsp;내가&amp;nbsp;배움과&amp;nbsp;경험이&amp;nbsp;부족하여&amp;nbsp;실천하는&amp;nbsp;방법을&amp;nbsp;깨우치지&amp;nbsp;못한&amp;nbsp;듯하다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;정리하자면,&amp;nbsp;역행자를&amp;nbsp;통해&amp;nbsp;독서와&amp;nbsp;글쓰기의&amp;nbsp;중요성을&amp;nbsp;다시&amp;nbsp;배웠고&amp;nbsp;실천하게&amp;nbsp;되었다.&amp;nbsp;그런&amp;nbsp;의미에서&amp;nbsp;나에게는&amp;nbsp;유의미한&amp;nbsp;책이었다.&lt;/p&gt;</description>
      <category>일상/독후감</category>
      <category>독후감</category>
      <category>역행자</category>
      <author>upcake_</author>
      <guid isPermaLink="true">https://upcake.tistory.com/530</guid>
      <comments>https://upcake.tistory.com/530#entry530comment</comments>
      <pubDate>Tue, 5 Mar 2024 22:00:26 +0900</pubDate>
    </item>
    <item>
      <title>유니티 공부 시작</title>
      <link>https://upcake.tistory.com/529</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주부터 유니티 공부를 시작했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 실무에서 자바를 잘 안쓰다보니 흥미가 식기도 했고 부업으로 재밌게 할만한게 뭐가 있을까 고민하다보니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도전하고 싶은게 게임개발이더군요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티 공식 홈페이지 러닝센터에 가이드가 잘 나와있어서 여기서부터 시작해보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learn.unity.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://learn.unity.com&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684481163609&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Learn game development w/ Unity | Courses &amp;amp; tutorials in game design, VR, AR, &amp;amp; Real-time 3D | Unity Learn&quot; data-og-description=&quot;Free tutorials, courses, and guided pathways for mastering real-time 3D development skills to make video games, VR, AR, and more.&quot; data-og-host=&quot;learn.unity.com&quot; data-og-source-url=&quot;https://learn.unity.com/&quot; data-og-url=&quot;https://learn.unity.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bP1WPi/hySGa25wk4/7CDHtfJF5HTTX2wpNCFzkk/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/bxl6zU/hySF85gXz4/JiDBno7xppb91siyzrAKu1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://learn.unity.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.unity.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bP1WPi/hySGa25wk4/7CDHtfJF5HTTX2wpNCFzkk/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/bxl6zU/hySF85gXz4/JiDBno7xppb91siyzrAKu1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Learn game development w/ Unity | Courses &amp;amp; tutorials in game design, VR, AR, &amp;amp; Real-time 3D | Unity Learn&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Free tutorials, courses, and guided pathways for mastering real-time 3D development skills to make video games, VR, AR, and more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.unity.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;1. 빌드 완성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 플레이 스토어 게시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 수익 창출&lt;/p&gt;
&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>일상/일기</category>
      <category>게임개발</category>
      <category>도전</category>
      <category>부업</category>
      <category>유니티</category>
      <author>upcake_</author>
      <guid isPermaLink="true">https://upcake.tistory.com/529</guid>
      <comments>https://upcake.tistory.com/529#entry529comment</comments>
      <pubDate>Fri, 19 May 2023 16:30:05 +0900</pubDate>
    </item>
    <item>
      <title>[III. 객체 지향 원리 적용] 8. IoC, DI, 그리고 컨테이너</title>
      <link>https://upcake.tistory.com/528</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/lecture?courseSlug=%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&amp;amp;unitId=55349&amp;amp;tab=curriculum&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;강의 링크&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 제어의 역전 IoC (Inversion of Control)&lt;/h4&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;- 반면에 AppConfig가 등장한 이후에 구현 객체는 자신의 로직을 실행하는 역할만 담당한다. 프로그램의 제어 흐름은 이제 AppConfig가 가져간다. 예를 들어서 &lt;i&gt;OrderServiceImpl&amp;nbsp;&lt;/i&gt;은 필요한 인터페이스들을 호출하지만 어떤 구현 객체들이 실행될지 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 프로그램에 대한 제어 흐름에 대한 권한은 모두 AppConfig가 가지고 있다. 심지어 &lt;i&gt;OrderServiceImpl&amp;nbsp;&lt;/i&gt;도 AppConfig가 생성한다. 그리고 AppConfig는 &lt;i&gt;OrderServiceImpl&amp;nbsp;&lt;/i&gt;이 아닌 OrderService 인터페이스의 다른 구현 객체를 생성하고 실행할 수 도 있다. 그런 사실도 모른 채 &lt;i&gt;OrderServiceImpl&amp;nbsp;&lt;/i&gt;은 묵묵히 자신의 로직을 실행할 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이렇듯 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)이라 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 프레임워크 vs 라이브러리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프레임워크가 내가 작성한 코드를 제어하고, 대신 실행하면 그것은 프레임워크가 맞다. (JUnit)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 반면에 내가 작성한 코드가 제어의 흐름을 담당한다면 그것은 프레임워크가 아니라 라이브러리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 의존관계 주입 DI (Dependency Injection)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;i&gt;OrderServiceImpl&amp;nbsp;&lt;/i&gt;은 &lt;i&gt;DiscountPolicy&amp;nbsp;&lt;/i&gt;인터페이스에 의존한다. 실제 어떤 구현 객체가 사용될지는 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 의존관계는&amp;nbsp;&lt;b&gt;정적인 클래스 의존 관계와, 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계&amp;nbsp;&lt;/b&gt;둘을 분리해서 생각해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 정적인 클래스 의존관계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클래스가 사용하는 import 코드만 보고 의존관계를 쉽게 판단할 수 있다. 정적인 의존관계는 애플리케이션을 실행하지 않아도 분석할 수 있다. 클래스 다이어그램을 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;i&gt;OrderServiceImpl&amp;nbsp;&lt;/i&gt;은 &lt;i&gt;MemberRepository, DiscountPolicy에&lt;/i&gt; 의존한다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그런데 이러한 클래스 의존관계 만으로는 실제 어떤 객체가 &lt;i&gt;OrderServiceImpl에&lt;/i&gt; 주입될지 알 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPug6d/btr6NlX7AaX/vKTj59V45TxZt9u8bXZck1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPug6d/btr6NlX7AaX/vKTj59V45TxZt9u8bXZck1/img.png&quot; data-alt=&quot;클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPug6d/btr6NlX7AaX/vKTj59V45TxZt9u8bXZck1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPug6d%2Fbtr6NlX7AaX%2FvKTj59V45TxZt9u8bXZck1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;821&quot; height=&quot;571&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 동적인 객체 인스턴스 의존 관계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존 관계다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uHaHN/btr6OrDmGcP/SWjHBBgGWrovTzF6sXK9Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uHaHN/btr6OrDmGcP/SWjHBBgGWrovTzF6sXK9Z1/img.png&quot; data-alt=&quot;객체 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uHaHN/btr6OrDmGcP/SWjHBBgGWrovTzF6sXK9Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuHaHN%2Fbtr6OrDmGcP%2FSWjHBBgGWrovTzF6sXK9Z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;771&quot; height=&quot;239&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;객체 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 애플리케이션 &lt;b&gt;실행 시점(런타임)&lt;/b&gt;에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것을 &lt;b&gt;의존관계 주입&lt;/b&gt;이라 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 객체 인스턴스를 생성하고, 그 참조값을 전달해서 연결된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 의존관계 주입을 사용하면 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. IoC 컨테이너, DI 컨테이너&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- AppConfig처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 IoC 컨테이너 또는 &lt;b&gt;DI 컨테이너&lt;/b&gt;라 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 의존관계 주입에 초점을 맞추어 최근에는 주로 &lt;b&gt;DI 컨테이너&lt;/b&gt;라 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 또는 어셈블러, 오브젝트 팩토리 등으로 불리기도 한다.&lt;/p&gt;</description>
      <category>인프런/스프링 핵심 원리 - 기본편 (김영한)</category>
      <category>Java</category>
      <category>Spring</category>
      <category>김영한</category>
      <category>스프링</category>
      <category>스프링핵심원리</category>
      <category>인프런</category>
      <author>upcake_</author>
      <guid isPermaLink="true">https://upcake.tistory.com/528</guid>
      <comments>https://upcake.tistory.com/528#entry528comment</comments>
      <pubDate>Wed, 29 Mar 2023 15:00:21 +0900</pubDate>
    </item>
    <item>
      <title>[III. 객체 지향 원리 적용] 7. 좋은 객체 지향 설계의 5가지 원칙의 적용</title>
      <link>https://upcake.tistory.com/527</link>
      <description>&lt;p data-ke-size=&quot;size16&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/unit/55348&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;강의 링크&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. SRP 단일&amp;nbsp; 책임 원칙 : 한 클래스는 하나의 책임만 가져야 한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트 객체는 직접 구현 객체를 생성하고, 실행하는 다양한 책임을 가지고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SRP 단일 책임 원칙을 따르면서 관심사를 분리함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구현 객체를 생성하고 연결하는 책임은 AppConfig가 담당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트 객체는 실행하는 책임만 담당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. DIP&amp;nbsp; 의존관계 역전 원칙 : 프로그래머는 &quot;추상화에 의존해야 하지, 구체화에 의존하면 안 된다.&quot; 의존성 주입은 이 원칙을 따르는 방법 중 하나다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 새로운 할인 정책을 개발하고, 적용하려고 하니 클라이언트 코드도 함께 변경해야 했다. 왜냐하면 기존 클라이언트 코드(&lt;i&gt;OrderServiceImpl&lt;/i&gt;)는 DIP를 지키며 &lt;i&gt;DiscountPolicy&amp;nbsp;&lt;/i&gt;추상화 인터페이스에 의존하는 것 같았지만, &lt;i&gt;FixDiscountPolicy&amp;nbsp;&lt;/i&gt;구체화 구현 클래스에도 함께 의존했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트 코드가 &lt;i&gt;DiscountPolicy&amp;nbsp;&lt;/i&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;- AppConfig가 &lt;i&gt;FixDiscountPolicy&lt;/i&gt; 객체 인스턴스를 클라이언트 코드 대신 생성해서 클라이언트 코드에 의존관계를 주입했다. 이렇게해서 DIP 원칙을 따르면서 문제도 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. OCP : 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다형성 사용하고 클라이언트가 DIP를 지킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 애플리케이션을 사용 영역과 구성 영역으로 나눔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AppConfig가 의존관계를 &lt;i&gt;FixDiscountPolicy &amp;rarr; RateDiscountPolicy&amp;nbsp;&lt;/i&gt;로 변경해서 클라이언트 코드에 주입하므로 클라이언트 코드는 변경하지 않아도 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;소프트웨어 요소를 새롭게 확장해도 사용 영역의 변경은 닫혀있다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인프런/스프링 핵심 원리 - 기본편 (김영한)</category>
      <category>Java</category>
      <category>Spring</category>
      <category>김영한</category>
      <category>스프링</category>
      <category>스프링핵심원리</category>
      <category>인프런</category>
      <author>upcake_</author>
      <guid isPermaLink="true">https://upcake.tistory.com/527</guid>
      <comments>https://upcake.tistory.com/527#entry527comment</comments>
      <pubDate>Thu, 9 Feb 2023 14:57:55 +0900</pubDate>
    </item>
    <item>
      <title>[III. 객체 지향 원리 적용] 6. 전체 흐름 정리</title>
      <link>https://upcake.tistory.com/526</link>
      <description>&lt;p data-ke-size=&quot;size16&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/unit/55347?tab=curriculum&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;강의 링크&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;0. 전체 흐름 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;현재까지의 흐름&amp;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;- AppConfig 리팩터링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 새로운 구조와 할인 정책 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 새로운 할인 정책 개발&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 다형성 덕분에 새로운 정률 할인 정책 코드를 추가로 개발하는 것 자체는 아무 문제가 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 새로운 할인 정책 적용과 문제점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 새로 개발한 정률 할인 정책을 적용하려고 하니&amp;nbsp;&lt;b&gt;클라이언트 코드&lt;/b&gt;인 주문 서비스 구현체도 함께 변경해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주문 서비스 클라이언트가 인터페이스인&amp;nbsp;&lt;i&gt;DiscountPolicy&lt;/i&gt; 뿐만 아니라, 구체 클래스인&amp;nbsp;&lt;i&gt;FixDiscountPolicy 도 함께 의존&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&amp;nbsp;&lt;b&gt;=&amp;gt;&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;b&gt;DIP 위반&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 관심사의 분리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 애플리케이션을 하나의 공연으로 생각&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 기존에는 클라이언가 의존하는 서버 구현 객체를&amp;nbsp; 직접 생성하고 실행함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 비유를 하면 기존에는 남자 주인공 배우가 공연도 하고, 동시에 여자 주인공도 직접 초빙하는 다양한 책임을 가지고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 공연을 구성하고, 담당 배우를 섭외하고, 지정하는 책임을 담당하는 별도의&amp;nbsp;&lt;b&gt;공연 기획자&lt;/b&gt;가 나올 시점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 공연 기획자인 AppConfig가 등장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- AppConfig는 애플리케이션의 전체 동작 방식을 구성(config)하기 위해,&amp;nbsp;&lt;b&gt;구현 객체를 생성&lt;/b&gt;하고,&amp;nbsp;&lt;b&gt;연결&lt;/b&gt;하는 책임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이제부터 클라이언트 객체는 자신의 역할을 실행하는 것만 집중, 권한이 줄어듬 (책임이 명확해짐)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. AppConfig 리팩터링&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 구성 정보에서 역할과 구현을 명확하게 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 역할이 잘 들어남&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 중복 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 새로운 구조와 할인 정책 적용&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 정액 할인 정책 &amp;rarr; 정률% 할인 정책으로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- AppConfig의 등장으로 애플리케이션이 크게&amp;nbsp;&lt;b&gt;사용 영역&lt;/b&gt;과, 객체를 생성하고&amp;nbsp;&lt;b&gt;구성(Configuration)하는 영역&lt;/b&gt;으로 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 할인 정책을 변경핻조 AppConfig가 이는 구성 영역만 변경하면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 사용 영역은 변경할 필요가 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 물론 클라이언트 코드인 주문 서비스 코드도 변경하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인프런/스프링 핵심 원리 - 기본편 (김영한)</category>
      <category>Java</category>
      <category>Spring</category>
      <category>김영한</category>
      <category>스프링</category>
      <category>스프링핵심원리</category>
      <category>인프런</category>
      <author>upcake_</author>
      <guid isPermaLink="true">https://upcake.tistory.com/526</guid>
      <comments>https://upcake.tistory.com/526#entry526comment</comments>
      <pubDate>Fri, 20 Jan 2023 10:50:46 +0900</pubDate>
    </item>
    <item>
      <title>[III. 객체 지향 원리 적용] 5. 새로운 구조와 할인 정책 적용</title>
      <link>https://upcake.tistory.com/525</link>
      <description>&lt;p data-ke-size=&quot;size16&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/unit/55346?tab=curriculum&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;강의 링크&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※ 코드는 저작권 상 올릴 수 없다고 합니다 ㅜㅜ&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 새로운 구조와 할인 정책 적용&lt;/h4&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;i&gt;FixDiscountPolicy&lt;/i&gt; &amp;rarr; &lt;i&gt;RateDiscountPolicy&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 어떤 부분만 변경하면 되겠는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; =&amp;gt; &lt;b&gt;AppConfig의 등장으로 애플리케이션이 크게 사용 영역과, 객체를 생성하고 구성(Configuration)하는 영역으로 분리되었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edLXoM/btrWHnjBY1d/JqDqVSSCukDupiNhNKnCv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edLXoM/btrWHnjBY1d/JqDqVSSCukDupiNhNKnCv0/img.png&quot; data-alt=&quot;사용, 구성의 분리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edLXoM/btrWHnjBY1d/JqDqVSSCukDupiNhNKnCv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedLXoM%2FbtrWHnjBY1d%2FJqDqVSSCukDupiNhNKnCv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;459&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용, 구성의 분리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU3Y7F/btrWCcxUsao/AaOhqVFL6QdBFquTNUaAe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU3Y7F/btrWCcxUsao/AaOhqVFL6QdBFquTNUaAe1/img.png&quot; data-alt=&quot;할인 정책의 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU3Y7F/btrWCcxUsao/AaOhqVFL6QdBFquTNUaAe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU3Y7F%2FbtrWCcxUsao%2FAaOhqVFL6QdBFquTNUaAe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;677&quot; height=&quot;459&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;할인 정책의 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;i&gt;FixDiscountPolicy&lt;/i&gt; &amp;rarr; &lt;i&gt;RateDiscountPolicy&lt;/i&gt;로 변경해도 구성 영역만 영향을 받고, 사용 영역은 전혀 영향을 받지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;i&gt;AppConfig&lt;/i&gt;에서 할인 정책 역할을 담당하는 구현을 &lt;i&gt;FixDiscountPolicy&lt;/i&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;RateDiscountPolicy&lt;/i&gt;객체로 변경했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이제 할인 정책을 변경해도, 애플리케이션의 구성 역할을 담당하는 AppConfig만 변경하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 클라이언트 코드인&amp;nbsp;&lt;i&gt;OrderServiceImpl&lt;/i&gt;을 포함해서&amp;nbsp;&lt;b&gt;사용 영역&lt;/b&gt;의 어떤 코드도 변경할 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;nbsp;&lt;b&gt;구성 영역&lt;/b&gt;은 당연히 변경된다. 구성 역할을 담당하는 AppConfig의 애플리케이션이라는 공연의 기획자로 생각하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 공연 기획자는 공연 참여자인 구현 객체들을 모두 알아야 한다.&lt;/p&gt;</description>
      <category>인프런/스프링 핵심 원리 - 기본편 (김영한)</category>
      <category>Java</category>
      <category>Spring</category>
      <category>김영한</category>
      <category>스프링</category>
      <category>스프링핵심원리</category>
      <category>인프런</category>
      <author>upcake_</author>
      <guid isPermaLink="true">https://upcake.tistory.com/525</guid>
      <comments>https://upcake.tistory.com/525#entry525comment</comments>
      <pubDate>Thu, 19 Jan 2023 09:57:37 +0900</pubDate>
    </item>
    <item>
      <title>[III. 객체 지향 원리 적용] 4. AppConfig 리팩터링</title>
      <link>https://upcake.tistory.com/524</link>
      <description>&lt;p data-ke-size=&quot;size16&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/unit/55345?tab=curriculum&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;강의 링크&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;- extract new method : ctrl + alt + m3&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. AppConfig 리팩터링&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 AppConfig를 보면 &quot;&lt;b&gt;중복&lt;/b&gt;&quot;이 있고, &quot;&lt;b&gt;역할&lt;/b&gt;&quot;에 따른 &quot;&lt;b&gt;구현&lt;/b&gt;&quot;이 잘 안보인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K3UTG/btrWCSFoG2b/WOBVSIzakP162zL7LczcRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K3UTG/btrWCSFoG2b/WOBVSIzakP162zL7LczcRk/img.png&quot; data-alt=&quot;기대하는 그림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K3UTG/btrWCSFoG2b/WOBVSIzakP162zL7LczcRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK3UTG%2FbtrWCSFoG2b%2FWOBVSIzakP162zL7LczcRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1006&quot; height=&quot;675&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기대하는 그림&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 중복을 제거하고, 역할에 따른 구현이 보이도록 리팩터링한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- new MemoryMemberRepository() 부분이 중복 제거되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이제 MemoryMemberRepository를 다른 구현체로 변경할 때 한 부분만 변경하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- AppConfig를 보면 역할과 구현 클래스가 한 눈에 들어온다. 애플리케이션 전체 구성이 어떻게 되어있는지 빠르게 파악할 수 있다.&lt;/p&gt;</description>
      <category>인프런/스프링 핵심 원리 - 기본편 (김영한)</category>
      <category>Java</category>
      <category>Spring</category>
      <category>김영한</category>
      <category>스프링</category>
      <category>스프링핵심원리</category>
      <category>인프런</category>
      <author>upcake_</author>
      <guid isPermaLink="true">https://upcake.tistory.com/524</guid>
      <comments>https://upcake.tistory.com/524#entry524comment</comments>
      <pubDate>Thu, 19 Jan 2023 09:49:58 +0900</pubDate>
    </item>
    <item>
      <title>[10일차][프로그래머스, 120843번, Lv. 0] 공 던지기</title>
      <link>https://upcake.tistory.com/523</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R7yWW/btrUSwdHiKZ/glGDjuP2nO9z6mawSSjcdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R7yWW/btrUSwdHiKZ/glGDjuP2nO9z6mawSSjcdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R7yWW/btrUSwdHiKZ/glGDjuP2nO9z6mawSSjcdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR7yWW%2FbtrUSwdHiKZ%2FglGDjuP2nO9z6mawSSjcdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;633&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;633&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqznHv/btrUWaHwuPm/E1aFNsbwf1vmPsyNpzlGVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqznHv/btrUWaHwuPm/E1aFNsbwf1vmPsyNpzlGVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqznHv/btrUWaHwuPm/E1aFNsbwf1vmPsyNpzlGVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqznHv%2FbtrUWaHwuPm%2FE1aFNsbwf1vmPsyNpzlGVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;523&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;내 풀이&lt;/h4&gt;
&lt;pre id=&quot;code_1672386696427&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int solution(int[] numbers, int k) {
        int index = 0;
        int answer = 0;
        for(int i = 0; i &amp;lt; k; i++) {
            answer = numbers[index];
            index += 2;
            
            if(index &amp;gt;= numbers.length) {
                index -= numbers.length;
            }
        }
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;채점 결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb8Ezj/btrUXpxFMd7/HXZy8JHozhtdBhL2aLODG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb8Ezj/btrUXpxFMd7/HXZy8JHozhtdBhL2aLODG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb8Ezj/btrUXpxFMd7/HXZy8JHozhtdBhL2aLODG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb8Ezj%2FbtrUXpxFMd7%2FHXZy8JHozhtdBhL2aLODG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;381&quot; height=&quot;276&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;피드백&lt;/h4&gt;
&lt;pre id=&quot;code_1672386752405&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int solution(int[] numbers, int k) {
        return (k-1)*2 % numbers.length+1;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 공부/코딩테스트</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>코딩테스트</category>
      <category>프로그래머스</category>
      <author>upcake_</author>
      <guid isPermaLink="true">https://upcake.tistory.com/523</guid>
      <comments>https://upcake.tistory.com/523#entry523comment</comments>
      <pubDate>Fri, 30 Dec 2022 16:52:54 +0900</pubDate>
    </item>
    <item>
      <title>[III. 객체 지향 원리 적용] 3. 관심사의 분리</title>
      <link>https://upcake.tistory.com/522</link>
      <description>&lt;p data-ke-size=&quot;size16&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/unit/55344&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;강의 링크&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※ 코드는 저작권 상 올릴 수 없다고 합니다 ㅜㅜ&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 관심사의 분리&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 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;h4 data-ke-size=&quot;size20&quot;&gt;2. 관심사를 분리하자&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 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;h4 data-ke-size=&quot;size20&quot;&gt;3. AppConfig 등장&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 애플리케이션의 전체 동작 방식을 구성(config)하기 위해, &lt;b&gt;구현 객체를 생성&lt;/b&gt;하고, &lt;b&gt;연결&lt;/b&gt;하는 책임을 가지는 별도의 설정 클래스를 만들자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AppConfig 클래스 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AppConfig는 애플리케이션의 실제동작에 필요한 &lt;b&gt;구현 객체를 생성&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * MemberServiceImpl&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * MemoryMemberRepository&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * OrderServiceImpl&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * FixDiscountPolicy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AppConfig는 생성한 객체 인스턴스의 참조(레퍼런스)를 통해서 &lt;b&gt;생성자를 통해 주입(연결)&lt;/b&gt;해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * MemberServiceImpl &amp;rarr; MemoryMemberRepository&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * OrderServiceImpl &amp;rarr; MemoryMemberRepository, FixDiscountPolicy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 생성자 주입으로 변경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MemberServiceImpl 생성자 주입으로 바꾼다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * 설계변경으로 MemberServiceImpl은 MemoryMemberRepository를 의존하지 않는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * 단지 MemberRepository 인터페이스에만 의존한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * MemberServiceImpl 입장에서 생성자를 통해 어떤 구현 객체가 들어올지(주입될지)는 알 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * MemberServiceImpl 의 생성자를 통해서 어떤 구현 객체를 주입할지는 오직 외부(AppConfig)에서 결정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * MemberServiceImpl 은 이제부터&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;의존관계에 대한 고민은 외부&lt;/b&gt;에 맡기고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;실행에만 집중&lt;/b&gt;하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpzDKv/btrUQa8fKPh/qEDZzv8NePF4mRo26EvWJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpzDKv/btrUQa8fKPh/qEDZzv8NePF4mRo26EvWJ0/img.png&quot; data-alt=&quot;클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpzDKv/btrUQa8fKPh/qEDZzv8NePF4mRo26EvWJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpzDKv%2FbtrUQa8fKPh%2FqEDZzv8NePF4mRo26EvWJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;619&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;619&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;- 객체의 생성과 연결은 AppConfig가 담당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;DIP 완성&lt;/b&gt; : MemberServiceImpl은 MemberRepository인 추상에만 의존하면 된다. 이제 구체 클래스를 몰라도 된다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvIckj/btrURo6cQD3/i5M5ETxO83xlR2gj7l3wtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvIckj/btrURo6cQD3/i5M5ETxO83xlR2gj7l3wtk/img.png&quot; data-alt=&quot;회원 객체 인스턴스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvIckj/btrURo6cQD3/i5M5ETxO83xlR2gj7l3wtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvIckj%2FbtrURo6cQD3%2Fi5M5ETxO83xlR2gj7l3wtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1052&quot; height=&quot;437&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;437&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;- appConfig 객체는 memoryMemberRepository 객체를 생성하고 그 참조값을 memberServiceImpl을 생성하면서 생성자로 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트인 memberServiceImpl 입장에서 보면 의존관계를 마치 외부에서 주입해주는 것 같다고 해서 DI(Dependency Injection) 우리말로 의존관계 주입 또는 의존성 주입이라 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OrderServiceImpl도 생성자 주입으로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * 설계 변경으로 OrderServiceImpl은 FixDiscountPolicy를 의존하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * 단지 DiscsoutPolicy 인터페이스만 의존한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * OrderServiceImpl 입장에서 생성자를 통해 어떤 구현 객체가 들어올지(주입될지)는 알 수 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * OrderServiceImpl 의 생성자를 통해서 어떤 구현 객체를 주입할지는 오직 외부(AppConfig)에서 결정한다,.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * OrderServiceImpl은 이제부터 실행에만 집중하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; * OrderServiceImpl에는 MemoryMemberRepository, FixDIscountPolicy 객체의 의존관계가 주입된다.&lt;/p&gt;</description>
      <category>인프런/스프링 핵심 원리 - 기본편 (김영한)</category>
      <category>Java</category>
      <category>Spring</category>
      <category>김영한</category>
      <category>스프링</category>
      <category>스프링핵심원리</category>
      <category>인프런</category>
      <author>upcake_</author>
      <guid isPermaLink="true">https://upcake.tistory.com/522</guid>
      <comments>https://upcake.tistory.com/522#entry522comment</comments>
      <pubDate>Wed, 28 Dec 2022 17:57:16 +0900</pubDate>
    </item>
  </channel>
</rss>