[初心-Spring Boot] 예제를 통한 MVC 패턴 설계 (2) - Service

0

초심-spring boot

목록 보기
5/16

1. Service 구현


service에서는 클라이언트가 요청한 정보를 처리한다. '비즈니스 로직을 수행한다'라고도 표현하기도 한다.

1-1. MemberService 생성


MemberService.java
package com.rptp.rptpSpringBoot.service;

import com.rptp.rptpSpringBoot.model.MemberDTO;
import com.rptp.rptpSpringBoot.repository.MemberRepository;
import com.rptp.rptpSpringBoot.repository.impliment.MemoryMemberRepository;

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

public class MemberService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();

    //화원가입
    public Long join(MemberDTO memberDTO) {
        // 같은 이름의 있는 중복 회원 x
        validateDuplicateMember(memberDTO);

        memberRepository.save(memberDTO);
        return memberDTO.getId();
    }

    private void validateDuplicateMember(MemberDTO memberDTO) {
        memberRepository.findByName(memberDTO.getName())
                .ifPresent(m -> {
                    throw new IllegalStateException("이미 존재하는 회원입니다");
                });
    }

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

    // id에 맞는 회원 조회
    public Optional<MemberDTO> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

엇... 왜 Service 클래스는 인터페이스 사용을 안할까...?
Service에서 인터페이스 사용은 필수가 아니다. 자세한 설명은 여기에 있다.

1-2. test코드 작성


MemberServiceTest.java
package com.rptp.rptpSpringBoot.service;

import com.rptp.rptpSpringBoot.model.MemberDTO;
import com.rptp.rptpSpringBoot.repository.MemberRepository;
import com.rptp.rptpSpringBoot.repository.impliment.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 java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;

class MemberServiceTest {

    MemoryMemberRepository memoryMemberRepository;
    MemberService memberService;

    @BeforeEach
    public void 테스트_시작전_실행(){
       memoryMemberRepository = new MemoryMemberRepository();
       memberService = new MemberService(memoryMemberRepository);
    }

    @AfterEach
    public void 테스트_종료시_실행() {
        memoryMemberRepository.deleteAll();
    }


    @Test
    void 회원가입() {
        //given
        MemberDTO memberDTO = new MemberDTO();
        memberDTO.setName("홍길동");
        //when
        Long saveId = memberService.join(memberDTO);

        //then
        MemberDTO findMember = memberService.findOne(saveId).get();
        Assertions.assertThat(memberDTO.getName()).isEqualTo(findMember.getName());
    }

    @Test
    public void 회원가입_시_중복회원가입_예외() {
        //given
        MemberDTO member1 = new MemberDTO();
        member1.setName("홍길동");

        MemberDTO member2 = new MemberDTO();
        member2.setName("홍길동");
        //when
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        //then
        Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다");
    }
/*
    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
*/
}

BeforeEach

각 단위테스트 실행하기 전에 실행된다.

assertThrows(Exception, Exception)

두 개의 Exception을 비교한다.

참조


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/lecture/49584?tab=curriculum
Spring 에서 Service 인터페이스 사용? https://hyunsoori.tistory.com/11

0개의 댓글