인프런 김영한 강의 정리/스프링 핵심원리 기본편

스프링 핵심 원리 기본편 - AppConfig

백엔드 개발자 - 젤리곰 2024. 4. 29. 11:28
728x90

1. AppConfig 란?

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

2. AppConfig의 필요성

- 클라이언트 코드는 구체클래스에 의존하면 안된다.(인터페이스에만 의존해야한다.)
 

3. 구체클래스에 의존하는 예제 코드

public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); 
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}

위 코드를 보면 DiscountPolicy가 구현객체인 FixDiscountPolicy와 RateDiscountPolicy를 직접 호출하고 있다.
이렇게 되면 객체지향 방법론의 장점인 "추상화"를 놓치게 되는 것이다.
 

4. 생성 경로

 
hello.core 바로 밑에 생성해준다.
 

5. AppConfig 코드

package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

	@Bean
	public MemberService memberService() {
		return new MemberServiceImpl(memberRepository());
	}

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

	@Bean
	public MemberRepository memberRepository() {
		return new MemoryMemberRepository();
	}

	@Bean
	public DiscountPolicy discountPolicy() {
		return new RateDiscountPolicy();
	}
}

 
1. AppConfig에는 실제 기능에 필요한 구현 객체를 만들어준다.
2. 생성자를 통해 연결해준다.
3. 구성 정보에서 역할과 구현을 명확하게 분리해준다.
4. @Configuration - AppConfig에서 설정을 구성한다는 뜻.
    @Bean - 스프링 컨테이너에 스프링 빈으로 등록한다.
(💡 @Bean어노테이션을 쓰면 일반 자바 코드만 사용하는 경우에 비해 애플리케이션의 구성 요소들을 더 잘 통합하고 관리할 수 있게 된다.)
 

6. 인터페이스에만 의존하는 코드

public class OrderServiceImpl implements OrderService{

    //회원 저장소와 할인정책이 필요
    private  final MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

    //생성자를 통해 구현체를 연결한다.
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
    ...
}

 
OrderServiceImpl은 더이상 구현 객체에 의존하지 않는다.
객체의 생성과 연결은 AppConfig가 담당한다.

728x90