전체 보기
📙

[스프링 입문] 3. 백엔드 개발

작성일자
2022/10/05
태그
SUB PAGE
프로젝트
스프링 입문
책 종류
1 more property

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 → 생성자 이용