본문 바로가기
Spring

회원 서비스 개발 & 테스트

by watergrace2u 2022. 9. 13.
반응형
SMALL

MemberService.java

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 {
// 보통 서비스 쪽은 비즈니스 같이 네이밍하기

    // 그냥 아래처럼 하면, 테스트 케이스 때 호출할 memberRespository와 다른객체이다.
    // private final MemberRepository memberRepository = new MemoryMemberRepository();
    // 두개를 쓸 이유도 없고, MemoryMemberRepository에서 static으로 되어있긴 하지만,
    // static은 인스턴스 레벨이 아닌, 클래스 레벨이 붙는 거이기도 하고,
    // 그러니 바꾸는 게 좋다.

    // 테스트케이스와 같은 인스턴스를 쓰게 하려면....

    private final MemberRepository memberRepository;

    // constructor 생성해주고,
    // 레포지토리를 외부에서 넣어주도록 생성하고,
    // test 할때 @BeforeEach를 사용하여 객체 만들어주기

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }


    // 회원 가입
    // 회원가입하면 아이디 반환
    public Long join(Member member){
        // 같은 이름 중복 회원X (일단 예시에서는)
        // result 값이 Optional 객체 타입이라 가능한 일!
        // null값이 나올 것 같으면, 일단 Optional 로 감싸주고, Optional에서 사용할 수 있는 함수도 사용!
        // ifPresent() => null이 아니라 값이 있으면

//        Optional<Member> result = memberRepository.findByName(member.getName());
//        result.ifPresent(m -> {
//            throw new IllegalStateException("이미 존재하는 회원입니다.");
//        });

        // 코드 정리
        validateDuplicateMember(member); // 중복회원검증
        memberRepository.save(member);
        return member.getId();
    }

    // 중복회원 검증
    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);
    }

}

 

 

MemberServiceTest.java

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.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

// 테스트 자동으로 만들어주는 단축키
// ctrl + shift + T
// 테스트는 과감하게 한글로 바꿔도 된다!
// 테스트는 정상 플로우도 중요하지만, 예외 플로우가 훨씬 더 중요하다.

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
        Member member = new Member();
        member.setName("spring");

        // 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");

        // when
        memberService.join(member1);
        // try catch 구문을 안 사용해도될 문법 존재!
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

        //        try {
//            memberService.join(member2);
//            fail();
//        }catch (IllegalStateException e){
//            Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//        }
        // then

    }
    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

# 기억해야할 사항

 

1. join 로직에서...

- Optional 객체에서 사용 가능한 ifPresent() 함수 알아두기 

- validateDuplicateMember 부분을 단축키 「ctrl + shift + M (extract Method)」 로 따로 떼어냈다.

 

2. MemberServiceTest 에서

- 하나하나 테스트 케이스 모두를 작성하는 것이 아니라, MemberService 클래스에서 단축키 「ctrl + shift + T」를 사용하여 테스트 자동으로 만들 수 있다.

- @BeforeEach와, MemberService에서 생성자를 따로 만들어주지 않으면, 본 로직과 테스트 케이스에서 호출할 memberRepository가 다른 객체가 된다. 그러므로 주의하자.

- 이제는 DI(Dependency Injection) 의존관계가 주입되었다!

 

 

반응형
LIST

'Spring' 카테고리의 다른 글

[spring] 책 목록 구현 + 제목으로 검색  (0) 2023.05.22
회원리포지토리 테스트 케이스 작성  (0) 2022.09.13

댓글