[스프링 입문] 회원 관리(2)

2024. 8. 24. 15:28·Back-End/Spring

[작성일: 2023. 05. 12]

 

 

회원 관리

회원 서비스 개발

service.class

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) {
        // 회원 가입
        // 같은 이름의 중복 회원은 허용하지 않는다는 룰 생성
        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> findeOne(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

 

 

 

 

 

회원 서비스 테스트

  • 기존에는 회원 서비스가 메모리 회원 리포지토리를 직접 생성하게 했지만, 그럴 경우 test에서 new를 사용하여 새로운 객체가 생성된다. 지금은 static이라 상관없을지 몰라도 나중에는 다른 객체들이 생성될 확률이 높기 때문에 코드를 수정해주어야 한다.
  • 회원 서비스 코드를 DI 가능하게 변경한다.

 

 

MemberService

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

 

 

 

MemberServiceTest

  • (window 기준) ctrl + shift + T를 누르면 쉽게 Test Class를 작성할 수 있다.
  • Test는 사실 과감하게 한글로 작성해도 된다. (ex : Join ➡️ 회원가입)
  • given, when, then 활용
  • 인텔리제이 static import : alt + enter ➡️ Add on - demand static import
  • ctrl + alt + V : 자동으로 값을 저장할 변수 생성(편리함)
  • Shift + F10 : 이전에 실행했던 Test를 다시 실행해줌.
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.assertj.core.api.Assertions.assertThat;
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 회원가입() {
        // 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));
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//    try {
//        memberService.join(member1);
//        fail();
//       } catch(IllegalStateException e) {
//            assertThat(e.getMessage()).isEqualTo("이미 존하는 회원입니다.");
//       }
        // then
    }

괴의로 예외 발생 했을 경우 test

 

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

 

 

 

 

 

 

 

 

 

 


🐣 출처: 인프런 김영한님 강의


이 글은 인프런의 김영한님 스프링 강의를 보고 작성한 글입니다.

강의를 들으면서 정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.

 

저작자표시 비영리 변경금지 (새창열림)
'Back-End/Spring' 카테고리의 다른 글
  • [스프링 입문] 스프링 빈과 의존관계(2)
  • [스프링 입문] 스프링 빈과 의존관계(1)
  • [스프링 입문] 회원 관리(1)
  • [스프링 입문] 스프링 웹 개발 기초
뚜비
뚜비
1년차 백엔드&iOS 개발자의 감자 탈출 블로그 🥔🥔
  • 뚜비
    뚜비의 개발로그
    뚜비
  • 전체
    오늘
    어제
  • 글쓰기     관리
    • Devlog
      • Back-End
        • Java
        • Spring
        • JPA
        • HTTP
        • Security
        • Back-End
        • Front-End
      • 알고리즘
      • iOS
        • Swift
      • Database
      • Tips
        • Git & GitHub
        • A to Z
      • 프로젝트
      • 생각정리
  • 태그

    다형성
    Swift
    객체
    JPA
    프로그래머스
    생성자
    sql
    javascript
    Java
    성능최적화
    변수
    자바
    최주호
    자바스크립트
    김영한
    알고리즘
    html
    게시판만들기
    DB
    spring
    데이터베이스
    Database
    스프링
    Security
    HTTP
    의존성주입
    jsp
    백준
    Spring Security
    MVC
  • hELLO· Designed By정상우.v4.10.0
뚜비
[스프링 입문] 회원 관리(2)
상단으로

티스토리툴바