-
(스프링 기본) 20 - 생성자 주입 선택해야 하는 이유개발/Spring 2024. 10. 28. 11:21
1. 불변
- 의존관계 주입은 한 번 일어나면 애플리케이션 종료 시점까지 변경할 일이 거의 없다.
(오히려 변하면 안된다 = 불변)
- 수정자 주입 사용하면 setXxx 메서드 public 으로 열어두고, 누군가 변경할 수 있다.
- 생성자 주입은 객체 생성 시 딱 1번만 호출되고 이후에는 호출되는 일 없어 불변 설계 가능하다.
2. 누락
- 프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우
class OrderServiceImplTest { @Test void createOrder() { MemoryMemberRepository memberRepository = new MemoryMemberRepository(); memberRepository.save(new Member(1L, "name", Grade.VIP)); OrderServiceImpl orderService = new OrderServiceImpl(memberRepository, new FixDiscountPolicy()); Order order = orderService.createOrder(1L, "itemA", 10000); Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000); } }
생성자 주입을 하면 순수 자바 코드로 테스트가 가능하다.
3. final 키워드 생성
private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy;
더불어 final 키워드를 사용하여 생성자로 생성 후에 변경하지 않도록 설계가 가능하다.
final 키워드를 넣으면 초기에 생성자에 값을 반드시 넣어야 함으로 누락 오류를 막을 수 있다.
※ 수정자 주입을 포함한 나머지 주입 방식은 모두 생성자 이후에 호출되므로,
필드에 final 키워드를 사용할 수 없다. (생성자 주입만 final 가능)
■ 정리 (생성자 주입 사용하는 이유)
- 프레임 워크 의존하지 않고 순수 자바 언어로 테스트 가능 (자바 가장 잘 살리는 방법)
- 기본으로 생성자 주입 사용하고, 필수 값이 아닌 경우 수정자 주입 방식을 옵션으로 부여
생성자 주입과 수정자 주입 동시에 사용 가능하다.
- 항상 생성자 주입 선택 후 옵션 필요 시, 수정자 주입 선택
출처 : 김영한 스프링 핵심 원리 - 기본편
'개발 > Spring' 카테고리의 다른 글
(스프링 기본) 22 - 조회된 빈이 2개 이상 문제 (@Qualifier, @Primary) (0) 2024.10.28 (스프링 기본) 21 - 롬복 사용하기 (@Getter, @Setter + 생성자 주입 깔끔하게 넣기) (0) 2024.10.28 (스프링 기본) 19 - 옵션 처리 (0) 2024.10.28 (스프링 기본) 18 - 다양한 의존관계 주입 방법 (생성자, 수정자, 필드, 일반 메서드) (0) 2024.10.28 (스프링 기본) 17 - 컴포넌트 스캔 (0) 2024.10.24