자바 ORM 표준 JPA 프로그래밍 - 기본편 수업을 듣고 정리한 내용입니다.
✔️ H2 데이터베이스
✔️ 메이븐 소개
✔️ 데이터베이스 방언
✔️ 데이터베이스 방언
JPA
는 사용하는 DB Dialect
에 따라서 알맞은 SQL을 생성해준다.H2
: org.hibernate.dialect.H2Dialect
Oracle 10g
: org.hibernate.dialect.Oracle10gDialect
MySQL
: org.hibernate.dialect.MySQL5InnoDBDialect
✔️ JPA 구동 방식
JPA
는 Persistence
라는 클래스가 있다.Persistence
에서 persistence.xml
설정 정보를 읽어서 EntityManagerFactory
객체를 생성해준다.EntityManagerFactory
에서 필요할 때마다 EntityManager
를 생성해서 사용한다.
트랜잭션?
jpa에서는 트랜잭션이 중요하다.
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행한다.
- 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유한다.
H2 데이터베이스에서 객체 생성
@Entity
: JPA가 관리할 객체@Id
: 데이터베이스 PK와 매핑
실행
✔️ 회원 등록
JpaMain
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
em.persist(member);
tx.commit();
em.close();
emf.close();
}
}
실행 결과
옵션 설정
옵션을 통해 출력되는 것이다.
db 확인 결과
✔️ 코드 리팩터링
try-catch
문 추가
package hellojpa;
import javax.persistence.*;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
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();
}
}
✔️ 조회
package hellojpa;
import javax.persistence.*;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember.id = " + findMember.getId());
System.out.println("findMember.name = " + findMember.getName());
tx.commit();
}catch (Exception e){
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
✔️ 수정
package hellojpa;
import javax.persistence.*;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
}catch (Exception e){
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
단순한 2가지 조회 방법
EntityManager.find()
a.getB().getC()
)➡️ 이때, 나이가 18살 이상인 회원을 모두(복잡한 조회) 검색하고 싶을 때는 위 2가지 조회 방법으로는 부족하다.
✔️ JPQL
➡️ JPQL
: 식별자를 통한 단순 조회가 아닌 추가 조건들을 통해 조회하고 싶을 때 사용한다.
JPQL
이라는 객체 지향 쿼리 언어를 제공한다.JPQL
은 SQL과 문법이 유사하다.
🔔 JPQL vs SQL
JPQL
: 엔터티 객체를 대상으로 쿼리
SQL
: 데이터베이스 테이블을 대상으로 쿼리
JPQL
은 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리이다.SQL
을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.JPQL
을 한마디로 정의하면 객체 지향 SQL이다.JPQL
을 자세하게 공부한다.
참고