본문 바로가기
개발/Spring

[Spring] 스프링 DI (1)

by devhooney 2022. 6. 29.
728x90

스프링 코어 중 하나인 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로 설정하는 것이 좋다.(알아보기 편함)

 

 

728x90