Spring106 [스프링 핵심 원리 - 기본편] AppConfig 리팩터링 현재 AppConfig를 보면 중복이 있고, 역할에 따른 구현이 잘 안보입니다. 기대하는 그림 리팩터링 전 public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); } public OrderService orderService() { return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy()); } } 중복을 제거하고, 역할에 따른 구현이 보이도록 리팩터링이 필요합니다. 리팩터링 후 public class AppConfig { public MemberSer.. 2021. 9. 9. [스프링 핵심 원리 - 기본편] 관심사의 분리 로미오와 줄리엣 공연을 하면 로미오 역할을 누가 할지 줄리엣 역할을 누가 할지는 배우들이 정하는게 아닙니다. 이전 코드는 마치 로미오 역할(인터페이스)를 하는 레오나르도 디카프리오(구현체, 배우)가 줄리엣 역할(인터페이스)을 하는 여자 주인공(구현체, 배우)을 직접 초빙하는 것과 같습니다. 디카프리오는 공연도 해야하고 동시에 여자 주인공도 공연에 직접 초빙해야 하는 다양한 책임을 가지고 있습니다. 관심사 분리 배우는 본인의 역할인 배역을 수행하는 것에만 집중해야 합니다. 디카프리오는 어떤 여자 주인공이 선택되더라도 똑같이 공연을 할 수가 있어야 합니다. 공연을 구성하고, 담당 배우를 섭외하고, 역할에 맞는 배우를 지정하는 책임을 담당하는 별도의 공연 기획자가 나올시점입니다. 공연 기획자를 만들고, 배우와.. 2021. 9. 9. [스프링 핵심 원리 - 기본편] 새로운 할인 정책 적용과 문제점 할인 정책을 애플리케이션에 적용 할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야 합니다. 문제점 발견 우리는 역할과 구현을 충실하게 분리했습니다. => OK 다형성도 활용하고, 인터페이스와 구현 객체를 분리했습니다. => OK OCP, DIP 같은 객체지향 설계 원칙을 충실히 준수했습니다. => 그렇게 보이지만 사실은 아닙니다. DIP: DIP를 지킨 것 같지만 추상(인터페이스) 뿐만 아니라 구체(구현) 클래스에도 의존하고 있습니다. 추상(인터페이스) 의존: DiscountPolicy 구체(구현) 클래스: FixDiscountPolicy, RateDiscountPolicy OCP: 지금 코드는 기능을 확장해서 변경하면, 클라이언트 코드에 영향을 줍니다. 따라서 OCP를 위.. 2021. 9. 9. [스프링 핵심 원리 - 기본편] 새로운 할인 정책 개발 RateDiscountPolicy 코드 추가 import hello.core.member.Grade; import hello.core.member.Member; public class RateDiscountPolicy implements DiscountPolicy { private int discountPercent = 10; @Override public int discount(Member member, int price) { if (member.getGrade() == Grade.VIP) { return price * discountPercent / 100; } else { return 0; } } } (RateDiscountPolicy.java) 테스트 작성 import hello.core.memb.. 2021. 9. 8. 이전 1 ··· 9 10 11 12 13 14 15 ··· 27 다음