<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>소스 코드를 기록하는 남자</title>
    <link>https://guy-who-writes-sourcecode.tistory.com/</link>
    <description>삼성 청년 소프트웨어 아카데미 2기 수료
42서울 - 3기 piscine 수료
2020년 카카오 여름 Tech 인턴</description>
    <language>ko</language>
    <pubDate>Wed, 13 May 2026 07:50:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dev-sh</managingEditor>
    <image>
      <title>소스 코드를 기록하는 남자</title>
      <url>https://tistory1.daumcdn.net/tistory/3182919/attach/e0dff17cbe9a4335bf9bfca3e2e11603</url>
      <link>https://guy-who-writes-sourcecode.tistory.com</link>
    </image>
    <item>
      <title>Java Test Case @Before 어노테이션 실행이 안될때</title>
      <link>https://guy-who-writes-sourcecode.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;본 포스팅은 필자가 한참 헤매서 작성하며, 혹여라도 길 잃은 영혼이 이 포스팅을 보고 해결되었으면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;저는 Intellij IDE 를 사용하며, 스프링 레거시 프로젝트를 진행하면서 공부하던 와중에 테스트 케이스를 작성 중에 @Before가 동작하지 않는 문제점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;@Before 어노테이션이 동작하기 위해서는 기본적으로 필요한 @Test 어노테이션은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;1.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;&lt;b&gt;import org.junit.Test;&lt;/b&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;&lt;span&gt;자동으로 import된 @Test 어노테이션은 ?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. import org.junit.jupiter.api.Test;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;따라서 Test import 문을 1번으로 변경해주시면 @Before가 잘 동작할 것입니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>@Before</category>
      <category>@Test</category>
      <category>Java</category>
      <category>junit4</category>
      <category>testcase</category>
      <author>dev-sh</author>
      <guid isPermaLink="true">https://guy-who-writes-sourcecode.tistory.com/48</guid>
      <comments>https://guy-who-writes-sourcecode.tistory.com/48#entry48comment</comments>
      <pubDate>Tue, 12 Jan 2021 01:37:28 +0900</pubDate>
    </item>
    <item>
      <title>2020년 12월 14일 : 내가 0순위</title>
      <link>https://guy-who-writes-sourcecode.tistory.com/47</link>
      <description>&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&quot;나를 사랑하게&quot;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;참 많은 책들이 자존감에 대해서 다룬다. 그만큼 스스로를 사랑하는 것, 자존감을 높히는 것은 꾸준하게 중요시되어 왔다는 이야기다. 한국의 정서를 생각해보면, 나보다 남을 배려하는 것에 대한 중요성을 더 강조하다. 자연스럽게, 그러한 분위기 속에서 커 온 사람들은 자신을 낮추더라도 남을 배려한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;미국에서 1년동안 살면서 못해도 500명 이상의 다양한 사람들을 만났었다. 이 때 많은 사람들이 자신이 뚱뚱하다고, 자신이 못생겼다고, 자신이 공부를 못한다고, 부족하더라도 스스로를 사랑하는 사람들이 과반수이상이었다. 하지만, 한국에 와서 많은 사람들과 이야기를 하면서 충분히 매력적이고, 자존감을 가져도 충분한 사람들이 스스로를 낮추고, 비판하며 스스로를 사랑하는 않는 경우가 많았다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;나를 사랑하지 못하는데, 누굴 사랑할 수 있을까? 그러니 나에게 집중하고, 자신을 가장 중요하게 생각하고 소중하게 여기자. 남에게 나의 가치를 인정받으려고 하지 않고, 내가 내 가치를 인정하고 귀하고 멋지다고 생각하자. 그럼 나의 여유로움이 넘쳐나며, 남들에게 자연스럽게 흘러나갈 것이다.&lt;/p&gt;</description>
      <category>매일 한마디</category>
      <category>0순위</category>
      <category>글귀</category>
      <category>나를 사랑하게</category>
      <category>자존감</category>
      <category>하루 한마디</category>
      <author>dev-sh</author>
      <guid isPermaLink="true">https://guy-who-writes-sourcecode.tistory.com/47</guid>
      <comments>https://guy-who-writes-sourcecode.tistory.com/47#entry47comment</comments>
      <pubDate>Mon, 14 Dec 2020 10:20:56 +0900</pubDate>
    </item>
    <item>
      <title>2020년 12월 13일 : 나의 말은 나를 대변해</title>
      <link>https://guy-who-writes-sourcecode.tistory.com/46</link>
      <description>&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&quot;본인의 가치는 본인이 만드는 것&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;말이라는 것은 본인을 대변한다. 내가 말을 거칠게 한다면 나는 거친 사람이 되고, 부드럽게 한다면 부드러운 사람이며, 품위있게 말한다면 품위있는 사람이 된다. 이처럼 말이라는 것은 나 자신의 대표하는 브랜드이다. 내가 아무리 마음이 여리다한들 입 밖으로 내뱉는 말이 거칠다면, 다른 사람들의 눈에는 거칠게 보일뿐이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;모든 관계는 말로부터 시작한다. 세상에 둘러보면 말없이 시작된 관계는 사실 찾아보기 힘들다. 따라서 이러한 관계에서 가장 큰 부분을 차지하는 것은 말이 아닌가 생각한다. 그래서 말을 할 때는 단순히 내 생각과 입장만 전달하는 것에 초점을 맞추는 것이 아니라 상대의 마음과 권리에 위협이 가지 않도록 현명하게 이야기하는 것이 중요하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;말의 힘은 강력하다. 내가 가질수 있는 능력 중에 가장 강력한 능력이라 생각한다. 따라서, 늘 감사함을 표하고, 예쁜 말을 함으로써 스스로를 명품으로 만들었으면 한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>매일 한마디</category>
      <category>가치</category>
      <category>글귀</category>
      <category>말이라는 것</category>
      <category>명품</category>
      <category>좋은 말</category>
      <author>dev-sh</author>
      <guid isPermaLink="true">https://guy-who-writes-sourcecode.tistory.com/46</guid>
      <comments>https://guy-who-writes-sourcecode.tistory.com/46#entry46comment</comments>
      <pubDate>Sun, 13 Dec 2020 11:16:20 +0900</pubDate>
    </item>
    <item>
      <title>2020년 12월 12일 : 매일 한마디의 시작</title>
      <link>https://guy-who-writes-sourcecode.tistory.com/45</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;나는 나를 위해 예쁜 말을 한다.&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;누구나 존중받고자 한다. 내 노력을 인정받고자 하고, 무리에서 괜찮은 사람으로 보이고자 한다. 이런 본능은 많은 사람들에게 있는 본능이다. 따라서 쟁취하기 위한 싸움을 한다. 이 과정에서 다칠수도 있고, 다치게 할 수도 있다. 하지만 곰곰히 생각해보면 나의 가치를 인정받는 것은 다른 사람에 의해 검증될 수 없다. 다른 사람이 백날 너는 너는 소중하다 소중한다한들 내가 나를 소중히 여기지 않는다면 나는 스스로 이미 소중하지 않은 사람이라는 결론을 내렸기 때문이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러니 스스로에게 귀를 기울여 &quot;나는 소중한 사람이다&quot; 를 하루에 한번씩 이야기해주자. 또 내가 소중한 사람이라면 나를 위해 예쁜 말을 하자. 말이라는 것은 내뱉는 순간부터 부메랑이 던져진 것이다. 내가 이쁜 말을 내뱉았다면 부메랑은 이쁜 부메랑으로 날라갈 것이다. 하지만 칼같은 말을 뱉는다면 나에게 칼이 되어 돌아온다. 그러니 말하기 전에 내가 지금 할 이 말이 다시 나에게 돌아올 때, 내가 잡을수 있는 부메랑인지 아닌지 또 생각하고 생각해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;오늘도 잘하고 있어&quot;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>매일 한마디</category>
      <category>매일</category>
      <category>예쁜 말</category>
      <category>좋은 말</category>
      <category>한마디</category>
      <author>dev-sh</author>
      <guid isPermaLink="true">https://guy-who-writes-sourcecode.tistory.com/45</guid>
      <comments>https://guy-who-writes-sourcecode.tistory.com/45#entry45comment</comments>
      <pubDate>Sat, 12 Dec 2020 20:26:38 +0900</pubDate>
    </item>
    <item>
      <title>도서 추천 : 예쁘게 말을 하니 좋은 사람들이 왔다 &amp;lt;심희정 지음&amp;gt;</title>
      <link>https://guy-who-writes-sourcecode.tistory.com/44</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biBfzh/btqPRBYbtVZ/YYnfehOwTLiVSY5yktcBf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biBfzh/btqPRBYbtVZ/YYnfehOwTLiVSY5yktcBf1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biBfzh/btqPRBYbtVZ/YYnfehOwTLiVSY5yktcBf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiBfzh%2FbtqPRBYbtVZ%2FYYnfehOwTLiVSY5yktcBf1%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마음을 울리는 책 이름 : &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;예쁘게 말을 하니 좋은 사람들이 왔다.&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;취업 준비를 하며 방에서 갇혀지내며 전공 서적만 본 게 어연 3개월은 된 것 같다. 생각보다 바쁜 삶에 치여서 숨쉴 공간이 필요했던 나는 인천 영종도에 있는 친구집으로 잠시 휴가아닌 휴가, 장소의 변화를 주고자 왔고, 마침 딱! 친구의 책장에 보인 책 한권이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;예쁘게 말을 하니 좋은 사람들이 왔다&quot;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가슴에 책 제목이 꿈틀하고 들어온 느낌이였다. 그래서 친구 집에 있으면서 꼭 읽어야겠다는 다짐이 들었고, 오늘 공부에 집중이 잘 되지않던 찰나에 이 책을 읽어보자 내 책상에 가져왔다. 책을 펴자마자 좋은 느낌이 몽글몽글 나를 감싸는 느낌이 들었고, 책을 내려놓을 틈없이 집중해서 읽게 되었다. 하나하나 모든 말들이 나에게 변화를 주는 느낌이였다. 4시간동안의 짧다면 짧고 길다면 긴 여정을 끝내고 책을 내려놓았을때 아! 다른 사람들도 읽었으면 좋겠다. 이 책이 나에게 주는 좋은 메시지가 많은 사람들에게 전파됐으면 좋겠다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;많은 사람들이 이 책을 보고 세상이 아름다워지면 얼마나 좋을까 하는 마음이 들었고, 난생 처음 자발적인 독후감을 써본다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 책의 저자 '심희정'님은 기자라는 직업을 가지고 있다. 지금 많은 기사들을 보면 상당히 자극적이고 공격적으로 기사를 작성하기에, 나도 모르게 기자라는 직업에 대해서 부드러운 언행보다 날카롭고 공격적인 부분이 많다는 생각을 가지고 있었는데, 이러한 직업을 가지고도 이러한 품성과 언행을 가지게 된 심희정님에게 큰 존경심이 든다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;본론으로 들어가서, 책을 읽으면서 인상을 받은 몇가지 부분에 대해서 이야기해보도록 하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 책은 예쁜 말을 어떻게 할 것인가에 대한 부분보다 나를 &quot;어떻게 Better Person이 되게 하는가!&quot;에&amp;nbsp; 좀 더 초점이 맞춰져 있던 것 같다. 우리는 현재 칭찬에 인색한 시대에 살고 있음에도 불구하고 사실 예쁜 말을 하는 것은 어렵지 않다. 한번 더 생각하고 말을 하면 되지 않는가?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 이 책에서는 단순히 예쁜 말을 하는 것보다, 나를 어떻게 변화시켜야 하는가에 초점이 맞춰져 있기에, 더 예쁜 말을 하기 위해서 내가 가져야 하는 심성이 무엇인가? 내가 사람을 어떻게 관심해야 하는가? 에 대한 내용에 대해서 많은 부분 저자의 경험담과 충고가 담겨있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마음을 담은 칭찬을 하자&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;칭찬이라는 부분에 대해서 이야기해보자. 이 책을 읽으면서 나 스스로 내가 칭찬을 하는 사람인가 되돌아봤을때 전혀 아니였다. 되려 좀 더 객관적인 부분을 보고자 했고, 타인이 잘하는 부분이 분명히 있음에도 불구하고 못하는 부분에 대해서만 이야기하였다. 또 생각해보면, 취업을 준비하는 과정에서 많은 프로젝트에서 팀장을 했었는데, 프로젝트 과정에서 팀원들의 역량을 이끌어내는게 사실 매번 힘들었다. 왜 힘들었을까? 사실 나는 그들의 장점을 이끌어내려고 노력했는가에 대한 질문을 받는다면 아니요.. 라는 말을 할 것 같다. 팀원들을 관심하고 진실로 믿음을 가지고 그들의 장점을 이해하려고 주의깊게 봤다면 충분히 화이팅 넘치는 프로젝트를 했을것이고, 좋은 결과를 얻었을 것이라 생각한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;듣는 태도의 중요성&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사실 이미 많은 대화 관련 책들에서 가장 많이 다루는 주제는 듣는 태도가 아닐까 한다. 자기 계발서로 여러 책들을 읽어보았을때 듣기라는 부분이 사실 말하기보다 더 중요하다는 것은 이미 알고 있었다. 알고 있음에도 불구하고 나를 되돌아보면 대화에서 항상 내가 말이 많았던 편이다. 이 뿐만 아니라 대화에서 내가 관심이 없는 내용이 나오면 그들이 말하고 있음에도 불구하고 불성실한 불량학생처럼 듣고, 주제를 돌려버리기 일수였다. 아 정말 최악이다. 이 책은 상대방이 이야기할때 진심이라는 부분을 매우 강조한다. 진심이 없는 맞장구는 네거티브 바디 제스쳐로 하는것만 못하다. 아주 간단한 &quot;아 정말?&quot; &quot;아 진짜?&quot; &quot;처음들어&quot; &quot;대박&quot; 이러한 맞장구도 진심이 담긴다면 상대방을 신나게 하고 당신의 대화를 행복한 시간으로 만들어줄 것이라는 내용을 담고 있었다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나를 관심하자&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사실 모든 건강한 언행은 나의 건강한 마음에서 나온다. 내 스스로가 건강한 사람이어야 예쁜 말, 또 타인에게 진심으로 관심을 가지며 대화를 할 수 있다는 것이다. 먼저 스스로를 사랑하고 자존감을 높히는 것이 좋은 대화의 첫걸음이라는 것을 이야기하는데 나는 깊이 공감한다. 운동을 하여 체력을 기르고, 내가 좋아하는 몸을 만들고 옷을 사고 옷을 입었을 때 스스로가 느끼는 만족감이 높았을 때를 생각해보면, 나는 꽤 예쁜 말들을 했던 것 같다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마지막으로, 4년만에 전공서적 이외의 책을 읽어보는데, 한 달에 두 권은 꼭 다른 책들을 읽어야겠다는 생각이 들었다. 먼가 책을 읽는 목적성을 두기보다 이러한 자극적인 세상의 컨텐츠에서 아름다운 글들을 읽는다는 것은 나에게 하나의 힐링이 될 것이다 라는 믿음으로 자리 잡았다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;http://book.interpark.com/product/BookDisplay.do?_method=detail&amp;amp;sc.shopNo=0000400000&amp;amp;sc.prdNo=320884331&amp;amp;sc.saNo=003002001&amp;amp;bid1=search&amp;amp;bid2=product&amp;amp;bid3=title&amp;amp;bid4=001&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;book.interpark.com/product/BookDisplay.do?_method=detail&amp;amp;sc.shopNo=0000400000&amp;amp;sc.prdNo=320884331&amp;amp;sc.saNo=003002001&amp;amp;bid1=search&amp;amp;bid2=product&amp;amp;bid3=title&amp;amp;bid4=001&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607683032730&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;싸니까 믿으니까 인터파크도서&quot; data-og-description=&quot;그중 잘 풀리는 사람, 인정받는 사람, 사랑받는 사람, 장수하는 사람 등 다양한 방식으로 사회적 성공을 이룬 이들을 지켜봤습니다. 처음에는 그저 운이 좋은 줄, 금수저인 줄 알았습니다. 그러&quot; data-og-host=&quot;book.interpark.com&quot; data-og-source-url=&quot;http://book.interpark.com/product/BookDisplay.do?_method=detail&amp;amp;sc.shopNo=0000400000&amp;amp;sc.prdNo=320884331&amp;amp;sc.saNo=003002001&amp;amp;bid1=search&amp;amp;bid2=product&amp;amp;bid3=title&amp;amp;bid4=001&quot; data-og-url=&quot;http://book.interpark.com/product/BookDisplay.do?_method=detail&amp;amp;sc.shopNo=0000400000&amp;amp;sc.prdNo=320884331&amp;amp;sc.saNo=003002001&amp;amp;bid1=search&amp;amp;bid2=product&amp;amp;bid3=title&amp;amp;bid4=001&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bltFj6/hyIwEf6csc/SewSFWS9MhJi9oAjGdK9s0/img.jpg?width=750&amp;amp;height=3750&amp;amp;face=0_0_750_3750,https://scrap.kakaocdn.net/dn/cCk7na/hyIxjg6gSG/y2au6ZC9uLI56rs2X9MjLk/img.jpg?width=300&amp;amp;height=439&amp;amp;face=0_0_300_439&quot;&gt;&lt;a href=&quot;http://book.interpark.com/product/BookDisplay.do?_method=detail&amp;amp;sc.shopNo=0000400000&amp;amp;sc.prdNo=320884331&amp;amp;sc.saNo=003002001&amp;amp;bid1=search&amp;amp;bid2=product&amp;amp;bid3=title&amp;amp;bid4=001&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://book.interpark.com/product/BookDisplay.do?_method=detail&amp;amp;sc.shopNo=0000400000&amp;amp;sc.prdNo=320884331&amp;amp;sc.saNo=003002001&amp;amp;bid1=search&amp;amp;bid2=product&amp;amp;bid3=title&amp;amp;bid4=001&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bltFj6/hyIwEf6csc/SewSFWS9MhJi9oAjGdK9s0/img.jpg?width=750&amp;amp;height=3750&amp;amp;face=0_0_750_3750,https://scrap.kakaocdn.net/dn/cCk7na/hyIxjg6gSG/y2au6ZC9uLI56rs2X9MjLk/img.jpg?width=300&amp;amp;height=439&amp;amp;face=0_0_300_439');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;싸니까 믿으니까 인터파크도서&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;그중 잘 풀리는 사람, 인정받는 사람, 사랑받는 사람, 장수하는 사람 등 다양한 방식으로 사회적 성공을 이룬 이들을 지켜봤습니다. 처음에는 그저 운이 좋은 줄, 금수저인 줄 알았습니다. 그러&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;book.interpark.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>읽어보니 또 읽게 되더라</category>
      <category>기사</category>
      <category>도서 추천</category>
      <category>독후감</category>
      <category>심희정</category>
      <category>예쁘게 말을 하니 좋은 사람들이 왔다</category>
      <category>예쁜 말</category>
      <author>dev-sh</author>
      <guid isPermaLink="true">https://guy-who-writes-sourcecode.tistory.com/44</guid>
      <comments>https://guy-who-writes-sourcecode.tistory.com/44#entry44comment</comments>
      <pubDate>Fri, 11 Dec 2020 19:37:54 +0900</pubDate>
    </item>
    <item>
      <title>백준 11066번 : 파일 합치기 [Java]</title>
      <link>https://guy-who-writes-sourcecode.tistory.com/43</link>
      <description>&lt;p&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://www.acmicpc.net/problem/11066&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.acmicpc.net/problem/11066&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607593988954&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;11066번: 파일 합치기&quot; data-og-description=&quot;소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/11066&quot; data-og-url=&quot;https://www.acmicpc.net/problem/11066&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dI97q6/hyIwsF0bZl/SJj7LXvQ1e1FbssOkXllmk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11066&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/11066&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dI97q6/hyIwsF0bZl/SJj7LXvQ1e1FbssOkXllmk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;11066번: 파일 합치기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DP 문제는 쉬워도 점화식 세우는 부분에서 항상 어려움을 겪는다.&lt;/p&gt;
&lt;p&gt;알고나면 별거 아닌데, 막상 접하면 어렵다.&lt;/p&gt;
&lt;p&gt;이 블로그까지 찾아왔다는 이야기는 이 전에 이미 풀이를 작성한 블로그에서 보여주는 풀이가 이해하는 부분에 있어서 헤매다 왔을것이라 생각한다. 한번 잘 설명해보겠다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;파일 합치기는 메모이제이션 문제임으로 점화식을 세울 필요성이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;따라서 먼저 식에 대한 정의가 필요하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;dp[ i ][ j ] 를 무엇이라 정의할 것인가?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;dp[ i ][ j ]는 i번 페이지부터 j번 페이지까지 페이지를 합한 최솟값이라 정의하겠다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;점화식?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;우선적으로 dp[ i ][ i ] 일때 생각해보자. i페이지부터 i페이지까지의 합은 즉 i번째 페이지의 값인 novel[ i ] 가 될 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;그럼 dp[ i ][ i + 1] 은?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;dp[ i ][ i + 1 ]은 novel[ i ] + novel[ i + 1 ] 이 될것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;그럼 dp[ i ][ i + 2]는 어떻게 될 것이냐?&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;dp[i][i] + dp[i+1][i+2] + (novel[i]&amp;nbsp; + novel[i + 1] + novel[i + 2]) , dp[i][i+1] + dp[i + 2][i + 2] + (novel[i] + novel[i + 1] + novel[i + 2]) 값중에 작은 값이 되지 않겠는가?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;이를 다시 점화식으로 풀어보자.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;dp[i][j] = divide가 i + 1 부터 시작해서 j - 1까지 순회하면서 비교했을때 dp[i][i + divide] + dp[divide + 1][j] + sum(i부터 j까지 부분합) 이 될 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 페이지를 묶어내야 함으로 두장씩 묶고, 세장씩 묶는 과정들이 필요하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1607598839323&quot; class=&quot;java&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for 1장부터 n장까지 묶기 n &amp;lt;= k(몇장을 묶을것인가?
	for 1부터 k까지 from + n &amp;lt;= k  (어디부터 묶기 시작할것인가)
    		for 1부터 k까지 divide &amp;lt; from + n (범위가 주어졌을때 특정 지점으로 나눠서 최대값 구하기)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 위와 같은 3차원 반복문이 나올것이다. 이를 코드화하면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1607598875978&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int n = 1; n &amp;lt;= k; n++) {
    for (int from = 1; from + n &amp;lt;= k; from++) {
        int to = from + n;
        dp[from][to] = Integer.MAX_VALUE;
        for (int divide = from; divide &amp;lt; to; divide++) {
            dp[from][to] = Math.min(dp[from][to], dp[from][divide] + dp[divide + 1][to] + sum[to] - sum[from - 1]);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위와 같이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1607599079852&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringTokenizer st = null;

    public static void main(String[] args) throws Exception {
        int t;

        t = Integer.parseInt(br.readLine());
        for (int tc = 0; tc &amp;lt; t; tc++) {
            int k;
            int[] novel;
            int[] sum;
            int[][] dp;

            k = Integer.parseInt(br.readLine());
            novel = new int[k + 1];
            dp = new int[k + 1][k + 1];
            sum = new int[k + 1];

            st = new StringTokenizer(br.readLine());
            for (int i = 1; i &amp;lt;= k; i++) {
                novel[i] = Integer.parseInt(st.nextToken());
                sum[i] = sum[i - 1] + novel[i];
            }

            for (int n = 1; n &amp;lt;= k; n++) {
                for (int from = 1; from + n &amp;lt;= k; from++) {
                    int to = from + n;
                    dp[from][to] = Integer.MAX_VALUE;
                    for (int divide = from; divide &amp;lt; to; divide++) {
                        dp[from][to] = Math.min(dp[from][to], dp[from][divide] + dp[divide + 1][to] + sum[to] - sum[from - 1]);
                    }
                }
            }

            System.out.println(dp[1][k]);
        }

    }
    /**
     * memoization dp
     * 점화식
     * dp[i][j] = i부터 j장까지 합치는 비용
     * dp[i][i] = novel[i]
     * dp[i][i + 1] = novel[i] + novel[i+1]
     */

}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/백준</category>
      <category>11066번</category>
      <category>dp</category>
      <category>메모이제이션</category>
      <category>백준</category>
      <category>파일합치기</category>
      <author>dev-sh</author>
      <guid isPermaLink="true">https://guy-who-writes-sourcecode.tistory.com/43</guid>
      <comments>https://guy-who-writes-sourcecode.tistory.com/43#entry43comment</comments>
      <pubDate>Thu, 10 Dec 2020 20:18:23 +0900</pubDate>
    </item>
    <item>
      <title>백준 6087번 : 레이저 통신 [Java]</title>
      <link>https://guy-who-writes-sourcecode.tistory.com/42</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/6087&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.acmicpc.net/problem/6087&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607499761562&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;6087번: 레이저 통신&quot; data-og-description=&quot;크기가 1&amp;times;1인 정사각형으로 나누어진 W&amp;times;H 크기의&amp;nbsp;지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/6087&quot; data-og-url=&quot;https://www.acmicpc.net/problem/6087&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bCvLED/hyIvfUMafX/lJkHuOnzERmkqxOlBiI8jK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/6087&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/6087&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bCvLED/hyIvfUMafX/lJkHuOnzERmkqxOlBiI8jK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;6087번: 레이저 통신&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;크기가 1&amp;times;1인 정사각형으로 나누어진 W&amp;times;H 크기의&amp;nbsp;지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;전형적인 백트래킹 문제다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;문제의 요점은 탐색 + 백트래킹 장치를 거는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서 백트래킹 장치라는 것은 레이저를 회전시키는 최소 횟수를 구하는 것이니, 회전이라는 것은 탐색하면서 방향을 트는 횟수가 최소가 되게 하면 된다는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;따라서 주어진 지도와 같은 크기의 turnCnt 배열을 생성한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;탐색하는 과정에서 특정 위치 x, y에 도착하였을때 지금까지 방향을 몇 번 틀었나 체크를 해주게 되고, 이 방향 튼 횟수를 turnCnt[x][y]에 기록하면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;글로 보면 이해가 안될것이다. 예제를 하나 들어보자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예를 들어 아래와 같은 입력이 주어진다고 하자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1607500110566&quot; class=&quot;java&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;4 4
C.**
..**
....
...C&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 turnCnt 배열의 초기값은 최대값으로 해준다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 95px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 19px;&quot;&gt;&lt;b&gt;INT_MAX&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;시작 위치는 왼쪽 상단 C 위치인 (0, 0) 부터 시작하여 도착 위치인 (3, 3)으로 이동하면서 체크해야 할 부분은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1, 4방향 탐색을 진행한다.&lt;/p&gt;
&lt;p&gt;2. 다음 좌표에까지&lt;b&gt; 방향 전환 횟수가 지금까지 오면서 꺽은 횟수보다 많거나 같으면 갱신하면서 재 탐색&lt;/b&gt;해준다.&lt;/p&gt;
&lt;p&gt;3. 그렇지 않으면 이전으로 가서 다시 탐색한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1607500606354&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[0, 2147483647, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]

[0, 1, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]

[0, 1, 2147483647, 2147483647]
[2147483647, 2, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 2147483647, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 2147483647, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 2147483647]
[2147483647, 2147483647, 2147483647, 2147483647]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[2147483647, 2147483647, 2147483647, 2147483647]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[2147483647, 2147483647, 2147483647, 6]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[2147483647, 2147483647, 6, 6]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[2147483647, 7, 6, 6]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[7, 7, 6, 6]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[7, 6, 6, 6]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[7, 6, 6, 6]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[4, 6, 6, 6]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[4, 5, 6, 6]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[4, 5, 5, 6]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 5, 5, 5]
[4, 5, 5, 5]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[4, 2, 5, 5]
[4, 5, 5, 5]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 5, 5]
[4, 5, 5, 5]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 5, 5]
[4, 5, 5, 5]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 5, 5]
[4, 5, 5, 5]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 5, 5]
[4, 5, 5, 5]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 5, 5]
[4, 5, 5, 5]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 3, 5]
[4, 5, 5, 5]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 3, 3]
[4, 5, 5, 5]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 3, 3]
[4, 5, 5, 4]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 3, 3]
[4, 5, 4, 4]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 3, 3]
[4, 5, 4, 4]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 3, 3]
[4, 2, 4, 4]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 3, 3]
[3, 2, 4, 4]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 3, 3]
[3, 2, 3, 4]

[0, 1, 2147483647, 2147483647]
[3, 2, 2147483647, 2147483647]
[3, 2, 3, 3]
[3, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[3, 2, 3, 3]
[3, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[3, 2, 3, 3]
[3, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[1, 2, 3, 3]
[3, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[1, 2, 3, 3]
[3, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[1, 2, 2, 3]
[3, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[1, 2, 2, 2]
[3, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[1, 2, 2, 2]
[3, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[1, 2, 2, 2]
[3, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[1, 2, 2, 2]
[1, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[1, 2, 2, 2]
[1, 2, 3, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[1, 2, 2, 2]
[1, 2, 2, 3]

[0, 1, 2147483647, 2147483647]
[1, 2, 2147483647, 2147483647]
[1, 2, 2, 2]
[1, 2, 2, 2]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;계속해서 백트래킹해주면서 탐색해주면 목적지에 최소 회전 값이 갱신되어 있을 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1607499751227&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringTokenizer st = null;

    static final char EMPTY = '.';
    static final char WALL = '*';
    static final char C = 'C';
    static final int START = 0;
    static final int END = 1;
    static int w, h, idx;
    static char[][] map;
    static Point[] p;

    public static void main(String[] args) throws IOException {

        st = new StringTokenizer(br.readLine());
        w = Integer.parseInt(st.nextToken());
        h = Integer.parseInt(st.nextToken());
        p = new Point[2];
        map = new char[h][w];
        visited = new boolean[h][w];
        turnCnt = new int[h][w];
        idx = 0;

        for (int i = 0; i &amp;lt; h; i++) {
            String line = br.readLine();
            for (int j = 0; j &amp;lt; w; j++) {
                map[i][j] = line.charAt(j);
                if (map[i][j] == C) {
                    p[idx++] = new Point(i, j);
                }
            }
            Arrays.fill(turnCnt[i], Integer.MAX_VALUE);
        }
        min = Integer.MAX_VALUE;
        visited[p[START].x][p[START].y] = true;
        dfs(p[START].x, p[START].y,-1, 0);

        System.out.println(turnCnt[p[END].x][p[END].y] - 1);
    }

    static int[] dx = {0, 0, -1, 1};
    static int[] dy = {-1, 1, 0, 0};
    static boolean[][] visited;
    static int[][] turnCnt;
    static int min;

    private static void printMap(int[][] map)
    {
        for (int i=0; i&amp;lt;map.length; i++){
            System.out.println(Arrays.toString(map[i]));
        }
        System.out.println();
    }

    private static void dfs(int x, int y, int exDir, int turn) {
        if (x == p[END].x &amp;amp;&amp;amp; y == p[END].y) {
            turnCnt[x][y] = turn;
            return;
        }

        turnCnt[x][y] = turn;

//        printMap(turnCnt);
        for (int dir = 0; dir &amp;lt; 4; dir++) {
            int nx, ny;

            nx = x + dx[dir];
            ny = y + dy[dir];
            if (0 &amp;lt;= nx &amp;amp;&amp;amp; nx &amp;lt; h &amp;amp;&amp;amp; 0 &amp;lt;= ny &amp;amp;&amp;amp; ny &amp;lt; w &amp;amp;&amp;amp; !visited[nx][ny]
            &amp;amp;&amp;amp; map[nx][ny] != WALL)
            {
//                System.out.println(nx+&quot; &quot;+ny);
//                System.out.println(&quot;dir : &quot;+dir +&quot; exDir : &quot;+exDir+&quot; turn : &quot;+turn+&quot; turnCnt[nx][ny] : &quot;+turnCnt[nx][ny]);
                visited[nx][ny] = true;
                if (dir == exDir)
                {
                    if (turnCnt[nx][ny] &amp;gt;= turn)
                    {
                        dfs(nx, ny, dir, turn);
                    }
                }
                else
                {
                    if (turnCnt[nx][ny] &amp;gt;= turn + 1)
                    {
                        dfs(nx, ny, dir, turn + 1);
                    }
                }
                visited[nx][ny] = false;
            }

        }


    }


    public static class Point {
        int x, y;

        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/백준</category>
      <category>6087번</category>
      <category>Java</category>
      <category>레이저통신</category>
      <category>백준</category>
      <category>백트래킹</category>
      <author>dev-sh</author>
      <guid isPermaLink="true">https://guy-who-writes-sourcecode.tistory.com/42</guid>
      <comments>https://guy-who-writes-sourcecode.tistory.com/42#entry42comment</comments>
      <pubDate>Wed, 9 Dec 2020 17:02:29 +0900</pubDate>
    </item>
    <item>
      <title>백준 6549번 : 히스토그램에서 가장 큰 직사각형 [Java]</title>
      <link>https://guy-who-writes-sourcecode.tistory.com/41</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/6549&quot;&gt;www.acmicpc.net/problem/6549&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607493016370&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;6549번: 히스토그램에서 가장 큰 직사각형&quot; data-og-description=&quot;입력은 테스트 케이스 여러 개로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 직사각형의 수 n이 가장 처음으로 주어진다. (1 &amp;le; n &amp;le; 100,000) 그 다음 n개의 정수 h1, ..., hn (0 &amp;le; hi &amp;le;&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/6549&quot; data-og-url=&quot;https://www.acmicpc.net/problem/6549&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/boNVi9/hyIvdWTOoV/bpfh5ke0nqBJ77jOvCINbk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/6549&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/6549&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/boNVi9/hyIvdWTOoV/bpfh5ke0nqBJ77jOvCINbk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;6549번: 히스토그램에서 가장 큰 직사각형&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;입력은 테스트 케이스 여러 개로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 직사각형의 수 n이 가장 처음으로 주어진다. (1 &amp;le; n &amp;le; 100,000) 그 다음 n개의 정수 h1, ..., hn (0 &amp;le; hi &amp;le;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1607492998763&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringTokenizer st = null;

    public static void main(String[] args) throws Exception {

        while (true) {
            int n;
            long max;
            int[] histogram, left, right;

            st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken());
            histogram = new int[n];
            if (n == 0)
                break;
            for (int i = 0; i &amp;lt; n; i++) {
                histogram[i] = Integer.parseInt(st.nextToken());
            }
            left = getLeft(histogram, n);
            right = getRight(histogram, n);
            max = getMaxArea(left, right, histogram, n);
            System.out.println(max);
        }

    }

    private static long getMaxArea(int[] left, int[] right, int[] histogram, int n) {
        long max = Integer.MIN_VALUE;
        long cur;
        for (int i = 0; i &amp;lt; n; i++) {
            cur = (long) (right[i] - left[i] - 1) * histogram[i];
            max = Math.max(max, cur);
        }
        return (max);
    }

    private static int[] getRight(int[] histogram, int n) {
        int[] right = new int[n];
        Stack&amp;lt;Bar&amp;gt; stack = new Stack&amp;lt;&amp;gt;();

        for (int i = n - 1; i &amp;gt;= 0; i--) {
            if (stack.isEmpty() || stack.peek().height &amp;lt; histogram[i]) {
                right[i] = i + 1;
                stack.push(new Bar(histogram[i], i));
            } else {
                while (true) {
                    if (!stack.isEmpty() &amp;amp;&amp;amp; stack.peek().height &amp;gt;= histogram[i])
                        stack.pop();
                    else {
                        right[i] = stack.isEmpty() ? n : stack.peek().idx;
                        stack.push(new Bar(histogram[i], i));
                        break;
                    }
                }
            }
        }
        return (right);
    }

    private static int[] getLeft(int[] histogram, int n) {

        int[] left = new int[n];
        Stack&amp;lt;Bar&amp;gt; stack = new Stack&amp;lt;&amp;gt;();

        for (int i = 0; i &amp;lt; n; i++) {
            if (stack.isEmpty() || stack.peek().height &amp;lt; histogram[i]) {
                left[i] = i - 1;
                stack.push(new Bar(histogram[i], i));
            } else {
                while (true) {
                    if (!stack.isEmpty() &amp;amp;&amp;amp; stack.peek().height &amp;gt;= histogram[i])
                        stack.pop();
                    else {
                        left[i] = stack.isEmpty() ? -1 : stack.peek().idx;
                        stack.push(new Bar(histogram[i], i));
                        break;
                    }
                }
            }
        }
        return (left);
    }


    public static class Bar {
        int height, idx;

        public Bar(int height, int idx) {
            this.height = height;
            this.idx = idx;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;새로운 유형의 문항이다. 문제 풀이법이 상당히 다양하나, 아래의 설명을 참고해서 문제를 풀었다. 이 문제에 대한 풀이를 여러군데서 찾아보았으나, 가장 이해가 잘 되고 명확한 풀이는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 풀이 내용을 참고하여 메인 로직을 작성했고, 풀고 나서 생각해보면 그렇게 어려운 문제는 아니였으나, 경험이 없었다면 실전에서도 풀지 못했을 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=v4OX1OTzma4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.youtube.com/watch?v=v4OX1OTzma4&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=v4OX1OTzma4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bYBcvB/hyIvf8gALh/nlMUa9qDOGe1a8ZQFPxlNK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/v4OX1OTzma4&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/백준</category>
      <category>백준</category>
      <category>백준 6549번</category>
      <category>직사각형</category>
      <category>히스토그램</category>
      <author>dev-sh</author>
      <guid isPermaLink="true">https://guy-who-writes-sourcecode.tistory.com/41</guid>
      <comments>https://guy-who-writes-sourcecode.tistory.com/41#entry41comment</comments>
      <pubDate>Wed, 9 Dec 2020 14:53:57 +0900</pubDate>
    </item>
    <item>
      <title>스프링의 삼각형 IoC/DI, AOP, PSA에 대하여</title>
      <link>https://guy-who-writes-sourcecode.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Java 백앤드 면접을 보러가면 여러 면접장에서 공통적으로 하는 질문들이 있는데, 그 중 빠지지 않고 나온 질문 중 하나가 스프링의 3대 특징에 대해서 이야기하라는 것이였다. 매번 면접 질문에 대한 대답을 하기 위해 정리했었던 부분을 다시 한번 보면서 공부했고, 이를 정리하여 포스팅하기로 마음을 먹었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;면접이 급해서 찾아보았다면 다음과 같이 이해하라.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 57px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.8605%; height: 19px; text-align: center;&quot;&gt;&lt;b&gt;IoC/DI&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 83.1395%; height: 19px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;의존 역전/의존성 주입은&amp;nbsp; @Autowired나 XML 설정을 통해서 강합 결합을 느슨한 결합으로 변경해주며, 코드를 유연하게 해준다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.8605%; height: 19px; text-align: center;&quot;&gt;&lt;b&gt;AOP&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 83.1395%; height: 19px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;관점 지향 프로그래밍으로서 공통된 로직을 추출하여 메소드의 다양한 시점에 실행할 수 있게 해줄수 있으며, 코드를 줄여주고, 개발자가 공통 로직을 배제하고 핵심 관심사에 집중할 수 있도록 해준다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.8605%; height: 19px; text-align: center;&quot;&gt;&lt;b&gt;PSA&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 83.1395%; height: 19px;&quot;&gt;Portable Service Abstraction으로 일관성 있는 서비스 추상화이다. 서비스 추상화의 대표적인 예를 JDBC로 들수 있으며, 어떠한 데이터 베이스를 사용하더라도 일관성있는 방식으로 제어할 수 있도록 공통의 인터페이스를 제공하는 것이 서비스 추상화라고 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;스프링 공부를 시작하게 되면 어떠한 개발자라도 반드시 이해하고 가야되는 부분이 스프링의 3대 프로그래밍 모델인 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;IoC/DI, AOP, PSA&lt;/b&gt;&lt;/span&gt;다. 따라서 이러한 부분을 모르고 따짜고짜 스프링으로 개발을 하겠다? 이것은 중학교 수학 공식도 모르는 친구가 고교 수학부터 시작하는 것일수도 있다. 물론 그 친구가 천재라면 가능하겠다만, 대다수는 천재가 아니지 않는가.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;IoC/DI - 제어의 역전/의존성 주입&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;스프링에서는 제어의 역전을 의존성 주입이라고도 한다. 이를 더 잘 이해하기 위해서는 &lt;b&gt;의존성&lt;/b&gt;을 이해해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span&gt;프로그래밍에서 의존성?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span&gt;의존성은 어렵게 생각하지 않아도 단순하게 예를 들자면 다음과 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef5369; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span&gt;운전자는 자동차를 생산한다. &lt;span style=&quot;color: #000000;&quot;&gt;= &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new Car()&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef5369; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span&gt;자동차는 내부적으로 타이어를 생산한다. &lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt; Car 객체 생성자에서 new Tire();&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span&gt;따라서 &lt;b&gt;new 라는 키워드는 의존성&lt;/b&gt;이라 할 수 있다. Car 객체 생성자에서 new 를 실행함으로 Car가 Tire에 의존한다고 볼 수 있다. 이렇게 의존이라는 것은 전체가 부분에 의존하는 것을 표현하며, 좀 더 깊게 들어가서 의존 관계 사이를 집합 관계와 구성 관계로 구분할 수 있으며, 의존 관계를 어떻게 맺냐에 따라서 강합 결합이냐 느슨한 결합이냐를 이야기할 수 있게 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;집합 관계&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;부분이 전체와 다른 생성 주기를 가질 수 있다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;구성 관계&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;부분은 전체와 같은 생명 주기를 갖는다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;강한 결합&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;객체 내부에서 다른 객체를 생성하는 것은&amp;nbsp;강한 결합도를 가지는 구조이다. A 클래스 내부에서 B 라는 객체를 직접 생성하고 있다면, B 객체를 C 객체로 바꾸고 싶은 경우에 A 클래스도 수정해야 하는 방식이기 때문에 강한 결합이다. 위에서도 동일하게 자동차 내부에서 타이어를 생성하는 것은 다른 타이어를 생성하고자 해도 코드를 수정해야 되는 상황이 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;느슨한 결합&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;객체를 주입 받는다는 것은 외부에서 생성된 객체를 인터페이스를 통해서 넘겨받는 것이다. 이렇게 하면 결합도를 낮출 수 있고,&amp;nbsp;런타임시에 의존관계가 결정되기 때문에 유연한 구조를 가진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SOLID 원칙에서 O 에 해당하는&amp;nbsp;&lt;b&gt;Open Closed Principle&lt;/b&gt;&amp;nbsp;을 지키기 위해서 디자인 패턴 중 전략패턴을 사용하게 되는데, 생성자 주입을 사용하게 되면 전략패턴을 사용하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;본격적으로 IoC/DI가 스프링에서 어떠한 역할을 하는지 알아보며 필요성을 느껴보도록 하자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;객체를 주입하는 방법은 생성자를 통한 주입, setter를 통한 주입이 있다. 각 방식에 대해서 살펴보고 어떠한 문제점들이 발생하는지 확인해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;먼저 객체 내부에서 생성하는 코드부터 확인하자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1607402391078&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 의존성주입;

public interface Dress {
    String getSeason();
}

public class FWSeasonDress implements Dress{
    @Override
    public String getSeason() {
        return &quot;F/W 신상 드레스&quot;;
    }
}

public class SSSeasonDress implements Dress{
    @Override
    public String getSeason() {
        return &quot;S/S 신상 드레스&quot;;
    }
}

public class Person {
    Dress dress;

    public Person() {
        dress = new FWSeasonDress();
    }

    public String getDress() {
        return &quot;입은 옷은 &quot; + dress.getSeason();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사람은 옷을 입게 된다. 이 코드에서 확인해보면 사람이 생성될 때 입을 옷이 결정이 된다. 따라서 코드가 유연하지 못하다는 의미이다. 이제 생성자 주입과 수정자 주입을 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;생성자를 통한 의존성 주입&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성자를 통한 주입 방법은 매우 간단하다. 기존의 생성자 코드를 아래와 같이 변경해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1607402790418&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 의존성주입;

public class Person {
    Dress dress;

    public Person(Dress dress) {
        this.dress = dress;
    }

    public String getDress() {
        return &quot;입은 옷은 &quot; + dress.getSeason();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Person의 생성자 부분이 변경되었다. 이렇게 되면 외부에서 Person 객체가 생성될 때 입을 옷을 결정해줄 수 있게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;코드가 유연해졌다는 의미이다. 기존의 Person 클래스 코드 변경없이 새로 추가되는 시즌의 옷들을 갈아입혀 줄 수 있게 되었다. 좀 더 실무적인 이야기를 해보자면, 새로운 W/W 시즌의 옷이 나왔을 때 코드의 변경은 Person 객체를 변경해주는 부분과 새롭게 추가되는 W/W 객체만 컴파일해서 배포하면 된다는 의미이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Setter (수정자)를 통한 주입&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성자를 통한 의존성 주입을 현실 세계로 예를 들어보면 한번 사람이 태어나면 태어나서 입을수 있는 옷은 고정되어 변경할 방법이 없다는 것이다. 이러한 부분에서 &lt;b&gt;유연성이 떨어지기 때문에 유연성 높은 코드를 작성하고자 한다면 이를 생성자가 아닌 속성을 통해서 의존성 주입&lt;/b&gt;을 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사실 이러한 부분에서 프로그래밍 진형에서는 생성자를 통한 것이 좋은가? 아니면 속성을 통한 주입이 좋은가에 대한 이야기가 많다. 따라서 사실 무엇이 더 좋다기보단&lt;b&gt; 상황에 맞는 DI를 선택&lt;/b&gt;하는 것이 올바르다고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래 글을 참조하면 생성자 주입을 강제하는 것처럼 보일지 모르지만 읽어보면 좋기에 링크를 남긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607401160221&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;스프링 - 생성자 주입을 사용해야 하는 이유, 필드인젝션이 좋지 않은 이유&quot; data-og-description=&quot;개요 Dependency Injection (의존관계 주입) 이란 Setter Based Injection (수정자를 통한 주입) Constructor based Injection (생성자를 통한 주입) 스프링에서 사용할 수 있는 DI 방법 세가지 생성자 주입을 이용한 순&quot; data-og-host=&quot;yaboong.github.io&quot; data-og-source-url=&quot;https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/&quot; data-og-url=&quot;https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;스프링 - 생성자 주입을 사용해야 하는 이유, 필드인젝션이 좋지 않은 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;개요 Dependency Injection (의존관계 주입) 이란 Setter Based Injection (수정자를 통한 주입) Constructor based Injection (생성자를 통한 주입) 스프링에서 사용할 수 있는 DI 방법 세가지 생성자 주입을 이용한 순&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;yaboong.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;코드로 변경해보면 아래와 같이 바뀐다.&lt;/p&gt;
&lt;pre id=&quot;code_1607403755948&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 의존성주입;

public class Person {
    Dress dress;

    public void setDress(Dress dress) {
        this.dress = dress;
    }

    public Dress getDress() {
        return dress;
    }

    public String getDressSeason() {
        return &quot;입은 옷은 &quot; + dress.getSeason();
    }
}

public class Driver {
    public static void main(String[] args) {
        Dress dress = new FWSeasonDress();
        Person person = new Person();
        person.setDress(dress);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성자가 사라졌고, dress 속성에 대한 접근자와 설정자 메소드가 생겼다. 따라서 언제든지 사람의 옷을 변경 가능하도록 유연한 코드로 변경하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 스프링에서는 어떻게 의존성을 주입하는 것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;두가지 방법이 있다.&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;XML 파일 사용 , @Autowired&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 포스팅에서는 깊게 보기보단 간단하게 보겠다. 스프링에는 XML 설정 파일들이 존재한다. 뿐만 아니라 스프링은 Bean을 관리하게 되는데, 내가 코드에서 생성할 Bean을 XML 파일에 등록하여 의존성을 주입할 수 있다. XML 관련 정보는 이 포스팅보다 아래 게시글을 참조하길 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-XML-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%9E%91%EC%84%B1-%EB%B0%A9%EB%B2%95-%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-XML-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%9E%91%EC%84%B1-%EB%B0%A9%EB%B2%95-%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607404046409&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 스프링 XML 설정 파일 작성 방법 정리&quot; data-og-description=&quot;[Spring]&amp;nbsp;스프링&amp;nbsp;XML&amp;nbsp;설정&amp;nbsp;파일&amp;nbsp;작성&amp;nbsp;방법&amp;nbsp;정리   목차 1. 스프링 XML 설정 파일 포맷 - 기본 포맷 - 애노테이션 설정을 사용하기 위한 포맷 2. 빈(Bean) 설정 예시 - 자동 주입 설정 - autowire 속성 3.&quot; data-og-host=&quot;atoz-develop.tistory.com&quot; data-og-source-url=&quot;https://atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-XML-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%9E%91%EC%84%B1-%EB%B0%A9%EB%B2%95-%EC%A0%95%EB%A6%AC&quot; data-og-url=&quot;https://atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-XML-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%9E%91%EC%84%B1-%EB%B0%A9%EB%B2%95-%EC%A0%95%EB%A6%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bnQIzy/hyIu5cur2q/PG9fLsXIuKnq6AT9pKga11/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552,https://scrap.kakaocdn.net/dn/icbRw/hyIvbcHGRy/Z50Ic2sB9wLlxaQRlByOK1/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552&quot;&gt;&lt;a href=&quot;https://atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-XML-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%9E%91%EC%84%B1-%EB%B0%A9%EB%B2%95-%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-XML-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%9E%91%EC%84%B1-%EB%B0%A9%EB%B2%95-%EC%A0%95%EB%A6%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bnQIzy/hyIu5cur2q/PG9fLsXIuKnq6AT9pKga11/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552,https://scrap.kakaocdn.net/dn/icbRw/hyIvbcHGRy/Z50Ic2sB9wLlxaQRlByOK1/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Spring] 스프링 XML 설정 파일 작성 방법 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;[Spring]&amp;nbsp;스프링&amp;nbsp;XML&amp;nbsp;설정&amp;nbsp;파일&amp;nbsp;작성&amp;nbsp;방법&amp;nbsp;정리   목차 1. 스프링 XML 설정 파일 포맷 - 기본 포맷 - 애노테이션 설정을 사용하기 위한 포맷 2. 빈(Bean) 설정 예시 - 자동 주입 설정 - autowire 속성 3.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;atoz-develop.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;위 링크에 대한 내용을 이해하고 스프링 의존성 주입이 이루어지는 메커니즘을 이해하게 된다면 스프링을 도입해서 얻고자 하는 목적을 이해할 것이다. 스프링을 도입한다면 코드의 수정없이 XML 파일만 수정하면 프로그램의 실행 결과를 변경할 수 있다는 것이다. 재컴파일이 필요없다는 것은 개발자로서 얻는 강점이 어마어마하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;AOP (Aspect-Oriented Programming) : 관점 지향 프로그래밍&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스프링의 DI가 의존성의 주입이라면 AOP는 코드 주입이라고 할 수 있다. 여러 모듈을 개발하다보면 모듈들에서 공통적으로 등장하는 로직이 존재한다. 예를 들어서 입금 출금 이체와 같은 부분에서 보안적인 부분이나 트랜잭션 로그를 남기고자 하는 코드 부분들이 분명히 공통적으로 등장할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 공통적으로 등장하는 부분은 &lt;b&gt;횡단 관심사(cross-cutting concern)&lt;/b&gt;이라고 한다. 일반적으로 코드는 &lt;b&gt;핵심 관심사 + 횡단 관심사&lt;/b&gt;로 구성된다. 따라서 이러한 부분을 @Aspect 어노테이션을 통해서 추출하여 특정 메소드가 호출될 때 특정 시점에 동작하도록 할 수 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 통해서 스프링이 얻고자 하는 부분은 어떤 것인가? 공통적으로 등장하는 횡단 관심사를 어느 한 사람이 잘 정의하여 코드를 작성했다면, 다른 개발자들은 이를 재사용할 수 있을 것이다. 이를 통해서 기존의 횡단 관심사를 계속해서 코딩해야 되는 불편함이 사라지고 오직 개발자들은 핵심 관심사에만 집중하여 개발을 할 수 잇게 되는 것이다. 또한 핵심 관심사에만 집중함으로 자연스럽게 SRP을 적용할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;AOP 개발에 대해서 궁금한 부분이 있다면 아래 링크에서 참조하여 공부하길 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/746&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;engkimbs.tistory.com/746&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607406300980&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP&quot; data-og-description=&quot;| 스프링 AOP ( Aspect Oriented Programming ) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으..&quot; data-og-host=&quot;engkimbs.tistory.com&quot; data-og-source-url=&quot;https://engkimbs.tistory.com/746&quot; data-og-url=&quot;https://engkimbs.tistory.com/746&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dRkhMZ/hyIvem1kzh/N3cmKmZDfoK9uoofyekm5K/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/59z0x/hyIvfe9H4b/9fjDgaRcBkp4fvBvkCMir1/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/Y6QzA/hyIvkt0jaP/LGJAOu9U8AtNDM6x9Xv1V0/img.png?width=443&amp;amp;height=500&amp;amp;face=0_0_443_500&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/746&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engkimbs.tistory.com/746&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dRkhMZ/hyIvem1kzh/N3cmKmZDfoK9uoofyekm5K/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/59z0x/hyIvfe9H4b/9fjDgaRcBkp4fvBvkCMir1/img.png?width=225&amp;amp;height=225&amp;amp;face=0_0_225_225,https://scrap.kakaocdn.net/dn/Y6QzA/hyIvkt0jaP/LGJAOu9U8AtNDM6x9Xv1V0/img.png?width=443&amp;amp;height=500&amp;amp;face=0_0_443_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;| 스프링 AOP ( Aspect Oriented Programming ) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;engkimbs.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;PSA (Portable Service Abstraction) : 일관성 있는 서비스 추상화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;PSA는 일관성있는 추상화이다. 서비스 추상화의 대표적인 예로 JDBC를 두는데 이러한 표준 스펙 덕분에 개발자는 오라클을 사용하든, MySQL을 사용하든, MS-SQL을 사용하던 어떠한 데이터베이스를 사용하던 공통된 방식으로 코드를 작성할 수 있다. 데이터베이스 종류에 관계없이 같은 방식으로 제어할 수 있는 이유는 디자인 패턴에서 설명했던 어댑터 패턴을 활용했기 때문이다. 이처럼 어댑터 패턴을 적용해 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한 것을 서비스 추상화라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실질적으로 스프링은 서비스 추상화를 위해 다양한 어댑터를 제공하는데 이러한 부분이 궁금하다면 직접 찾아보는 것을 권한다. 스프링 고수가 되는 그날까지 다들 화이팅이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring</category>
      <category>aop</category>
      <category>IoC/DI</category>
      <category>PSA</category>
      <category>관점 지향 프로그램</category>
      <category>스프링 3대 요소</category>
      <category>스프링 PSA</category>
      <category>의존 역전</category>
      <category>의존 주입</category>
      <author>dev-sh</author>
      <guid isPermaLink="true">https://guy-who-writes-sourcecode.tistory.com/40</guid>
      <comments>https://guy-who-writes-sourcecode.tistory.com/40#entry40comment</comments>
      <pubDate>Tue, 8 Dec 2020 14:45:52 +0900</pubDate>
    </item>
    <item>
      <title>템플릿 콜백 패턴(Template Callback Pattern)</title>
      <link>https://guy-who-writes-sourcecode.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;템플릿 콜백 패턴은 전략 패턴의 변형이며 스프링 3대 프로그래밍 모델 중 하나인 &lt;b&gt;DI (의존성 주입)&lt;/b&gt;에서 사용하는 특별한 형태의 전략 패턴이다. &lt;b&gt;템플릿 콜백 패턴은 전략 패턴과 모든 것이 동일하나 전략을 익명 내부 클래스로 정의해서 사용하는 것이 차이&lt;/b&gt;이다. 앞에서 봤던 내용을 템플릿 콜백 패턴으로 변경해보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1607351368391&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 전략패턴;

public class Client {
    public static void main(String[] args) {
        전략 strategy = null;
        군인 rambo = new 군인();

        strategy = new 총();
        rambo.runContext(strategy);

        strategy = new 칼();
        rambo.runContext(strategy);

        strategy = new 활();
        rambo.runContext(strategy);

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 코드는 기존의 코드이다. 익명 내부 클래스를 사용하여 변경해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1607351498436&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 전략패턴;

public class Client {
    public static void main(String[] args) {
        군인 rambo = new 군인();

        rambo.runContext(new 전략() {
        	@Override
            public void runStrategy() {
            	System.out.println(&quot;총 : 빵야&quot;);
            }
        });

        rambo.runContext(new 전략() {
        	@Override
            public void runStrategy() {
            	System.out.println(&quot;칼 : 슈욱&quot;);
            }
        });
        
                rambo.runContext(new 전략() {
        	@Override
            public void runStrategy() {
            	System.out.println(&quot;활 : 슈슉&quot;);
            }
        });

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위와 같이 익명 내부 클래스로 변경했다. 코드를 보자하니 중복되는 부분이 많다. 이를 리팩토링 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1607351627827&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 전략패턴;

public class 군인 {
    void runContext(String weaponSound) {
        System.out.println(&quot;전투 시작&quot;);
        executeWeapon(weaponSound).runStrategy();
        System.out.println(&quot;전투 종료&quot;);
    }
    
    private 전략 executeWeapon(final String weaponSound) {
        return new 전략() {
            @Override
            public void runStrategy() {
                System.out.println(weaponSound);
            }
        };
    }
}

public class Client {
    public static void main(String[] args) {
        군인 rambo = new 군인();

        rambo.runContext(&quot;총&quot;);

        rambo.runContext(&quot;칼&quot;);

        rambo.runContext(&quot;활&quot;);

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래와 같이 리팩토링이 가능하다. 리팩토링의 예제를 보면 볼수록 신기하고 즐겁다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 리팩토링하여 보니, 전략이 군인의 내부로 들어왔다. 스프링은 이와 같은 형식으로 템플릿 콜백 패턴을 DI에 적극 활용하고 있다. 따라서 전략 패턴과 템플릿 콜백 패턴, 리팩터링된 템플릿 콜백 패턴은 꼭 기억해둘 필요성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;마지막 한마디로 정리해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&quot;전략을 익명 내부 클래스로 구현한 전략 패턴&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://guy-who-writes-sourcecode.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;guy-who-writes-sourcecode.tistory.com/30&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607351997802&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;스프링에 녹아있는 아름다운 디자인 패턴&quot; data-og-description=&quot;프로그램을 개발하다 보면 많은 상황에 직면하게 되는데, 프로그래밍의 역사가 꽤 길지 않은가? 따라서 이와 비슷한 사례를 이미 경험한 선배들이 정리해 둔 표준 설계 패턴이 있다. 이를 디자&quot; data-og-host=&quot;guy-who-writes-sourcecode.tistory.com&quot; data-og-source-url=&quot;https://guy-who-writes-sourcecode.tistory.com/30&quot; data-og-url=&quot;https://guy-who-writes-sourcecode.tistory.com/30&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgsQGU/hyItLfdTei/dznCDPHllL3plFfLxq4Jck/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gZe2u/hyIu5C9xZb/rYYjIoQIIMFCP6QvpG7cBk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://guy-who-writes-sourcecode.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://guy-who-writes-sourcecode.tistory.com/30&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgsQGU/hyItLfdTei/dznCDPHllL3plFfLxq4Jck/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gZe2u/hyIu5C9xZb/rYYjIoQIIMFCP6QvpG7cBk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;스프링에 녹아있는 아름다운 디자인 패턴&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;프로그램을 개발하다 보면 많은 상황에 직면하게 되는데, 프로그래밍의 역사가 꽤 길지 않은가? 따라서 이와 비슷한 사례를 이미 경험한 선배들이 정리해 둔 표준 설계 패턴이 있다. 이를 디자&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;guy-who-writes-sourcecode.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>디자인 패턴</category>
      <category>di</category>
      <category>리팩토링</category>
      <category>스프링</category>
      <category>익명 내부 클래스</category>
      <category>전략 패턴</category>
      <category>템플릿 콜백 패턴</category>
      <author>dev-sh</author>
      <guid isPermaLink="true">https://guy-who-writes-sourcecode.tistory.com/39</guid>
      <comments>https://guy-who-writes-sourcecode.tistory.com/39#entry39comment</comments>
      <pubDate>Mon, 7 Dec 2020 23:40:38 +0900</pubDate>
    </item>
  </channel>
</rss>