728x90 반응형 전체 글202 [스프링 핵심 원리 이해2 - 객체 지향 원리 적용] 전체 흐름 정리 전체 흐름 정리 1. 새로운 할인 정책 개발 새로운 정률 할인 정책 코드를 추가로 개발하는 것 자체는 아무 문제가 없음 2. 새로운 할인 정책 적용과 문제점 주문 서비스 클라이언트가 인터페이스인 DiscountPolicy 뿐만 아니라 구체 클래스인 FixDiscountPolicy도 함께 의존하여 주문 서비스 구현체도 변경해야 함 3. 관심사 분리 AppConfig는 애플리케이션의 전체 동작 방식을 구성(config)하기 위해, 구현 객체를 생성하고, 연결하는 책임 4. AppConfig 리팩터링 역할과 구현을 명확하게 분리 중복 제거 5. 새로운 구조와 할인 정책 적용 정액 할인 ---> 정률 %할인 정책으로 변경 사용 역역과 객체를 생성하고 구성하는 영역으로 분리 할인 정책을 변경해도 구성 영역만 변경.. 2022. 2. 1. [스프링 핵심 원리 이해2 - 객체 지향 원리 적용] 새로운 구조와 할인 정책 적용 새로운 구조와 할인 정책 적용 정액 할인 정책을 정률% 할인 정책으로 변경 FixDiscountPolicy ---> RateDiscountPolicy AppConfig의 등장으로 애플리케이션이 크게 사용영역과, 객체를 생성하고 구정(Configuration)하는 영역으로 분리 public class AppConfig { ... public DiscountPolicy discountPolicy() { // return new FixDiscountPolicy(); return new RateDiscountPolicy(); } } 할인 정책으로 변경해도, 애플리케이션의 구성 역할을 담당하는 AppConfig만 변경하면 된다. 사용영역의 어떤 코드도 변경할 필요가 없다. 인프런 강의 "스프링 핵심 원리 - 기본.. 2022. 2. 1. [스프링 핵심 원리 이해2 - 객체 지향 원리 적용] AppConfig 리팩터링 AppConfig 리팩터링 아래와 같이 드래그 후 ctrl + alt + m 을 눌러 리팩터링을 한다. DiscountPolicy는 직접 작성 public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(memberRepository()); // 생성자 주입 } private MemberRepository memberRepository() { return new MemoryMemberRepository(); } public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); // .. 2022. 1. 31. [스프링 핵심 원리 이해2 - 객체 지향 원리 적용] 관심사 분리 관심사 분리 각각의 인터페이스를 배역(배우 역할)이라 생각하면 실제 배역 맞는 배우를 선택하는 것은 누가 하는가? 관심사를 분리 배우는 본인의 역할인 배역을 수행하는 것에만 집중해야 한다. 공연을 구성하고, 담당 배우를 섭외하고, 역할에 맞는 배우를 지정하는 책임을 담당하는 별도의 "공연 기획자"가 있다. AppConfig 등장 애플리케이션의 전체 동작 방식을 구성(config)하기 위해, 구현 객체를 생성하고, 연결하는 책임을 가지는 별도의 설정 클래스 package hello.core; import hello.core.discount.FixDiscountPolicy; import hello.core.member.MemberService; import hello.core.member.MemberServ.. 2022. 1. 31. [스프링 핵심 원리 이해2 - 객체 지향 원리 적용] 새로운 할인 정책 적용과 문제점 새로운 할인 정책 적용과 문제점 할인 정책 변경시 클라이언트인 OrderServiceImpl 변경 필요 // private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); 역할과 구현 분리 OK 다형성 활용, 인터페이스와 구현 객체 분리 OK OCP, DIP 객체지향 설계 원칙 준수...한 것 처럼 보이나 사실은 아니다. - OCP (개방-폐쇄 원칙) : 확장에 열려있으나 변경에는 닫혀있어야 한다. 즉, 변경하지 않고 확장 가능 - DIP (의존관계 역전 원칙) : 역할에 의존. 즉, 인터페이스에 의존 (참고 : .. 2022. 1. 31. [스프링 핵심 원리 이해2 - 객체 지향 원리 적용] 새로운 할인 정책 개발 새로운 할인 정책 개발 RateDiscountPolicy implements DiscountPolicy discountPercent = 10 int discount(member, price) ctrl + shift + t : Test코드 만들어 주는 단축키 class RateDiscountPolicyTest { RateDiscountPolicy discountPolicy = new RateDiscountPolicy(); @Test @DisplayName("VIP는 10% 할인이 적용되어야 한다.") void vip_o() { //given Member member = new Member(1L, "memberVIP", Grade.VIP); //when int discount = discountPolicy... 2022. 1. 31. [스프링 핵심 원리 이해1 - 예제 만들기] 주문과 할인 도메인 실행과 테스트 주문과 할인 도메인 실행과 테스트 public class OrderApp { public static void main(String[] args) { MemberService memberService = new MemberServiceImpl(); OrderService orderService = new OrderServiceImpl(); Long memberId = 1L; Member member = new Member(memberId, "memberA", Grade.VIP); memberService.join(member); Order order = orderService.createOrder(memberId, "itemA", 10000); System.out.println("order = " + o.. 2022. 1. 31. [스프링 핵심 원리 이해1 - 예제 만들기] 주문과 할인 도메인 개발 주문과 할인 도메인 개발 interface DiscountPolicy int discount(Member member, int price) FixDiscountPolicy int discountFixAmount int discount(Member member, int price) Order Long memberId String itemName int itemPrice int discountPrice Order() getter, setter toString() interface OrderService Order createOrder(Long memberId, String itemName, int itemPrice) OrderServiceImpl MemberRepository memberRepository .. 2022. 1. 31. 이전 1 ··· 15 16 17 18 19 20 21 ··· 26 다음 728x90 반응형