✔️테스트용 회원 리포지토리
@Repository
public class MemberRepository {
@PersistenceContext
EntityManager em;
public Long save(Member member) {
em.persist(member);
return member.getId();
}
public Member find(Long memberId) {
Member member = em.find(Member.class, memberId);
return member;
}
}
EntityManager
를 빈으로 주입할 때 사용하는 어노테이션EntityManager
가 존재한다.EntityManager
를 만들어서 빈으로 등록해둔다.EntityManagerFactory
가 EntityManager
를 만들어서 제공해주는데 이 때, EntityManager
는 절대 공유해선 안 된다.@PersistenceContext
으로 EntityManager
를 주입받아도 동시성 문제가 발생하지 않는다.✔️회원 리포지토리 테스트 코드
@RunWith(SpringRunner.class)
@SpringBootTest
class MemberRepositoryTest {
@Autowired
public MemberRepository memberRepository;
@DisplayName("회원 리포지토리 테스트 코드")
@Test
void save() throws Exception {
// given
Member member = new Member();
member.setName("테스트 회원");
// when
Long savedId = memberRepository.save(member);
Member findMember = memberRepository.find(savedId);
// then
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
}
}
실행 결과
No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
@Transactional
어노테이션을 걸어준다.@Transactional
어노테이션을 붙여주면 테스트가 수행되고 난 후 롤백이 이루어진다.