Spring/스프링 입문 - 스프링 부트, 웹 MVC, DB 접근 기술

8. 회원 서비스 개발 | 회원 서비스 테스트

DEV-HJ 2023. 3. 5. 18:38
반응형

리포지터리는 단순하게 저장소에 값을 넣다 빼는 느낌이면 서비스는 비지니스에 가깝다.

메서드 명도 비지니스에 가깝게 지어야한다.

그래야 회원가입 관련 이슈를 받았을때 Join 메서드 살펴보자 하면서 비지니스 문제를 찾을수 있다.

이렇게 서비스는 비지니스에 의존적이게 설계를 해야하고

리포지터리는 단순히 기계적으로 개발스럽게 용어를 선택한다. (insert, update..등)


회원 서비스 개발

 

ifPresent

- null이 아니라 어떤 값이 있으면 동작하는 메서드

- Optional로 감쌌기 때문에 가능한 기능이다. 과거에는 if문 사용해서 null 체크했던걸 현재는 ifPresent로 생략한 모습

- Optional로 한번 감싸면 Optional 안에 member 객체가 있는것. 

- 그냥 꺼내고 싶으면 get() 메서드 사용하면 되지만 권장하지 않는다.

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import java.util.List;
import java.util.Optional;


public class MemberService {

    private final MemberRepository memberRepository;
    
//dependency injection : 멤버리포지터리를 직접 new에서 생성 하지않고, 외부에서 넣어줌
	public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

    /**
    * 회원가입
    */
    public Long join(Member member){
        validataDuplicateMember(member); //중복회원 검증        
        memberRepository.save(member); //중복회원 검증 통과하면 저장
        return member.getId();
    }

    private void validataDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
              .ifPresent(m -> {
                throw new IllegalStateException("이미 존재하는 회원 입니다.");
          });
    }

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

    // id로 하나의 회원만 찾기
    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }


}

 회원 서비스 테스트 

given, when, then 문법

- 처음 테스트를 할 때 이 문법을 권장한다.

- given 이 데이터를 | when 검증 한다 | then 결과

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Optional;
//스태틱 임포트 하는방법 aseertThat 에서 Art+Enter
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberrepository;


    // @BeforeEach : 테스트를 실행하기 전에 리포지터리 생성
    @BeforeEach
    public void beforeEach(){
        memberrepository = new MemoryMemberRepository();
        memberService = new MemberService(memberrepository);
    }

    @AfterEach
    public void afterEach(){
        memberrepository.claerStore(); //테스트 메모리 클리어
    }

    @Test
    void 회원가입() { //테스트는 과감하게 한글로 적어도 된다, 테스트 코드는 실제 코드에 포함 X
        //given
        Member member = new Member();
        member.setName("spring");

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

        //then
        Member findMember = memberService.findOne(saveId).get();
        //스태틱 임포트 하는방법 aseertThat 에서 Art+Enter
        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 e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        
      	//then
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원 입니다.");    
    }

    @Test
    void findMember() {
    }

    @Test
    void findOne() {
    }
}

 

 

반응형