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
'인프런 김영한 강의 정리 > 스프링 핵심원리 기본편' 카테고리의 다른 글
스프링 핵심 원리 기본편 - 의존관계 자동 주입(2)|옵션처리 (0) | 2024.05.04 |
---|---|
스프링 핵심원리 기본편 - 의존관계 자동 주입(1)|다양한 의존관계 주입방법 (0) | 2024.05.02 |
스프링 핵심원리 기본편 - 컴포넌트 스캔 (0) | 2024.05.01 |
스프링 핵심 원리 기본편 - 싱글톤 패턴과 스프링 컨테이너 (0) | 2024.04.30 |
[스프링 핵심원리] 객체 지향 프로그래밍(SOLID) (0) | 2024.03.14 |