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

이멀젼씨

·

2021. 8. 27. 15:04

목적

생성자 주입을 사용하는 이유에 대해 알고자 함

목차

  1. 생성자 주입이란?
  2. 생성자 주입의 장점
    a. NPE 방지
    b. Immutable 객체 생성
    c. 순환참조 방지

1. 생성자 주입이란?

주입이란 A객체가 B객체를 사용하는 코드가 있을때, B객체를 생성하여 A객체가 사용할 수 있도록 관계를 형성해 주는 것이다.

생성자 주입은 생성자를 사용하여 객체를 생성할때, 생성되는 객체가 사용하는 의존성을 생성자의 파라미터로 전달해주는 방식이다.

2. 생성자 주입의 장점

a. NPE 방지

필드주입과 setter주입이 제대로 되지 않았다는 가정하에 autowired를 제거하였다.

테스트 시 필드주입과 setter주입의 경우엔 의존성이 제대로 주입되지 않았음에도 객체를 생성할 수 있었다.

따라서 의존성이 제대로 주입되지 않은 객체는 런타임에서야 오류를 발견할 수 있다.

하지만 생성자 주입의 경우 컴파일 타임에서 바로 확인이 가능하다.

b. Immutable 객체 생성

final키워드를 붙이면 변수를 생성과 함께 초기화하며, 초기화 된 이후 변경 불가능하다

필드주입과 setter주입의 경우엔 객체 생성 후 주입이 발생하기 때문에 final키워드를 사용할 수 없다

생성자 주입의 경우에만 객체의 생성과 동시에 초기화가 가능하기 때문에 final 키워드를 사용할 수 있다

c. 순환참조 방지

필드주입으로 Dependency1이 Dependency2를 사용하고, Dependency2가 Dependency1을 사용하는 상황이다

컴파일타입에서 잡지 못하고 런타임 시 stackoverflow가 발생하며 앱이 종료된다

하지만 생성자 주입을 사용한 경우엔 컴파일타임에 순환참조 오류를 알리는 메시지가 나오게 된다