[Spring Framework] Spring Boot DI 완벽 정리 | @Resource 활용법
[Spring Framework] Spring Boot DI 완벽 정리 | @Resource 활용법
[Spring Framework] Spring Boot DI 핵심 가이드 | @Primary와 @Qualifier 제대로 이해하기 [Spring Framework] Spring Boot DI 핵심 가이드 | @Primary와 @Qualifier 제대로 이해하기[Spring Framework] Spring Framework 의존성 주입(DI)
crushed-taro.tistory.com
1. DI Annotation
1. @Inject
@Inject 어노테이션은 자바에서 제공하는 기본 어노테이션이다. @Autowired 어노테이션과 같이 Type으로 빈을 의존성 주입한다.
해당 어노테이션은 사용하기 전 라이브러리 의존성 추가가 필요하므로 Maven Repository에서javax inject을 검색하여 build.gradle.kts파일에 아래와 같은 구문을 추가한다.
dependencies {
implementation("javax.inject:javax.inject:1")
...생략
}
1. 필드 주입
필드로Pokemon 타입의 객체를 의존성 주입 받는 PokemonService 클래스를 선언한다. @Inject 어노테이션은 Type 으로 의존성 주입하므로 3개의 동일한 타입의 빈이 있는 현재 상황에서는 오류가 발생한다. 따라서 @Named어노테이션을 함께 사용해서 빈의 이름을 지정하면 해당 빈을 의존성 주입할 수 있다.
@Service("pokemonServiceInject")
public class PokemonService {
/* 1. 필드 주입 */
@Inject
@Named("pikachu")
private Pokemon pokemon;
public void pokemonAttack() {
pokemon.attack();
}
}
Charmander, Pikachu, Squirtle, PokemonService 를 빈 스캐닝 할 수 있는 basePackages를 설정하여 스프링 컨테이너를 생성한다.
ApplicationContext context = new AnnotationConfigApplicationContext("project");
PokemonService pokemonService = context.getBean("pokemonServiceInject", PokemonService.class);
pokemonService.pokemonAttack();
/*
피카츄 백만볼트⚡
*/
2. 생성자 주입
생성자로Pokemon 타입의 객체를 의존성 주입 받는 PokemonService클래스를 선언한다.
@Service("pokemonServiceInject")
public class PokemonService {
private Pokemon pokemon;
/* 2. 생성자 주입 */
@Inject
public PokemonService(@Named("pikachu") Pokemon pokemon) {
this.pokemon = pokemon;
}
public void pokemonAttack() {
pokemon.attack();
}
}
/*
피카츄 백만볼트⚡
*/
@Named어노테이션의 경우 메소드 레벨, 파라미터 레벨에서 둘 다 사용 가능하다.
3. 세터 주입
세터로Pokemon타입의 객체를 의존성 주입 받는PokemonService클래스를 선언한다.
@Service("pokemonServiceInject")
public class PokemonService {
private Pokemon pokemon;
/* 3. 세터 주입 */
@Inject
public void setPokemon(@Named("pikachu") Pokemon pokemon) {
this.pokemon = pokemon;
}
public void pokemonAttack() {
pokemon.attack();
}
}
/*
피카츄 백만볼트⚡
*/
@Inject는 필드 주입, 생성자 주입, 세터 주입이 모두 가능하다.
정리
DI는 스프링 프레임워크에서 매우 중요한 개념 중 하나로, 개발자는 객체 간의 의존성을 직접 관리하지 않고 스프링 컨테이너가 객체 간의 의존성을 주입해주는 방식으로 관리할 수 있다.
다양한 DI 어노테이션이 있는데 각각의 특징과 사용 방식이 다르다.
@Autowried | @Resource | @Inject | |
제공 | Spring | Java | Java |
지원 방식 | 필드, 생성자, 세터 | 필드, 세터 | 필드, 생성자, 세터 |
빈 검색 우선 순위 | 타입 → 이름 | 이름 → 타입 | 타입 → 이름 |
빈 지정 문법 | @Autowired @Qualifier(”name”) |
@Resource(name=”name”) | @Inject @Named(”name”) |