EntityManager
를 빈에 주입시키기 위한 어노테이션이다. 요즘에는 @Autowired
만 써도 된다고 한다.
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
하지만, 스프링 부트는 위 과정을 자동으로 해주기 때문에 지워도 된다.
스프링 부트가 알아서 처리해주는 모습을 확인할 수 있다.