1. 비즈니스 요구사항 정리
1) 비즈니스 요구사항
•
데이터: 회원Id, 이름
•
기능: 회원 등록, 조회
•
시나리오: 아직 db 선정 x
2) 일반적인 웹 어플리케이션의 계층 구조
•
컨트롤러: 웹 MVC의 컨트롤러 역할. API 만들 때 컨트롤러 역할.
•
서비스: 서비스 클래스의 핵심 비즈니스 로직이 들어가 있음.
◦
ex) 회원 중복 가입 안됨
•
도메인: 회원, 주문, 쿠폰처럼 db에 주로 저장되고 관리되는 비즈니스 도메인 객체.
•
리포지토리: 비즈니스 도메인 객체를 가지고 핵심 비즈니스 로직이 동작하도록 구현한 계층. 도매인 객체를 DB에 저장하고 관리.
3) 클래스 의존관계
•
회원 비즈니스 로직에는 회원 서비스가 있음
회원 리포지토리(회원을 저장)는 인터페이스로 설계할 거임
2. 회원 도메인과 리포지토리 만들기
1) 회원 객체
•
도메인: 회원, 주문, 쿠폰처럼 db에 주로 저장되고 관리되는 비즈니스 도메인 객체.
1.
패키지 만들기 (hello.hellospring.domain)
2.
패키지 안에 Java 클래스 만들기 (Member)
src/main/java/hello.hellospring.domain/Member.java
3.
요구사항 구현
src/main/java/hello.hellospring.domain/Member.java
2) 회원 리포지토리 (인터페이스, 구현체)
•
리포지토리: 도메인 객체를 DB에 저장하고 관리. (리포지토리 뜻: 저장소)
•
회원 리포지토리 인터페이스
1.
패키지 만들기 (hello.hellospring.repository)
2.
패키지 안에 인터페이스 만들기 (MemberRepository)
src/main/java/hello.hellospring.repository/MemberRepository.java
3.
기능 구현
src/main/java/hello.hellospring.repository/MemberRepository.java
•
회원 리포지토리 메모리 구현체
1.
패키지 안에 Java 클래스 만들기 (MemoryMemberRepository)
src/main/java/hello.hellospring.repository/MemoryMemberRepository.java
2.
인터페이스를 implements하기
src/main/java/hello.hellospring.repository/MemoryMemberRepository.java
3.
구현하기
src/main/java/hello.hellospring.repository/MemoryMemberRepository.java
3. 회원 리포지토리 테스트 케이스 작성
1) 테스트 코드 쓰는 이유
•
방금 만든 회원 리포지토리 클래스가 정상 동작하는지 검증하기 위함
•
원래) 개발한 기능을 실행해서 테스트 할 때 main 메서드를 통해서 실행하거나 컨트롤러로 해당 기능을 실행해볼 수 있음.
◦
문제점) 반복적 실행 어려움. 어려 테스트 한번에 실행하기 어려움
•
대안) JUnit이라는 프레임워크로 테스트 실행
◦
main 메서드 쓰는 거랑 비슷함
•
여러 명이 함께 개발할 때 필수적임
2) 테스트케이스 작성
1.
Test/java에 패키지 만들기(hello.hellospring.repository)
2.
패키지 안에 java class 만들기(MemoryMemberRepositoryTest)
3.
MemberRepository 클래스의 객체 만들기
src/test/java/hello.hellospring.repository/MemoryMemberRepositoryTest.java
4.
멤버 저장 기능 확인할 save() 만들기
src/test/java/hello.hellospring.repository/MemoryMemberRepositoryTest.java
5.
Run save()
•
기존에 돌리던 거 빨간 사각형 눌러서 끄고 public void save()옆에 초록 삼각형 눌러서 실행하기
6.
save()로 멤버 저장 기능 잘 동작하는지 테스트하기 + import 꿀팁 + 리포지토리에서 store 출력해서 확인
src/test/java/hello.hellospring.repository/MemoryMemberRepositoryTest.java
src/main/java/hello.hellospring.repository/MemoryMemberRepository.java (store 출력)
7.
findByName()으로 이름으로 멤버 찾는 기능 잘 동작하는지 테스트하기
src/test/java/hello.hellospring.repository/MemoryMemberRepositoryTest.java
8.
한 번에 실행 가능
클래스 레벨에서 돌리거나 hello.hellospring을 통째로 실행가능. (테스트 코드 장점)
9.
findAll() 테스트하기
src/test/java/hello.hellospring.repository/MemoryMemberRepositoryTest.java
10.
세 개를 한 번에 실행했더니 오류 발생 (중요)
원인) 다른 테스트가 findByName테스트에 영향을 미쳐서 발생
해결) 테스트 끝날 때마다 데이터를 깔끔하게 clear 해주어야 함
•
테스트가 수십, 수백 개면 hello.hellospring run하거나 gradlew 띄우고 테스트하면 됨. 다 자동으로 돌려줌
3) TDD: 테스트 코드 작성 후 개발
•
테스트 주도 개발
4. 회원 서비스 개발
1) 회원 서비스
•
회원 리포지토리와 도메인을 활용해서 실제 비즈니스 로직을 작성하는 부분
1.
패키지 만들기 (hello.hellospring.service)
2.
패키지 안에 클래스 만들기 (MemberService.js)
src/main/java/hello.hellospring.service.MemberService.js
3.
회원 리포지토리 만들기
src/main/java/hello.hellospring.service.MemberService.js
4.
회원 가입 만들기
src/main/java/hello.hellospring.service.MemberService.js
5.
전체 회원 조회 만들기
src/main/java/hello.hellospring.service.MemberService.js
2) 네이밍으로 알아보는 리포지토리와 서비스 차이점
•
리포지토리: save, findById, findByName, findAll처럼 단순히 저장소에 넣었다 뺐다하는 느낌 듬
◦
개발스럽게 용어 선택해 설계함.
•
서비스: join, findMembers처럼 비즈니스에 가까운 느낌 듬.
◦
비즈니스에 의존적으로 설계함.
5. 회원 서비스 테스트
1.
Member Service 클래스에서 ctrl+shift+t해서 Create new test
: 테스트 패키지, 클래스, method 만드는 거 한 번에 하는 법
src/test/java/hello.hellospring.service/MemberServiceTest.java
2.
MemberService클래스의 객체 memberService만들기
src/test/java/hello.hellospring.service/MemberServiceTest.java
3.
회원가입 정상 테스트
give, when, then 방법 → 주석 처리해두는 것
src/test/java/hello.hellospring.service/MemberServiceTest.java
store 출력
4.
회원가입 예외 테스트
src/test/java/hello.hellospring.service/MemberServiceTest.java
5.
Clear 넣기
src/test/java/hello.hellospring.service/MemberServiceTest.java
6.
같은 memberRepository 객체 쓰게 만들기(DI)
src/test/java/hello.hellospring.service/MemberServiceTest.java → BeforeEach 이용
src/main/java/hello.hellospring.service/MemberService → 생성자 이용