반응형
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다.
순수 JPA 기반 리포지토리 만들기
CRUD 기능 만들기
MemberJpaRepository.class
@Repository
public class MemberJpaRepository {
@PersistenceContext
private EntityManager em;
public Member save(Member member) {
em.persist(member);
return member;
}
public void delete(Member member) {
em.remove(member);
}
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
public long count() {
return em.createQuery("select count(m) from Member m", Long.class)
.getSingleResult();
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
TeamRepository.class
@Repository
public class TeamRepository {
@PersistenceContext
private EntityManager em;
public Team save(Team team) {
em.persist(team);
return team;
}
public void delete(Team team) {
em.remove(team);
}
public List<Team> findAll() {
return em.createQuery("select m from Team t", Team.class)
.getResultList();
}
public Optional<Team> findById(Long id) {
Team team = em.find(Team.class, id);
return Optional.ofNullable(team);
}
public long count() {
return em.createQuery("select count(t) from Team t", Long.class)
.getSingleResult();
}
}
MemberRepository와 TeamRepository의 코드가 타입만 다를 뿐 사실 비슷하다. 아니 똑같다! 그래서 스프링에서는 이런 기본적인 CRUD 같은 부분들을 더욱 간편하게 쓸 수 있는 기능을 제공한다.
여기서 UPDATE가 없는 이유는 JPA는 엔티티 변경 감지 기능으로 데이터를 변경하기 떄문에 따로 update 기능을 만들지 않아도 된다.
↓ 관련 포스팅
MemberJpaRepositoryTest.class
@SpringBootTest
@Transactional
@Rollback(false)
class MemberJpaRepositoryTest {
@Test
public void basicCRUD() {
Member member1 = new Member("member1");
Member member2 = new Member("member2");
memberJpaRepository.save(member1);
memberJpaRepository.save(member2);
// 단건 조회 검증
Member findMember1 = memberJpaRepository.findById(member1.getId()).get();
Member findMember2 = memberJpaRepository.findById(member2.getId()).get();
assertThat(findMember1).isEqualTo(member1);
assertThat(findMember2).isEqualTo(member2);
// 리스트 조회 검증
List<Member> all = memberJpaRepository.findAll();
assertThat(all.size()).isEqualTo(2);
// 카운트 검증
long count = memberJpaRepository.count();
assertThat(count).isEqualTo(2);
// 삭제 검증
memberJpaRepository.delete(member1);
memberJpaRepository.delete(member2);
long deleteCount = memberJpaRepository.count();
assertThat(count).isEqualTo(2);
}
}
변경 감지 테스트
변경 감지 기능은 트랜잭션 안에서 엔티티를 조회한 다음, 데이터를 변경하면 트랜잭션 종료 시점에 변경 감지 기능이 작동해서 변경된 엔티티를 감지하고 UPDATE SQL을 실행한다.
@Test
public void basicCRUD() {
Member member1 = new Member("member1");
Member member2 = new Member("member2");
memberJpaRepository.save(member1);
memberJpaRepository.save(member2);
// 단건 조회 검증
Member findMember1 = memberJpaRepository.findById(member1.getId()).get();
Member findMember2 = memberJpaRepository.findById(member2.getId()).get();
assertThat(findMember1).isEqualTo(member1);
assertThat(findMember2).isEqualTo(member2);
findMember1.setUsername("member!!!!!!!!!!"); // ** Member1의 이름 변경
// // 리스트 조회 검증
// List<Member> all = memberJpaRepository.findAll();
// assertThat(all.size()).isEqualTo(2);
//
// // 카운트 검증
// long count = memberJpaRepository.count();
// assertThat(count).isEqualTo(2);
//
// // 삭제 검증
// memberJpaRepository.delete(member1);
// memberJpaRepository.delete(member2);
// long deleteCount = memberJpaRepository.count();
// assertThat(count).isEqualTo(2);
}
// 출력 로그 중 일부
update
member
set
age=?,
team_id=?,
username=?
where
member_id=?
반응형