들어가며
최근 우연한 기회에 객체지향의 사실과 오해
와 오브젝트
라는 책을 쓰신 조영호님과 객체지향에 대한 간단한 토론을 할 수 있는 자리가 생겨 그 자리에서 oop 의 다양한 것들에 대해서 이야기를 나누었다.
회사 동료이자 내가 있던 팀의 리드 개발자였던 분의 블로그 글인 조영호님과의 객체지향에 대해서 이야기하기, happy-coding-day.tistory.com 에서 나온 몇가지 주제중 한가지에 대해서 이야기해보려 한다.
책임 주도 설계 (RDD) 의 책임과 단일 책임 원칙 (SRP) 의 책임은 다르다
책임 주도 설계와 단일 책임 원칙이란
이 둘의 간단한 뜻에 대해서 알아볼 것이다. 하지만 이번 글의 핵심은 책임 주도 설계의 여러가지 접근법과 패턴이나 SRP 의 필요성이나 효과에 대한 글이 아니기 때문에 간단하게 뜻 정도만 알아볼 것이다
책임 주도 설계, Responsibility Driven Design
책임 주도 설계 이하 RDD 는 시스템에서 책임을 누구에게 할당할 것인가?
에 대한 설계적인 관점이다.
이러한 설계 원칙을 통해서 거대한 시스템을 작고 응집된 여러 서브 시스템으로 만드는 것이 목적이다.
객체에게 어떠한 책임을 쥐어주느냐에 따라서 전반적인 협력의 방향성이 달라지고 흐름이 결정된다. 이에 따라서 적절한 객체에게 책임(Responsibility) 을 쥐어줘야 한다.
그 과정에서 5-GRASP 가 사용되기도 하는데 자세한 내용은 책임 주도 설계, thisblogfor 님의 블로그 를 참고하면 좋을것 같다
단일 책임 원칙, Single Responsibility Priciple
단일 책임 원칙 이하 SRP 는 객체는 어떤 하나의 액터에 의해서만 동작한다
라는 어떤 개발 원칙이다.
하나의 액터에 의해서만 동작한다는 것은 변경되는 이유가 단 하나라는 이야기이다.
나는 결국 유지보수 관점에서 보자면 하나의 변경이 예상하지 못한 다른 협력에 저해가 되는것을 막아주는 장치라고 해석한다
유명한 SRP 의 이해자료중 하나는 엉클밥의 클린 아키텍처-SRP 에 급여를 관리하는 소프트웨어의 문제점 파트에서 확인할 수 있다
코드는 없지만 해당 블로그의 클린 아키텍처, SRP 와 OCP 에서 SRP 에 대한 내용을 참고할 수 있다.
RDD 의 책임과 SRP 의 책임은 다르다
결론은 RDD 의 책임은 설계적인 관점에서 어떠한 객체에게 어떠한 일을 하게 할 것인가? 에 대한 이야기이고 SRP 의 책임은 개발이나 유지보수의 관점에서 변경의 여파를 어떻게 잘 제어할 것인가? 에 대한 이야기다
정리해보자면
- RDD 의 책임
- 설계적 관점
- 협력하는 공동체를 만들기 위한 수단
- 모듈, 컴포넌트 수준의 관심사
- SRP 의 책임
- 개발, 유지보수
- 변경의 여파를 제어하는 수단
- 코드, 객체 수준의 관심사
즉, RDD 와 SRP 는 위상이 다르다는 이야기다
위의 내용을 적용해보자면 다음 문장이 이해가 갈 것이다
RDD 를 통해서 SRP 를 만족시킬 수 있지만, SRP 에서 RDD 를 수행할 수는 없다
마치며
객체지향에서 책임이라는 단어가 정말 많이 나온다.
이 경우도 그러하고 또 비슷한 용어의 구분이 필요한 떄가 존재한다.
바로 interface 이다
java 의 interface 와 설계의, 객체의 interface 는 서로 다른 용어이다.
java 의 인터페이스는 다형을 지원하는 한 가지 방법임과 동시에 언어적인 키워드이지만 객체의 interface 는 클라이언트가 수신 객체와 협력하는 방법 혹은 메시지를 수신하는 공개된 방법이다.
이 차이를 이해하지 못한다면 (나 처럼) GoF 의 디자인 패턴 책을 읽을 때 굉장한 혼동으로 인해서 책을 덮어버리고 만다
'더 좋은 개발자 되기 > 나의 개발론' 카테고리의 다른 글
왜 자바는 반복에 있어 repeat 대신 iterate 라고 할까? 를 통해 알아보는 캡슐화와 메시지 (1) | 2023.01.06 |
---|---|
백엔드 개발자로 밥벌이 1년을 축하하며 2022년의 회고를 (16) | 2022.12.29 |
나는 개인적으로 CQRS 를 이렇게 정의내리고 이렇게 생각한다. (9) | 2022.12.06 |
[Testing] Test Double, 테스트 더블-테스트 환경을 제어하는 다양한 방법 (4) | 2022.09.25 |
오버엔지니어링 하지 않기 (2) | 2022.08.29 |
댓글