웹심화 Spring DI 실습

스프링 프레임워크에서 객체 간의 의존 관계를 외부에서 주입하는 DI(Dependency Injection)의 실전 활용법과 생성자 주입의 강점을 분석한다.

생성자 주입(Constructor Injection)

스프링에서 가장 권장하는 주입 방식으로, 객체 생성 시점에 의존성을 주입하여 불변성과 필수 의존성을 보장한다.

@Service
public class OrderService {
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    // 생성자가 하나일 경우 @Autowired 생략 가능
    public OrderService(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

    public void createOrder(Long memberId, String itemName, int itemPrice) {
        Member member = memberRepository.findById(memberId);
        int discountPrice = discountPolicy.discount(member, itemPrice);
        // 주문 로직 수행...
    }
}

DI의 주요 강점

  • 불변성 확보: final 키워드를 사용하여 객체 생성 후 의존성이 변경되는 것을 방지한다.
  • 테스트 용이성: 스프링 컨테이너 없이도 순수 자바 코드로 단위 테스트를 작성할 때, 생성자를 통해 가짜 객체(Mock)를 쉽게 주입할 수 있다.
  • 순환 의존성 방지: 애플리케이션 구동 시점에 순환 참조를 감지하여 런타임 에러를 예방한다.

다양한 주입 방식 비교

  • 생성자 주입: 불변성, 필수 의존성 주입 시 사용 (권장).
  • 수정자 주입(Setter Injection): 선택적 의존성이나 변경 가능성이 있는 경우 사용.
  • 필드 주입(Field Injection): 코드가 간결하지만 외부에서 변경이 불가능하고 테스트가 어려워 지양한다.

P.S

DI는 객체 간의 결합도를 낮추고 코드의 재사용성을 높이는 핵심 기술이다.

특히 생성자 주입을 적극 활용함으로써 견고하고 테스트 가능한 자바 애플리케이션을 구축할 수 있는 것 같다.

Author avatar

웨이호프

WordPress creator and blogger.

View all posts