본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2024-2 Spring Boot 스터디] 김문기 #4주

반응형

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으로 등록해 주어야 사용 할 수 있다.

여기서 주의 해야 될 점은 이름은 항상 다른 이름을 부여해야 한다. 같은 이름을 부여하면, 다른 빈이 무시되거나, 기존 빈을 덮어버 리거나 설정에 따라 오류가 발생 할 수 있다.

 

이런 방식을 통해 스프링 컨테이너를 생성하고  스프링 빈으로 설정 정보를 등록하고 의존관계도 설정할 수 있다.

반응형