일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- popleft
- 프로그래머스
- 합 구하기
- C#강의
- 연관관계
- 파이썬
- deque
- 소수판별
- Java
- 1일1솔
- DP
- python3
- 인프런
- pypy3
- 백준
- Python
- mvc
- 완전탐색
- 브루투포스
- appendleft
- 소수찾기
- JPA
- BFS
- spring
- 우선순위큐
- LCM
- 그리디 알고리즘
- 누적합
- unity
- c#
Archives
- Today
- Total
jae_coding
[Spring Project] 회원 관리 및 테스트 본문
반응형
목차
- 회원 도메인
- 회원 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 검증
회원 테스트 검증이 확인된 것을 확인할 수 있다.
필요한 내용은 주석에 처리해둔 것을 확인할 수 있지만 충분히 설명을 못한 부분이 있다면 댓글로 남겨주시면 설명해드리겠습니다.
반응형
'Spring, java > Spring_Project' 카테고리의 다른 글
[Spring Project] 주문 도메인 개발 (0) | 2022.08.23 |
---|---|
[Spring Project] 상품 도메인 개발 (0) | 2022.08.22 |
[Spring Project] 애플리케이션 아키텍쳐 (0) | 2022.08.22 |
[Spring Project] 엔티티 설계 주의사항 (0) | 2022.08.22 |
[Spring Project] 엔티티 클래스 개발 (3) | 2022.08.21 |
Comments