About JPA
#Spring/DB/JPA
Database 방언
방언 : SQL 표준을 지키지 않는 특정 DB만의 고유 기능
- 각각의 DB가 제공하는 SQL 문법이랑 함수가 조금씩 다르다.
- JPA는 특정 DB에 종속적이지 않다.
- hibernate.dialect 속성에 DB를 지정해줄 수 있다.
- H2 : org.hibernate.dialect.H2Dialect
- Oracle 10g : org.hibernate.dialect.Oracle10gDialect
- MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
- PostgreSQL : org.hibernate.dialect.PostgreSQLDialect
- 기타 등등 40가지 이상 DB를 지원
JPA 구동 방식
JPA 매핑
@Entity
: JPA가 관리할 객체@Id
: 데이터베이스 PK와 매핑@Table(name = “USER”)
: 쿼리가 나갈 때 USER 테이블로 나간다.@Column(name = “username”)
: 쿼리가 나갈 때 username으로 나간다.
package hellojpa;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
public class Member {
@Id
private Long id;
private String name;
protected Member() {}
public Member(Long id, String name) {
this.id = id;
this.name = name;
}
- JPA Entity로 사용할 객체는 반드시 빈 생성자가 필요하다.
회원 관리
회원 저장
package hellojpa;
import jakarta.persistence.*;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// persistence 의 unit name 을 넘겨서 EntityManagerFactory 를 만든다.
EntityManager em = emf.createEntityManager(); // 쉽게 생각하면 DB 커넥션을 얻었다고 생각하면 된다.
EntityTransaction tx = em.getTransaction();
tx.begin(); // 트랜잭션 시작
//정석적인 code
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();
}
}
회원 단건 조회
try {
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember.getId() = " + findMember.getId());
System.out.println("findMember.getName() = " + findMember.getName());
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close(); // 반드시 닫아주자
}
emf.close();
회원 수정
try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close(); // 반드시 닫아주자
}
emf.close();
- 트랜잭션 커밋하는 시점에 JPA가 변경 여부를 체크한다. 바뀌면 업데이트 쿼리를 만들어서 날려준다.
회원 삭제
em.remove(Member.class, 1L);
주의사항
- 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
- 엔티티 매니저는 쓰레드간에 공유X (사용하고 버려야 한다).
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
JPQL
- 객체를 조회한다
- 가장 단순한 조회 방법
- em.find()
- 객체 그래프 탐색
테이블이 정말 많을 때 테이블을 sql로 직접 조인하고 객체에 등록하는 과정은 매우 복잡하다. 이 일을 jpql을 통해 단순히 처리할 수 있다.
- JPA를 사용하면 엔티티 객체 중심으로 개발할 수 있다.
- 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다.
- Application이 필요한 데이터만 DB에서 불러오려면 검색 조건이 포함된 SQL이 필요하다.
- JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
- SQL 문법과 유사하다. SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다.
- JPQL은 엔티티 객체를 대상 쿼리이고, SQL은 DB table 대상 쿼리이다.
- JPA를 사용하면 특정 DB에 종속적이지 않은 jqpl을 사용한다.
- JPQL을 한 마디로 정의하면 객체지향 SQL이다.
Ref) 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편
'Spring > JPA' 카테고리의 다른 글
[JPA] 엔티티 매핑 (0) | 2024.11.08 |
---|---|
[JPA] 영속성 관리 (0) | 2024.11.06 |
[JPA] 웹 계층 개발 (0) | 2024.10.09 |
[JPA] 도메인 개발 (0) | 2024.10.04 |
[JPA] Cascade 적용 기준 (0) | 2024.09.29 |