728x90
Spring 관련해서 요즘 기초부터 다시 보고 있는데 생성자 주입에 관해서 보고 있던 중, 흥미로운 부분을 발견했다.
수정자 주입과 필드 주입이다.
(옛날에는 수정자 주입, 필드 주입을 많이 사용했었다고 한다)
수정자 주입
- 선택, 변경의 가능성이 있는 의존관계에 사용한다
- 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다
- set메서드를 public으로 열어둬야 한다 (누군가 변경가능성 있음)
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
필드 주입
- 코드가 간결해진다
- DI 프레임워크가 없으면 아무것도 할 수 없음
- 테스트 코드 짜기 힘들다(외부에서 변경이 불가능)
- 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용한다
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
생성자 주입
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
위와 같은 특징과 방법이 있는데 그냥 생성자 주입이나 쓰자
최근 스프링을 포함한 DI프레임워크 대부분이 생성자 주입을 권장하고 있다
- 대부분의 의존관계 주입은 불변해야 한다
- 객체를 생성할 때 1번만 호출되므로 이후에는 호출되는 일이 없다 (불변하게 설계가능)
- final 키워드를 통해 코드 누락을 막을 수 있다 (나머지 주입방식들은 사용불가)
프레임워크에 의존하지 않고, 순수한 자바 언어의 특징을 잘 살리는 방법이기도 하다
가끔 필수 값이 아닌 경우에만 수정자 주입방식을 옵션으로 부여하면 된다 (생성자 주입과 수정자 주입 동시에 사용가능하다)
그냥 수정자 주입이나 쓰자. 그리고 가아아아아끔 옵션이 필요하면 수정자 주입을 쓰자 (필드 주입은 그냥 그런게 있구나로만 넘어가자)
컴파일 오류는 세상에서 가장 빠르고, 좋은 오류다!
728x90
'개발일지 > Spring' 카테고리의 다른 글
[회고] 스프링 핵심 원리 - 기본편 (0) | 2023.03.21 |
---|---|
Spring - 빈 생명주기 콜백 (0) | 2023.03.17 |
스프링 싱글톤 컨테이너 (Spring Singleton Container) (0) | 2023.03.03 |
싱글톤 패턴 (Singleton Pattern) (0) | 2023.03.03 |
좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2023.02.25 |