1. Service 구현
- service를 구현하다 보면 비즈니스 네임이랑 비슷하다는 것을 알 수 있다. 그래야지 기획자가 말하는 부분의 로직을 찾기가 쉽다.
- model 같은 경우 단순히 기계적으로 개발스럽게 만든다.
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import java.util.List;
import java.util.Optional;
public class MemberService {
MemberRepository memberRepository = new MemoryMemberRepository();
/**
* 회원가입
*/
public Long join(Member member) {
// alt + ctrl + v 함수 리턴 값을 변수로 자동완성
// 같이 이름이 있는 중복 회원 X
validateDuplicateMember(member); // 중복회원 검증
this.memberRepository.save(member);
return member.getId();
}
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
// alt + ctrl + shift + t 함수로 뽑아내기
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
}
2. Junit Test 구현
- service를 구현 했으므로 테스트 케이스를 작성한다.
- test> java> hello.hellospring> repository> serive> MemoryServiceTest.java
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;
//이전에 실행 시켰던 것을 다시 재실행 shift + F10
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
@Test
void 회원가입() {
//given 주어주다
Member member1 = new Member();
member1.setName("hello");
// when 실행했을때
memberService.join(member1);
// then 결과값
Assertions.assertThat(memberService.findOne(member1.getId()).get().equals(member1));
}
@Test
void 중복_회원_예외() {
//given 주어주다
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
// when 실행했을때
memberService.join(member1);
//then
assertThrows(IllegalStateException.class, ()-> memberService.join(member2));
/*
try {
memberService.join(member2);
fail();
} catch ( IllegalStateException e) {
Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
*/
}
@Test
void 회원조회() {
Member member1 = new Member();
member1.setName("spring3");
memberService.join(member1);
Assertions.assertThat(memberService.findMembers().size()).isEqualTo(1);
}
@Test
void findOne() {
Member member1 = new Member();
member1.setName("spring");
memberService.join(member1);
Assertions.assertThat(memberService.findOne(member1.getId()).get()).isEqualTo(member1);
}
}
- Test 케이스는 잘되는 케이스도 있지만, 예외가 잘 나오는지도 확인해야 된다. 때문에 예외 함수를 만들어서 해당하는 기능이 잘 작동되는지 확인한다.
- assertThrows : Exception이 함수 내에 지정한 IllegalStateException이 맞는지 확인
- @beforEeach: @TEST 함수 실행 전 실행시켜주는 함수
- beforEach로 DI 구현 외부에서 생성자를 통해서 만든 후 내부 클래스로 선언
DI 추가 설명: https://cozing.tistory.com/53?category=1076708
결론
이를 통해서 Model, Service의 흐름을 익힐 수 있었고, Test 케이스를 통해서 예외까지 확인하는 방법을 알 수 있었다.
이 글은 인프런의
제목 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강사 : 김영한 님의 동영상을 참조해 만들었습니다.
'Spring > 스프링 입문' 카테고리의 다른 글
회원 웹 기능 - 등록, 출력 (0) | 2022.03.08 |
---|---|
자바 코드로 직접 스프링 빈 등록하기 (0) | 2022.03.07 |
컴포넌트 스캔과 자동 의존관계 설정 (0) | 2022.03.07 |
회원 관리 예제 - 백엔드 개발 (1) (0) | 2022.03.07 |
스플링 웹 개발 기초 - 정적 컨텐츠, MVC와 템플릿 엔진 (0) | 2022.03.06 |