build my life

[Spring] AppConfig를 통한 의존관계 주입 본문

Spring

[Spring] AppConfig를 통한 의존관계 주입

dalovee 2023. 6. 2. 17:00
728x90

❗기존 구현 코드에는 인터페이스를 의존하는 것 뿐 아닌 구현체 클래스에도 의존하는 문제점이 있음

public class OrderServiceImpl implements OrderService {

    // 인터페이스 뿐만 아니라 구현체도 의존하게 됨
    private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
    private final DiscountPolicy discountPolicy = new RateDiscountPolicy();

OrderServiceImple -> DiscountPolicy 뿐 아니라 FixDiscountPolicy or RateDiscountPolicy도 의존

 

✅ 인터페이스만 의존할 수 있도록 코드 수정

public class OrderServiceImpl implements OrderService {

    // 인터페이스만 의존
    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;
하지만 구현체가 없기 때문에 코드 실행했을 경우 Null Pointer Exception 발생!
=> 해결하기 위해서 구현 객체를 대신 생성하고 주입해주어야 함 => AppConfig

 

AppConfig

애플리케이션의 전체 동작 방식을 구성(config)하기 위해 _'구현 객체를 생성'_하고 _'연결'_하는 _'책임'_을 가지는 클래스

1. 실제 동작에 필요한 구현 객체를 생성

2. 생성자를 통해서 주입(연결)

먼저, 의존 관계 주입을 위해 생성자를 만든다.

public class OrderServiceImpl implements OrderService {

    ...

    public OrderServiceImpl(DiscountPolicy discountPolicy, MemberRepository memberRepository) {
        this.discountPolicy = discountPolicy;
        this.memberRepository = memberRepository;
    }

그 다음, AppConfig에서 OrderServiceImpl 객체를 생성자를 통해서 주입(연결)

public class AppConfig {

    public OrderService orderService() {
        return new OrderServiceImpl(new FixDiscountPolicy(), new MemoryMemberRepository());
    }
}

결과적으로 의존관계 주입은 외부에서 결정이 되기 때문에 변경되는 부분에서도 수정이 쉽다.

OrderServiceImpl 입장에서는 생성자를 통해 어떤 구현 객체가 들어올지 알 수 없고 실행에만 집중하면 된다.

AppConfig에서도 역할에 따른 구현이 잘 보이도록 구현할 것!

=> 다른 구현체로 변경할 때 해당 부분만 변경하면 된다는 이점이 있음

public class AppConfig {

    private MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }

    public OrderService orderService() {
        return new OrderServiceImpl(discountPolicy(), memberRepository());
    }
}

 


< 테스트 코드에서 의존성 주입하기 위한 어노테이션 >

 

@BeforeEach

테스트 코드에서 각 테스트 실행하기 전에 호출

해당 코드를 먼저 실행해서 각 객체에 의존 관계를 주입!

728x90

'Spring' 카테고리의 다른 글

스코프와 프록시  (0) 2023.07.14
웹 스코프  (0) 2023.07.14
[Spring] 의존 관계 주입 방법  (0) 2023.06.14
[Spring] 스프링 컨테이너  (0) 2023.06.14
[Spring Boot] Spring Initializr  (0) 2023.04.07