스프링/개념

의존성 주입(DI)과 주입 방식

문상휘파람 2024. 9. 30. 17:36

의존성 주입

의존성 주입은 흔히 DI(Dependency Injection) 라고 불립니다.

 

그렇다면 의존성 주입이란 도대체 뭘까요?

-> 스프링 프레임워크에서, 의존성 주입은 직접 객체를 생성하거나 참조하지 않고 외부에서 주입받는 것을 의미합니다.

 

그렇다면 의존성 주입을 왜 사용할까요?

1. 코드가 깔끔해진다.

2. 의존성 주입을 통해 객체들이 효과적으로 분리된다.

3. 코드의 재사용성과 유연성이 높아진다.


의존성 주입 방법

1. 생성자 주입

 

생성자를 통해 의존성을 주입하는 방법입니다. 스프링이 가장 권장하는 방법이기도 합니다.

@Service
public class SimpleMovieLister {

    private final MovieFinder movieFinder;

    public SimpleMovieLister(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}

 

호출 시점에 자동으로 의존성이 주입됩니다.

이 경우 객체의 불변성을 보장할 수 있고, final 키워드를 사용할 수 있음에 따라서 컴파일 타임에서 의존성 문제를 발견할 수 있습니다.

생성자가 하나만 있는 경우 @Autowired 어노테이션을 생략할 수 있습니다. 생략한 코드가 위의 코드입니다.

 

 

2. 필드 주입

 

객체 생성시에 @Autowired 어노테이션을 통해 의존성을 주입하는 방법입니다.

@Service
public class SimpleMovieLister {

    @Autowired
    private final MovieFinder movieFinder;
}

 

이 경우 final 키워드를 사용할 수 없기에 객체의 불변성을 보장할 수 없고, 외부에서 접근이 불가능 하기에 유지보수에 어려움이 있을 수 있습니다. 또한, 접근 불가능하기에 테스트 코드를 작성할 때도 힘듭니다.

 

 

3. Setter 주입, Method 주입

 

// Setter 주입

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Autowired
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}

// 메서드 주입

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Autowired
    public void inject(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}

 

Setter 주입은 컨테이너가 빈을 생성한 후, 세터 메서드를 호출하여 의존성을 주입하는 방식입니다. 주입 받는 객체가 변경될 가능성이 있을 때 사용합니다.

 

메서드 주입은 수정자 주입과 비슷하게 변경 가능성이 있는 객체에 사용될 수 있습니다. 여러개 객체를 주입받을 수 있습니다.

 

 

 

 

ref. 스프링 공식문서 / [출처] [Spring] 의존성 주입(DI)과 주입 방식에 대해 알아보자|작성자 이재윤