스프링은 객체를 컴포넌트 스캔으로 여러가지 객체들을 빈으로 등록합니다. 그리고 해당 빈들에게 필요한 의존관계를 자동으로 주입해 주는 과정을 거치는데, 의존관계 주입을 명시하는 방법은 아래와 같이 여러가지 가 있습니다.
- 생성자 주입
- 수정자 주입(Setter)
- 필드 주입
- 일반 메소드 주입
위의 방법들을 하나하나 살펴보려 합니다.
생성자를 호출할 때 의존관계를 주입받는 방법으로, 여러가지를 따져보았을 때 가장 무난하고 선호하는 방법입니다.
💡 생성자가 하나만 존재한다면 @Autowired 어노테이션을 생략 가능 합니다!!
TMI 정보
: 이후 Lombok 라이브러리를 사용하면 @RequiredArgsConstructor 어노테이션 하나를 추가하여 생성자를 생략 가능합니다.
Setter라 불리는 필드값을 변경하는 메소드를 통해 의존관계를 주입하는 방법입니다.
💡 자바빈 프로퍼티 규약이란?
간단히 설명하자면 필드 변수는 private 지시자로 선언해 값을 직접 수정, 조회하지 않고, 해당 값을 수정하길 원한다면 setXXX() 형식의 메소드로 수정하고, 조회하길 원한다면 getXXX() 형식의 메소드로 조회하라는 규약입니다.
❗️@Autowired의 경우 주입할 대상 빈이 없으면 에러를발생하게 됩니다. 빈이 없어도 동작하게 하는 세가지 방법이 있습니다.
1. @Autowired(required = false) : 주입하려는 빈이 없다면 해당 메소드를 실행조차 하지 않습니다.
2. @Nullable : 주입하려는 매개변수 앞에 @Nullable 어노테이션을 추가해준다면, null을 허용합니다.
3. Optional<> : Optional<> 로 해당객체를 감싸주는것도 의존관계 주입 대상 빈이 없더라도 메소드가 진행됩니다.
필드 주입이란 말 그대로 필드 변수에 @Autowired 어노테이션을 추가해 주입시키는 방법입니다. 사용하지 않는것이 좋고, 사용한다면 @SpringBootTest 아래에서 실행되는 테스트같이 실제 코드와 관계없는 테스트 코드에는 사용해도 무관합니다.
💡 순수한 자바 테스트에서는 필드 주입을 사용할 수 없습니다.
@SpringBootTest처럼 DI를 해주는 스프링 컨테이너가 있는 테스트에서 사용 가능합니다.
일반 메소드를 통해 주입 받을 수도 있습니다. 한번에 여러 필드를 주입받을 수 있지만, 잘 사용하지는 않습니다.