service에서는 클라이언트가 요청한 정보를 처리한다. '비즈니스 로직을 수행한다'라고도 표현하기도 한다.
package com.rptp.rptpSpringBoot.service;
import com.rptp.rptpSpringBoot.model.MemberDTO;
import com.rptp.rptpSpringBoot.repository.MemberRepository;
import com.rptp.rptpSpringBoot.repository.impliment.MemoryMemberRepository;
import java.util.List;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
//화원가입
public Long join(MemberDTO memberDTO) {
// 같은 이름의 있는 중복 회원 x
validateDuplicateMember(memberDTO);
memberRepository.save(memberDTO);
return memberDTO.getId();
}
private void validateDuplicateMember(MemberDTO memberDTO) {
memberRepository.findByName(memberDTO.getName())
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다");
});
}
//전체 회원 조회
public List<MemberDTO> findMembers() {
return memberRepository.findAll();
}
// id에 맞는 회원 조회
public Optional<MemberDTO> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
엇... 왜 Service 클래스는 인터페이스 사용을 안할까...?
Service에서 인터페이스 사용은 필수가 아니다. 자세한 설명은 여기에 있다.
package com.rptp.rptpSpringBoot.service;
import com.rptp.rptpSpringBoot.model.MemberDTO;
import com.rptp.rptpSpringBoot.repository.MemberRepository;
import com.rptp.rptpSpringBoot.repository.impliment.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 java.util.Optional;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
MemoryMemberRepository memoryMemberRepository;
MemberService memberService;
@BeforeEach
public void 테스트_시작전_실행(){
memoryMemberRepository = new MemoryMemberRepository();
memberService = new MemberService(memoryMemberRepository);
}
@AfterEach
public void 테스트_종료시_실행() {
memoryMemberRepository.deleteAll();
}
@Test
void 회원가입() {
//given
MemberDTO memberDTO = new MemberDTO();
memberDTO.setName("홍길동");
//when
Long saveId = memberService.join(memberDTO);
//then
MemberDTO findMember = memberService.findOne(saveId).get();
Assertions.assertThat(memberDTO.getName()).isEqualTo(findMember.getName());
}
@Test
public void 회원가입_시_중복회원가입_예외() {
//given
MemberDTO member1 = new MemberDTO();
member1.setName("홍길동");
MemberDTO member2 = new MemberDTO();
member2.setName("홍길동");
//when
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
//then
Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다");
}
/*
@Test
void findMembers() {
}
@Test
void findOne() {
}
*/
}
각 단위테스트 실행하기 전에 실행된다.
두 개의 Exception을 비교한다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/lecture/49584?tab=curriculum
Spring 에서 Service 인터페이스 사용? https://hyunsoori.tistory.com/11