스프링 코어 중 하나인 DI에 대한 개요, 특징, 이용 방법 및 DI를 어떻게 이용할 것인가에 대한 설명
2.1 DI란
- DI는 '의존 관계의 주입'이다.
- 오브젝트 사이의 의존 관계를 만드는 것. -> 오브젝트의 인스턴스 변수에 그 오브젝트가 이용할 오브젝트를 설정한다는 의미.
- 학술적으로 어떤 오브젝트가 이용할 오브젝트를 주입 혹은 인젝션(인스턴스 변수에 설정)한다는 의미.
- DI를 구현하는 컨테이너는 클래스의 인스턴스화 등의 생명 주기 관리 기능이 있는 경우가 많다.
2.2 DI를 사용할 곳
- 보통 컨트롤러, 서비스, DAO의 의존 관계를 구축할 때
2.3 어노테이션을 이용한 DI
2.3.1 기본 - @Autowired와 @Component
- ProductService 인터페이스
public interface ProductService {
void addProduct(Product p);
Prodict findByProductName(String n);
}
- ProductServiceImpl 클래스
@Component
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductDao productDaol
public void addProduct(Product p) {
productDao.addProduct(p);
}
public Product findByProductName(String n) {
return productDao.findByProductName(n);
}
}
- ProductDao인터페이스
public interface ProductDao {
void addProduct(Product p);
Product findByProductName(String n);
}
- ProductDaoImpl 클래스
@Component
public class ProductDaoImpl implements ProductDao {
// DB 접속 대신 Map으로 대체
private Map<String, Product> storage = new HashMap<>();
public Product findByProductName(String n) {
return storage.get(n);
}
public void addProduct(Product p) {
storage.put(p.getName(), p);
}
}
- @Autowired를 변수 앞에 붙이면 DI 컨테이너가 인스턴수 변수의 타입에 대입할 수 있는 클래스를 @Component가 붙은 클래스 중에서 찾아내 그 인스턴스를 인젝션 해준다.
2.3.3 @Autowired
- @Autowired는 인젝션을 받기 위한 설정
- 변수 이외에 메소드 앞에도 붙일 수 있다.
- @Autowired로 인젝션할 수 있는 클래스의 타입이 2개 존재한다면 에러가 발생한다. -> @Primary를 같이 설정하면 에러를 피할 수 있다.
2.3.4 @Component
- @Component는 DI 컨테이너가 관리한, 주로 인젝션을 위한 인스턴스를 설정하는 것
- 클래스 선언 앞에 @Component를 선언하면 스프링의 DI 컨테이너가 찾아서 관리하고, @Autowired가 붙은 인스턴스 변수나 메소드에 인젝션 해준다.
- Controller는 @Controller, Service는 @Service, DAO는 @Repository로 설정하는 것이 좋다.(알아보기 편함)
'개발 > Java & Kotlin' 카테고리의 다른 글
[Java] 람다와 스트림(3) (0) | 2022.06.30 |
---|---|
[Spring] 스프링 DI (2) (0) | 2022.06.29 |
[Java] 람다와 스트림(2) (0) | 2022.06.29 |
[Spring] @ResponseBody가 null만 가져올 때 (0) | 2022.06.28 |
[Java] 람다와 스트림(1) (0) | 2022.06.28 |