본문 바로가기

강의/스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

회원 Service 생성 및 Test

Service 세팅


Service에는 핵심 비즈니스 로직이 존재하는 곳입니다.

회원 가입 (join 메서드)을 살펴보면 validateDuplicateMember 메서드를 이용하여 중복을 체크하는 기능이 있습니다.

중복이 존재하지 않으면 회원 정보를 저장하고, 회원 id를 반환하도록 구현을 하였습니다.

 

@Service annotation을 통해 해당 클래스를 bean으로 등록 하여 해당 클래스가 Service로 사용됨을 Spring Framework에 알려줍니다.

 

package com.example.hellospring2.service;

import com.example.hellospring2.domain.Member;
import com.example.hellospring2.repository.MemberRepository;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MemberService {

    private final MemberRepository memberRepository;

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

    /**
     * 회원 가입
     */
    public Long join(Member member){

        long start = System.currentTimeMillis();

        try {
            // 같은 이름이 있는 중복 회원 X
            validateDuplicateMember(member);

            memberRepository.save(member);
            return member.getId();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("join " + timeMs + "ms");
        }

    }

    private void validateDuplicateMember(Member member) {
        // findByName이 optional type 으로 return 했기 때문에 ifPresent 문법을 사용할 수 있음.
        memberRepository.findByName(member.getName()).
            ifPresent(m -> {
                throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
    }

    /**
     * 전체 회원 조회
     */
    public List<Member> findMembers(){
        long start = System.currentTimeMillis();
        try {
            return memberRepository.findAll();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = start - finish;
            System.out.println("findMembers " + timeMs + "ms");
        }


    }

    public Optional<Member> findOne(Long memberID){
        return memberRepository.findById(memberID);
    }
}

Service Test 코드 세팅


service 로직이 잘 돌아가는지 확인을 해 보겠습니다.

Test 코드에서는 메서드 명을 한글로 사용할 수 있기 때문에 여기에서는 한글로 메서드명을 작성하도록 하겠습니다.

 

회원 가입 확인

회원 가입 메서드에서는 회원 가입이 정상적으로 잘 되는지를 확인하기 위해

회원을 생성하여 db에 저장을 하고

초기에 생성한 회원과 db에 저장한 회원을 꺼내 서로를 비교해 봅니다.

 

중복 회원 예외 처리

중복된 이름을 가진 회원이 존재하는지 확인하는 작업을 진행합니다.

이름이 같은 회원 두명을 생성한 후 둘다 memberRepository에 집어 넣은 다음 예상한 에러가 발생하는지를 확인해 봅니다.

 

중복 회원 예외 확인 테스트가 먼저 실행 될 경우 회원 가입 테스트에서 오류가 발생합니다.

모든 테스트가 상호 영향을 미치지 않도록, afterEach에서 memberRepository를 초기화 해줍니다.

beforeEach에서는 memberService와 memberRepository를 생성하는 작업을 진행합니다.

 

class MemberServiceTest {
    MemberService memberService;
    MemoryMemberRepository memberRepository;

    // class 가 시작히기 전에 실행
    @BeforeEach
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }


    // class 가 끝날 때 마다 실행  11
    @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);
        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() {
    }
}

 

 

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {

    //
    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

    @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);
        IllegalStateException e = assertThrows(IllegalStateException.class,
                () -> memberService.join(member2));
        Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    }
}