SPRING 핵심 원리 [ 기본편 ]

[스프링 핵심 원리] 섹션 3.4 객체 지향 원리 적용 (AppConfig 리팩터링)

wlalsu_u 2023. 1. 31. 13:40

3.4.1  AppConfig 코드 문제점

 

 

 

앞서 섹션 3.3 에서 작성한 AppConfig 에는 중복이 있고,

 

역할에 따른 구현이 잘 보이지 않는다.

 

 

 

 

아래의 다이어그램을 살펴보자.

 

 

 

 

클라이언트가 주문을 할 때, 주문 서비스 역할에 의존하고,

 

주문 서비스 역할은 회원 저장소와 할인 정책 역할에 의존한다.

 

 

 

출처 : 김영한 - spring 핵심 원리 - 기본편

 

 

 

 

어플리케이션 설정 정보인 AppConfig 에서는 이러한 정보를 한 눈에 볼 수 있어야 하는데,

 

현재 코드에는 이러한 역할들이 제대로 드러나지 않는 문제점이 있다.

 

 

 

 

현재 AppConfig 코드

 

 

package hello.core;
import hello.core.discount.FixDiscountPolicy;
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;
public class AppConfig {
 public MemberService memberService() {
 return new MemberServiceImpl(new MemoryMemberRepository());
 }
 public OrderService orderService() {
 return new OrderServiceImpl(
 new MemoryMemberRepository(),
 new FixDiscountPolicy());
 }
}

 

 

 

 

 

 


 

 

3.4.2  AppConfig 리팩터링

 

 

 

 

앞선 코드에서 중복을 제거하고, 역할에 따른 구현이 잘 드러나도록 리팩터링한다.

 

 

 

 

package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
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;
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();
 }
}

 

 

 

new MemoryMemberRepository() 중복 제거

 

 

: MemoryMemberRepository 를 다른 구현체로 변경하더라도, 한 부분만 변경하면 된다.

 

 

 

메소드 이름

 

 

: 메소드 명을 통해 역할이 명시적으로 드러난다.

 

  역할과 구현 클래스가 한 눈에 들어오므로, 어플리케이션의 전체 구성을 쉽게 파악할 수 있다.

 

 

 

 

 

 

 

 

 

김영한 '스프링 핵심 원리 - 기본편' 강의를 기반으로 작성하였습니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8