순수 JPA
를 사용해서Member 객체
를 조회, 저장, 삭제할 수 있는 Repository를 생성한다.
@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);
}
// 전체 멤버 조회 - JPQL 사용
public List<Member> findAll(){
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
// id로 멤버 1명 조회 - 반환타입: Optional
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();
}
// id로 멤버 1명 조회 - 반환타입: Member
public Member find(Long id){
return em.find(Member.class, id);
}
}
마찬가지로
순수 JPA
를 사용해서Team 객체
를 조회, 저장, 삭제할 수 있는 Repository를 생성한다.
@Repository
public class TeamRepository {
@PersistenceContext
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 t from Team t", Team.class)
.getResultList();
}
// id로 Team 1개 조회 - 반환 타입: Optional
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();
}
// id로 Team 1개 조회 - 반환 타입: Team
public Team find(Long id){
return em.find(Team.class, id);
}
}
JPA는 기본적으로
변경감지
를 사용해서트랜잭션 commit시점
에DB에 query 날려서
엔티티를 수정
-> update 쿼리 명시적으로 작성할 필요 없음
순수 JPA 기반
으로 기본 CRUD기능을 가진 MemberJpaRepository와 TeamJpaRepository
-> type만 다를 뿐,작성한 코드가 비슷!
위에서 작성한 MemberJpaRepository의 작동을 테스트하는 Test 코드
@SpringBootTest
@Transactional// 모든 데이터 변경은 트랜잭션 안에서, test는 기본적으로 트랜잭션 롤백
@Rollback(value = false) // 롤백 안하도록 설정
class MemberJpaRepositoryTest {
@Autowired MemberJpaRepository memberJpaRepository;
@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 deletedCount = memberJpaRepository.count();
assertThat(deletedCount).isEqualTo(0);
}
}