[Spring 입문] 03. 회원 관리 예제 - 백엔드 개발(2)

Jiwoo Jung·2024년 11월 3일
0

김영한 Spring 입문

목록 보기
3/6
  1. 회원 서비스 개발
  2. 회원 서비스 테스트

IntelliJ windows 단축키
Ctrl + Alt + v : 리턴
Ctrl + Alt + m : 메소드 추출
Ctrl + Alt + t : 테스트 생성

회원 서비스 개발

service.MemberService

package com.jiu.spring_basic.service;

import com.jiu.spring_basic.domain.Member;
import com.jiu.spring_basic.repository.MemberRepository;
import com.jiu.spring_basic.repository.MemoryMemberRepository;

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

public class MemberService {
    private final MemberRepository memberRepository;

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

    /**
     * 회원가입
     */
    public Long join(Member member){
        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();
    }

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

회원가입(Join)

중복 회원 검증(by name)

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

코드가 복잡하니까 아래의 방법으로 사용

memberRepository.findByName(member.getName()) // findByName()는 Optional 객체 반환
		.ifPresent(m -> {
				throw new IllegalStateException("이미 존재하는 회원입니다.");
		});

DI(Dependency Injection)

// without DI
public class MemberService {
		private final MemberRepository memberRepository = new MemoryMemberRepository();
}
// with DI
public class MemberService {
    private final MemberRepository memberRepository;

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

회원 서비스 테스트

MemberServiceTest

package com.jiu.spring_basic.service;

import com.jiu.spring_basic.domain.Member;
import com.jiu.spring_basic.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.*;
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 join() {
        //given
        Member member = new Member();
        member.setName("dup");

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

        //then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());

    }

    @Test
    void Dup_Member_join(){
        //given
        Member member1 = new Member();
        member1.setName("dup");

        Member member2 = new Member();
        member2.setName("dup");

        //when
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

give-when-then 문법

@Test
void join() {
		//given
		Member member = new Member();
		member.setName("dup");
		//when
		Long saveId = memberService.join(member);
		
		//then
		Member findMember = memberService.findOne(saveId).get();
		assertThat(member.getName()).isEqualTo(findMember.getName());
}

중복 회원 검증 test

try-catch 문법

@Test
void Dup_Member_join(){
		//given
		Member member1 = new Member();
		member1.setName("dup");
		Member member2 = new Member();
		member2.setName("dup");
		
		//when
		memberService.join(member1);		
		try{
				memberService.join(member2);
				fail();
		} catch(IllegalStateException e){
				assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
		}
}

assertThrows()로 간단하게

@Test
void Dup_Member_join(){
		//given
		Member member1 = new Member();
		member1.setName("dup");
		Member member2 = new Member();
		member2.setName("dup");
		
		//when
		memberService.join(member1);
		IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
		//assertThrows(NullPointerException.class, () -> memberService.join(member2)); // 오류 발생
		assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}

@BeforeEach

@BeforeEach
public void beforeEach(){
		memberRepository = new MemoryMemberRepository();
		memberService = new MemberService(memberRepository);
}

각 테스트 실행 전에 호출된다. 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고, 의존관계도 새로 맺어준다.

0개의 댓글