본문 바로가기

좋아하는 것_매직IT/1.spring

7.Spring, 의존성 주입(dependency injection) 타입에 대해서 알아봅시다. ^^

반응형

의존성 주입(dependency injection) 타입의 종류는 무엇이 있을까요?

  • 정답은 아래와 같습니다.
    • constructor injection
    • setter injection

우선 생성자(constructor) 주입에 대해서 알아볼께요.

  • 말 그대로, 생성자 주입은 의존성 주입을 위해서 생성자를 이용하는 것입니다.
  • 그럼 예시를 통해서 알아볼까요?
  • 예시

  • 위코드를 실행하면, 아래로그가 찍히게됩니다.
    • 로그예시
      • Autowiring by type from bean name 'BusinessThubServiceImpl' via constructor to bean named 'dataThubServiceImpl'

그럼, setter 주입에 대해서 알아볼께요.

  • 역시나, setter 주입은 의존성 주입을 위해서 setter를 이용하는 것입니다.
  • 그럼, 또 예시를 통해서 알아볼까요?
  • 예시

 

but, 솔직히 setter 주입을 사용하기 위해서는 setter 메소드를 선언할 필요조차 없습니다.

  • 왜냐하면, 변수에 @Autowired를 지정하면 Spring은 자동으로 setter 주입을 사용하게 됩니다.
  • 다시말해서, DataThubService의 setter 주입에 필요한 코드는 아래와 같습니다.
    • 예시

 

그럼, 위에서 알아본 constructor 와 setter 주입간 차이점을 알아보자.

  • constructor injection
    • 필수적인 의존성 주입에 유용함.
    • 게다가 final을 선언할 수 있으므로 객체가 불변하도록 할 수 있음.
    • 또한 순환 의존성도 알 수 있음. 
    • 그로인해 나쁜 디자인 패턴인지 아닌지 판단할 수 있게됨.
    • 스프링 4.3버전부터는,
      • 클래스를 완벽하게 DI 프레임워크로부터 분리할 수 있게됨.
      • 단일 생성자에 한해 @Autowired를 붙이지 않아도 된다고함
      • 이러한 장점들 때문에 스프링 4.x 에서는 더이상 Setter Injection이 아닌 Constructor Injection을 권장함.
      • 굳이 Setter Injection을 사용한다면
        • 합리적인 디폴트를 부여할 수 있고 선택적인(optional) 의존성을 사용할 때만 사용해야한다고 말함.
        • 그렇지 않으면 not-null 체크를 의존성을 사용하는 모든 코드에 구현해야된다고 함.
  • setter injection
    • 위에서 알아본거와 같이, 선택적인 의존성을 사용할 때 유용함.
    • 상황에 따라 의존성 주입이 가능하다.
      • 스프링 3.x 에서는 Setter Injection을 추천했었음.

결론

  • 의존성 주입(dependency injection) 타입의 종류는 constructor/setter injection 이 있음.
  • setter injection은 선택적인 의존성을 사용할 때 유용함. 그외의 부분에서는 constructor injection을 사용하면됨.
  • 오늘도 Spring 관련 의존성 주입 종류에 대한 마술(?) 한가지 획득완료! 감사합니다. ^^
300x250