Section 4
* 이전에 만들었던 FixDiscountPolicy 말고 새로운 할인 정책 RateDiscountPolicy를 적용해야 한다.
public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
적용 하기 위해서는 위와 같이 OrderServiceImpl 코드를 고쳐야 한다.
# 위의 과정에서 문제점 발견
=> 추상클래스 뿐만 아니라 구체(구현) 클래스에도 의존하게 된다. = DIP를 위반하게 된다
이를 해결하기 위해선 인터페이스에만 의존하도록 해야 한다.
**
public class OrderServiceImpl implements OrderService {
//private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
private DiscountPolicy discountPolicy;
}
이와 같이 변경하면 인터페이스에만 의존하게 되지만 실제로는 Null pointer exception이 발생.
=> 어디선가 객체를 직접 생성해서 따로 넣어주어야 한다.
이를 해결하기 위해 AppConfig 클래스를 사용해보자
AppConfig객체는 구현객체를 생성하고 연결하는 역할을 하는 설정 클래스 이다.
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
AppConfig를 통해 각 클래스들의 역할을 확실하게 분리해 줄 수 있게 된다.
또한 이 객체는 의존관계를 주입해주는 모습 처럼 보여서 의존성 주입을 해주는 역할을 한다고도 표현한다.
Seciton 5
이제 위의 설정 정보들을 실제 spring을 사용하여 구현하여 보자.
//스프링 컨테이너 생성
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
위의 코드를 통해 직전에 AppConfig 를 자바 설정 클래스로 스프링 컨테이너를 만들 수 있다.
그리고 각각의 설정 클래스 정보를 Bean으로 등록해 주어야 사용 할 수 있다.
여기서 주의 해야 될 점은 이름은 항상 다른 이름을 부여해야 한다. 같은 이름을 부여하면, 다른 빈이 무시되거나, 기존 빈을 덮어버 리거나 설정에 따라 오류가 발생 할 수 있다.
이런 방식을 통해 스프링 컨테이너를 생성하고 스프링 빈으로 설정 정보를 등록하고 의존관계도 설정할 수 있다.
'WINK-(Web & App) > Spring Boot 스터디' 카테고리의 다른 글
[2024-2 SpringBoot 스터디] 정호용 #5주차 섹션 6~7 (0) | 2024.11.25 |
---|---|
[2024-2 SprintBoot 스터디] 윤성욱 #4주차 (0) | 2024.11.21 |
[2024-2 SpringBoot 스터디] 탁태현 #4주차 (0) | 2024.11.21 |
[2024-2 SprintBoot 스터디] 조상혁 #4주차 (1) | 2024.11.20 |
[2024-2 SprintBoot 스터디] 김아리 #4주차 (1) | 2024.11.20 |