Spring에서 생성자에 @Autowired 어노테이션을 사용하는 이유와 장점
Spring Framework에서 의존성 주입(Dependency Injection)은 객체 간 결합도를 낮추고 유지보수성을 높이기 위해 사용된다. 의존성을 주입하는 방법 중 하나로 생성자 주입(Constructor Injection)이 있으며, 이때 @Autowired 어노테이션이 자주 활용된다. 이번 글에서는 @Autowired를 생성자와 함께 사용하는 이유와 장점을 코드 예시와 함께 설명한다.
의존성 주입 방법
Spring에서 의존성 주입은 다음 세 가지 방식으로 수행된다.
- 필드 주입(Field Injection)
- Setter 주입(Setter Injection)
- 생성자 주입(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;
}
}
생성자 주입의 장점
- 불변성 보장
- 생성자를 통해 주입된 의존성은 final 키워드를 사용할 수 있어 객체가 생성된 이후 의존성이 변경되지 않음을 보장한다.
- 필수 의존성 명시
- 생성자 주입은 반드시 필요한 의존성을 명확히 표현하며, Spring이 누락된 의존성을 감지해 컴파일 시 오류를 방지한다.
- 테스트 용이성
- 생성자 주입은 Mock 객체를 주입하기 쉬워 단위 테스트 작성에 유리하다.
- 간결한 코드
- 필드 주입이나 Setter 주입 대비 코드가 간결하며, 주입 대상이 명확하다.
이처럼 생성자 주입은 강력한 설계 원칙인 불변성과 명확성을 제공하며, 유지보수성과 테스트 가능성을 크게 향상시킨다. 앞으로 의존성 주입을 설계할 때 생성자 주입을 적극적으로 활용해 프로젝트를 진행해보려고 한다.
'JAVA > Spring' 카테고리의 다른 글
Spring의 ComponentScan 이해하기: @ComponentScan의 동작 원리와 활용법 (1) | 2024.12.21 |
---|---|
DI(의존관계 주입, Dependency Injection)란 무엇인가? (1) | 2024.12.20 |
[스프링 싱글톤] : 왜 @Bean은 한 번만 호출될까? (0) | 2024.12.20 |
[스프링 빈과 싱글톤 패턴: 무상태로 설계해야 하는 이유?] (0) | 2024.12.17 |
AssertThat의 isEqualTo와 isSameAs의 차이점 알아보기 (0) | 2024.12.17 |
댓글