서비스는 비즈니스 로직에 가깝게 용어를 선택한다.
//service package 생성
package hello.hellospring.service;
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository
/**
* 회원가입
**/
public Long join(Member member){
//같은이름이 있는 중복회원이 있으면 안된다
/*memberRepository.findByName(member.getName());
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다")
}
}
*/
추출한 메소드를 호출
validateDuplicateMember(member);
//같은 이름이 있는지 중복검사
//없으면
memberRepository,save(member);
return member.getrId();
//ctrl + alt + m으로 extract method로 메소드를 추출할 수 있다.
}
추출한 결과
private void validateDuplicateMember(Member member){
memberRepository.findByName(member.getName());
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다");
}
}
//위 메소드를 다음과 같이 추출
public List<Member> findMembers(){
return memberRepository.findAll();
//전체 회원을 반환
}
public Optional<Member> findOne(Long memberId){
return memberRepository.findById(memberId);
}
회원 코드 작성한 거 테스트 해보기
테스트 진행
해당 프로세스로 들어가서 ctrl + shift + T를 누르면 create new Test 창이 나옵니다. 창을 누르고 들어가서 직접 테스트하면 됩니다.
import org.junit.jupiter.api.Test;
class MemberServiceTest {
MemberService memberService = new MemberService();
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
@AfterEach
public void afterEach(){
memberRepository,clearStore();
//메모리에 데이터가 계속 쌓이니 삭제해주기 위한 것
}
@Test
void 회원가입(){
//given 데이터를 기반으로 하는 것
Member member = new Member9);
Member.setName("hello");
//when 이런 것을 검증하는 구나
Long saveId = memberService.join(member);
//then 검증부구나 라는 것을 알 수 있어서 코드를 3개로 분할해서 사용하는 것이좋음
Member findMember = memberService.findOne(saveId).get();
Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Test
public void 중복_회원_예외(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
assertThrows(IllegalStateException.class, () ->memberService.join(member2));
/*다른 수가나오면 에러터지며 종료
try {
memberService.join(member2);
fail();
}catch ( IllegalStateException e) {
assertThat(e.getMessage()).idEqualTo("이미 존재하는 회원입니다.");
}
//then
*/
}
//나중에 알아야하는 정보
//멤버 repository를 외부에서 넣어주기위함 ( new를 통해서가 아니라) 클래스 레벨에서 넣으려면?
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}