* 인프런 김영한님의 '스프링 입문' 강의를 듣고 작성한 내용입니다! (https://inf.run/txXC)
서비스 : 핵심 비즈니스 로직 구현 (name은 중복이 안되고,...)
회원 서비스 개발
1. hello.hellospring/service (package생성)
2. service/MemberService.java (java 파일 생성)
[MemberService.java 소스코드]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import java.util.List;
import java.util.Optional;
@Transactional
public class MemberService {
priavate final MemberRepository memberRepository = new MemmoryMemberRepository();
/**
* 회원 가입
*/
public Long join(Member member) {
validateDuplicateMember(member); // 중복회원 검증
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> { // null이 아니면 검사
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package hello.hellospring.service; | |
import hello.hellospring.domain.Member; | |
import hello.hellospring.repository.MemoryMemberRepository; | |
import java.util.List; | |
import java.util.Optional; | |
@Transactional | |
public class MemberService { | |
priavate final MemberRepository memberRepository = new MemmoryMemberRepository(); | |
/** | |
* 회원 가입 | |
*/ | |
public Long join(Member member) { | |
validateDuplicateMember(member); // 중복회원 검증 | |
memberRepository.save(member); | |
return member.getId(); | |
} | |
private void validateDuplicateMember(Member member) { | |
memberRepository.findByName(member.getName()) | |
.ifPresent(m -> { // null이 아니면 검사 | |
throw new IllegalStateException("이미 존재하는 회원입니다."); | |
}); | |
} | |
public List<Member> findMembers() { | |
return memberRepository.findAll(); | |
} | |
public Optional<Member> findOne(Long memberId) { | |
return memberRepository.findById(memberId); | |
} | |
} | |
- Repository로 MemoryRepository 객체 사용
- 회원가입시 name이 중복되면 안되므로 validateDuplicateMember 함수를 만들어준다
회원 서비스 테스트
- repository 테스트 케이스 작성 시 일일히 코드를 쳤지만, test할 class에서 ctrl + shift + T 단축키로 Test를 생성할 수 있다
- 이전에 MemberService.java 소스코드에서 회원 서비스가 회원 repository를 직접 생성했다
-
priavate final MemberRepository memberRepository = new MemmoryMemberRepository();
- 회원 서비스 코드에서 DI(Dependency Injection) 를 가능하게 변경한다
-
private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; }
=> 왜 DI가 가능하게 만들어주는가? Test 코드를 짤 때 각 테스트마다 repository 객체를 생성하므로 서로 다른 DB가 생성되게 된다. 따라서 같은 객체를 쓰게 하기 위해 contructor로 생성해서 repository를 외부에서 넣어줄 수 있도록 한다.
[MemberServiceTest.java 소스코드]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.BeforeAll; | |
import org.junit.jupiter.api.BeforeEach; | |
import org.junit.jupiter.api.Test; | |
import static org.assertj.core.api.AssertionsForClassTypes.assertThat; | |
import static org.junit.jupiter.api.Assertions.assertThrows; | |
import static org.junit.jupiter.api.Assertions.fail; | |
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 join() { | |
// given | |
Member member = new Member(); | |
member.setName("spring"); | |
// when | |
Long saveId = memberService.join(member); | |
// then | |
Member findMember = memberService.findOne(saveId).get(); | |
assertThat(member.getName()).isEqualTo(findMember.getName()); | |
} | |
@Test | |
public void duplicated_exception() { | |
// given | |
Member member1 = new Member(); | |
member1.setName("spring"); | |
Member member2 = new Member(); | |
member2.setName("spring"); // member2는 join 되면 안됨 | |
// when | |
memberService.join(member1); | |
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2)); | |
// then | |
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); | |
} | |
@Test | |
void findMembers() { | |
} | |
@Test | |
void findOne() { | |
} | |
} |
'개발 > Spring' 카테고리의 다른 글
[스프링 입문] 스프링 회원관리 예제 - 6. 웹 MVC 개발 (0) | 2021.06.30 |
---|---|
[스프링 입문] 스프링 회원관리 예제 - 5. 스프링 빈과 의존관계 (0) | 2021.06.30 |
[스프링 입문] 스프링 회원관리 예제 - 3. 회원 레포지토리 테스트 케이스 작성 (0) | 2021.06.29 |
[스프링 입문] 스프링 회원관리 예제 - 2. 회원 도메인, 레포지토리 만들기 (0) | 2021.06.29 |
[스프링 입문] 스프링 회원관리 예제 - 1. 비즈니스 요구사항 정리 (0) | 2021.06.29 |