[김영한님 - 스프링 핵심 원리] 생성자 주입을 사용해야하는 이유

2022. 11. 1. 23:41Spring

728x90

의존관계를 주입하는 방법에는 4가지가 있다.

그 중 주로 사용하는 것은 생성자 주입이고, 가끔 사용하는 것은 수정자 주입(setter 주입)이다.

 

이번 포스팅에서는 생성자 주입과 수정자 주입 그리고 생성자 주입을 써야하는 이유에 대해서 알아보도록 하겠습니다.

 

생성자 주입

@Service
public class BoardServiceImpl implements BoardService {

    private final BoardRepository boardRepository;

    @Autowired
    public BoardServiceImpl(BoardRepository boardRepository) {
        this.boardRepository = boardRepository;
    }
 ...
 }

생성자를 통해 의존관계를 주입받는 방법이다.

 

  • 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다.
  • 불변, 필수 의존관계에 사용된다.

 

수정자 주입

@Service
public class BoardServiceImpl implements BoardService {

    private final BoardRepository boardRepository;

    @Autowired
   	public void setBoardRepository(BoardRepository boardRepository){
    	this.boardRepository = boardRepository;
    }
...
}

수정자 메소들를 통해서 의존관계를 주입하는 방법이다.

 

  • 선택, 변경 가능성이 있는 의존관계에 사용
  • 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법

 

생성자 주입을 사용해야하는 이유

  1. 불변
  2. final 키워드

 

불변

대부분의 의존관계 주입을 한번 하고 나면 애플리케이션 종료 시점까지 바뀔 일이 거의 없기도 하고, 대부분의 의존관계는 불변해야한다.

만약 수정자 주입을 사용한다면, setter()메소드를 통해서 누군가가 의존관계를 변경할 가능성이 있기 때문에 수정자 주입을 사용하는 것은 좋은 설계 방법이 아니다.

또한, 생성자 주입은 객체를 생성할 때 1번만 호출되므로 이후에 호출할 일이 없기때문에 불변하게 설계할 수 있다.

 

 

final 키워드

final이 붙은 필드는 필드작성 시에 초기화를 하거나, 생성자에서 초기화를 해줘야 합니다.

따라서, 수정자 주입을 포함한 나머지 주입 방식은 모두 생성자 이후에 호출되므로 필드에 final 키워드를 사용할 수 없다.

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

 

 

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

 

따라서, 기본으로 생성자 주입을 사용하되, 선택 및 변경이 될 가능성이 있는 의존관계가 있을 경우에 예외적으로 수정자 주입을 사용하도록 한다!

 

 

 

728x90