Spring 예제
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나 할인 정책이 변경되어도!
- 하기 코드는 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 |
댓글
이 글 공유하기
다른 글
-
싱글톤 컨테이너
싱글톤 컨테이너
2021.12.12 -
객체 지향 원리 적용
객체 지향 원리 적용
2021.12.10 -
객체지향 설계와 스프링
객체지향 설계와 스프링
2021.12.09 -
Spring 프로젝트 설정 & 테스트 코드 작성하기
Spring 프로젝트 설정 & 테스트 코드 작성하기
2021.05.25