스프링 프레임워크 의존성 주입

최민영·2024년 9월 25일

IntelliJ

목록 보기
24/30

의존성 주입 Dependency Injection
스프링 컨테이너에서 객체 Bean을 먼저 생성해두고 생성한 객체를 지정한 객체에 주입하는 방식

의존성 주입 방식
1) 필드 주입 Field Injection
클래스에 선언된 필드에 생성된 객체 주입
@Autowired 어노테이션 사용

@Autowired
private PetService petService;

2) 수정자 주입 Setter Based Injection
수정자를 통해 의존성 주입

private PetService petService;
@Autowired
public void setPetService(PetService petService){
    this.petService = petService;
}

3) 생성자 주입 Constructor Based Injection
생성자를 통해 의존성 주입 (final 사용 가능, 1회 호출 보장)

private final PetService petService;

@Autowired
public PetController(PetService petService){
    this.petService = petService;
}

이때 Lombok 라이브러리를 통해 간결하게 작성할 수 있다

@RequiredArgsConstructor
public class PetController{
    private final PetService petService;
}

Autowired 키워드 생략, 필드를 포함한 생성자 자동 생성

생성자 주입의 장점

  • 객체의 불변성 : 생성자는 최초 1회 주입하므로 immutable, 객체가 비어있을 가능성도 배제
  • 순환 참조 방지 : 두 객체가 각각 서로를 필드에 포함하여 참조하는 순환 참조 상태를 방지할 수 있다. 순환 참조가 발생하면 서로의 객체를 계속해서 생성하는 무한반복에 빠질 수 있다. 다른 주입 방법과의 차이는 순환 참조의 발생 시점에 있다. 필드주입과 수정자주입은 실제 메소드가 호출되었을 때 runtime 에러와 함께 순환참조가 일어날 수 있으며 서비스 진행중에 문제가 발생할 수 있다. 생성자주입은 스프링 애플리케이션이 구동되는 순간(컴파일 중)에 에러가 발생하기 때문에 서비스 진행 전 문제를 해결할 수 있다.
  • 테스트 용이 : 순수 자바 코드로 테스트가 가능하다.

0개의 댓글