비즈니스 요구사항에 따라 설계.

private static Map<Long, member> store = new HashMap<>();
필드 가짐.
private final MemberRepository memberRepository = new MemoryMemberReposotory();
가짐.
MemberApp 통한 테스트
but, 애플리케이션 로직으로의 테스트 좋은 방법 X. JUnit 테스트 사용
JUnit 테스트
@Test 어노테이션 붙여줌.
필드 :
private final MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPosicy discountPolicy = new FixDiscountPolicy();
생성 이유 : Order에 discount값 넣어줘야함 -> discount값 얻으려면 discount()에 member 넘겨줘야함 (discountPolicy 생성) -> 그러려면 member 객체 얻어야함(memberRepository 생성)
OrderApp 통한 테스트
JUnit 통한 테스트
과정 : 1. member 생성 2. memberService.join()3. orderService.createOrder()
Test에서, createOrder memberId만 받잖아. 그럼 굳이 Member객체를 만들지 않아도 통과 되는거 아니야?
-> createOrder 메서드 안의 코드 보면, findById로 member 객체를 찾음. 그렇기에 만들어두지 않으면 member를 찾지 못할 것이고 null에러 날 것임. 놓친 것은, 그 안의 로직을 생각하지 않은 것.
주문에서, 할인 정책 fix-rate 선택 못해서 discount interface 만들었잖아. 그럼 만약 fix만 하기로 선택했다면 굳이 discountPolicy interface 안만들고 orderService에 할인해주는 메서드 만들어도 될까?
-> 안된다고 결론내림. SRP 때문. 이는 변화를 고려한 것. 만약 orderService에 fix 넣었다가 나중에 변동 있을시 파급효과 존재함. 그렇기에 구별해야 한다.
@Override 어노테이션 없어도 실행 되는데 왜 달까?
-> 만약 메서드명을 틀릴시 이를 알려줌. 만약 어노테이션 없이 했다면, 상속이 아닌 또다른 함수로 알아버릴 수도 있음. 이를 방지.
또한 유지보수시 상속된 메서드임을 알 수 있으므로 생산성 올라감.
자바와 스프링에 있는 기술들은 진보보단 안정을 중요시한다고 느꼈다. 화려한 공격이 아닌, 매우 안정적인 방어 구축을 지향하는 것.