본문 바로가기
728x90
반응형

스프링 Spring/스프링 핵심 원리 - 기본편61

[스프링 핵심 원리 이해2 - 객체 지향 원리 적용] IoC, DI, 그리고 컨테이너 IoC, DI, 그리고 컨테이너 제어의 역전 IoC(Inversion of Control) 프로그램에 대한 제어 흐름에 대한 권한은 모두 AppConfig가 가지고 있다. OrderServiceImpl도 AppConfig가 생성한다. 그리고 AppConfig는 OrderServiceImpl이 아닌 OrderService 인터페이스의 다른 구현 객체를 생성하고 실행할 수 있다. 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)라 한다. 프레임워크 vs 라이브러리 프레임워크가 내가 작성한 코드를 제어하고, 대신 실행하면 프레임워크 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 라이브러리 의존관계 주입 DI(Dependency Injection) 의존관계는 정적.. 2022. 2. 1.
[스프링 핵심 원리 이해2 - 객체 지향 원리 적용] 좋은 객체 지향 설계의 5가지 원칙의 적용 좋은 객체 지향 설계의 5가지 원칙의 적용 SRP 단일 책임 원칙 "한 클래스는 하나의 책임만 가져야 한다." 구현 객체를 생성하고 연결하는 책임은 AppConfig가 담당 DIP 의존관계 역전 원칙 "추상화에 의존해야지, 구체화에 의존하면 안된다." AppConfig가 FixDiscountPolicy 객체 인스턴스를 클라이언트 코드 대신 생성해서 클라이언트 코드에 의존관계를 주입하여 DIP 원칙을 따르면서 문제도 해결 OCP "소프트웨어 요소는 확장에는 열러 있으나 변경에는 닫혀있어야 한다." 애플리케이션을 사용 영역과 구성 영역으로 나누어 요소를 새롭게 확장해도 사용 영역의 변경은 닫혀있다. 인프런 강의 "스프링 핵심 원리 - 기본편"을 정리한 것 입니다. 스프링 핵심 원리 - 기본편 - 인프런 | .. 2022. 2. 1.
[스프링 핵심 원리 이해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.
728x90
반응형