회원 도메인 개발

slee2·2022년 2월 4일
0

순서

  • 회원 엔티티 코드 다시 보기
  • 회원 리포지토리 개발
  • 회원 서비스 개발
  • 회원 기능 테스트

리포지토리 개발

@PersistenceContext

EntityManager를 빈에 주입시키기 위한 어노테이션이다. 요즘에는 @Autowired만 써도 된다고 한다.

JPQL

em.createQuary를 사용하면 안에 JPQL을 작성할 수 있다. SQL과 차이점은 엔티티를 참고한다는 점 정도 있다. 자세한건 JPA 기본편에 있다.

서비스 개발

package jpabook.jpashop.service;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;

    /**
     * 회원 가입
     */
    @Transactional
    public Long join(Member member) {
        validateDuplicateMember(member); // 중복 회원 검증
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        List<Member> findMembers = memberRepository.findByName(member.getName());
        if (!findMembers.isEmpty())
            throw new IllegalStateException("이미 존재하는 회원입니다.");
    }

    /**
     * 회원 전체 조회
     */

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

    public Member findOne(Long memberId) {
        return memberRepository.findOne(memberId);
    }
}

스프링 기본편에서 했던 것과 비슷한 양상을 볼 수 있었다.

특별히 어.. 신경써야 할 부분은 안보여서 패스

테스트

package jpabook.jpashop.service;


import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

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

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class MemberServiceTest {

    @Autowired
    MemberService memberService;

    @Autowired
    MemberRepository memberRepository;

    @Test
    public void 회원가입() throws Exception {
        //given
        Member member = new Member();
        member.setName("kim");

        //when
        Long savedId = memberService.join(member);

        //then
        assertEquals(member, memberRepository.findOne(savedId));
    }

    @Test
    public void 중복_회원_예외() throws Exception {
        //given
        Member member1 = new Member();
        member1.setName("kim1");

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

        //when
        memberService.join(member1);
        try {
            memberService.join(member2);
        } catch (IllegalStateException e) {
            return;
        }

        //then
        fail("예외가 발생해야한다.");
    }
}

여기서 Junit4를 사용하기 위해
build.gradle에 아래를 추가한다.

implementation 'junit:junit:4.13.1'

또, 테스트를 할때는 메모리를 사용하는 것이 편하기 때문에 테스트용 설정을 따로 만들어준다.

/test/resources/application.yml
로 만들면 테스트는 이 파일의 설정을 따르게 된다.
여기서 url의 경로는 h2 사이트에서 In-Memory에 있는 url을 사용하면 된다.

https://www.h2database.com/html/cheatSheet.html

하지만, 스프링 부트는 위 과정을 자동으로 해주기 때문에 지워도 된다.

스프링 부트가 알아서 처리해주는 모습을 확인할 수 있다.

0개의 댓글