회사에 조영호작가님이 오셔서 우아한테크세미나에서 진행하신 의존성과 아키텍처 강의를 진행해주셨다.
오늘 쓸 내용은 그 강의에 대한 후기이자 정리이다.
정리
의존성
의존성이란
A와 B가 존재하고 B가 변경될 때 A도 변경되어야 하면 A가 B에 의존성을 가진다라고 할 수 있다.
https://image.slidesharecdn.com/woowahanoo-190618171417/95/-3-1024.jpg?cb=1560916139
클래스 의존성의 종류
- 연관 관계 (Association)
A가 B를 '영구적' 으로 의존하는 경우 대표적으로 객체참조가 이에 해당된다. - 의존 관계 (Dependency)
A가 B를 '일시적'으로 의존하는 경우 대표적으로 함수의 파라미터로 넘겨받는 경우나 리턴타입, 지역변수의 경우가 해당된다. - 상속 관계 (Inheritance)
A가 B를 상속하는 경우에 해당된다. - 실체화 관계 (Realization)
흔히 말하는 구현(Implementation) 관계로 A가 B를 구현하고 있을 경우에 해당된다.
패키지 의존성
패키지 내부에 클래스 들이 서로 의존하고 있을 때 패키지 의존성이 생긴다,
의존성 기본 원칙
- 양방향의존성(사이클) 을 피하자
A 가 변경될 때 B 도 변경되고 B가 변경될 때 A도 변경되어야 한다면 양방향 의존성이 된다. 이 상황은 코드가 변경에 취약하고 개발 확장성이 떨어진다. - 다중성이 적은 방향을 선택하자
A 와 B 가 일대다(One-To-Many) 구조로 되어있다면 Many 인 B 가 A 를 의존하는 방향성을 선택해야한다. 그래야 A가 변경될 때 B의 모든 요소들이 변경되는 것이 아닌 B 하나가 변경되면 A 하나가 변경되는 방향이 될 수 있다. - 의존성이 필요없다면 제거하자
해당 객체와 협력이 필요하지 않음에도 의존하고 있다면 의존성을 제거해야한다. - 패키지 사이의 의존성 사이클을 제거하자
패키지 사이에 의존성 사이클이 존재한다면 의존하고 있는 각 클래스의 의존성을 정리하여 단방향으로 의존하도록 해야한다.
의존성을 설계하는 방법
- Domain 을 정한다.
각 도메인이 가져야할 책임에 따라 Domain 을 정한다.
ex) 주문, 상품, 결제 ... - 협력을 설계한다.
각 Domain이 주소받아야할 협력을 설계한다.
ex) 주문이 상품을 확인해야한다. 주문이 결제를 요청해야한다. ... - 의존성의 방향을 설정한다.
협력의 방향 == 관계의 방향 == 의존성의 방향 - 관계의 종류를 결정한다.
영구적인 탐색관계(연관관계), 일시적인 필요에 의한 의존성(의존관계) 등 관계의 종류를 설정한다. - 구현을 시작한다,
- 의존성 관점에서 설계를 검토한다.
구현하면서 끊임없이 이과정을 반복한다.
의존성 설계를 개선하는 방법
- 객체 참조를 줄인다.
- 의존성 사이클을 제거한다.
객체참조
결합도와 의존성의 차이
- 의존성 : B가 바뀔 때 A가 바뀌는 가의 여부
- 결합도 : B가 바뀔 때 A가 얼마나 자주 바뀌는 가의 정도
객체참조의 단점
가장 쉬운 의존성 설정 방법이지만 결합도를 상승시킨다
객체참조를 줄이는 방법
https://image.slidesharecdn.com/woowahanoo-190618171417/95/-81-1024.jpg?cb=1560916139
의존성 사이클을 제거하는 방법
- 중간객체를 놓는다.
사이클이 생긴 부분에 중간객체를 놓음으로써 의존성 사이클을 제거한다.
관련 슬라이드
shop 과 order 사이에 의존성 사이클이 존재한 걸 중간 객체를 이용해 의존성을 해결
https://image.slidesharecdn.com/woowahanoo-190618171417/95/-54-1024.jpg?cb=1560916139
https://image.slidesharecdn.com/woowahanoo-190618171417/95/-58-1024.jpg?cb=1560916139
- 인터페이스(interface) 를 이용하여 의존관계를 역전시킨다.
관련슬라이드
Deilivery 도메인이 추가되면서 패키지 사이에 의존성 사이클이 생겼다.
https://image.slidesharecdn.com/woowahanoo-190618171417/95/-122-1024.jpg?cb=1560916139
인터페이스(interface)르 활용한 DIP 를 통해 의존성 사이클을 해결
https://image.slidesharecdn.com/woowahanoo-190618171417/95/-124-1024.jpg?cb=1560916139
- 패키지를 분리 한다.
의존성 사이클이 생기는 부분의 패키지를 분리하여 의존성 사이클을 제거한다 마치 중간객체를 둬서 의존성을 해결했던 것처럼 다른 패키지로 분리하여 패키지사이의 의존성 사이클을 제거하는것
관련슬라이드
결제를 위한 EvenHandler 가 추가되어 Order 와 Shop 사이에 의존성 사이클이 생겼다.
https://image.slidesharecdn.com/woowahanoo-190618171417/95/-137-1024.jpg?cb=1560916139
Billing 이라는 새로운 패키지로 분리하여 의존성 사이클 해결
https://image.slidesharecdn.com/woowahanoo-190618171417/95/-141-1024.jpg?cb=1560916139
https://image.slidesharecdn.com/woowahanoo-190618171417/95/-143-1024.jpg?cb=1560916139
후기
토끼책과 오브젝트의 저자분께 직접 강의를 들을 수 있는 기회가 있어서 좋았다. 강의가 매끄럽고 이해하기 쉬웠다. 원래는 빠른속도로 진행하신다고 했는데 회사에서 진행한 강의는 시간적 여유가 있어서 더 자세히 설명해 주셔서 이해하는데 어려움이 없었다. 강의 이후에 평소에 DDD 를 공부하며 궁금했던 것에 대하여 물어봤는데 이에 대한 답도 이후 개발 설계를 하는데 있어서 큰 도움이 되었다. 이 글을 보고 계신 분들도 강의를 듣지 않으셨다면 꼭 유투브에서 들어보시기를 바란다.
질문 했던 내용은 코드 내에는 이벤트핸들러가 도메인 영역에 있는데 이벤트핸들러가 애플리케이션 영역에 있는것 같다고 생각되는데 다른 도메인을 도메인에서 도메인으로 직접 연결가능한지에 대한 문의였다. 구현할 수 있으면 도메인에서 도메인 서비스를 이용하여 바라볼 수 있고 이벤트핸들러는 작가님이 생각하시기에도 애플리케이션영역이라고 생각하시지만 강의의 편의를 위해 다르게 표현한 부분이 있다고 답해주셨다.
youtube : https://www.youtube.com/watch?v=dJ5C4qRqAgA
slide link : https://www.slideshare.net/baejjae93/ss-151545329?qid=7a53502f-0d61-4c95-9d7a-15c76830919b
끝!
'Java' 카테고리의 다른 글
[OOP] 책임과 역할의 차이 그리고 타입의 구현 방법 (0) | 2019.12.15 |
---|---|
[OOP] 객체, 추상화, 캡슐화 (0) | 2019.12.14 |
[JAVA Stream] stream(), peek()의 함정 (1) | 2019.11.27 |
[Java] Handlebars.java 써서 예약어 Template 으로 처리하기 (1) | 2018.12.31 |
[Java] Jackson으로 Json <-> Object 변환(Transformation)하기 (0) | 2018.06.28 |