의존성 주입이 필요한 이유

  • 의존성 주입이 필요한 이유는 객체 간에 결합도를 줄일 수 있기 때문이다. 

의존성 주입 방법

스프링에서 의존성 주입(DI)을 위한 4가지 방법을 제공한다.

  • 생성자 주입
  • Setter 주입
  • 필드 주입
  • 메서드 주입

1. 생성자 주입

생성자를 통해 의존 관계를 주입할 수 있는 방법이다. 이 방법은 생성자 호출시점에서 1번만 호출되는것이 보장된다. 불변인 상태에서 사용할 수 있다. 

@Component
public class quackServiceImpl implements diService {
	private final QuackRepository quackRepository;
    
    @Autowired
    public quackServiceImpl(QuackRepository quackRepository) {
    	this.quackRepository = quackRepository;
    }
}

2. Setter 주입

필드 값을 변경하는 setter 메서드를 통해 의존관계를 주입한다. 선택해서 변경 가능성이 있는 의존관계에 사용할 수 있다. setter, getter 이용하는 방법을 Java Property 라고 한다. 그래서 Java Bean Property 규약의 Setter 메서드 방식이라고도 부른다. 

@Component
public class QuackServiceImpl implements QuackService {
	private QuackRepository quackRepository;
    
    @Autowired
    public void setQuackRepository(QuackRepository quackRepository) {
    	this.quackRepository = quackRepository;
    }
}

3. 필드 주입

필드에 바로 주입하는 방법인데 코드가 간결해져서 좋지만 외부에서 변경 불가능한 테스트가 된다. 프레임워크에 의존적이게 된다. 

@Component
public class QuackServiceImpl implements QuackService {
	
    @Autowired
    private QuackRepository quackRepository;
}

4. 일반 메서드 주입

생성자 주입이랑 비슷하지만 메서드를 이용하는데서 차이가 있다. 한번에 여러 필드를 주입 받을 수 있다. 

@Component
public class QuackServiceImpl implements QuackService {
	
    private QuackRepository quackRepository;
    private QuackRepository quackRepository2;
    
    @Autowired
    public void init(QuackRepository quackRepository, QuackRepository quackRepository2) {
    	this.quackRepository = quackRepository;
    	this.quackRepository2 = quackRepository2;
    }
}

정리

의존성 주입의 경우에 @Autowired 를 사용하게 되는데 required 옵션의 기본값이 true로 되어 있으면 자동주입의 대상이 없는 경우 에러를 발생하게 된다. 의존성 주입관계는 불변해야 한다. 스프링 컨테이너가 종료될 때까지 변경되서는 안된다. 하지만, Setter 주입을 사용하게 되면 public으로 열러져 있기 때문에 외부로부터 변경 가능성이 생기게 된다. 그래서, 생성자 주입을 사용하게 되면 생성할 때 한번만 호출하게 되므로 불변하게 객체를 설계할 수 있다. 

 

'Spring' 카테고리의 다른 글

스프링 핵심원리 고급편 - threadLocal, 템플릿 메서드 패턴 & 콜백 패턴  (0) 2024.01.14
Criteria API  (0) 2023.01.28
Spring Security  (0) 2021.12.14
빈 생명주기 & 콜백  (0) 2021.12.14
의존관계 자동 주입  (0) 2021.12.13