minOS

스프링 핵심 원리 이해2 - 객체 지향 원리 적용(2) 본문

TIL/김영한의 스프링 핵심 원리

스프링 핵심 원리 이해2 - 객체 지향 원리 적용(2)

minOE 2024. 1. 24. 23:28
728x90

관심사의 분리 - DIP, OCP 원칙 지키기 위해

AppConfig 클래스 - 구현 객체를 생성하고 연결을 책임지는 별도의 설정 클래스

import com.example.core.discount.FixDiscountPolicy;
import com.example.core.member.MemberService;
import com.example.core.member.MemberServiceImpl;
import com.example.core.member.MemoryMemberRepository;
import com.example.core.order.OrderService;
import com.example.core.order.OrderServiceImpl;

public class AppConfig {

    public MemberService memberService(){
        return new MemberServiceImpl(new MemoryMemberRepository());
    }

    public OrderService orderService(){
        return new OrderServiceImpl(new MemoryMemberRepository(),new FixDiscountPolicy());
    }
}


AppConfig 리팩토링

import com.example.core.discount.DiscountPolicy;
import com.example.core.discount.FixDiscountPolicy;
import com.example.core.member.MemberRepository;
import com.example.core.member.MemberService;
import com.example.core.member.MemberServiceImpl;
import com.example.core.member.MemoryMemberRepository;

public class AppConfig {

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

    private MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }

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

    public DiscountPolicy discountPolicy(){
        return new FixDiscountPolicy();
    }
}

/* new MemoryMemberRepository() 부분 중복이 제거 되었다. MemoryMemberRepository를 다른
구현체로 변경할 때 한 부분만 변경하면 된다
AppConfig 역활과 구현 클래가 하눈에 들어온다. 애플리케이션 전체 구성이 어떻게 되어있는지 빠르게 파악할 수 있다.*/

 




할인 정책 변경

import com.example.core.discount.DiscountPolicy;
import com.example.core.discount.FixDiscountPolicy;
import com.example.core.discount.RateDiscountPolicy;
import com.example.core.member.MemberRepository;
import com.example.core.member.MemberService;
import com.example.core.member.MemberServiceImpl;
import com.example.core.member.MemoryMemberRepository;
import com.example.core.order.OrderService;
import com.example.core.order.OrderServiceImpl;

public class AppConfig {

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

    private MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }

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

    public DiscountPolicy discountPolicy(){
        //return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}

// new MemoryMemberRepository() 부분 중복이 제거 되었다. MemoryMemberRepository를 다른 구현체로 변경할 때 한 부분만 변경하면 된다
// AppConfig 역활과 구현 클래가 하눈에 들어온다. 애플리케이션 전체 구성이 어떻게 되어있는지 빠르게 파악할 수 있다.

DIP ,OCP 원칙이 지켜지는 것을 확인할 수 있다.

 

 

 

728x90