{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/21-11-15-single-reponsibilty-principle/",
    "result": {"data":{"site":{"siteMetadata":{"title":"irrationnelle","author":"irrationnelle","siteUrl":"https://dev.rase.blog","comment":{"disqusShortName":"","utterances":"irrationnelle/devlog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"d58e9ba8-638b-5e37-bb33-f450e21dc9b2","excerpt":"들어가기 전 언어 차원에서 인터페이스라는 개념이 존재하지 않는 자바스크립트에서 어떻게 DI 를 적용하는지 알아보기 위해, 먼저 DI 가 무엇인지 다시 공부할 필요를 느꼈다. DI 에 대해 그 필요성과 방법에 대해 토비의 스프링만큼 자세히 설명한 책이 없지만, 자바라는 정적 컴파일 언어 기반으로 설명을 하기 때문에 다음을 기약하기로 했다. 로버트 마틴의 클린 아키텍쳐도 강한 응집력과 낮은 결합성을 이야기하며 DI…","html":"<h2 id=\"들어가기-전\" style=\"position:relative;\"><a href=\"#%EB%93%A4%EC%96%B4%EA%B0%80%EA%B8%B0-%EC%A0%84\" aria-label=\"들어가기 전 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>들어가기 전</h2>\n<p>언어 차원에서 인터페이스라는 개념이 존재하지 않는 자바스크립트에서 어떻게 DI 를 적용하는지 알아보기 위해, 먼저 DI 가 무엇인지 다시 공부할 필요를 느꼈다.</p>\n<p>DI 에 대해 그 필요성과 방법에 대해 토비의 스프링만큼 자세히 설명한 책이 없지만, 자바라는 정적 컴파일 언어 기반으로 설명을 하기 때문에 다음을 기약하기로 했다.</p>\n<p>로버트 마틴의 클린 아키텍쳐도 강한 응집력과 낮은 결합성을 이야기하며 DI 를 언급했던 기억이 났다. 이 또한 자바 친화적인 책이지만 책 주제로 봤을 때 언어 의존성이 그나마 낮은 편이다.</p>\n<p>그렇게 책을 보다가 단일 책임 원칙에 대해 다시 읽었는데, 상당히 오해하고 있던 개념이라 글로 남긴다.</p>\n<h2 id=\"solid\" style=\"position:relative;\"><a href=\"#solid\" aria-label=\"solid 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>SOLID</h2>\n<p>로버트 마틴의 클린 아키텍쳐에서는 SOLID 원칙을 좋은 아키텍쳐를 정의하는 원칙이라 하며 다음과 같이 이야기한다.</p>\n<blockquote>\n<p>SOLID 원칙의 목적은 중간 수준의 소프트웨어 구조가 아래와 같도록 만드는 데 있다.</p>\n<ul>\n<li>변경에 유연하다.</li>\n<li>이해하기 쉽다.</li>\n<li>많은 소프트웨어 시스템에 사용될 수 있는 컴포넌트의 기반이 된디</li>\n</ul>\n</blockquote>\n<p>여기서 중간 수준의 소프트웨어란 모듈 단위이다. 모듈로 가져다가 쓸 정도의 규모가 아니면 SOLID 원칙의 대상이 아니라고 볼 수 있다.</p>\n<h2 id=\"단일-책임-원칙\" style=\"position:relative;\"><a href=\"#%EB%8B%A8%EC%9D%BC-%EC%B1%85%EC%9E%84-%EC%9B%90%EC%B9%99\" aria-label=\"단일 책임 원칙 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>단일 책임 원칙</h2>\n<blockquote>\n<p>아마도 현저히 부적절한 이름 때문이기도 할 것이다.\n프로그래머가 이 원칙의 이름을 듣는다면 모든 모듈이 단 하나의 일만 해야 한다는 의미로 받아들이기 쉽다.</p>\n</blockquote>\n<p>로버트 마틴이 언급한 것처럼 나 또한 모듈이 하나의 일만 한다는 의미라고 생각했다.</p>\n<p>하나의 일만 한다는 것을 예로 들어보자.</p>\n<ul>\n<li>pdf 업로드를 관리하는 클래스는 pdf 업로드만 관여한다.</li>\n<li>만약 pdf 를 이미지 등 다른 형태로 변경한다면 pdf 를 변경하는 클래스는 따로 생성한다.</li>\n</ul>\n<p>이렇게 하나의 action 에만 집중하는 것을 <code class=\"language-text\">하나의 일만 한다</code> 로 보통 인식한다.</p>\n<p>하지만 클린 아키텍쳐에서는 단일 책임 원칙에 대해서 다음과 같이 이야기한다.</p>\n<blockquote>\n<p>하나의 모듈은 하나의, 오직 하나의 사용자 또는 이해관계자에 대해서만 책임져야 한다.</p>\n</blockquote>\n<h2 id=\"하나의-사용자-또는-이해관계자\" style=\"position:relative;\"><a href=\"#%ED%95%98%EB%82%98%EC%9D%98-%EC%82%AC%EC%9A%A9%EC%9E%90-%EB%98%90%EB%8A%94-%EC%9D%B4%ED%95%B4%EA%B4%80%EA%B3%84%EC%9E%90\" aria-label=\"하나의 사용자 또는 이해관계자 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>하나의 사용자 또는 이해관계자</h2>\n<p>만약 pdf 업로드를 관리하는 클래스가 현재 사용하는 유저의 요금제 정보를 알고 있다고 하자.</p>\n<p>그래서 요금제 등급에 따라 pdf 변환 여부를 결정하는 스펙을 수익 모델과 관련한 기획팀에서 결정했다.</p>\n<p>한편 사용자 편의 증대와 관련한 기획팀에서 pdf 를 이미지 뿐만 아니라 doc 와 같은 문서로도 저장하는 스펙을 결정한다.</p>\n<p>이 경우 pdf 변환 클래스는 수익 모델 기획팀과 사용자 편의 증대 기획팀이라는 두 이해관계자에 의해 변한다.</p>\n<p>이 경우 하나의 이해관계자만이 pdf 변환 클래스를 책임지지 않기 때문에 단일 책임 원칙을 어긴 것이 된다.</p>\n<h2 id=\"마치며\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EC%B9%98%EB%A9%B0\" aria-label=\"마치며 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>마치며</h2>\n<p>단일 책임 원칙은 좋은 아키텍쳐를 결정하는 원칙임과 동시에 비즈니스 모델과도 관련이 있음을 알 수 있다.</p>\n<p>결국 개발자는 왜 개발을 하는가? 라는 부분에서 비즈니스 모델을 결코 분리할 수 없다는 것을 시사한다.</p>","frontmatter":{"title":"단일 책임 원칙에 대해","date":"November 15, 2021"}}},"pageContext":{"slug":"/21-11-15-single-reponsibilty-principle/","previous":{"fields":{"slug":"/21-11-09-msw-tutorial/"},"frontmatter":{"title":"MSW 를 사용해서 실제 API 가 작동하는 것처럼 mocking 하기","category":"dev","draft":false}},"next":{"fields":{"slug":"/21-11-17-sever-side-rendering-next-js/"},"frontmatter":{"title":"서버 사이드 렌더링에 대해","category":"dev","draft":false}}}},
    "staticQueryHashes": ["3128451518","3474900066"]}