의존관계 주입

전현진·2025년 3월 28일

Spring

목록 보기
7/14

의존관계 주입

의존관계 주입을 하는 방법으로 생성자 주입, setter 주입, 필드 주입, 메서드 주입 총 4가지 방법이 존재한다.

- 의존관계 주입 방법

- `@Autowired` 는 의존성을 자동으로 주입할 때 사용하는 Annotation 이다.
    - 기본적으로 주입할 대상이 없으면 오류가 발생한다.(`required = true`)

1. 생성자 주입

- 생성자를 통해 의존성을 주입하는 방법.
- 최초에 한번 생성된 후 값이 수정되지 못한다.[불변, 필수]
- 생성자가 하나인 경우 @Autowired 생략이 가능하다.

2. Setter 주입

- Setter 메서드를 통해 의존성을 주입하는 방법.
- 선택하거나, 변경 가능한 의존관계에 사용한다.(생성자 주입은 필수 값)

3. 필드 주입

- 필드에 직접적으로 주입하는 방법 (가장 추천되지 않음).
- 코드는 간결하지만 Spring이 없으면 사용할 수 없다.
	- 사용하지 않아야 한다.
	- 순수 Java 코드로 사용할 수 없다. = 테스트 코드 작성이 힘들다.
	- Application의 실행과 관계 없는 `@SpringBootTest` 테스트 코드나 Spring에서만 사용하는  `@Configuration` 같은 곳에서 주입할 때 주로 사용한다.

4. 일반 메서드 주입

- 생성자, setter 주입으로 대체가 가능하기 때문에 사용하지 않는다.

의존관계를 자동으로 주입할 객체가 Spring Bean으로 등록되어 있어야 @Autowired 로 주입이 가능하다.

생성자 주입

과거 setter, 필드 주입도 사용했지만 현재는 DI를 가지고 있는 대부분의 Framework가 생성자 주입 방식을 권장한다.

생성자 주입을 선택하는 이유

- **불변(immutable)**
    - 어떤 요리(Web Application)를 만들지 정해졌다면 이미 재료(Bean)와 의존 관계가 결정된다.
    - 객체를 생성할 때 최초 한번만 호출된다.(불변)
    - setter 주입을 사용하면 접근제어자가 `public` 으로 설정되어 누구나 수정할 수 있게된다.
- 실수 방지
    - 순수 Java 코드로 사용할 때(주로 테스트 코드) 생성자의 필드를 필수로 입력하도록 만들어준다.(NPE 방지)
    - 컴파일 시점에 오류를 발생 시킨다. 즉, 실행 전에 오류를 알 수 있다.
- Spring Framework에 의존하지 않아도 객체 지향 특성을 가장 잘 사용하는 방법이다.

필드에 final 은 생성자 주입 방식만 사용할 수 있다. 나머지 주입 방식들은 모두 생성 이후에 호출되어 사용할 수 없다.

@RequiredArgsConstructor

실제 Web Application을 개발하면 대부분이 불변 객체이고 생성자 주입 방식을 선택하게 된다. 이런 반복되는 코드를 편안하게 작성하기 위해 Lombok에서 제공하는 Annotation 이다.

  • @RequiredArgsConstructor
    • final 필드를 모아서 생성자를 자동으로 만들어 주는 역할
    • Annotation Processor 가 동작하며 컴파일 시점에 자동으로 생성자 코드를 만들어준다.

생성자를 하나 만들고 @Autowired 를 사용한 코드와 똑같이 동작한다.

profile
안녕하세요

0개의 댓글