JPA 시작하기
데이터베이스 방언
- JPA는 특정 데이터베이스에 종속 X
- MySQL, Oracle 등 각 데이터베이스의 문법에 따르도록 설정하여 사용할 수 있음.
- JPA가 방언(DB문법이 JPA입장에서)을 해석하여 사용해줌.
javax와 hibernate의 차이점
javax는 java 진영 표준으로 jpa에 정의된 패키지이기 때문에 hibernate가 아닌 다른 구현체를 사용하더라도 그대로 사용이 가능하다.
하지만, hibernate.dialect 처럼 hibernate로 시작되는 패키지들은 hibernate에 종속적이므로 hibernate에서만 사용 가능하다.
애플리케이션 개발
JPA 구동 방식
- Persistence 클래스에서 META-INF/persistence.XML 설정 정보 파일을 읽음.
- EntityManagerFactory를 생성함.
- EntityManagerFactory에서 EntityManager를 찍어내어 사용.
EntityManager 테스트
진행되는 방식은 JDBC Connection을 사용해서 DB에 쿼리를 주입하는 방식과 비슷하지만, Entity 객체를 만들어 persist 한다는 개념이 달랐다.
- 회원 작성
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// 트랜잭션의 단위가 일어날 때마다 em을 반드시 만들어 사용하고 버려야한다.
EntityManager em = emf.createEntityManager();
// 트랜잭션을 시작하고 데이터 처리를 한다.
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
// 데이터베이스에 밀어 넣는다.
em.persist(member);
// 트랜잭션 커밋.
tx.commit();
} catch (Exception e) {
// 문제 발생시 트랜잭션 롤백.
tx.rollback();
} finally {
// 작업이 끝나면 닫아줌.
em.close();
}
emf.close();
}
}
- 회원 조회
//회원 조회
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember = " + findMember.getId());
System.out.println("findMember = " + findMember.getName());
- 회원 삭제
//회원 삭제
// 조회한 객체를 remove 메소드를 사용해 삭제함.
// em.remove(findMember);
- 회원 수정
//회원 수정
// 조회한 객체를 변경하면 커밋시 영속성 컨텍스트에서 변환된 것을 flush 하여 내보냄
// 즉, 변환된 값을 기억하고 있다가 수정 쿼리가 나감.
findMember.setName("helloJPA");
실제 데이터베이스에도 변화된 것을 확인할 수 있음.
주의
- 엔티티 매니저 팩토리는 하나만 생성에서 애플리케이션 전체에서 공유한다.
- 엔티티 매니저는 쓰레드 간에 공유하지 않는다.
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행한다.
JPQL 소개
- 가장 단순한 조회 방법
- EntityManager.find()
- 객체 그래프 탐색(a.getB().getC())
- JPQL 실습: 쿼리 작성해보기
- 전체 회원 검색
- ID가 2 이상인 회원만 검색
- 이름이 같은 회원만 검색
//JPQL
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.setFirstResult(5) //5번부터
.setMaxResults(8) //8개 가져오기
.getResultList(); //쿼리로 리스트 받아옴.
//MySQL - Limit ? Offset ?
//Oracle - rownum
JPA를 사용하면 Entity 객체 중심으로 개발할 수 있다. 하지만, 검색 쿼리에서 애로사항이 발생한다. 이를 돕기 위해 JPA는 DB에 종속되지 않도록 방언을 적용해 Entity 객체로 SQL을 작성할 수 있는 JPQL을 제공한다. 즉, JPQL은 Sql을 추상화한 객체 지향 쿼리 언어이다.
SQL과 문법이 유사하며, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다.
JPQL | SQL |
---|---|
엔티티 객체를 대상으로 쿼리 | 데이터베이스 테이블을 대상으로 쿼리 |
'노트 정리 > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[JPA이론] 7. 고급매핑 (0) | 2022.10.14 |
---|---|
[JPA이론] 6. 다양한 연관관계 매핑 (0) | 2022.10.13 |
[JPA이론] 5. 연관관계 매핑 기초 (0) | 2022.10.09 |
4. 엔티티 매핑 (0) | 2022.08.24 |
3. 영속성 관리 - 내부 동작 방식 (0) | 2022.08.21 |