[JPA] About JPA

2024. 11. 6. 16:43·Spring/JPA

 

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
'Spring/JPA' 카테고리의 다른 글
  • [JPA] 엔티티 매핑
  • [JPA] 영속성 관리
  • [JPA] 웹 계층 개발
  • [JPA] 도메인 개발
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Spring
        • MVC
        • DB
        • 핵심 원리
        • JPA
      • WEB
        • HTML
        • CSS
        • HTTP
        • Application
      • Computer Science
        • Network
        • Database
        • OS
        • 시스템 프로그래밍
        • 컴퓨터구조
      • Algorithm
        • Divide&Conquer
        • Sort
        • Greedy
        • DP
        • Backtracking
        • NP-Complete
        • Graph
      • Data Structure
        • 자료구조
        • C++ STL
        • Java Collection
      • 소프트웨어 공학
        • 시험 공부 정리
        • Theorem
      • Programming Language
        • Python
        • Java
        • C
        • C++
        • Rust
        • Theory
      • Unix_Linux
        • Common
      • React
      • PS
        • BOJ
        • Tip
        • 프로그래머스
        • CodeForce
      • Book Review
        • Clean Code
      • Math
        • Linear Algebra
      • AI
        • DL
        • ML
        • DA
        • Concepts
      • 우아한테크코스
        • 프리코스
      • Project Review
      • LegacyPosts
      • Android
      • Apple
        • Mac
        • IPhone
        • IPad
      • 모니터
      • Diary
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
lumana
[JPA] About JPA
상단으로

티스토리툴바