제어의 역전

IoC: Inversion of Control

정의

필요한 객체를 외부에서 결정하여 연결시키는 것

(= 객체 의존관계를 외부에서 넣어주는 것)

목적 및 특징

애플리케이션 **실행 시점(런타임)**에 외부에서 실제 구현 객체 인스턴스를 생성하고 주입하여 실제 의존관계가 연결된다.

장점

단점

예시

Spring Container: IoC Container

주입방식

정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.

@Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.

  1. 필드 주입
  2. Setter 주입
  3. 생성자 주입(권장)
    1. 순환 의존성 확인: 필드 주입으로는 순환 의존성을 파악하기 어렵다. 생성자 주입을 하게 되면 서버 기동 시 순환 의존성을 가지는 요소들을 파악할 수 있게 에러메시지를 표시하면서 서버가 가동이 되지 않는다.
    2. 불변성: 필드 주입은 final을 선언할 수 없지만 생성자 주입은 final을 선언함으로써 객체가 변하지 않도록 방지해준다.
    3. 단일 책임 원칙 위반 확인 가능
  4. @RequiredArgsConstructor 어노테이션을 이용한 의존성 주입
    1. @RequiredArgsConstructor라는 어노테이션을 붙이면 final 필드나 @NonNull이 붙은 필드에 대해 생성자를 생성해 준다. 주로 의존성 주입의 편의성을 위해서 사용된다.
    2. 생성자가 오직 하나만 있고, 생성자의 파라미터 타입이 빈으로 등록 가능한 존재라면 이 빈은 @Autowired 어노테이션 없이도 의존성 주입이 가능하다.

질문

의존성 주입을 해야하는 이유

@Autowired 필드 주입 VS @RequiredArgsConstructor final 주입 VS Setter 주입

@RequiredArgsConstructor final 주입

@Autowired 필드 주입

Setter 주입

생성자 주입 추천 이유