DEVELOP/SPRING

생성자 주입/필드 주입/setter 주입

콘순이 2025. 4. 25. 18:40

Spring에서 의존성 주입(DI, Dependency Injection)을 하는 방식은 생성자 주입, 필드 주입, setter 주입 이렇게 3가지가 있다.

 

생성자 주입 (Constructor Injection)


    @Component
    public class MemberService {

      private final MemberRepository memberRepository;

      @Autowired
      public MemberService(MemberRepository memberRepository) {
          this.memberRepository = memberRepository;
      }
  }

특징

  • 불변성 보장: final 사용 가능 -> 생성 이후 값 변경 불가
  • 테스트에 용이: 필요한 의존성을 명확하게 알 수 있음
  • 의존성 누락 방지: 주입하지 않으면 컴파일/런타임 에러 발생

단점

  • 생성자 인자가 너무 많아지면 가독성 저하

 

필드 주입 (Field Injection)


@Component
public class MemberService {

    @Autowired
    private MemberRepository memberRepository;
}

특징

  • 가장 간단한 방식, 코드량이 적음

단점

  • 키워드 사용 불가 -> 값의 불변성을 보장하지 않는다.
  • 테스트 어려움: Mock 주입하려면 리플렉션을 사용해야 한다.
  • DI 프레임워크에 강하게 결합된다. -> 외부에서 주입 불가능
  • 생성 시점 확인이 어렵다.

 

Setter 주입 (Setter Injection)


@Component
public class MemberService {

    private MemberRepository memberRepository;

    @Autowired
    public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

특징

  • 선택적 의존성 주입에 적합 (null 가능성이 있음)
  • 유연성: 초기화 이후 변경 가능

단점

  • 객체가 완전히 초기화되지 않은 상태로 사용될 위험
  • 변경 가능성이 생김 -> 안정성이 낮다.

 

보통은 생성자 주입을 권장한다. 안전하고 명확하여 테스트에 유리하기 때문이다.