728x90
1. 비즈니스 요구사항 정리
- 데이터 : 회원 ID, 이름
- 기능 : 회원 등록, 조회
- 아직 데이터 저장소가 선정되지 않음(가상의 시나리오 : 성능이 중요한 DB로 선정 or 일반적인 관계형 DB로 선정 or NoSQL로 선정)
일반적인 웹 애플리케이션 계층 구조
- 컨트롤러 : 웹 MVC의 컨트롤러 역할
- 서비스 : 핵심 비즈니스 로직 구현 - 서비스 클래스에 핵심 비즈니스 로직이 들어가 있다(ex> 회원은 중복 가입이 안됨)
- 리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
- 도메인 : 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
- 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
- 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민 중인 상황으로 가정
- 개발을 진행하기 위해서 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소 사용
2. 회원 도메인과 리포지토리 만들기
- domain/Member.java : 회원 아이디, 이름, getter/setter
- repository/MemberRepository.interface : 회원을 저장소에 저장 +아이디로 회원을 찾는 기능 + 이름으로 회원을 찾는 기능 +전체 회원 리스트 반환
- repository/MemoryMemberRepository.java :
- private static Map<Long.Member> store
- save Member할 때, sequence number를 1씩 올려줌, 선언한 store에 put 해줌
- store.values().stream().filter(member->member.getName().equals(name)).findAny()
- 전체 반환 : return new ArrayList<>(store.values());
3. 회원 리포지토리 테스트 케이스 작성
- test/java/~/repository/MemoryMemberRepository.java
@Test
- 그 밑 매서드 실행됨
- test코드 실행 시 순서는 보장이 안됨 ( test 종료 시 clear 해주는 코드 필요)
@AfterEach
- 이를 사용하면 각 테스트가 종료될 때마다 이 기능을 실행한다.
- 여기서는 메모리 DB에 저장된 데이터를 삭제한다.
- 한 번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있음.
- 이렇게 되면 다음 이전 테스트 때문에 다음 테스트가 실패할 가능성이 있음.
- 테스트는 각각 독립적으로 실행되어야 함.
- 테스트 순서에 의존관계가 있는 것은 좋은 테스트가 아님
* Optional : 값을 꺼낼 땐 get()으로 꺼냄
* Assertions.assertThat(member).isEqualTo(result) : 결과가 맞는지 확인
*@AfterEach repository.clearstore();
4. 회원 서비스 개발
회원 도메인과 리포지토리를 이용해 실제 비즈니스 로직을 작성
- 회원 서비스를 만들려면 회원 리포지토리가 있어야 함 -> private final로 선언
- private final MemberRepository memberRepository = new MemoryRepository();
- member join(Member nenber){} - 같은 이름이 있는 중복 회원 x memberRepository.findByName(~) : 이 반환 값이 있으면 이미 존재하는 회원인 것임 result.ifPresent
- findMembers(){} : memberRepositoy.findAll();
- findOne(Long memberId){} : membetRepository
*작성한 코드를 method로 뽑아내는 단축키 : ctrl + T
5. 회원 서비스 테스트
- MemberService memberservice = new MenberService();
- @Test코드는 과감하게 한글로 변경해도 됨
- given, when : memberservice.join, then : Assertions.assertThat(~) 결과가 이렇게 나와야 해
- 예외 검증도 중요함 (중복 회원도 저장해서 확인해야 함) try{}catch{} , assertThrows()
- 메모리에 쌓이기 때문에 test를 clear 해줘야 함! -> 근데 repository 선언 필요함! -> 돌 때마다 clear 해줘서
- 멤버 Repository의 리포지토리랑 testcase의 Repository는 같은 게 좋음 -> 같은 Repository를 테스트하는 것이 맞음
- MemberService.java에서 memberRepository를 외부에서 넣어 주도록 설계해줌
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRespository;
}
- MemberServiceTest.java 코드에서는 @BeforeEach를 사용해 MemberRepository를 넣어줌 : 테스트를 실행할 때마다 각각 생성을 해줌
class MemberServiceTest{
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach(){
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
...
}
*main코드를 test코드로 생성하는 단축키 : ctrl + shift + T
*command + option + V : 앞에 뭐가 생기ㅁ,,,
*shift + F10 : 이 전에 돌렸던 코드 그대로 돌리게 해 줌
'Back-End > Inflearn 강의' 카테고리의 다른 글
[스프링 입문] 스프링 DB 접근 기술 (0) | 2022.05.16 |
---|---|
[스프링 입문] 회원 관리 예제 - 웹 MVC 개발 (0) | 2022.05.15 |
[스프링 입문] 스프링 빈과 의존관계 (0) | 2022.05.12 |
[스프링 입문] 스프링 웹 개발 기초 (0) | 2022.04.06 |
프로젝트 환경설정 (0) | 2022.04.06 |