[우아한 객체지향] 의존성을 이용해 설계 진화시키기 - 1

newVelog·2024년 7월 25일
0

CS

목록 보기
31/31

이 게시글은 아래 우아한테크에서 진행한 세미나 영상을 보고 작성했다.
[우아한 객체지향] 의존성을 이용해 설계 진화시키기

해당 영상은 아래 4개의 주제로 이야기하고있고 이번 게시글은 1번 항목을 이야기 할 것이다.
1. 의존성이란?
2. 예제 살펴보기
3. 의존성에 따라 설계가 어떻게 바뀌는지 과정을 보여준다.
4. 의존성을 어떻게 관리할 것인지에 대한 힌트를 얻어가자.

의존성

설계란 코드를 어떻게 배치할 것인가에 대한 의사결정이다.
어떤 class에 어떤 코드를 넣을 것이고 어떤 package에 어떤 코드를 넣을 것이고 어떤 project에 어떤 코드를 넣을 것인지에 따라서 설계의 모양이 많이 바뀐다.

그러면 어디에 어떤 코드를 넣어야할까?
핵심은 변경에 초점을 맞추는 것이다. 같이 변경되는 코드를 같이 넣고, 같이 변경되지 않는 코드는 따로 넣어야한다.
이 변경의 핵심은 의존성이다.


A가 B에 의존한다.
B가 변경될 때 A도 변경될 가능성이 있다.

Dependency(의존성) 라는건 변경에 의해서 영향을 받을 수 있는 가능성이다.

클래스 의존성의 종류

  1. 연관관계

    A에서 B로 이동할 수 있다. (A라는 클래스에 B로 갈 수 있는 경로를 가지고 있다.)
    코드상으로 객체참조가 있다고 볼 수 있다.
    A에서 B로 영구적으로 갈 수 있는 경로가 있는것이라고 본다.

  2. 의존 관계

    파라미터에 그 타입이 나오거나 리턴타입에 그 타입이 나오거나 메서드 안에서 그 타입의 인스턴스를 생성하면 의존 관계라고 할 수 있다.
    A에서 B로 일시적으로 협력을 하는 어떤 시점에 잠깐 관계를 맺고 헤어지는 관계이다.

  3. 상속 관계

    실질적으로 B 클래스의 구현을 A가 상속 받는것이기 때문에 B가 바뀔때 A도 같이 바뀌게 된다.
    구현이 바뀌더라도 영향을 받을 수 있는 것이다.

  4. 실체화 관계

    인터페이스를 implements 하는 관계이다.
    인터페이스의 메서드의 시그니처(메서드 명, 매개변수, 반환 타입 등)가 바뀌었을 때만 영향을 받는 것이다.

패키지 의존성


"패키지 A가 패키지 B에 의존을 한다." 라고 하는 것은 패키지 B에 있는 클래스가 바뀔때 패키지 A에 있는 클래스가 바뀐다. 그러니까 어떤 패키지 안에 있는 클래스가 다른 패키지 안에 있는 클래스의 뭐가 되었건(연간관계이던 의존관계이던) 어쨌든 의존성이 있으면 두 패키지 간의 의존성이 있다고 보면 된다.
간단하게 클래스 파일에서 import에 다른 패키지의 이름이 나오면 의존성이 있는 것이다.

좋은 의존성을 관리하기 위한 Guide (정답은 아님)

  1. 양방향 의존성을 피하라

    B가 바뀔때 A가 바뀌고, A가 바뀔때 B도 바뀐다. 이 것은 A와 B가 하나의 클래스여도 되는 것을 억지로 찢어 놓은거라고 볼 수 있어서 좋은 설계가 아니라고 할 수 있다.
    또, A 클래스 setter에서 B 클래스의 setter 를 부르고 있다. 항상 A와 B 사이의 관계를 동기화 시켜줘야한다.
    그래서 연관관계가 양방향이 될때에는 신경 쓸 것이 많아진다. 성능이슈, 싱크 맞추다가 발생하는 버그 등이 있다.
    물론 양방향 연관관계가 꼭 필요한 경우도 있겠지만 그래도 양방향 연관관계를 피할 수 있으면 아래와같은 단방향 연관관계로 바꿔야한다.

  2. 다중성이 적은 방향을 선택하라

    A에서 B 타입의 컬렉션을 인스턴스 변수로 잡거나, 컬렉션에 대해서 dependency를 가지는 것 보다는 아래와 같이 반대방향의 dependency를 가지도록 하는 것이 좋다.

    List나 Collection 같은 것들을 인스턴스 변수로 가지면 다양한 이슈가 발생한다.
    JPA에서는 성능이슈가 발생할 수 있고, 그 객체들의 관계를 유지하기 위한 많은 노력들이 필요하다. 그래서 가급적이면 다중성이 적은 의존성의 방향을 선택하는 것이 좋다.

  3. 의존성이 필요없다면 제거하라

    A와 B사이의 의존성이 필요없다면 제거하는 것이 가장 좋다.

  4. 패키지 사이의 의존성 사이클을 제거하라

    패키지 사이에는 양방향 의존성이 있으면 안된다.
    예를들어 패키지 3개가 있는데 이 패키지 3개 사이의 dependency를 따라갔을때 A->B, B->C, C->A 처럼 의존성이 있다면 이 패키지들은 원래 하나의 패키지여야 하는 것이다.

이처럼 위의 가이드를 기반으로 다음 게시글에서는 의존성에 관하여 예제를 통해 이야기하도록 하겠다.

0개의 댓글