Spring/JPA

[JPA] About JPA

lumana 2024. 11. 6. 16:43

 

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