본문 바로가기

프로그래밍/- Spring

[ 회원 관리 예제 - 백엔드 개발 ] 회원 서비스 개발 / 회원 서비스 테스트

 

 

비즈니스 요구사항 정리

 

package hello.hello_spring.service;

import hello.hello_spring.domain.Member;
import hello.hello_spring.repository.MemberRepository;
import hello.hello_spring.repository.MemoryMemberRepository;

import java.util.List;
import java.util.Optional;

public class MemberService {

    // 기계적인 역할의 리포지토리와 다르게 service는 더 비즈니스적으로 개발(메서드 이름 등)

    private final MemberRepository memberRepository = new MemoryMemberRepository();

    // 회원가입
    public Long join(Member member){
        // 중복 회원x
        validateDuplicateMember(member);
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        Optional<Member> result = memberRepository.findByName(member.getName());
        result.ifPresent(m -> { //만약 result가 있으면 (Optional의 메소드)
            throw new IllegalStateException("이미 존재하는 회원입니다.");  //중복회원이라는 예외 던져줌
        });
    }

    // 전체 회원 조회
    public List<Member> findMembers(){
        return memberRepository.findAll();
    }

    // 회원 한명 조회
    public Optional<Member> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }
}

➡️ service 패키지에 비즈니스 요구사항 반영하여 MemberService 개발

 

➡️ 로직 입력시 길어져 메서드로 따로 빼고 싶으면 해당 부분 드래그해서 Extract Method 선택

 

 

 

 

 

 

 

 

회원 서비스 테스트

 

➡️테스트가 필요한 클래스 드래그해서 Ctrl + Shift + T >> Create Test창 >> Member 체크하고 OK

 

➡️자동으로 test에 패키지와 테스트 클래스 생성

 

package hello.hello_spring.service;

import hello.hello_spring.domain.Member;
import hello.hello_spring.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.*;
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 - when - then 문법 : 어떤 상황이 주어져서 실행했을때 이러한 결과가 나와야 함
        //given
        Member member = new Member();
        member.setName("hello");

        //when
        Long saveId = memberService.join(member);

        //then
        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");  // name 중복

        //when
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        //member2를 join하면 IllegalStateException예외가 터져야 함

        Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        //예외 메세지가 맞는지 확인


        /*
        try-cahtc문을 통한 확인방법

        try {
            memberService.join(member2);    // 중복 회원 예외가 일어나야 함
            fail();
        } catch(IllegalStateException e){
            // 예외가 일어나 메세지가 "이미 존재하는 회원입니다"와 같다면 정상 작동
            Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        }
        */

        //then
    }


    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}