본문 바로가기
개발자 공부 - 인프런 온라인 강의/스프링 핵심 원리 - 기본편

[섹션 7. 의존관계 자동 주입] 생성자 주입을 선택해라! (의존관계(DI)에서 생성자 주입을 해야하는 이유) / 인프런 김영한 스프링 핵심 원리 기본편

by easpop 2023. 6. 17.
728x90
반응형

이번 시간에는 생성자 주입에 대해서 알아보았다.

 

과거에는 수정자 주입과 필드 주입을 많이 사용했지만, 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장하고 있다.

이유는 몇가지가 있는데~~

 

1. 불변

대부분의 의존관계 주입은 처음 애플리케이션 조립할 때 정해진다. 그 이후로는 의존관계를 변경할 일이 거의 없기 때문이다.

오히려 대부분의 의존 관계는 종료전까지 변하면 안된다. (불변해야된다)

 

수정자 주입을 사용하면, setXxx 메소드를 public 으로 열어두어야 되기 때문에, 누군가 실수로 변경할 수도 있고,

변경하면 안되는 메소드를 열어두는 것은 좋은 설계 방법이 아니기 때문이다.

생성자 주입은 객체를 생성할 때 한번만 호출되므로 이후에 호출되는 일이 없다.

그렇기 때문에 불변하게 설계할 수 있다.

 

2. 누락

생성자 주입을 하게 되면 누락을 방지할 수 있다는 장점이 있다.

아래의 코드로 예시를 보자.

테스트를 위해서 기존의 생성자 주입코드는 주석처리하고 수정자 주입 코드를 만든다.

 

Ctrl + Shift + T를 눌러서 테스트 클래스를 생성해준다.

 

orderService에서 createOrder를 직접호출하는 테스트 코드를 작성하고 테스트를 돌려주면~~

 

NullPointerException 오류가 난다.

 

그 이유는 OrderServiceImpl로 가면 createOrder 메소드를 호출했는데,

아래 사진의 memberRepository와 discountPolicy의 값을 넣어줘야 하는데 없기 때문이다.

 

OrderServiceImpl의 생성자 주입으로 다시 원복해준다.

반응형

그리고 orderService를 호출하는 테스트 코드를 다시 작성해주면~~

 

테스트 통과!

 

그리고 또 생성자 주입의 특징으로는,

필드에 fianl 키워드를을 쓸 수 있다.

final은 생성자를 통해서만 값을 세팅할 수 있고 (초기값을 필드에 memberRepository = xx.. 이렇게 넣지 않는 이상),

생성할 때 정해지면 바뀌지 않기 때문에 유지보수가 용이하다.

 

또한 final을 넣게 되면 생성자에서 값이 설정되지 않아서 값이 들어오지 않을 때,

예를 들면, 위와 같이 개발자가 실수로 생성자 값을 누락했을 때, 이러한 경우를 방지할 수 있다는 장점이 있다.

 

수정자 주입을 포함한 나머지 주입 방식은 모두 생성자 이후에 호출되기 때문에,

필드에 final 키워드를 사용할 수 없다. 오직 생성자 주입만 final 키워드를 사용할 수 있다.

 

정리하자면,

- 생성자 주입방식을 선택하는 이유는 프레임 워크에 의존하지 않고, 순수한 자바 언어의 특징을 살리는 방법이기도 하다.

- 기본으로 생성자 주입을 사용하고, 필수값이 아닌 경우에는 수정자 주입 방식을 옵션으로 부여하면 된다.

생성자 주입과 수정자 주입을 동시에 사용할 수 있다.

- 항상 생성자 주입을 선택해야 된다. 옵션이 필요할때는 수정자 주입을 선택하고, 필드 주입은 사용하지 않는게 좋다.

728x90
반응형

댓글