본문 바로가기

Spring Boot(스프링 부트)

Spring Boot(스프링 부트) > 회원 서비스 개발 2 - 전 포스팅에 이어서...

간단한 회원 기능을 구현 및 테스트를 완료하였고, 이제 간단한 로직을 구현한다!

 

hello-spring -> src -> main -> java -> hello.hellospring에서 service 이름의 패키지를 만들고 MemberService 클래스를 만든다.

이 곳에서 회원 서비스 기능을 작성하는 것이다.

 

import ...

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(); // 임의로 member id 반환
   }

   private void validateDuplicateMember(Member member) { // 중복 회원 검증 함수
      memberRepository.findByName(member.getName()) 
         .ifPresent(m -> { // member 객체의 name이 이미 존재하는 name이라면...
            throw new IllegalStateException("이미 존재하는 회원입니다."); // 오류!
         });
   }

   // 전체 회원 조회
   public List<Member> findMembers() {
      return memberRepository.findAll(); // 이전에 만들었던 함수 실행
   }

   public Optional<Member> findOne(Long memberId) {
      return memberRepository.findById(memberId); id로 객체를 가져
   }
}

 

위의 코드가 회원 서비스의 비즈니스 로직 부분이다!

이제 Test를 구현해보겠다.

선생님께서 test의 중요성을 말씀해 주셨는데, 단순한 코드면 모르겠지만 코드가 몇 만라인 넘어가고 하면 test가 정말 중요하다고 하였다. 같이 작업하는 사람들 간에도 중요한 커뮤니케이션 일 것이라고!!

 

hello-spring -> src -> test -> java -> hello.hellospring 에 service 패키지를 만들고, 클래스 MemberServiceTest를 만든다

Test 작성 방식은 다음과 같다!

Given : 입력 값이 주어지면

When : 어떤 상황에서

Then : 이렇게 결과가 나올 것이다.

 

다음 포인트 단어를 생각하여 test를 작성하면 원활할 것이라고 말씀해 주셨다.

 

import ...

class MemberServiceTest {
   MemberService memberService; 
   MemoryMemberRepository memberRepository;

   // Test가 끝날 때마다 실행
   @AfterEach 
   public void afterEach() {
      memberRepository.clearStore(); // List<Member> 초기화
   }

   // Test 실행 전마다 실행
   @BeforeEach
   public void beforeEach() {
      memberRepository = new MemoryMemberRepository(); // 객체 생성 -> List<Member>를 초기화하기 위해 필요! MemoryMemberRepository()에 List<Member>을 오버라이딩하였기 때문...
      memberService = new MemberService(memberRepository); // 객체 생성
   }

   @Test
   void 회원가입() { // 한글로 입력해도 가능 -> 한 눈에 이해하기 쉬움
      // given
      Member member = new Member();
      member.setName("hello");

      // when
      Long saveId = memberService.join(member); // 함수 리턴값을 ID(Long 타입)으로 설정하였음
  
      // then
      Member findMember = memberService.findOne(saveId).get(); // 회원 ID를 입력하여 member 객체를 받아옴
      assertThat(member.getName()).inEqualTo(findMember.getName()); // 만든 객체의 name과 함수로 받아온 객체의 name과 같은 경우 Check
   }

   @Test
   public void 중복_회원_예외() { // test는 예외 상황을 test하는 것이 중요(Point)
      // 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));

      // 오류 메시지가, "이미 존재하는 회원입니다." 이면 Check
      assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
   }

 

다음과 같이 입력하면 회원 서비스의 비즈니스 로직과 테스트를 구현한 것이다!

 

아직 DB를 설정하지 않은 상태라 프로그램 자체에서 저장되는 형태인 것 같다

DB까지 지정하고 설정한다면 매우 복잡해질 것 같다

테스트의 aseert 문법이 많이 어려운 것 같다..

오류 상황도 지정해야하고, 람다함수도 잘 모르는 상태라 그런 것 같다

 

이렇게 이번주 강의 내용은 이것으로 끝이다!

 

다음 주도 화이팅!