의존성 주입
의존성 주입은 흔히 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)과 주입 방식에 대해 알아보자|작성자 이재윤
'스프링 > 개념' 카테고리의 다른 글
트랜잭션(Transaction)에 관하여 (0) | 2024.10.05 |
---|---|
IoC(Inversion Of Control) 컨테이너와 스프링 빈(Bean) (1) | 2024.09.30 |
@Data 어노테이션에 관하여 (0) | 2024.09.30 |
Session 과 Session Login (0) | 2024.09.23 |
Cookie 와 Cookie Login (0) | 2024.09.23 |