참고
프로젝트 생성
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의 OCP와 DIP 원칙에 어긋난다!
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 에러임)
•
이 상황에서는 누군가가 클라이언트인 OrderServiceImpl에 DiscountPolicy의 구현 객체를 대신 생성하고 주입해주어야 한다..
⇒ AppConfig의 등장배경!