단 건에 대한 기본적인 CRUD 기능은 아래와 같이 간편하게 사용할 수 있었다.
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = new Member();
member.setId(1L);
member.setName("name1");
// Create
em.persist(member); // list.add(Object o) 처럼 간편하게 DB에 객체 저장
// Read
Member findMember = em.find(Member.class, 1L); // PK를 사용하여 간편하게 읽어옴
// Update
findMember.setName("change name"); // 조회한 객체에 대하여 수정을 하는 것만으로 update쿼리까지 완료됨
// Delete
em.remove(member); // 조회한 객체를 삭제하면 테이블에서도 해당 엔티티 바로 삭제됨
tx.commit();
그럼 좀 더 복잡한 경우에 대해서는 어떻게 해야할까?
여러 개의 행을 반환해야 하거나 검색 조건을 넣어 조회를 해야한다면?
이런 경우에는 약간의 쿼리 작성이 필요하다. 하지만 DB 테이블을 기준으로 쿼리를 작성하지 않는다.
그게 무슨 말이지?
->
JPA의 존재 의의는 DB 테이블에 종속되지 않고 엔티티 객체 중심적으로 개발을 하기 위함이다.
그렇기에 부득이하게 쿼리를 짜야하는 일이 있어도 객체에 초점을 맞춰 쿼리를 작성한다.
만약 실제 물리적 DB에 맞춰 쿼리를 짠다면 그것은 DB에 종속적인 설계가 되는 것이고 이는 JPA의 사용 취지에 어긋난다.
// 여러 건의 검색 결과를 List에 담아 반환한다.
List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();
위와 같은 문제를 해결하기 위해 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
쿼리를 자세히 보면 지금까지 작성했던 쿼리와의 차이점을 알 수 있다.
from table_name이 아닌 from class_name의 형식으로 작성된 쿼리이다.
이런식으로 객체 중심적으로 쿼리를 작성하면 이 역시 JPA가 Member클래스에 해당하는 테이블명에 대한 쿼리를 알아서 날려서 조회를 해준다.
이렇게 객체 중심적으로 작성하는 쿼리를 JPQL(Java Persistence Query Language)라고 한다.
JPQL은 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다.
'김영한님 스프링 강의 정리 > JPA' 카테고리의 다른 글
연관관계 매핑과 관계의 주인 (0) | 2021.02.21 |
---|---|
기본 키 매핑 전략 - IDENTITY, SEQUENCE (0) | 2021.02.21 |
Flush에 대해 (0) | 2021.02.19 |
Persistence Context 에 대해 (0) | 2021.02.19 |
ORM과 JPA란? (0) | 2021.02.19 |