{"componentChunkName":"component---src-templates-blog-post-js","path":"/language/200207-SOLID/","result":{"data":{"site":{"siteMetadata":{"title":"Junbyeol Blog","author":"Junsung Yoon","siteUrl":"https://junbyeol.github.io","comment":{"disqusShortName":"","utterances":"junbyeol/junbyeol.github.io"},"sponsor":{"buyMeACoffeeId":"junbyeol"}}},"markdownRemark":{"id":"f8bd8cf2-0a19-5bbb-b887-1bda63dc9910","excerpt":"이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.\n기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다. SOLID: 객체지향설계 5대 원칙 Spring 예제로 보는 SOLID DIP - Yun Blog | 기술 블로그 OCP : Open/Closed Principle…","html":"<blockquote>\n<p>이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.\n기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.</p>\n</blockquote>\n<p>SOLID: 객체지향설계 5대 원칙</p>\n<p><a href=\"https://cheese10yun.github.io/spring-solid-dip/\">Spring 예제로 보는 SOLID DIP - Yun Blog | 기술 블로그</a></p>\n<h1 id=\"ocp\" style=\"position:relative;\"><a href=\"#ocp\" aria-label=\"ocp permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>OCP</h1>\n<p>: Open/Closed Principle, 개방-폐쇄 원칙</p>\n<p>: 확장에 대해서는 개방 되어 있어야 하지만, 변경에 대해서는 폐쇄되어야 한다</p>\n<ul>\n<li>확장? → 새로운 타입을 추가함으로써 새로운 기능을 구현한다</li>\n<li>변경? → 확장이 발생했을 때, 해당 코드를 호출하는 쪽에서 변경이 발생하지 않아야 변경에 대해 닫혀있는 것</li>\n</ul>\n<h3 id=\"ocp-실패-사례\" style=\"position:relative;\"><a href=\"#ocp-%EC%8B%A4%ED%8C%A8-%EC%82%AC%EB%A1%80\" aria-label=\"ocp 실패 사례 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>OCP 실패 사례</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 511px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 47%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAAA/klEQVQoz5VS14rEMAz0/39e8pBOXkJ6732W0eJjOQK3JxBykWZGstV93/jGaYzTNKEoCuR5LjHLMvG2bXGeJxT+YcdxCJBlWXAcR5xr27YRxzHWdYVi0jiOwpamqbAlSYKmaTDPs7AOw4BlWeQuCAI5fyJjjiIYF1EUwfM8KXBdF3Vdo+97aYXMNAJt2/aoft/3t0Kt4sl4R2Zt13WJcpJ9Os/KsnwDcsgsYrJ2TcBWu6772TOyG9/3YRgGTNOUyDlytlSvKJVtE/jJSUZQJldVhTAMRRXBWUvX85MZ/vWy/CosIACBOVP9jX4/irT87R/ULVM1lXx2wVmTjIAvYda5/2Pr7E8AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled.png\"\n        title=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled.png\"\n        src=\"/static/1c4cd304ee435e91674bfc27e9cd5159/92e00/200207-1.png\"\n        srcset=\"/static/1c4cd304ee435e91674bfc27e9cd5159/5a46d/200207-1.png 300w,\n/static/1c4cd304ee435e91674bfc27e9cd5159/92e00/200207-1.png 511w\"\n        sizes=\"(max-width: 511px) 100vw, 511px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<ul>\n<li>신한카드 결제만 있었던 시스템에, 우리은행 결제가 추가되어야 한다!</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/ocp/anti/payment/shinhan\"</span><span class=\"token punctuation\">,</span> method <span class=\"token operator\">=</span> <span class=\"token class-name\">RequestMethod</span><span class=\"token punctuation\">.</span>POST<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token class-name\">ShinhanCardDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    shinhanCardPaymentService<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/ocp/anti/payment/woori\"</span><span class=\"token punctuation\">,</span> method <span class=\"token operator\">=</span> <span class=\"token class-name\">RequestMethod</span><span class=\"token punctuation\">.</span>POST<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token class-name\">WooriCardDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    wooriCardPaymentService<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>⇒ 앞으로 카드가 추가될 때마다, 새로운 API를 계속 만들어야함</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PaymentRequest</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> cardNumber<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> csv<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">CardType</span> type<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// 컨트롤러</span>\n<span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/ocp/anti/payment\"</span><span class=\"token punctuation\">,</span> method <span class=\"token operator\">=</span> <span class=\"token class-name\">RequestMethod</span><span class=\"token punctuation\">.</span>POST<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span><span class=\"token function\">getType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token class-name\">CardType</span><span class=\"token punctuation\">.</span>SHINHAN<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        shinhanCardPaymentService<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span><span class=\"token function\">getType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token class-name\">CardType</span><span class=\"token punctuation\">.</span>WOORI<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        wooriCardPaymentService<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// 그 해당 카드 이외의 타입이 들어오면 예외처리는 어떻게??...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>⇒ API 면에서 보았을 때, DIP의 개념 준수</p>\n<p>⇒ Request값을 통일하여 추상화의 기초가 됨</p>\n<p>⇒ 카드가 추가될 때마다 if문이 추가되어야 함 == 컨트롤러 계층이 너무 많은 책임을 갖는것</p>\n<p>⇒ 확장이 발생했을 때, 해당 코드를 호출하는 쪽에서 코드의 변경이 일어나므로 OCP 실패</p>\n<h3 id=\"ocp-성공\" style=\"position:relative;\"><a href=\"#ocp-%EC%84%B1%EA%B3%B5\" aria-label=\"ocp 성공 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>OCP 성공</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 49.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABJUlEQVQoz22S3Y6CQAyFef+n4gX0RjExQgTCHTEq/4jQzdfkmHF3m5Qy7emZ05mJXq+X9X1vt9vt4/f73YZhsGVZDBvH0Z1c0zSOV27bNscoRhS7rrMsy+xyuViaplYUhTdTm+fZ6zTvdjuL49j2+73Xyb/f729CCuu62m8D+Hw+nfR6vbpyyKdpcqeHmnr/KJQiXLvTiHEEj8fDVUIqLOOHhHjEBzVyAOSIctaohYh/ImuRSJ0r/G9ULgolugAIdFZSg3qmoN627eeConAHQGVZ2uFwsCRJ3I/Ho+V57o3asK5rO5/PXj+dTh8MqqPwQGmqqsqfi8YmskaBCMGgDtOxYEzyRUhCNxieKeNLIeSMGGKEY5MvQikJHzJR71GKlFcM/38AtJYH9kCEk9gAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%201.png\"\n        title=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%201.png\"\n        src=\"/static/9487389af4d08a4a5bcf6fda92404492/17d73/200207-2.png\"\n        srcset=\"/static/9487389af4d08a4a5bcf6fda92404492/5a46d/200207-2.png 300w,\n/static/9487389af4d08a4a5bcf6fda92404492/17d73/200207-2.png 571w\"\n        sizes=\"(max-width: 571px) 100vw, 571px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PaymentController</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/payment\"</span><span class=\"token punctuation\">,</span> method <span class=\"token operator\">=</span> <span class=\"token class-name\">RequestMethod</span><span class=\"token punctuation\">.</span>POST<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">CardPaymentService</span> cardPaymentService <span class=\"token operator\">=</span> cardPaymentFactory<span class=\"token punctuation\">.</span><span class=\"token function\">getType</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span><span class=\"token function\">getType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        cardPaymentService<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ShinhanCardPaymentService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CardPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">ShinhanCardDto<span class=\"token punctuation\">.</span>PaymentRequest</span> paymentRequest <span class=\"token operator\">=</span> <span class=\"token function\">buildPayment</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        shinhanCardApi<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>paymentRequest<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">WooriCardPaymentService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CardPaymentService</span> <span class=\"token punctuation\">{</span>    \n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">WooriCardDto<span class=\"token punctuation\">.</span>PaymentRequest</span> paymentRequest <span class=\"token operator\">=</span> <span class=\"token function\">buildPayment</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        wooriCardApi<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>paymentRequest<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>⇒ 새로운 카드 결제가 추가되어도 Controller의 수정이 필요없음(cardPaymentFactory 클래스의 수정이 일어나기는 함)</p>\n<h1 id=\"dip\" style=\"position:relative;\"><a href=\"#dip\" aria-label=\"dip permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>DIP</h1>\n<p>: Dependency Inversion Principle, 의존관계 역전 원칙</p>\n<ul>\n<li>상위 모듈이 하위 모듈에 의존해서는 안된다</li>\n</ul>\n<h3 id=\"dip-실패사례\" style=\"position:relative;\"><a href=\"#dip-%EC%8B%A4%ED%8C%A8%EC%82%AC%EB%A1%80\" aria-label=\"dip 실패사례 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>DIP 실패사례</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 521px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 29.333333333333332%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAAArklEQVQY03VRyw6EIBDz/38O8YAnvRkPHkSMD/DR3ZIMccnapAGmnUmBAl+c54nrupBD6vd9J7L2D9ToLWiY5xl936MsS2itUVUV6rqGcw7Lsvw0sWaMST72KKXQti3WdUVxHEdsklW4bRtCCJimKWqiN02DruuiLl4Okn0cSPEN1tqoe+8xjiOGYXi9ckwoV2bDvu+JPNNACvhGkjz3poQ05oYnn5/y9OYBSIb7AIQK0a9qW0iAAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%202.png\"\n        title=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%202.png\"\n        src=\"/static/c2ce9a9a8d747155d792483e97c3337d/bb9c5/200207-3.png\"\n        srcset=\"/static/c2ce9a9a8d747155d792483e97c3337d/5a46d/200207-3.png 300w,\n/static/c2ce9a9a8d747155d792483e97c3337d/bb9c5/200207-3.png 521w\"\n        sizes=\"(max-width: 521px) 100vw, 521px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<ul>\n<li>상위모듈(PaymentController)이 하위모듈(ShinhanPaymentService)에 의존하고 있다</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">PaymentController</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/dip/anti/payment\"</span><span class=\"token punctuation\">,</span> method <span class=\"token operator\">=</span> <span class=\"token class-name\">RequestMethod</span><span class=\"token punctuation\">.</span>POST<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token class-name\">ShinhanCardDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        shinhanCardPaymentService<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>   \n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ShinhanCardPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">ShinhanCardDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        shinhanCardApi<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>   \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>⇒ RequestBody의 키값 하나만 바뀌어도, 컨트롤러, 서비스, 심지어 프론트엔드까지 영향을 미침</p>\n<p>⇒ 확장에 유연하지 못함(OCP 실패)</p>\n<h3 id=\"dip-성공\" style=\"position:relative;\"><a href=\"#dip-%EC%84%B1%EA%B3%B5\" aria-label=\"dip 성공 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>DIP 성공</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 49.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABJUlEQVQoz22S3Y6CQAyFef+n4gX0RjExQgTCHTEq/4jQzdfkmHF3m5Qy7emZ05mJXq+X9X1vt9vt4/f73YZhsGVZDBvH0Z1c0zSOV27bNscoRhS7rrMsy+xyuViaplYUhTdTm+fZ6zTvdjuL49j2+73Xyb/f729CCuu62m8D+Hw+nfR6vbpyyKdpcqeHmnr/KJQiXLvTiHEEj8fDVUIqLOOHhHjEBzVyAOSIctaohYh/ImuRSJ0r/G9ULgolugAIdFZSg3qmoN627eeConAHQGVZ2uFwsCRJ3I/Ho+V57o3asK5rO5/PXj+dTh8MqqPwQGmqqsqfi8YmskaBCMGgDtOxYEzyRUhCNxieKeNLIeSMGGKEY5MvQikJHzJR71GKlFcM/38AtJYH9kCEk9gAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%203.png\"\n        title=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%203.png\"\n        src=\"/static/9487389af4d08a4a5bcf6fda92404492/17d73/200207-4.png\"\n        srcset=\"/static/9487389af4d08a4a5bcf6fda92404492/5a46d/200207-4.png 300w,\n/static/9487389af4d08a4a5bcf6fda92404492/17d73/200207-4.png 571w\"\n        sizes=\"(max-width: 571px) 100vw, 571px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">PaymentController</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"/payment\"</span><span class=\"token punctuation\">,</span> method <span class=\"token operator\">=</span> <span class=\"token class-name\">RequestMethod</span><span class=\"token punctuation\">.</span>POST<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@RequestBody</span> <span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">final</span> <span class=\"token class-name\">CardPaymentService</span> cardPaymentService <span class=\"token operator\">=</span> cardPaymentFactory<span class=\"token punctuation\">.</span><span class=\"token function\">getType</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span><span class=\"token function\">getType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        cardPaymentService<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">CardPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ShinhanCardPaymentService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CardPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        shinhanCardApi<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>⇒ 상위모듈(PaymentController)이 PaymentService 인터페이스를 바라보며 하위모듈(ShinhanCardPaymentService)에 의존하지 않음</p>\n<h1 id=\"srp\" style=\"position:relative;\"><a href=\"#srp\" aria-label=\"srp permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SRP</h1>\n<p>: Single Responsibility Principle, 단일 책임 원칙</p>\n<p>: 클래스나 메소드는 하나의 역할만을 하며, 한가지 책임만을 진다</p>\n<ul>\n<li>클래스는 단 한개의 책임을 가져야 한다</li>\n<li>누가 해당 메소드의 변경을 유발하는 사용자(Actor)인가?</li>\n</ul>\n<h3 id=\"srp-실패-사례\" style=\"position:relative;\"><a href=\"#srp-%EC%8B%A4%ED%8C%A8-%EC%82%AC%EB%A1%80\" aria-label=\"srp 실패 사례 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SRP 실패 사례</h3>\n<ul>\n<li>신한카드에 해외결제 기능을 추가하고, 우리은행은 해외 결제가 되지 않는다면?</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 49.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAACPUlEQVQoz4VTS2saURSeSDUKrU2hi1IIzT9ol10UCm6Khag02Srdaighi278A+4EcZelbhQ3IhQURNGFbyVR8RGN8T3WR+pbidXb797G0nTTA2fOzJxvvnPud85wl5eXL2q1miocDitCoRDzRCKhbDQah5FIZI+D5XK5V8B8arVaimKxqCiVSopOp6Os1+sf7Xa7mGLcbjfHrFqtqggMH5CbmxuCZ8LzPJnP5ySZTL6lGOS+UAzNoQhBcTIej8lqtZq5XK59iolGozuMEFUZ4b+2Xq9JMBh8RzEg+drv98lgMCCz2YwSMczd3d3M4/Ewwlgs9puwXC5/mEwmfQDb0+mUOo/773jXzGazbyjm6upKDWkmmUyGv76+bi8WC4q5BaaEo76kmIuLCwGk4DiHwyHwer0Sv98v8fl84kAgIMzn88JUKiXk7g2dcYVC4YnRaHyOxkQGg0Esk8meWSyWXe5/ZrVad09OTsRarVaiVqv3dDqdVK/XS5F6tMXYbDbh6empRC6XPz47O5NqNJqnJpNJihOIOFyoCygQE96H8BUcj0+n003EJjqt4Zg/MNFjikGXom63+w0d3yJXB6aBWMVAJ+1228AqQvyd+9EfVCqVn8vl8o/wWwPJZ4pxOp0iTD35d26z2bA4Go3OGSH0Y4RYgQN0s8bkCfbsASGqM8J4PC7CAJI0j64fFIbW59sOWcSAJL1e73A4HKqwJkoQK0FEl/wIErD1MJvNAiz+ezwf0R8AElGMAn4MGV7/AsSV7r/OLta+AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%204.png\"\n        title=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%204.png\"\n        src=\"/static/c90975142672138e75ea67e66a67d23e/17d73/200207-5.png\"\n        srcset=\"/static/c90975142672138e75ea67e66a67d23e/5a46d/200207-5.png 300w,\n/static/c90975142672138e75ea67e66a67d23e/17d73/200207-5.png 571w\"\n        sizes=\"(max-width: 571px) 100vw, 571px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">CardPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">void</span> <span class=\"token function\">payOverseas</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ShinhanCardPaymentService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CardPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">payOverseas</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// .. 신한 카드 해외 결제 로직..</span>\n        shinhanCardApi<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>paymentRequest<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">WooriCardPaymentService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CardPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">payOverseas</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 우리 카드 결제는 해외 결제 기능이 없음...</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>⇒ 하나의 클래스에 해외결제/국내결제를 하고자 하는 두 명의 Actor가 존재 == 두 개의 책임이 존재</p>\n<p>⇒ 만일 모든 클래스가 모두 해외결제/국내결제를 지원한다면, 그것은 카드결제를 하는 큰 한 명의 Actor만이 있다라고 볼 수 있다 == 큰 하나의 책임으로 묶을 수 있음</p>\n<h3 id=\"srp-성공\" style=\"position:relative;\"><a href=\"#srp-%EC%84%B1%EA%B3%B5\" aria-label=\"srp 성공 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SRP 성공</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 107%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAAsSAAALEgHS3X78AAAC/UlEQVQ4y61USUxTURT9/RSHxMTEGCIhjSEmJpoukJVsim6MS4fIRhNi3LNg09KKCxWWwAJdkoBJS6OJbbW0CAmLIkNTKdCRDmBLB6B0sHQMw/O8T3/DogyNvuTmvvx3/nn33OExzBmXw+EQlLwIlgqFQiQQCHDm9/tJOp2m+ydn5WPsdjtHOD8/L4pGo39IhbW+vv70RBKFQsF5qVTKmM1mjnBubq4e0VhyudzvnZ0dL8yXyWQ88CGv1/vgREJcynsBjKVms9lqent7hVqttra9vf1CQ0ODsK2tTSCRSNiWlpbTpSIa5r+tra0tlvpIJPJ8Y2NDD9nqsbGxz5OTk19WVlaMOH/PK7FYLMzy8jLD4IAJh8MsQJxNTEywMzMzbDweZ5FkIf0BmI+FQoGAgMRiMbK5uUn29/dJMpm08oSjo6OnR9jR0XGOeiT7Q6Wq4pIFnlCtVpf76/Lq6mqzSqVqwi13lEplk8FgaEYkYplMdolisL+fSqV6EOFr7Lup397efgdlL3nCoaGhQ0KQPT44OCDBYJAz2qiJRII2aravr+/WaSr4TigvNOmjSnL29vbSg4OD1ROura09RJPGkY8ILEp9sViMZbNZF/Jyg2Ig7xUa96fVajX+wDKZTEaoMOH7AE86PDx8SKjT6c5PT0/Xo7LXjlg9Rqyuv7//4tGioPIE7UOgilOBSxeqqjKdDOo9Hk/FKkPZL55wZGTkUD6iY9xut8DpdApQFBZFEUKSEI0qRKS19AdE1YqKvvX5fF2Q2gmcHC9MD16cFzhm0fg1mOcapEVwfHL/ZeFp4nvyKqZChvGi1qXX6+Uw6dLSkgIRXqcYl8t1BRF2Tk1NdY+Pj8uNRqMMmC4ofAMFNzkizCBbeprEdLyQGzoFJJ/Pc1Z66+5RzOLiYiNSkN/d3S2fU3wJ84wpJZ0jnJ2dFZNjFvLVSjFonUbMcu4YTJmQSyaKIMJtGiRYiwRrqGGvwSPwDa1zm2Lw4tRhij6hZb4fwXyFN4DnblVFOQvmL2ZR/jnEKS9IAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%205.png\"\n        title=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%205.png\"\n        src=\"/static/64a7bc858b5f1b282f9b7dc8aa7bb054/17d73/200207-6.png\"\n        srcset=\"/static/64a7bc858b5f1b282f9b7dc8aa7bb054/5a46d/200207-6.png 300w,\n/static/64a7bc858b5f1b282f9b7dc8aa7bb054/17d73/200207-6.png 571w\"\n        sizes=\"(max-width: 571px) 100vw, 571px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>⇒ </p>\n<h1 id=\"isp\" style=\"position:relative;\"><a href=\"#isp\" aria-label=\"isp permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ISP</h1>\n<p>: Interface Segregation Principle, 인터페이스 분리 원칙</p>\n<p>: 클라이언트가 자신이 이용하지 않는 메소드에 의존하면 안된다</p>\n<h3 id=\"isp-실패-사례\" style=\"position:relative;\"><a href=\"#isp-%EC%8B%A4%ED%8C%A8-%EC%82%AC%EB%A1%80\" aria-label=\"isp 실패 사례 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ISP 실패 사례</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 49.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAACPUlEQVQoz4VTS2saURSeSDUKrU2hi1IIzT9ol10UCm6Khag02Srdaighi278A+4EcZelbhQ3IhQURNGFbyVR8RGN8T3WR+pbidXb797G0nTTA2fOzJxvvnPud85wl5eXL2q1miocDitCoRDzRCKhbDQah5FIZI+D5XK5V8B8arVaimKxqCiVSopOp6Os1+sf7Xa7mGLcbjfHrFqtqggMH5CbmxuCZ8LzPJnP5ySZTL6lGOS+UAzNoQhBcTIej8lqtZq5XK59iolGozuMEFUZ4b+2Xq9JMBh8RzEg+drv98lgMCCz2YwSMczd3d3M4/Ewwlgs9puwXC5/mEwmfQDb0+mUOo/773jXzGazbyjm6upKDWkmmUyGv76+bi8WC4q5BaaEo76kmIuLCwGk4DiHwyHwer0Sv98v8fl84kAgIMzn88JUKiXk7g2dcYVC4YnRaHyOxkQGg0Esk8meWSyWXe5/ZrVad09OTsRarVaiVqv3dDqdVK/XS5F6tMXYbDbh6empRC6XPz47O5NqNJqnJpNJihOIOFyoCygQE96H8BUcj0+n003EJjqt4Zg/MNFjikGXom63+w0d3yJXB6aBWMVAJ+1228AqQvyd+9EfVCqVn8vl8o/wWwPJZ4pxOp0iTD35d26z2bA4Go3OGSH0Y4RYgQN0s8bkCfbsASGqM8J4PC7CAJI0j64fFIbW59sOWcSAJL1e73A4HKqwJkoQK0FEl/wIErD1MJvNAiz+ezwf0R8AElGMAn4MGV7/AsSV7r/OLta+AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%204.png\"\n        title=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%204.png\"\n        src=\"/static/c90975142672138e75ea67e66a67d23e/17d73/200207-5.png\"\n        srcset=\"/static/c90975142672138e75ea67e66a67d23e/5a46d/200207-5.png 300w,\n/static/c90975142672138e75ea67e66a67d23e/17d73/200207-5.png 571w\"\n        sizes=\"(max-width: 571px) 100vw, 571px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<ul>\n<li>우리은행은 payOverseas를 이용하지 않는데, paymentService에 의존하고 있다</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">CardPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">void</span> <span class=\"token function\">payOverseas</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ShinhanCardPaymentService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CardPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">payOverseas</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// .. 신한 카드 해외 결제 로직..</span>\n        shinhanCardApi<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>paymentRequest<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">WooriCardPaymentService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CardPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">payOverseas</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 우리 카드 결제는 해외 결제 기능이 없음...</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"isp-성공\" style=\"position:relative;\"><a href=\"#isp-%EC%84%B1%EA%B3%B5\" aria-label=\"isp 성공 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ISP 성공</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 571px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 107%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAAsSAAALEgHS3X78AAAC/UlEQVQ4y61USUxTURT9/RSHxMTEGCIhjSEmJpoukJVsim6MS4fIRhNi3LNg09KKCxWWwAJdkoBJS6OJbbW0CAmLIkNTKdCRDmBLB6B0sHQMw/O8T3/DogyNvuTmvvx3/nn33OExzBmXw+EQlLwIlgqFQiQQCHDm9/tJOp2m+ydn5WPsdjtHOD8/L4pGo39IhbW+vv70RBKFQsF5qVTKmM1mjnBubq4e0VhyudzvnZ0dL8yXyWQ88CGv1/vgREJcynsBjKVms9lqent7hVqttra9vf1CQ0ODsK2tTSCRSNiWlpbTpSIa5r+tra0tlvpIJPJ8Y2NDD9nqsbGxz5OTk19WVlaMOH/PK7FYLMzy8jLD4IAJh8MsQJxNTEywMzMzbDweZ5FkIf0BmI+FQoGAgMRiMbK5uUn29/dJMpm08oSjo6OnR9jR0XGOeiT7Q6Wq4pIFnlCtVpf76/Lq6mqzSqVqwi13lEplk8FgaEYkYplMdolisL+fSqV6EOFr7Lup397efgdlL3nCoaGhQ0KQPT44OCDBYJAz2qiJRII2aravr+/WaSr4TigvNOmjSnL29vbSg4OD1ROura09RJPGkY8ILEp9sViMZbNZF/Jyg2Ig7xUa96fVajX+wDKZTEaoMOH7AE86PDx8SKjT6c5PT0/Xo7LXjlg9Rqyuv7//4tGioPIE7UOgilOBSxeqqjKdDOo9Hk/FKkPZL55wZGTkUD6iY9xut8DpdApQFBZFEUKSEI0qRKS19AdE1YqKvvX5fF2Q2gmcHC9MD16cFzhm0fg1mOcapEVwfHL/ZeFp4nvyKqZChvGi1qXX6+Uw6dLSkgIRXqcYl8t1BRF2Tk1NdY+Pj8uNRqMMmC4ofAMFNzkizCBbeprEdLyQGzoFJJ/Pc1Z66+5RzOLiYiNSkN/d3S2fU3wJ84wpJZ0jnJ2dFZNjFvLVSjFonUbMcu4YTJmQSyaKIMJtGiRYiwRrqGGvwSPwDa1zm2Lw4tRhij6hZb4fwXyFN4DnblVFOQvmL2ZR/jnEKS9IAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%205.png\"\n        title=\"200524%20SOLID%20a201c624ba1b4a418fb467fe29922c75/Untitled%205.png\"\n        src=\"/static/64a7bc858b5f1b282f9b7dc8aa7bb054/17d73/200207-6.png\"\n        srcset=\"/static/64a7bc858b5f1b282f9b7dc8aa7bb054/5a46d/200207-6.png 300w,\n/static/64a7bc858b5f1b282f9b7dc8aa7bb054/17d73/200207-6.png 571w\"\n        sizes=\"(max-width: 571px) 100vw, 571px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">PaymentService</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">pay</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">OverseasPaymentService</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">void</span> <span class=\"token function\">payOverseas</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ShinhanCardPaymentService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">PaymentService</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">OverseasPaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">payOverseas</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// .. 신한 카드 해외 결제 로직..</span>\n        shinhanCardApi<span class=\"token punctuation\">.</span><span class=\"token function\">pay</span><span class=\"token punctuation\">(</span>paymentRequest<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">WooriCardPaymentService</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">PaymentService</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">payOverseas</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CardPaymentDto<span class=\"token punctuation\">.</span>PaymentRequest</span> req<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 우리 카드 결제는 해외 결제 기능이 없음...</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h1 id=\"lsp\" style=\"position:relative;\"><a href=\"#lsp\" aria-label=\"lsp permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>LSP</h1>\n<p>: Liskov Substitution principle, 리스코프 치환 원칙</p>\n<p>: 자식 클래스는 언제나 자신의 부모 클래스를 교체할 수 있다</p>\n<p>( 부모 클래스의 명세를 따라야 한다, 부모 클래스가 하는 일을 다 충실히 수행해야 한다 )</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Rectangle</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">int</span> width<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">int</span> height<span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setWidth</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> width<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>width <span class=\"token operator\">=</span> width<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span> \n\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setHeight</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> height<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>height <span class=\"token operator\">=</span> height<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token comment\">//getter</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Square</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Rectangle</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setWidth</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> width<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">setWidth</span><span class=\"token punctuation\">(</span>width<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">setHeight</span><span class=\"token punctuation\">(</span>width<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span> \n\n\t<span class=\"token annotation punctuation\">@Override</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setHeight</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> height<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">setWidth</span><span class=\"token punctuation\">(</span>width<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">setHeight</span><span class=\"token punctuation\">(</span>width<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token comment\">//getter</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">calculateAreaTest</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Rectangle</span> rectangle<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\trectangle<span class=\"token punctuation\">.</span><span class=\"token function\">setWidth</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\trectangle<span class=\"token punctuation\">.</span><span class=\"token function\">setHeight</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\t<span class=\"token keyword\">assert</span> r<span class=\"token punctuation\">.</span><span class=\"token function\">getWidth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> r<span class=\"token punctuation\">.</span><span class=\"token function\">getHeight</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">6</span> <span class=\"token operator\">:</span> <span class=\"token function\">printError</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>⇒ rectangle에 Rectangle()과 Square()을 넣었을 때의 결과가 달라진다</p>\n<p>⇒ Rectangle 객체에서 작동하는 것이 Square에서 작동하지 않으므로 LSP 위반</p>","frontmatter":{"title":"SOLID","date":"February 07, 2020"}}},"pageContext":{"slug":"/language/200207-SOLID/","previous":{"fields":{"slug":"/infra/200716-Docker/"},"frontmatter":{"title":"Docker"}},"next":{"fields":{"slug":"/database/200524-Transaction/"},"frontmatter":{"title":"Transaction"}}}}}