Setter 주입
- 필드의 값을 변경하는 Setter 메서드를 통해서 의존관계를 주입받는 방법
- 선택, 변경 가능성이 있는 의존관계에 사용
@Component
public class OrderService {
private MemberRepository memberRepository;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
필드 주입
- 필드에 바로 주입하는 방법으로, 외부에서 변경이 불가능하기 때문에 사용하지 않는 것이 좋다.
- 애플리케이션의 실제 코드와 관계없는 테스트 코드나 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용
@Component
public class OrderService {
@Autowired
private MemberRepository memberRepository;
}
생성자 주입
- 생성자를 통해서 의존관계를 주입받는 방법으로, 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다.
- 불변, 필수 의존관계에 사용한다.
- 생성자가 1개만 있는 경우에는 @Autowired를 생략해도 자동 주입된다.
@Component
public class OrderService {
private final MemberRepository memberRepository;
@Autowired
public OrderService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
장점
- 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없기 때문에 권장하는 방식
- 또한 생성자 주입은 객체를 생성할 때 딱 1번만 호출하므로 불변하게 설계가 가능하고, 필드에 final 키워드를 사용할 수 있기 때문에 생성자에서 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 막을 수 있다. (참고로 다른 주입 방법은 모두 생성자 이후에 호출되므로 필드에 final 키워드를 사용할 수 없다.)
- 생성자 주입 방식은 프레임워크에 의존하지 않고 순수한 자바 언어의 특징을 잘 살리는 방법으로, 기본으로 생성자 주입을 사용하고 필수값이 아닌 경우에만 Setter 주입 방식으로 옵션을 부여하는 것이 좋다.
Lombok
- 롬복 라이브러리가 제공하는 @RequiredArgsConstructor 기능을 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.
- 최근에는 생성자를 딱 1개 두고 @Autowired를 생략하는 방법과 롬복 라이브러리를 함께 사용한다.
'Spring > Spring' 카테고리의 다른 글
Lombok 생성자 어노테이션 (0) | 2022.07.07 |
---|---|
빈 생명주기와 콜백 (0) | 2022.03.03 |
객체지향 설계와 스프링 (0) | 2022.02.28 |
@Bean과 @Component (0) | 2022.01.27 |
스프링 컨테이너와 컴포넌트 스캔 (0) | 2022.01.20 |