jae_coding

[Spring Project] 회원 관리 및 테스트 본문

Spring, java/Spring_Project

[Spring Project] 회원 관리 및 테스트

재코딩 2022. 8. 22. 17:16
반응형

목차

  • 회원 도메인
  • 회원 Repository
  • 회원 Service
  • 회원 Service Test
  • 회원 Service Test 검증

 

1. 회원 도메인

package jpabook.jpashop.domain;


import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@Setter
public class Member {

    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    private String name;

    @Embedded
    private Address address;

    //mapping이 된 거울이된 느낌(읽기 전용)
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}

2. 회원 Repository

package jpabook.jpashop.repository;

import jpabook.jpashop.domain.Member;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import java.util.List;

//스프링 빈으로 스프링이 등록을 해준다.
@Repository
@RequiredArgsConstructor
public class MemberRepository {

    private final EntityManager em;

    /*
    //JPA 엔티티메니저를 주입할 수 있도록하는 어노테이션
    @PersistenceContext
    private EntityManager em;
     */

    // 멤버 저장
    public void save(Member member){
        em.persist(member);
    }

    // 멤버 찾기
    public Member findOne(Long id){
        return em.find(Member.class, id);
    }

    //전체 멤버 리스트 반환
    public List<Member> findAll(){
        return em.createQuery("select m from Member m", Member.class).getResultList();
    }

    //이름에 의한 회원 조회기능
    public List<Member> findByName(String name){
        return em.createQuery("select m from Member m where m.name = :name", Member.class)
                .setParameter("name", name)
                .getResultList();
    }
}

3. 회원 Service

package jpabook.jpashop.service;

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

import java.util.List;

@Service
//읽기전용이라 최적화하기 좋다.
@Transactional(readOnly = true)
//final이 있는 경우에 생성자 인젝션을 자동으로 생성해줌 (lombok)
@RequiredArgsConstructor
public class MemberService {

    /*
    //Autowired를 통하여 스프링빈에 있는 것을 필드 인젝션을 해준다. (단점: 변경을 하지 못한다)
    @Autowired
    private MemberRepository memberRepository;

     */

    /*
    //생성자 Injection (변경할 일이 없기때문에 final로 지정)
    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
     */

    private final MemberRepository memberRepository;


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

    private void validateDuplicateMember(Member member) {
        //EXCEPTION
        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);
    }


}

4. 회원 Service Test

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.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;

import static org.junit.Assert.*;

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

    @Autowired
    MemberRepository memberRepository;
    @Autowired
    MemberService memberService;
//    @Autowired
//    EntityManager em;

    @Test
//    @Rollback(value = false) //Transactional으로 인한 Rollback True
    public void 회원가입() throws Exception{
        //given
        Member member = new Member();
        member.setName("Kim");

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

        //then
//        em.flush(); // 영속성 콘텍스트 멤버 객체를 변경 내용을 쿼리로 볼 수 있다.
        //같은 회원인지 확인
        assertEquals(member, memberRepository.findOne(savedId));
    }

    //Try-catch사용을 줄일 수 있음
    @Test(expected = IllegalStateException.class)
    public void 중복_회원_예외() throws Exception{
        //given
        Member member1 = new Member();
        member1.setName("Kim");
        Member member2 = new Member();
        member2.setName("Kim");
        //when
        memberService.join(member1);
        memberService.join(member2); //예외가 발생해야하는 상황

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

5. 회원 Service Test 검증

회원 테스트 검증이 확인된 것을 확인할 수 있다.

필요한 내용은 주석에 처리해둔 것을 확인할 수 있지만 충분히 설명을 못한 부분이 있다면 댓글로 남겨주시면 설명해드리겠습니다.

 

반응형
Comments