Spring 1-3. 회원 관리 예제 - 백엔드 개발 2

JG's Development Blog·2023년 1월 25일
0

Spring

목록 보기
4/10

회원 서비스 개발

  • 도메인과 리포지토리를 이용하여 비즈니스 로직 구현
  • src - main - java 에 service 패키지 생성 후 MemberService 클래스 생성
  • 아래 코드 붙여넣기
package hello.hellospring.service;

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

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

public class MemberService {

    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 ->{
            throw new IllegalStateException("이미 존재하는 회원입니다.");
            // 같은 이름이 존재하면 위 문구 출력
        });
    }

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

    public Optional<Member> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }
}
  • Optional을 쓰는 이유 : Optional을 이용하면 if(null==?) 등의 다양한 메소드들을 활용할 수 있다.

    단축키
    shift+f6 : 단어를 한번에 바꿀 수 있다.
    ctrl+alt+shift+t : 해당 블록을 함수화 시킨다.(window)


회원 서비스 테스트

  • test 파일에서 따로 package를 만들고 class를 만들 필요 없이 자동으로 만들어주는 단축키가 있다.

    ctrl + shift + t

  • create new test를 누르면 창이 뜬다.

  • test할 함수를 선택하면 자동으로 test 파일을 생성해준다.

  • test 함수는 빌드에 포함되지 않으므로 한글사용이 가능하다.

  • test는 기본적으로 다음과 같은 단계로 구분된다.
    given : 어떠한 상황이 주어진다.
    when : 이것이 실행되었을 때
    then : 이것이 나와야한다.

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.Test;

import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertThrows;

class MemberServiceTest {

    MemberService memberService = new MemberService();
    MemoryMemberRepository memberRepository = new MemoryMemberRepository();
    
    @AfterEach
    public void afterEach(){
        memberRepository.clearStore();
    }
    @Test
    void join() {
        // given
        Member member = new Member();
        member.setName("hello");

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

        // then
        Member findMember = memberService.findOne(saveId).get();
        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));
        // 2번째 인자를 실행했을 때 1번째 인자의 오류가 발생해야함
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        // 발생한 오류의 메시지 체크

        /*
        // try catch 이용하여 중복 검사가 동작하는지 체크
        try {
            memberService.join(member2);
            fail("예외가 발생해야 합니다.");
        }catch (IllegalStateException e){
            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        }
*/

        // then
    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}
  • 그러나 memberService에서 repository를 new로 생성하고
    테스트 파일에서 따로 repository를 new로 생성하는 오류가 있다.
    -> static이기 때문에 결국은 같은 저장공간을 가르키지만 static이 아니라면 오류가 발생한다.

  • 따라서 service의 다음 코드를 바꿔주어야한다.

private final MemberRepository memberRepository = new MemoryMemberRepository();

=>

private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
  • service test의 코드 또한 바꿔 준다.
    MemberService memberService = new MemberService();
    MemoryMemberRepository memberRepository = new MemoryMemberRepository();

=>

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach // 각 테스트 실행하기 전에 실행
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

강의 사이트
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

profile
왕왕왕초보

0개의 댓글