Spring DI -2-

Dobi·2024년 4월 7일

Spring

목록 보기
3/6

Spring DI의 의존성 주입 방법들

의존성을 주입하는 방법에는 여러가지가 있다.
대표적인 방법은 세가지가 있는데 각각 생성자 주입, 수정자 주입, 필드 주입이다. 최신버전의 스프링에서는 생성자 주입을 권장하고 있는데 이에 대해서는 아래에서 알아보자.

1. 생성자 주입(Constructor Injection)

생성자 주입(Constructor Injection) 방식은 스프링 4이후에 권장하는 방식으로 말 그대로 생성자를 통해 의존관계를 주입하는 방식이다.

@Service
public class SampleService {

    private testService testService;

    @Autowired
    public SampleService(testService testService) {
        this.testService = testService;
    }
}

생성자 주입은 생성자 호출 시점에 1회 호출 되는 것이 보장된다.
주입받은 객체가 변하지 않거나 반드시 객체의 주입이 필요한 경우를 강제할 수 있다. 즉, 객체의 불변성을 확보할 수 있다.

또한, 스프링 프레임워크에서 생성자가 1개인 경우에는 @Autowired 를 생략해도 된다. 단, 생성자가 여러개인 경우 기본생성자를 반드시 구현해야한다.

필드 주입방식과는 다르게 스프링 외에서 테스트가 가능한데 수정자 주입에서는 어려운 순수 자바코드로 테스트가 가능하다는 것이 큰 장점이다.

생성자 주입을 이용하면 필드 객체에 final 키워드를 사용할 수 있어서 다른 방법들과는 다르게 컴파일 시점에서 의존성의 누락을 확인할 수 있다. 또, 빈의 생성시점과 초기화 시점이 동일하고 객체 생성 시점에 순환참조의 에러를 미리 확인할 수 있다는 장점이 있다.


2. 수정자 주입(Setter Injection)

수정자 주입(Setter Injection)은 스프링 3.*에서 추천했던 방식으로 필드 값을 변경하는 Setter를 통해 의존관계를 주입하는 방법이다. 생성자 주입과는 다르게 주입받는 객체가 변경될 가능성이 있을 때 사용한다.

@Component
public class SampleController {
    private SampleService sampleService;
 
    @Autowired
    public void setSampleService(SampleService sampleService) {
        this.sampleService = sampleService;
    }
}

수정자 주입은 이후에 나오는 필드 주입방식과는 다르게 스프링 컨텍스트가 아니더라도 테스트를 할 수 있다.

또한 필드 주입방식과 공통되는 문제로 빈의 생성시점과 빈의 초기화 시점이 다르다는 문제점이 있다. 의존성 주입이 조금 늦어지면서 문제가 발생할 수 있는데 이 문제를 런타임시에만 알 수 있다는 치명적인 문제다. 런타임시에 확인할 수 있는 문제는 순환 참조의 문제 등이 있다.

사용자가 이 서비스를 사용하는 중에만 문제가 발생된다면 어떻게 될까? QA로 다 막을 수 있을까?


3. 필드 주입(Field Injection)

필드 주입(Field Injection) 방식은 필드에 바로 의존관계를 주입하는 방법이다. 최신버전의 인텔리제이에서는 필드주입을 사용하지 말라는 노란줄로 권고사항이 나오게 된다.

@Component
public class SampleController{
	@Autowired
    private SampleService sampleservice;
}

필드 주입은 코드가 간결하고 쉽게 사용할 수 있다는 장점이 있다. 하지만 필드 주입은 외부에서 접근이 불가능하다. 즉, 스프링 컨텍스트를 벗어나는 테스트 등을 할 수가 없다.



출처
[Spring] 의존성 주입(Dependency Injection, DI)이란?
백기선 스프링 웹 MVC

profile
양말 받을 때까지 공부하는 개발자 도비

0개의 댓글