(회원 엔티티 코드 다시 보기) ➡️ 회원 리포지토리 개발 ➡️
회원 서비스 개발 ➡️ 회원 기능 테스트
MemberRepository
@Repository // 스프링 빈으로 등록, JPA 예외를 스프링 기반 예외로 예외 변환
public class MemberRepository {
@PersistenceContext // 엔티티 메니저(EntityManager) 주입
private EntityManager em;
// 기능 1
public void save(Member member) {
em.persist(member);
}
// 기능 2
public Member findOne(Long id) {
return em.find(Member.class, id);
}
// 기능 3
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
// 기능 4
public List<Member> findByName(String name) {
return em.createQuery("select m from Member m where m.name = :name",
Member.class)
.setParameter("name", name)
.getResultList();
}
}
cf) @PersistenceUnit
: 엔티티 메니터 팩토리( EntityManagerFactory ) 주입
MemberService
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository; // 레포지토리 객체 만들기
/**
* 회원가입 */
@Transactional // 변경
public Long join(Member member) {
validateDuplicateMember(member); // 중복 회원 검증 memberRepository.save(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);
}
}
@RequiredArgsConstructor : 생성자 주입
- 변경이 불가능한 안전한 객체 생성 가능public class MemberService { private final MemberRepository memberRepository; // final 키워드를 추가하면 컴파일 시점에 memberRepository 를 설정하지 않는 오류를 체크할 수 있다. public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } ... }
lombok
라이브러리가 자동완성 해주는 부분이다 !
MemberServiceTest
@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 saveId = memberService.join(member);
//Then
assertEquals(member, memberRepository.findOne(saveId));
}
@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("예외가 발생해야 한다.");
}
}