Spring/스프링 입문

회원 관리 예제 - 백엔드 개발 (2)

코징 2022. 3. 7. 16:36

1. Service 구현

  • service를 구현하다 보면 비즈니스 네임이랑 비슷하다는 것을 알 수 있다. 그래야지 기획자가 말하는 부분의 로직을 찾기가 쉽다. 
  • model 같은 경우 단순히 기계적으로 개발스럽게 만든다.
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 {
    MemberRepository memberRepository = new MemoryMemberRepository();

    /**
     * 회원가입
     */
    public Long join(Member member) {
        // alt + ctrl + v 함수 리턴 값을 변수로 자동완성
        // 같이 이름이 있는 중복 회원 X
        validateDuplicateMember(member); // 중복회원 검증
        this.memberRepository.save(member);
        return member.getId();
    }

    public List<Member> findMembers() {
        return memberRepository.findAll();
    }

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

    // alt + ctrl + shift + t 함수로 뽑아내기
    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                .ifPresent(m -> {
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }
}

 

 

2. Junit Test 구현

  • service를 구현 했으므로 테스트 케이스를 작성한다.
  • test> java> hello.hellospring> repository> serive> MemoryServiceTest.java
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.junit.jupiter.api.Assertions.assertThrows;

//이전에 실행 시켰던 것을 다시 재실행 shift + F10
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 member1 = new Member();
        member1.setName("hello");

        // when 실행했을때
        memberService.join(member1);

        // then 결과값
        Assertions.assertThat(memberService.findOne(member1.getId()).get().equals(member1));
    }

    @Test
    void 중복_회원_예외() {
        //given 주어주다
        Member member1 = new Member();
        member1.setName("spring");

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

        // when 실행했을때
        memberService.join(member1);
        //then
        assertThrows(IllegalStateException.class, ()-> memberService.join(member2));

    /*
        try {
            memberService.join(member2);
            fail();
        } catch ( IllegalStateException e) {
            Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        }
    */
    }

    @Test
    void 회원조회() {
        Member member1 = new Member();
        member1.setName("spring3");
        memberService.join(member1);
        Assertions.assertThat(memberService.findMembers().size()).isEqualTo(1);
    }

    @Test
    void findOne() {
        Member member1 = new Member();
        member1.setName("spring");
        memberService.join(member1);
        Assertions.assertThat(memberService.findOne(member1.getId()).get()).isEqualTo(member1);
    }
}
  • Test 케이스는 잘되는 케이스도 있지만, 예외가 잘 나오는지도 확인해야 된다. 때문에 예외 함수를 만들어서 해당하는 기능이 잘 작동되는지 확인한다.
  • assertThrows : Exception이 함수 내에 지정한 IllegalStateException이 맞는지 확인
  • @beforEeach: @TEST 함수 실행 전 실행시켜주는 함수
  • beforEach로 DI 구현 외부에서 생성자를 통해서 만든 후 내부 클래스로 선언

DI 추가 설명:  https://cozing.tistory.com/53?category=1076708

 

[리뷰]클린코드 clean code 11장 - 시스템 - (1)

*도시가 잘 돌아가는 이유 수도권 관리팀, 전력 관리팀, 교통 관리 팀, 치안 관리 팀, 건축물 관리 팀 등 각 분야를 관리하는 팀이 있다. 적절한 추상화와 모듈 때문이다. 그래서 큰 그림을 이해하

cozing.tistory.com

 

 

결론

이를 통해서 Model, Service의 흐름을 익힐 수 있었고, Test 케이스를 통해서 예외까지 확인하는 방법을 알 수 있었다. 

 

이 글은 인프런의

제목 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

강사 : 김영한 님의 동영상을 참조해 만들었습니다.

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/dashboard