1. Question

Spring Framework에서 생성자 주입 시, @Autowired annotation을 생략해도 되는 이유는?

2. Answer

Spring에서 @Autowired annotation은 Container가 관리하는 Bean을 자동으로 연결해주는 데 사용된다. 이 annotation은 필드 주입, 세터 주입, 생성자 주입에 모두 사용될 수 있다. 그러나 Spring 4.3 버전 이후부터는 클래스에 오직 하나의 생성자만 존재할 경우, 이 생성자에 @Autowired를 생략할 수 있게 되었다. 이는 Spring이 자동으로 해당 생성자를 사용하여 의존성을 주입하기 때문이다.

@Component
public class InventoryService {
  private final ItemRepository repository;

  // @Autowired annotation 생략
  public InventoryService(ItemRepository repository) {
    this.repository = repository;
  }
}

위 예시에서 InventoryService 클래스는 ItemRepository를 의존성으로 갖고 있으며, 하나의 생성자를 통해 이를 주입받는다. 이 클래스에서 @Autowired annotation 없이도 Spring이 의존성을 자동으로 주입한다.

3. Detail

A. 생성자 주입이란?

생성자 주입은 객체 생성 시점에 모든 의존성을 생성자를 통해 주입하는 방법이다. 이 방식은 의존성이 명시적이며, 객체가 완전한 상태로 생성될 것을 보장한다. 또한, 불변성을 유지할 수 있어 객체가 생성된 후에 의존성이 변경되는 것을 방지한다.

@Component
public class ProductService {
    private final InventoryService inventoryService;

    public ProductService(InventoryService inventoryService) {
        this.inventoryService = inventoryService;
    }
}

ProductService 클래스는 InventoryService를 필요로 하며, 생성자를 통해 이 의존성을 주입받는다. 생성자가 하나뿐이므로 @Autowired 없이도 의존성 주입이 가능하다.

B. @Autowired 생략의 이점

  • 코드 간결성: 단일 생성자의 자동 사용은 코드를 더 간결하고 읽기 쉽게 만든다. 큰 프로젝트나 많은 의존성을 가진 클래스에서 이는 특히 유용하며, 코드의 클린함을 유지하는 데 도움을 준다.

  • 명시성 감소: 생성자 주입이 필수 의존성을 강조함에 따라, @Autowired annotation을 추가적으로 사용하지 않아도 된다. 이는 코드의 명확성을 높이고, 중복 annotation의 사용을 줄여 유지 관리성을 향상시킨다.

4. Reference

None

댓글남기기