Spring

  • Spring build 할 때 프로퍼티에서 gradle보다 intellij를 쓰는것이 더 빠르다. 
  • Client에서 회원서비스를 통해 인터페이스에서 회원 저장소오아 연동될 DB를 구현한다.
    • 예를들어서, MemberService 인터페이스를 구성하고 구현체로 MemberServiceImpl을 구현한다.
  • 개발자가 구체적인 클래스 다이어그램을 구현한다.
  • Spring에서 프로그래밍 처리하다보면 동시성 이슈가 생길 수 있기 때문에 Concurrent 를 고려해야한다.
  • 아래 코드를 확인해보면 MemberRepository는 인터페이스이고 실제 구현은 MemoryMemberRepository에서 수행한다.  여기서 구현체가 존재하지 않는다면 NullPointException이 발생한다. 
  • private final MemberRepository(인터페이스)  memberRepository = new
    MemoryMemberRepository(); // Tip - cmd+shift+enter 까지 수행하면 ; 까지 자동으로 문장이 완성된다.
  • test > java 위치에서 JUnit으로 test 코드 작성 (given, when, then)
  • //아래 코드는 MemberServiceImple에서 구현되고 있습니다.(Client)
    //OCP, DIP를 잘 지킨것이라고 볼 수 있을까? > 다형성으로 구현되고 있지만 new 객체 생성되는것이 실제 구현체에
    //의존하는것은 OCP, DIP를 만족하는것이 아니다. 즉, 변경에는 닫혀있어야 한다. 
    private final MemberRepository memberRepository = new
    MemoryMemberRepository();
  • 객체 다이어그램에서는 동적으로 구현되고, 클래스 다이어그램은 정적으로 구현된다.
    • Client > 회원 Service > 회원 저장소  

 

역할과 구현의 분리

  • 역할들의 협력 관계를 그대로 재사용할 수 있다.
  • 인터페이스를 역할로 두고 구현체들을 갈아 끼울 수 있다.
  • 특히, 아래 사진을 보면 OrderServiceImpl 를 변경할 필요가 없다. DB나 할인 정책이 변경되어도!  

김영한님의 Spring 핵심 원리 - 기본편 

  • 하기 코드는 SRP(단일 책임 원칙)를 잘 따르고 있다. 
  • 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);
     //orderservice 입장에서는 discountPolicy를 신경쓰지 않아도 된다. 
     int discountPrice = discountPolicy.discount(member, itemPrice);
     return new Order(memberId, itemName, itemPrice, discountPrice);
     }
    }
  • 디비에 데이터 인입 시 null이 들어갈 수 있기 때문에 Primitive Type은 잘 쓰지 않는다. > long 대신 Long 으로 사용하는 케이스가 있다.
  • Test 코드 작성 시 Assertions.assertThat 을 사용한다. (org.assertj 라이브러리)
  • @Test는 단위 테스트가 중요하다. @SpringBootTest로 처리하게 되면 Spring 관련 라이브러리랑 디비 커넥션이 들어가게 되면 Test 시 빌드 속도가 굉장히 느려진다. 
  • Test작성은 Spring Container 의 도움없이 단위 테스트를 하는것이다. 즉, Java 언어만으로 진행한다. 

'Spring' 카테고리의 다른 글

싱글톤 컨테이너  (0) 2021.12.12
객체 지향 원리 적용  (0) 2021.12.10
객체지향 설계와 스프링  (0) 2021.12.09
Spring 프로젝트 설정 & 테스트 코드 작성하기  (0) 2021.05.25
Spring03 :: Spring boot에 필요한 설정  (0) 2020.09.07