[되새김질] 스프링 기본 - 의존관계 자동 주입 #2

jeyong·2023년 8월 20일
0

- 해당 게시물은 인프런 "스프링 핵심 원리 - 기본편" 강의를 참고하여 작성한 글 입니다.

스프링 핵심 원리 - 기본편

1. 결론은 생성자 주입

최근에는 스프링을 포함한 DI 컨테이너들은 생성자 주입을 권장한다. 그 이유는 다음과 같다.

1) 불변

  • 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다.
  • 불변, 필수 의존관계에 사용한다.
  • 애플리케이션을 종료할 때 까지 의존관계를 변경할 일이 있을까? 없다. 거의 없다. 오히려 불변해야한다.
  • 수정자 주입을 사용하면, setXxx 메서드를 public으로 열어둬야 한다. 누군가 실수로 setXxx으로 변경할 수 있어서 위험한 설계다.

2) 누락

  • 생성자 주입을 사용하면 주입 데이터를 누락했을 때 바로 컴파일 에러를 낸다.
    가장 좋은 에러는 컴파일에러. 그리고 IDE에서 바로 어떤 값을 주입하라고 알려준다.

3) final 키워드

  • 생성자 주입을 사용하면 필드에 final 키워드를 사용할 수 있다. 혹시라도 생성자에 값이 주입되지 않은 오류를 컴파일 시점에 막아준다.

테스트 A) 수정자 주입으로 테스트 코드 작성

  • setter로 (수정자 주입)을 사용하여 테스트 코드를 작성한 예시를 보자.

OrderServiceImpl 에서 수정자 주입으로 의존관계를 주입했다.

순수 자바 코드를 이용해서 OrderServiceImpl 의 '주문 요청'메서드를 테스트하자.

NullPointerException 이 발생한다.

OrderServiceImpl 을 생성해서 테스트 코드를 작성하는 상황에서는 의존관계를 주입해야 하는 것을 발견하지 못하기 때문이다.
set은 '객체가 생성된 후에' 의존관계 주입을 하는거니까. 생성시에는 별 문제가 안된다.

테스트 B) 생성자 주입으로 테스트 코드 작성

OrderServiceImpl 의 의존관계를 '생성자 주입'으로 변경했다.

테스트 코드로 돌아가보자. 코드에 빨간 밑줄이 벌써 떠있고 constructor 오류가 난다.

보는 것과 같이 컴파일 오류가 발생해서 미리 알려준다.

테스트 C) final 키워드 시용시 개발자가 생성자 주입에서 필드 하나 주입하는것을 잊어버린다면?

바로 빨간줄 뜨고 자바 컴파일러가 생성자에 의존관계 주입하라고 컴파일 시점에 잡을 수 있다.

결론 : 항상 생성자 주입을 사용하자.

4. 롬복과 최신 트랜드

막상 개발을 해보면 대부분이 다 불변이다. 그래서 생성자에 final 키워드를 붙이게 된다.
대부분 다 비슷한 코드를 사용할 것인데 누군가 간단하게 만들수 있도록 해놓지 않았을까?

해당 OrderServiceImpl 을 최적화 해보자.

  • 생성자가 딱 1개만 있으면 @Autowired 를 생략할 수 있다.
  • 롬복 라이브러리를 적용해서 생성자를 자동으로 만들자.

@RequiredArgsConstructor 가 final 이 붙은 필드를 가지고 생성자 코드를 그대로 만들어준다.

profile
천천히 잊어가기

0개의 댓글