[JPA] Chapter 2. JPA란? - 2

joyful·2021년 6월 29일
0

JPA

목록 보기
2/18
post-custom-banner

들어가기 앞서

이 글은 김영한 님의 저서 「자바 ORM 표준 JPA 프로그래밍」을 학습한 내용을 정리한 글입니다. 모든 출처는 해당 저서에 있습니다.


2.1 H2 Database

자바로 작성된 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)

  • 특징
    • 인메모리 DB 기능 지원
      • 임베디드 모드 : JVM 메모리 안에서 실행
      • 서버 모드 : 실제 데이터베이스처럼 별도의 서버를 띄워 동작

        💡 인메모리(In-memory)
          ▪ 데이터가 시스템 메모리에 저장
          ▪ 프로그램 종료시 데이터 손실

    • 브라우저 기반 콘솔 응용 프로그램 지원
    • 매우 가볍고 빠름
    • JDBC API 지원
  • 주로 어플리케이션 개발 단계의 테스트 DB로 이용


2.2 라이브러리(Library)

2.2.1 빌드 도구

프로젝트 생성, 테스트 빌드, 배포등의 작업을 위한 프로그램

✅ Ant

  • Java 기반의 빌드 도구
  • 다른 빌드 도구보다 오래 됨
  • 높은 유연성 : 개발자가 원하는 것 개발 가능
구분내용
특징▪ 각 프로젝트에 대한 XML기반 빌드 스크립트 개발
▪ 형식적인 규칙 x
  - 결과물 넣을 정확한 위치 지정 필요
  - 프로젝트에 특화된 Target과 Dependency 이용해 모델링
▪ 절차적 : 명확한 빌드 절차 정의 필요
▪ 생명주기 x
  → 각 target에 대한 의존관계 및 일련의 작업 정의 필요
단점▪ 프로젝트가 복잡해질 경우 각각의 Build 과정 이해 어려움
▪ XML, Remote Repository(Dependency) 사용 x
▪ 스크립트의 재사용 어려움

✅ Maven

  • 프로젝트에 필요한 모든 Dependency(종속성)를 리스트의 형태로 Maven에게 알려 관리할 수 있도록 돕는 방식
  • Ant를 사용하던 개발자들의 불편함 해소 및 부가기능 추가
구분내용
특징▪ Dependency 관리
▪ 표준화된 프로젝트(Standardize project) 제공
▪ XML, Remote Repository 사용 가능
  : 개발에 필요한 종속되는 'jar', 'class path'를 'POM.xml'에 선언시
    다운로드 없이 사용 가능
▪ 상속형 : 하위 XML이 필요 없는 속성도 모두 표기
▪ 계층적인 데이터를 표현하기에 좋음
단점▪ 라이브러리가 서로 종속시 XML의 복잡도 증가
▪ 플로우나 조건부 상황 표현 어려움
▪ 맞춤화 된 로직 실행 어려움

✅ Gradle

  • JVM 기반의 빌드 도구
  • 기존의 Ant와 Maven 보완
  • JAVA 또는 Groovy를 이용하여 개발자의 의도에 따라 logic 설계 가능
  • 초기 프로젝트 설정에 소요되는 시간 절약 가능
  • 기존의 Maven이나 Ivy등과 같은 빌드 도구들과 호환 가능
  • 특징
    • 오픈소스 기반의 build 자동화 시스템
    • Groovy 기반 DSL(Domain-Specific Language)로 작성
    • Build-by-convention을 바탕으로 구성
      → 스크립트 규모가 작고 읽기 쉬움
    • Multi 프로젝트의 빌드 지원
    • 설정 주입 방식(Configuration Injection)

2.2.2 핵심 라이브러리

  • JPA & 하이버네이트(Hibernate) : JPA 표준과 하이버네이트를 포함하는 라이브러리

    • hibernate-core : 하이버네이트 라이브러리
    • hibernate-entitymanager : 하이버네이트가 JPA 구현체로 동작하도록 JPA 표준을 구현한 라이브러리
    • hibernate-jpa-2.1-api : JPA 2.1 표준 API를 모아둔 라이브러리
  • H2 데이터베이스 : H2 데이터베이스 접속을 위한 라이브러리



2.3 어노테이션(Annotation)

DB와 객체의 관계를 매핑해주는 기능

  • 패키지 → javax.persistence

  • 종류

    항목내용
    @Entity▪ 테이블과 매핑할 클래스를 JPA에게 알려줌
    @Entity가 사용된 클래스를 엔티티 클래스라고 함
    @Table▪ 엔티티 클래스에 매핑할 테이블 정보 알려줌
    ▪ 생략시 클래스명을 테이블(엔티티)명으로 매핑
    @Id▪ 엔티티 클래스의 필드를 테이블의 기본 키(Primary key)에 매핑
    ▪ @Id가 사용된 필드를 식별자 필드라고 함
    @Column▪ 필드를 컬럼에 매핑
    ▪ 생략시 필드명을 사용하여 칼럼명으로 매핑
    ▪ 대소문자 구분하는 데이터베이스 사용시 명시적으로 매핑해야 함


2.4 JPA 설정

  • JPA는 persistence.xml을 사용하여 설정 정보 관리
  • 설정 파일이 META-INF/persistence.xml 클래스 패스 경로에 존재
    → 별도의 설정 없이 JPA가 인식

[JPA 환경설정 파일 persistence.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!--XML 네임스페이스와 사용 버전 지정-->
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
    <!--영속성 유닛 등록 및 이름 부여-->
    <persistence-unit name="jpabook" >
        <properties>
        
            <!--필수 속성-->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
            
            <!--옵션-->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.use_sql_comments" value="true" />
            <property name="hibernate.id.new_generator_mappings" value="true" />
            
        </properties>
    </persistence-unit>
</persistence>

💡 영속성 유닛(Persistence-unit)

  • 응용프로그램의 EntityManager 인스턴스에 의해 관리되는 모든 엔티티 클래스 집합
  • 일반적으로 연결할 데이터베이스당 하나의 영속성 유닛 등록
  • 고유한 이름을 부여해야 함

속성값 분석

<properties>
    <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
    ...
  • JPA 표준 속성

    속성설명중요도
    javax.persistence.jdbc.driverJDBC 드라이버필수
    javax.persistence.jdbc.user데이터베이스 접속 아이디필수
    javax.persistence.jdbc.password데이터베이스 접속 비밀번호필수
    javax.persistence.jdbc.url데이터베이스 접속 url필수
  • 하이버네이트 속성

    속성설명중요도
    hibernate.dialect데이터베이스 방언(dialect) 설정필수
    hibernate.show_sql하이버네이트가 실행한 SQL 출력옵션
    hibernate.format_sql하이버네이트가 실행한 SQL을
    출력할 때 보기 쉽게 정렬
    옵션
    hibernate.use_sql_comments쿼리 출력시 주석도 출력옵션
    hibernate.id.new_generator_mappingsJPA 표준에 맞춘 새로운
    키 생성 전략 사용
    옵션

    🔍 차이점

    • javax.persistence
      • JPA 표준 속성
      • 특정 구현체에 종속되지 않음
    • hibernate
      • 하이버네이트 전용 속성
      • 하이버네이트에서만 사용 가능

2.4.1 데이터베이스 방언(dialect)

SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능

✅ 문제점

  • 각 데이터베이스가 제공하는 SQL 문법과 함수가 조금씩 다름

    [예시]

    항목오라클오라클 외
    데이터 타입
    - 가변 문자 타입 -
    VARCHAR2VARCHAR
    함수명
    - 문자열 자르는 함수 -
    SUBSTR()SUBSTRING()
    페이징 처리ROWNUMLIMIT
  • 특정 데이터베이스에 종속되는 기능 사용
    → 데이터베이스 교체 어려움

✅ 해결 방법

  • 데이터베이스 방언 클래스 제공
    → 데이터베이스 변경시 데이터베이스 방언만 교체


2.5 애플리케이션 개발

[애플리케이션 시작 코드]

package jpabook.start;

import javax.persistence.*;
import java.util.List;

public class JpaMain {

    public static void main(String[] args) {
    
        //[엔티티 매니저 팩토리] - 생성
        EntityManagerFactory emf =
            Persistence.createEntityManagerFactory("jpabook");
        //[엔티티 매니저] - 생성
        EntityManager em = emf.createEntityManager();
        //[트랜잭션] - 획득
        EntityTransaction tx = em.getTransaction();
        
        try {
        
            tx.begin();    //[트랜잭션] - 시작
            logic(em);     //비즈니스 로직 실행
            tx.commit();   //[트랜잭션] - 커밋
            
        } catch (Exception e) {
            tx.rollback();  //[트랜잭션] - 롤백
        } finally {
            em.close();     //[엔티티 매니저] - 종료
        }
        emf.close();        //[엔티티 매니저 팩토리] - 종료
    }
    
    //비즈니스 로직
    private static void logic(EntityManager em) {...}
}

2.5.1 엔티티 매니저 설정

  • 엔티티 매니저 팩토리

    • 생성 비용이 매우 크므로 애플리케이션 전체에서 한 번만 생성 후 공유해서 사용
  • 엔티티 매니저

    • JPA의 대부분의 기능 제공 ex) 엔티티 → 데이터베이스 CRUD
    • 내부에 데이터소스(데이터베이스 커넥션)를 유지하며 데이터베이스와 통신 → 일종의 가상 데이터베이스
    • 데이터베이스 커넥션과의 밀접한 관계
      스레드 간 공유 및 재사용 금지
  • 사용이 끝난 엔티티 매니저나 애플리케이션 종료시 엔티티 매니저 팩토리는 반드시 종료


2.5.2 트랜잭션 관리

  • 반드시 트랜잭션 내에서 데이터를 변경해야 하며, 트랜잭션 없이 데이터 변경시 예외 발생
  • 실행 결과
    • 비즈니스 로직 정상 동작시 → 커밋(commit)
    • 예외 발생시 → 롤백(rollback)

2.5.3 비즈니스 로직

엔티티 매니저(em)를 통해 작업(등록, 수정, 삭제, 조회) 수행


2.6 JPQL(Java Persistence Query Language)

  • JPA에서 SQL을 추상화하여 제공하는 객체지향 쿼리 언어
  • SQL과 문법의 거의 유사함
  • 데이터베이스 테이블 인식 x
  • 개요

    • JPA는 엔티티 객체를 중심으로 개발 및 검색
    • 애플리케이션에 필요한 데이터만 데이터베이스에서 추출하려면 검색 조건 포함된 SQL을 사용해야 함
      JPQL을 통해 해결
  • JPQL vs SQL

    JPQLSQL
    쿼리 대상엔티티 객체데이터베이스 테이블
    대소문자 구분Ox
  • 사용

    1. em.createQuery(JPQL, 반환 타입) 메소드 실행
    2. 쿼리 객체 생성
    3. 쿼리 객체의 getResultList() 메소드 호출
    4. JPA가 JPQL 분석 후 SQL 생성
    5. 데이터베이스에서 데이터 조회



📖 참고

profile
기쁘게 코딩하고 싶은 백엔드 개발자
post-custom-banner

0개의 댓글