본문 바로가기
프레임워크/Spring

[스프링 입문] 섹션 3 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

by 오오오니 2022. 5. 14.

 

  • 비지니스 요구사항 정리
  • 회원 도메인과 리포지토리 만들기
  • 회원 리포지토리 테스트 케이스 작성
  • 회원 서비스 개발
  • 회원 서비스 테스트

 

비지니스 요구사항 정리

-데이터:회원 ID,이름    -회원 등록,조회      -아직 데이터 저장소가 선정되지 않음

 

클래스 의존관계

MemberService -> MemberRepository (interface)     <- - - Memory MemberRepository

회원을 저장하는 것은 인터페이스로 설계

->아직 데이터 저장소가 선정되지 않았기 때문이다. 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계

데이터 저장소는 RDB,NoSQL등등 다양한 저장소를 고민중인 상황으로 가정한다.

개발초기단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소 사용한다.

회원 도메인과 리포지토리 만들기

도메인

회원 리포지토리

 

 

Alt + Shift +Enter

구현체

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.Optional;

import static org.assertj.core.api.Assertions.*;

class MemoryMemberRepositoryTest {

    MemberRepository repository = new MemoryMemberRepository();

    @Test
    public  void save()
    {
        Member member = new Member();
        member.setName("string");

        repository.save(member);

       Member result= repository.findById(member.getId()).get();
     //  System.out.println("result = " + (result==member));
        //Assertions.assertEquals(result,member);
        assertThat(member).isEqualTo(result);


    }

    @Test
    public void findByName()
    {
        Member member1= new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2= new Member();
        member2.setName("spring2");
        repository.save(member2);

       Member result = repository.findByName("spring1").get();

       assertThat(result).isEqualTo(member1);
    }
}

 

회원 리포지토리 테스트 케이스 작성

main 메서드, 웹 어플리케이션의 컨트롤러를 통한 실행

-> 오래 걸리고 반복하기 어렵다.한번에 여러 테스트를 실행하기 어렵다.=> JUnit 프레임워크 사용

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

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

import static org.assertj.core.api.Assertions.*;

class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach()
    {
        repository.clearStore();
    }

    @Test
    public  void save()
    {
        Member member = new Member();
        member.setName("string");

        repository.save(member);

       Member result= repository.findById(member.getId()).get();
     //  System.out.println("result = " + (result==member));
        //Assertions.assertEquals(result,member);
        assertThat(member).isEqualTo(result);


    }

    @Test
    public void findByName()
    {
        Member member1= new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2= new Member();
        member2.setName("spring2");
        repository.save(member2);

       Member result = repository.findByName("spring1").get();

       assertThat(result).isEqualTo(member1);
    }

    @Test
    public  void findAll()
    {
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        List<Member> result = repository.findAll();

        assertThat(result.size()).isEqualTo(2);

    }


}

shift +f6 -> 변수 이름 한번에 바꾸기

Test는 순서가 상관없다. 순서에 의존적으로 설계하면 안된다.

하나의 테스트가 끝날때마다 공용인것을 지워줘야한다.

회원 서비스 개발

ctrl +Alt +shift +t 메소드 뽑기

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 MemoryMemberRepository memberRepository;// =new MemoryMemberRepository();

    public MemberService(MemoryMemberRepository memberRepository) {//외부에서 넣어주도록 바꾸기
        this.memberRepository = memberRepository;
    }

    /**
     * 회원가입
     */
    public  Long join(Member member){//같은 이름이 있는 중복 회원X
        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> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }
}

 

회원 서비스 테스트

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Optional;

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

class MemberServiceTest {

    MemberService memberService;// = new MemberService();
    MemoryMemberRepository memberRepository ;//=new MemoryMemberRepository();//다른 인스턴스라서 내용물이 달라질 수도 있다.

    @BeforeEach
    public void beforeEach()
    {
        memberRepository =new MemoryMemberRepository();
        memberService =new MemberService(memberRepository);
    }
    @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);
        //memberService.join(member2);
        //try catch  x
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

        //then
    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}