Search
Duplicate
📒

[Spring Study] 01-3. 예제를 통한 스프링 핵심 원리 이해

상태
수정중
수업
Spring Study
주제
기본개념
4 more properties
참고

프로젝트 생성

NOTE
지금은 스프링 없는 순수한 자바로만 개발을 진행한다는 점을 꼭 기억하자! 스프링 관련은 한참 뒤에 등장한다.
Intelij Gradle 대신에 자바 직접 실행
Build and run using: IntelliJ IDEA
Run tests using: IntelliJ IDEA
다음과 같이 변경함녀 InteliJ가 자바를 바로 실행해서 실행속도가 더 빠르다.

비즈니스 요구사항과 설계

NOTE
회원은 상품을 주문할 수 있고, 회원 등급에 따라 할인을 받을 수 있다!
전체 클래스 다이어그램

회원 도메인 개발

NOTE
회원 저장소의 구현체가 여러가지가 존재한다.
public class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); @Override public void join(Member member) { memberRepository.save(member); } @Override public Member findMemeber(Long memberId) { return memberRepository.findById(memberId); } }
Java
복사
memberRepository에서 어떤 저장소를 구현할지 결정

주문과 할인 도메인 설계

NOTE
고정 할인, 퍼센트 할인 정책중 하나를 선택
public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository = new MemoryMemberRepository(); private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } }
Java
복사
할인 정책의 구현체를 정의한다. (VIP인 경우 1000원 할인해주는 로직)

현재 구조의 문제점

NOTE
현재 방식은 SOLID의 OCPDIP 원칙에 어긋난다!
public class OrderServiceImpl implements OrderService { // private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); }
Java
복사
만약 할인 정책을 바꾼다면?
DIP 위반 이유
Service가 DiscountPolicy(인터페이스)와 RateDiscountPolicy(구현체) 둘다 의존중
OCP 위반이유
FixDiscountPolicy → RateDiscountPolicy로 변경하려면 Service의 코드도 변경해야함!

해법

NOTE
해결방법은 아래와 같이, 오로지 클래스가 인터페이스에만 의존하도록 해준다.
우리가 원했던 구조
public class OrderServiceImpl implements OrderService { private final DiscountPolicy discountPolicy; }
Java
복사
근데 구현체가 없어짐.. (이대로 하면 nullPointer 에러임)
이 상황에서는 누군가가 클라이언트인 OrderServiceImplDiscountPolicy의 구현 객체를 대신 생성하고 주입해주어야 한다..
⇒ AppConfig의 등장배경!