Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
01-25 03:08
- Today
- Total
Tags
- 스프링 Configuration
- Spring interceptor
- docker
- 생성자 주입
- HandlerMethodArgumentResolver
- 스프링 빈 조회
- qualifier
- autowired
- 롬복 Qualifier
- 싱글톤 컨테이너
- Spring
- Autowired 옵션
- 스프링 컨테이너
- 빈 중복 오류
- DI
- 스프링 빈
- springsecurity
- 객체지향
- UsernamePasswordAuthenticationFilter
- RequiredArgsConstructor
- 도커
- 스프링 싱글톤
- beandefinition
- DI컨테이너
- Servlet Filter
- 라즈베리파이4
- 라즈베리파이
- 의존관계 주입
- ComponentScan
- 스프링
Archives
그날그날 공부기록
왜 생성자 주입 방식을 선택해야 할까? 본문
의존관계 주입 방법에 대한 강의를 들으며 여러 방식이 있다는 것을 알았다.
하지만 최근에는 스프링을 포함하여 대부분의 DI프레임워크들이 생성자 주입 방식을 권장한다고 한다.
- 불변
- 대부분의 의존관계는 한번 일어나면 애플리케이션 종료 전까지 변하지 않아야 한다.
- setter 주입을 사용하면 그 메서드를 public으로 열어두어야 한다. → 실수할 가능성이 높아진다.
→ 생성자 주입은 객체 생성 시점에 한 번만 호출되기 때문에 불변하게 설계할 수 있다.
- 누락
- 스프링 프레임워크 없이 순수한 자바 코드로 실행시킬 경우 @Autowired는 동작하지 않는다.
→ 스프링 없이 순수한 자바로 테스트하는 경우가 많이 생긴다고 한다. - 생성자 주입 방식이라면 컴파일 오류가 발생해 의존관계 주입에 관한 ‘누락'을 빠르게 알아차릴 수 있다.
- 하지만 setter주입 등 다른 방식이라면 자바 코드상으로 문제가 없어 실행은 되지만 의존관계는 주입되지 않았기 때문에 NullPointException이 발생한다.
- 스프링 프레임워크 없이 순수한 자바 코드로 실행시킬 경우 @Autowired는 동작하지 않는다.
생성자 주입과 setter주입을 각각 스프링 없이 테스트한다.
당연히 @Autowired는 작동하지 않기 때문에 객체를 생성할 경우 직접 의존관계를 주입해주어야 한다.
아래의 코드는 각각 생성자 주입과 수정자 주입을 사용한 객체이다.
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
위와 같은 생성자 주입 방식을 사용하고, 테스트 코드에서 new OrderServiceImpl()로 객체를 생성한다고 생각해보자.
의존관계 주입을 누락했을 경우 컴파일 오류가 발생하여 어떤 의존관계가 누락되었는지, 어떤 값이 필수인지 빠르게 확인할 수 있다.
setter주입을 사용했을 경우이다.
@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;
}
}
마찬가지로 테스트 코드에서 new OrderServiceImpl()로 객체를 생성한다고 생각해보자.
해당 서비스 사용을 위해 set메서드로 의존관계를 주입해 주어야 하지만 주입하지 않아도 자바 코드상에서는 문제가 없다.
결과적으로 실행은 되지만 오류가 발생하고 직접 OrderServiceImpl 코드를 확인하지 않는 이상 어떤 값이 필수로 들어가야 하는지 알 수 없다.
- final 키워드
- 생성자 주입을 사용한다면 필드에 final키워드를 사용할 수 있다.
- 이는 누락되는 데이터를 컴파일 시점에서 확인할 수 있다.
정리
- 생성자 주입 방식은 프레임워크에 의존하지 않고 자바 언어의 특성을 잘 살리는 방법이다.
- 항상 생성자 주입을 사용하고 의존관계가 필수적이지 않다면 수정자 주입 방식을 옵션으로 부여하면 된다.(생성자 주입과 동시 사용 가능)
- 옵션이 필요하다면 수정자 주입을 사용하는 것이 좋다. 필드 주입은 사용하지 말자.
출처
'Spring 공부' 카테고리의 다른 글
스프링 빈 중복 시 오류 & 해결방법 (0) | 2022.08.02 |
---|---|
lombok(롬복) 설치 & 적용하기 (0) | 2022.08.02 |
@Autowired 옵션 처리 (0) | 2022.07.28 |
스프링의 의존관계 주입 방법 2 (0) | 2022.07.27 |
스프링의 의존관계 주입 방법 (0) | 2022.07.26 |
Comments