의존관계 자동 주입이란?
스프링 프레임워크에서 의존관계 주입(Dependency Injection)은 객체 간의 의존성을 설정하고 관리하는 방법입니다. 이 글에서는 다양한 의존관계 주입 방법, 생성자 주입의 중요성, 롬복을 사용한 최적화, 그리고 다중 빈 조회 시 문제 해결 방법에 대해 설명합니다.
다양한 의존관계 주입 방법
스프링에서 의존관계 주입은 크게 네 가지 방법으로 나뉩니다:
- 생성자 주입:
- 객체 생성 시점에 한 번만 호출되어 불변성을 보장합니다.
- 필수 의존관계에 사용됩니다.
- 예시 코드:
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
수정자 주입 (Setter 주입):
- 선택적이고 변경 가능한 의존관계에 사용됩니다.
- 자바빈 프로퍼티 규약을 따릅니다.
- 예시 코드:

필드 주입:
- 간결하지만 테스트가 어렵고, DI 프레임워크 없이 사용할 수 없습니다.
- 사용하지 않는 것이 권장됩니다.
- 예시 코드:

일반 메서드 주입:
- 여러 필드를 한 번에 주입 받을 수 있지만 잘 사용되지 않습니다.
- 예시 코드:

생성자 주입을 선택해야 하는 이유
- 불변성: 대부분의 의존관계는 애플리케이션 종료 시점까지 변경되지 않기 때문에, 생성자 주입을 사용하여 불변성을 보장하는 것이 좋습니다.
- 누락 방지: 생성자 주입을 사용하면 컴파일 시점에 주입 데이터를 누락할 경우 오류가 발생하여, 필수 값을 빠뜨리는 실수를 방지할 수 있습니다.
- final 키워드 사용: 생성자 주입을 사용하면 필드에 final 키워드를 사용할 수 있어, 생성자에서 값이 설정되지 않는 오류를 컴파일 시점에 막아줍니다.
롬복과 최신 트렌드
롬복(Lombok)은 자바 코드를 더 간결하게 만들어주는 라이브러리입니다. 생성자 주입 시 롬복의 @RequiredArgsConstructor 애노테이션을 사용하면, final이 붙은 필드를 모아 생성자를 자동으로 만들어줍니다.
- 기본 코드:

다중 빈 조회 시 문제 해결
의존관계 자동 주입 시 동일한 타입의 빈이 여러 개 존재하면 문제가 발생할 수 있습니다. 이를 해결하는 방법은 다음과 같습니다:
- @Autowired 필드 명 매칭:
- 타입 매칭 후 필드 이름으로 빈 이름을 매칭합니다.

@Qualifier 사용:
- 추가 구분자를 붙여 빈을 주입합니다.

@Primary 사용:
- 여러 빈 중 우선순위를 지정합니다.

결론
스프링 프레임워크에서 의존관계 주입은 애플리케이션 개발의 필수적인 부분입니다. 생성자 주입을 기본으로 사용하고, 필요한 경우 롬복을 활용하여 코드를 간결하게 만들 수 있습니다. 다중 빈 문제를 해결하기 위해 @Autowired, @Qualifier, @Primary 등을 적절히 사용하여 유연한 설계를 할 수 있습니다. 이러한 방법들을 통해 보다 견고하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.
'BE Study > Spring' 카테고리의 다른 글
| 빈 생명주기 콜백 (0) | 2024.07.03 |
|---|---|
| 컴포넌트 스캔 (0) | 2024.07.02 |
| 싱글톤 컨테이너 (0) | 2024.07.01 |
| 스프링 컨테이너와 스프링 빈 (0) | 2024.07.01 |
| 객체 지향 원리 적용 (0) | 2024.06.29 |