객체의 세계에서 협력은 필수적이며, 객체가 협력한다는 것은 객체 간의 의존성이 존재한다는 것이다. 여기서 의존성이란 파라미터나 리턴값 또는 지역변수 등으로 다른 객체를 참조하는 것을 의미한다.
모듈간 의존성이 줄어든다.
모듈간 변경에 민감해지지 않아, SOLID 원칙 중 OCP(개방-폐쇄 원칙)을 만족하는 코드를 작성할 수 있다.
재사용성이 높아진다.
유닛 테스트를 쉽게 만들어준다.
테스트하려는 A모듈이 의존하는 B모듈에 대한 Mock 객체 (이를 테스트 더블이라고 한다) 를 만들면, A모듈과 B모듈을 별개로 유닛 테스트할 수 있다.
가독성이 증가한다.
일반적인 (의존성에 대한) 제어권: “내가 사용할 의존성은 내가 만든다.”
기존 방식은 객체를 생성하고 사용하는 2가지 책임이 존재한다.
만약, 객체를 생성하는 과정에서 변경사항이 생긴다면, 생성에 관한 코드를 수정해야 하며, 경우에 따라 객체를 사용하는 코드 또한 수정하는 경우가 존재한다.
결국, 프로그래머는 객체의 생성 및 사용 또한 지속적으로 신경쓰면서 코딩해야하고 누락하게 된다면 잠재적으로 버그를 가지게 된다.
“내가 사용할 의존성을 누군가 알아서 주겠지”
실제 의존성 주입은 스프링(ApplicationContext)이 해줌
💡 IoC 란 제어의 역전으로
객체를 생성하고 관리하는 '제어'를 역전시키는 것이다.
내가 객체를 생성하고 관리하는 것이 아니라 객체의 새성은 외부에 맡기고 나는 객체의 사용만을 관리하는 것!
개발자는 객체의 생성과 유지 및 관리에 대한 신경을 쓰지 않도록 도와준다.
즉, 생성과 사용을 분리하는 것이 좋다.
클린코드 11장 시스템 제작과 사용을 분리
ApplicationContext, BeanFactory
ApplicationContext를 주로 사용하며 BeanFactory뿐 아니라 다양한 인터페이스들을 상속받고 있기 때문에 다양한 일들을 함
빈을 만들고 엮어주며 제공한다.
빈 설정
컨테이너를 직접 쓸 일은 많지 않다.
의존성 주입은 Bean끼리만 가능
스프링 IoC 컨테이너 안에 들어 있는 객체들끼리만 의존성 주입을 함(IoC밖에 있는 객체에다가 의존성 주입을 하지 않음)
Bean은 applicationContext가 알고 있는 객체
라이프 사이클 콜백
@Autowired 를 이용해 빈을 꺼내와서 의존성을 주입해줄 수 있음(생성자를 통해 주입 받는 것이 아니라)
IOC 컨테이너 자체가 Bean으로 등록되어 있어 아래와 같이 가져 올 수 있음
public OwnerController(OwnerRepository clinicService, ApplicationContext applicationContext){
this.owners=clinicService;
this.applicationContext = applicationContext;
}
@Autowired
private OwnerRepository owners;
생성자를 이용한 의존성 주입의 장점
- @Autowired를 사용하지 않아도 된다.
- 불필요한 Setter를 만들지 않아도 되며 이로 인한 코드의 안정성을 증대시킨다.
- 해당 클래스가 NullPointerException을 발생할 확률을 줄여준다.
- 의존 관계에 대한 내용을 외부로 노출시킴으로써 컴파일 타임에 오류를 잡아낼 수 있다.
- 클래스에서 생성자는 단 1개여야 한다.
- 생성자에는 의존성 주입 받는 빈의 자료형을 매개변수로 등록해야한다.
- 주입 받고자 하는 빈이 스프링 컨테이너에 존재해야 한다.
Yes! 모든 파라미터는 컨테이너에 등록된 빈으로만 만들자.
DI의 장점은 컨테이너에서 바로 빈을 주입해주는 것이 장점이다.
상황에 따라, 필드나 Setter 방식을 사용할 수 있다.
DI를 지원하는 어노테이션은 여러가지가 있다.
@Autowired : 필드의 자료형과 연관된 객체를 컨테이너로부터 주입받아준다.
@Inject : 특정 프레임워크에 종속적이지 않은 Java 의 의존성 주입 어노테이션이다.
@Qualifier : @Autowired와 함께 사용되며,
빈의 이름을 기준으로 우선적으로 주입받을 객체를 지정할 수 있다.
@Resource : 빈의 이름을 기준으로 의존성 주입을 처리한다.
의존성 주입 어노테이션에 대한 보다 자세한 내용은 필자가 정리한 내용을 참고바란다.