🦁 걸어봐 위엄 라잌어 라이옹/👀 주차별 과제

[대학교멋사🦁/OOD] 5. 의존과 DI(의존 주입)

우주수첩 2023. 5. 5. 00:59
728x90

1. 의존하다

  • 기능 구현을 위해 다른 구성 요소를 사용하는 것.
    ex) 객체  생성, 메소드 호출, 데이터 사용 등
  • 의존은 변경이 전파될 가능성이 있음을 의미
    • 내가 의존하는 대상이 변경되면 나도 바뀔 가능성이 존재
      == 의존하는 대상이 변경되면 의존받는 대상도 바뀔 가능성이 존재
  • ex) 호출하는 메소드의 파라미터 변경
  • ex) 호출하는 메소드가 발생할 수 있는 exception 타입 추가 (예외 처리)

 

 


 

 

2. 순환 의존

  • A->B->C->A의 형태로 의존하는 관계.

 

# 문제점

  • 변경 연쇄 전파 가능성 존재.
    => 왠만하면 클래스, 패키지, 모듈 등의 모든 수준에서 순환의존이 없도록 구현하도록 하자.

 

 

Q. 의존하는 대상이 많다면?

  • A,B,C,D,E,F를 의존하는 X가 존재한다고 할때
    X는 의존하는 애들이 바뀔 때 마다 변경되어야 하는 것을 의미
    • 의존하는 대상은 적을수록 용이함
    • 내가 바뀔 가능성이 줄어드는 것.

 

 

# situation 1 : 한 클래스에서 제공하는 기능이 많은 경우

  • 각 기능마다 의존하는 대상이 다를 수 있음
  • 한 기능 변경이 다른 기능에 영향을 줄 수 있음
    => A의 기능을 변경해야 하는데 B와 연결된 기능의 변경 발생
    => 한 기능만 테스트 하고 싶은데 다른 기능들 까지 초기화 해야 하는 상황이 발생
    => 테스트에 어려움 존재

 

 

# solution 1 : 기능 별로 분리 고려

 

  • 개선 내용
    • 각 클래스별로 의존이 줄어들게 됨
    • 한 기능을 수정할 때 다른 기능을 수정하는 일이 생기지 않도록
    • 개별 기능 테스트 가능

 

 

# solution 2 몇 의존 대상을 단일 기능으로 묶어서 생각함으로써 의존 대상을 줄인다.

 

 

 

Q. 의존 대상 객체를 직접 생산하면?

=> 생성 클래스가 변경되면서 의존하는 코드또한 같이 변경됨.

 

 

그럼 어떻게 해?

  • 의존 대상 객체를 직접 생성하지 않아야지
  • ex) 팩토리, 빌더
          의존 주입(Dependency Injection)
          서비스 로케이터(Service Locator)

 

 


 

 

3. 의존 주입(Dependency Injection)

  • 객체를 직접 생성하지 않고 초기화코드에서 생성자나 메소드를 이용하여 의존 객체를 주입한다.

 

 

# 조립기(Assembler)

  • 조립기가 객체 생성, 의존 주입을 처리 ex) Spring frame work

 

 

# DI의 장점

  • 의존 객체 변경이 쉬움
    • 상위 타입 사용 시 의존대상이 변경될 경우 조립기(설정)만 변경하면 된다.
  • 존하는 객체 없이 대역 객체를 사용하여 테스트가 가능
    • 대역 사용 시 원하는 상태로 초기화 가능 => 다양한 경우의 수를 테스팅하는 데에 훨씬 용이

 

 

728x90