자바 ORM 표준 JPA 프로그래밍 - 기본편 수업을 듣고 정리한 내용입니다.

 

📚 1. Hello JPA - 프로젝트 생성

✔️ H2 데이터베이스

  • http://www.h2database.com/
  • 최고의 실습용 DB
  • 가볍다.(1.5M)
  • 웹용 쿼리툴 제공
  • MySQL, Oracle 데이터베이스 시뮬레이션 기능
  • 시퀀스, AUTO INCREMENT 기능 지원

 

✔️ 메이븐 소개

  • https://maven.apache.org/
  • 자바 라이브러리, 빌드 관리
  • 라이브러리 자동 다운로드 및 의존성 관리
  • 최근에는 Gradle이 점점 유명

 

✔️ 데이터베이스 방언

  • JPA는 특정 데이터베이스에 종속 X
  • 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름
    • 가변 문자 : MySQL은 VARCHAR, Oracle은 VARCHAR2
    • 문자열을 자르는 함수 : SQL 표준은 SUBSTRING(), Oracle은 SUBSTR()
    • 페이징 : MySQL은 LIMIT , Oracle은 ROWNUM
  • 방언 : SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능

 

✔️ 데이터베이스 방언

스크린샷 2022-03-03 오후 3 26 00
  • JPA는 사용하는 DB Dialect에 따라서 알맞은 SQL을 생성해준다.
    • H2 : org.hibernate.dialect.H2Dialect
    • Oracle 10g : org.hibernate.dialect.Oracle10gDialect
    • MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
    • 하이버네이트는 40가지 이상의 데이터베이스 방언 지원

 

📚 2. Hello JPA - 애플리케이션 개발

✔️ JPA 구동 방식

스크린샷 2022-03-03 오후 3 32 15
  • JPAPersistence라는 클래스가 있다.
  • Persistence에서 persistence.xml 설정 정보를 읽어서 EntityManagerFactory 객체를 생성해준다.
  • EntityManagerFactory에서 필요할 때마다 EntityManager를 생성해서 사용한다.

 

트랜잭션?
jpa에서는 트랜잭션이 중요하다.

  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행한다.
  • 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유한다.

 

📖 A. 객체와 테이블을 생성하고 매핑하기

스크린샷 2022-03-03 오후 6 19 49

 

H2 데이터베이스에서 객체 생성
스크린샷 2022-03-03 오후 6 22 13

  • @Entity : JPA가 관리할 객체
  • @Id : 데이터베이스 PK와 매핑

 

실행
스크린샷 2022-03-03 오후 6 25 12

 

✔️ 회원 등록

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();
    }
}

실행 결과

스크린샷 2022-03-03 오후 5 47 48

 

옵션 설정

스크린샷 2022-03-03 오후 5 48 48

옵션을 통해 출력되는 것이다.

 

db 확인 결과

스크린샷 2022-03-03 오후 5 50 16

 

✔️ 코드 리팩터링

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();

    }
}
스크린샷 2022-03-03 오후 6 32 17

 

✔️ 수정

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();

    }
}

스크린샷 2022-03-03 오후 6 33 47

 

실행 결과

스크린샷 2022-03-03 오후 6 34 54

 

📖 B. JPQL

단순한 2가지 조회 방법

  • EntityManager.find()
  • 객체 그래프 탐색 (a.getB().getC())

➡️ 이때, 나이가 18살 이상인 회원을 모두(복잡한 조회) 검색하고 싶을 때는 위 2가지 조회 방법으로는 부족하다.

 

✔️ JPQL

  • JPA를 사용하면 엔티티 객체를 중심으로 개발한다.
  • 문제는 검색 쿼리
  • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
  • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다.
  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검 색 조건이 포함된 SQL이 필요하다.

➡️ JPQL : 식별자를 통한 단순 조회가 아닌 추가 조건들을 통해 조회하고 싶을 때 사용한다.

 

  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
  • JPQL은 SQL과 문법이 유사하다.

 

🔔 JPQL vs SQL
JPQL : 엔터티 객체를 대상으로 쿼리
SQL : 데이터베이스 테이블을 대상으로 쿼리

 

  • JPQL은 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리이다.
  • SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
  • JPQL을 한마디로 정의하면 객체 지향 SQL이다.
  • 수업 후반에 JPQL을 자세하게 공부한다.

 


참고

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글