JAVA/Spring

Spring에서 생성자에 @Autowired 어노테이션을 사용하는 이유와 장점

min민 2024. 12. 20.

Spring에서 생성자에 @Autowired 어노테이션을 사용하는 이유와 장점

Spring Framework에서 의존성 주입(Dependency Injection)은 객체 간 결합도를 낮추고 유지보수성을 높이기 위해 사용된다. 의존성을 주입하는 방법 중 하나로 생성자 주입(Constructor Injection)이 있으며, 이때 @Autowired 어노테이션이 자주 활용된다. 이번 글에서는 @Autowired를 생성자와 함께 사용하는 이유와 장점을 코드 예시와 함께 설명한다.

 

 

 

의존성 주입 방법

Spring에서 의존성 주입은 다음 세 가지 방식으로 수행된다.

  1. 필드 주입(Field Injection)
  2. Setter 주입(Setter Injection)
  3. 생성자 주입(Constructor Injection)

이 중 생성자 주입불변성을 보장하고, 필수적인 의존성을 명확히 표현할 수 있어 가장 권장되는 방식이다

 

의존관계 주입과 관련된 블로깅은 아래 링크를 참조하면 된다!

https://mininkorea.tistory.com/76

 

 

 

 

 

 

@Autowired 어노테이션과 생성자 주입

@Autowired는 Spring이 자동으로 Bean의 의존성을 주입할 수 있도록 지원하는 어노테이션이다. 생성자와 함께 사용하면 해당 클래스의 객체 생성 시 의존성 주입이 자동으로 이루어진다.

코드 예시: @Autowired를 사용한 생성자 주입

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

// Service 클래스 정의
@Service
public class OrderService {

    private final PaymentService paymentService;

    // 생성자 주입
    @Autowired
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    public void processOrder(String orderId) {
        System.out.println("Processing order: " + orderId);
        paymentService.processPayment(orderId);
    }
}
import org.springframework.stereotype.Service;

// 의존성으로 주입될 Bean
@Service
public class PaymentService {

    public void processPayment(String orderId) {
        System.out.println("Payment processed for order: " + orderId);
    }
}
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

// 테스트 실행
public class Application {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = 
                new AnnotationConfigApplicationContext("com.example");

        OrderService orderService = context.getBean(OrderService.class);
        orderService.processOrder("12345");

        context.close();
    }
}

 

실행 결과

Processing order: 12345
Payment processed for order: 12345

 

 

 

 

생성자에 @Autowired 어노테이션이 없어도 되는 이유

Spring 4.3 이후, 생성자가 하나만 존재하는 경우에는 @Autowired 어노테이션을 생략해도 자동으로 의존성을 주입해준다. 따라서 위 코드에서 @Autowired를 제거해도 동일하게 동작한다.

// @Autowired 생략 가능 (Spring 4.3 이상)
@Service
public class OrderService {

    private final PaymentService paymentService;

    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

 

 

 

 

 

생성자 주입의 장점

  1. 불변성 보장
    • 생성자를 통해 주입된 의존성은 final 키워드를 사용할 수 있어 객체가 생성된 이후 의존성이 변경되지 않음을 보장한다.
  2. 필수 의존성 명시
    • 생성자 주입은 반드시 필요한 의존성을 명확히 표현하며, Spring이 누락된 의존성을 감지해 컴파일 시 오류를 방지한다.
  3. 테스트 용이성
    • 생성자 주입은 Mock 객체를 주입하기 쉬워 단위 테스트 작성에 유리하다.
  4. 간결한 코드
    • 필드 주입이나 Setter 주입 대비 코드가 간결하며, 주입 대상이 명확하다.

 

이처럼 생성자 주입은 강력한 설계 원칙인 불변성명확성을 제공하며, 유지보수성과 테스트 가능성을 크게 향상시킨다. 앞으로 의존성 주입을 설계할 때 생성자 주입을 적극적으로 활용해 프로젝트를 진행해보려고 한다.

댓글