세미나 목표
•
OOP의 구성요소는 역할, 책임, 협력, 하지만 OOP만으로 설계를 하면 객체 탐색 그래프의 사이즈가 비대해진다, 여기에 비즈니스 정책이 더해지면서 서비스 특성에 따라 TPS가 다르고 문제가 발생할 수 있다.
•
좋은 설계를 위해선 무언가가 더 필요하다.
•
의존성을 이용해 설계를 한 단계 더 진화시키는 방법에 대해 알아보자.
의존성이란?
•
B가 변경될 때, A도 함께 변경될 가능성이 있다면 의존성을 가지고 있다고 함
•
설계를 잘하면 B가 변경되더라도 A가 변경되지 않을 수 있음
클래스 의존성의 종류
패키지 의존성
•
양방향 의존성을 피하라, 단방향!
◦
동적인 프로세스를 정적인 코드에 담아내는 사람이 개발자, 즉 양방향 의존성은 개발은 편해도 런타임 시점에 예상치 못한 문제들이 발생할 수 있다.
◦
객체 간의 데이터 Sync 이슈, 객체의 수명 주기가 달라 참조해야할 때 NPE이 발생할 수도 있음, 성능 이슈
•
다중성이 적은 방향을 선택하라
◦
작가와 책이 있다면
◦
작가 → 책이 아닌
◦
작가 ← 책으로 해라
•
물론 무조건 사용하지 말라는 것이 아니라, 사용하더라도 알고 사용하자, 최대한 발생 가능성과 범위를 최소화시켜랴
패키지 사이의 의존성 사이클
•
패키지 간의 의존성 사이클이 생긴다는 것은 사실 두 패키지가 같은 이유로 같이 바뀐다는 의미
•
즉 사실은 하나의 패키지를 쓸데없이 분리한 것, 다시 합쳐주자
의존성을 이용하여 설계 진화시키기
협력 설계하기
•
관계의 방향은 협력의 방향, 런타임에 객체들의 협력 관계를 그려보고 방향성을 잡는 것이 중요하다.
•
물론 처음부터 완벽한 설계를 하는 것은 어렵다.
•
설계를 진화시키기 위한 출발점은 협력을 설계하는 것
•
의존성이 어떻게 흐를지 봐라, 봐도 모르겠다면 일단 코드를 작성하라.
•
코드 작성 후 의존성을 다시 그려보고 의존성 관점에서 설계를 다시 검토하라.
•
연관관계 : 협력을 위해 필요한 영구적인 탐색 구조
•
의존관계 : 협력을 위해 일시적으로 필요한 의존성