본문 바로가기


Java

[의존성과 아키텍처] 조영호작가님의 우아한 객체지향 강의 후기 및 정리

회사에 조영호작가님이 오셔서 우아한테크세미나에서 진행하신 의존성과 아키텍처 강의를 진행해주셨다.

오늘 쓸 내용은 그 강의에 대한 후기이자 정리이다.

정리

의존성

의존성이란

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 하나가 변경되는 방향이 될 수 있다.
  • 의존성이 필요없다면 제거하자
    해당 객체와 협력이 필요하지 않음에도 의존하고 있다면 의존성을 제거해야한다.
  • 패키지 사이의 의존성 사이클을 제거하자
    패키지 사이에 의존성 사이클이 존재한다면 의존하고 있는 각 클래스의 의존성을 정리하여 단방향으로 의존하도록 해야한다.

의존성을 설계하는 방법

  1. Domain 을 정한다.
    각 도메인이 가져야할 책임에 따라 Domain 을 정한다.
    ex) 주문, 상품, 결제 ...
  2. 협력을 설계한다. 
    각 Domain이 주소받아야할 협력을 설계한다.
    ex) 주문이 상품을 확인해야한다. 주문이 결제를 요청해야한다. ...
  3. 의존성의 방향을 설정한다.
    협력의 방향 == 관계의 방향 == 의존성의 방향
  4. 관계의 종류를 결정한다.
    영구적인 탐색관계(연관관계), 일시적인 필요에 의한 의존성(의존관계) 등 관계의 종류를 설정한다.
  5. 구현을 시작한다,
  6. 의존성 관점에서 설계를 검토한다. 
    구현하면서 끊임없이 이과정을 반복한다.

의존성 설계를 개선하는 방법

  1. 객체 참조를 줄인다.
  2. 의존성 사이클을 제거한다.

객체참조

결합도와 의존성의 차이

  • 의존성 : 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

 

[수정본] 우아한 객체지향

2019년 6월 20일 우아한 테크 세미나 "우아한 객체지향" 발표자료 수정본

www.slideshare.net


끝!