TIL 2023.11.08 생성자 주입이 좋은 점

손창현·2023년 11월 8일
0

TIL

목록 보기
5/15

불변

  • 의존 관계가 한번 주입 되고나면 대부분 어플리케이션이 종료될 때까지 의존 관계를 변경할일이 없어 중간에 변경이 불가능하게끔 불변으로 설계해야 한다.
  • 수정자 주입을 사용하려면, setter 메서드를 public으로 열어두어야 하는데 누군가의 실수로 변경할 수도 있고, 변경하면 안되는 것을 메서드로 열어두는 것을 좋은 설계 방법이 아니다.

누락

다음은 스프링 프레임워크 없이 순수 자바 코드로 단위 테스트를 하는 경우에 수정자 주입을 사용한 코드이다.

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;
 }

위 코드를 아래와 같이 테스트 실행하면

@Test
void createOrder() {
 OrderServiceImpl orderService = new OrderServiceImpl();
 orderService.createOrder(1L, "itemA", 10000);
}

memberRepositorydiscountPolicy 모두 의존관계 주입이 누락되었기 때문에 NullPointException이 발생한다. 스프링 프레임워크 안에서 작동할 때는 의존관계가 없으면 오류가 발생하지만 순수 자바 코드기 때문에 컴파일 시점에 잡아 줄 수가 없다.

하지만 생성자 주입 방식을 사용하면 의존관계 필드에 final 키워드를 사용할 수 있기 때문에 순수 자바 코드라도 컴파일 시점에 오류를 잡을 수가 있게 된다.

이로써 생성자 주입 방식은 프레임워크에 의존하지 않고, 순수 자바 언어의 특징을 잘 살리는 방법이다.

정리

생성자 주입과 수정자 주입을 동시에 사용할 수 있기 때문에 기본으로 생성자 주입을 사용하고 필수 값이 아닌 경우에는 수정자 주입 방식을 옵션으로 부여하면 된다.

profile
백엔드개발자 손창현입니다.

0개의 댓글