JKROH 2023. 2. 20. 09:52
반응형
 해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

* JPA

  • JPA는 ORM(Object-Relational Mapping) 스펙의 하나로 자바 객체와 RDB간의 매핑 처리를 위한 API이다.
  • 2.2.ver까지는 Java Persistence API로 불렸으나, 3.0.ver 이후로 Jakarta Persistence API로 이름이 바뀌었다.
    • 2.2 버전부터 JPA 스펙을 관리하는 주체가 JCP에서 이클립스로 넘어갔다.
    • JPA 3.0은 Jakarta EE 9.ver에 포함되어있다.
  • JPA만 단독으로 사용하기 보다는 스프링과 연동하여 사용한다.
  • 스프링 6.ver부터 Jakarta EE 9+를 지원한다.

* JPA 특징

  • 애노테이션을 이용한 매핑 설정이 가능하다. XML 파일을 이용한 매핑 설정 역시 가능하나 일반적으로 애노테이션을 사용한다.
  • String, int, LocalDate 등 기본적인 타입에 대한 매핑을 지원한다.
  • 커스텀 타입 변환기를 지원한다. 즉, 내가 만든 타입을 DB 칼럼에 매핑 할 수 있다.
  • 밸류 타입 매핑을 지원한다. 즉, 한 개 이상 칼럼을 한 개 타입으로 매핑이 가능하다.
  • 클래스 간 연관을 지원한다 : 1-1, 1-N, N-1, N-M
  • 상속에 대한 매핑을 지원한다.

* DB, DB 사용자, 권한

/*
* DB 이름을 jpabegin으로 설정한다
*/
create database jpabegin CHARACTER SET utf8mb4; 

/*
* 사용자 Id 는 jpauser로 설정한다.
* 사용자 패스워드는 jpapass로 설정한다.
*/
CREATE USER 'jpauser'@'localhost' IDENTIFIED BY 'jpapass';
CREATE USER 'jpauser'@'%' IDENTIFIED BY 'jpapass';

/*
*jpauser 가 jpabegin DB에 접근할 수 있도록 권한을 부여한다.
*/
GRANT ALL PRIVILEGES ON jpabegin.* TO 'jpauser'@'localhost';
GRANT ALL PRIVILEGES ON jpabegin.* TO 'jpauser'@'%';
더보기

 해당 명령어들은 root 계정으로 접근해서 실행하면 된다.

 

* 테이블 생성

/*
* jpabegin DB 내에 user 테이블을 만든다
* column은 email, name, create_date로 설정한다.
* email 을 Primary Key 로 정의한다.
*/
create table jpabegin.user (
    email varchar(50) not null primary key,
    name varchar(50),
    create_date datetime
) engine innodb character set utf8mb4;

 

* pom.xml에 의존 추가하기

- hiberate 버전을 6.0.0.Final로 설정

  • JPA는 API의 모음, 일종의 스펙이다. 이 스펙을 구현할 구현체가 필요한데, 이 중 하나가 hiberate이다.
  • 대부분의 경우 hiberate를 JPA의 구현체로 사용한다.
  • JPA 3.0 규약에 맞게 사용하기 위해 6.0.ver 이상의 hiberate를 사용한다.

- hibernate-hikaricp

  • 커넥션 풀을 제공하기 위한 모듈

- mysql-connector-java

  • DB 연결을 위한 드라이버

- logback

  • log를 남기기 위함

* persistence.xml

  • JPA가 관리할 영속성에 대한 정보를 담고 있다.
  • 어떤 class 를 mapping-class로 사용할 것인지, DB 연결 드라이버는 무엇인지 등에 대한 정보와 구현체에 특화된 설정에 대한 정보를 담고있다.
<persistence-unit name="jpabegin" transaction-type="RESOURCE_LOCAL"> //영속의 단위는 jpa begin이다.
        /*
        * 매핑 클래스들을 나타낸다.
        * 매핑 대상 클래스를 추가할 때 class태그를 추가한다.
        */ 
        <class>jpabasic.reserve.domain.User</class>
        
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            /*
            * DB 연결 설정
            */
            <property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="jakarta.persistence.jdbc.url"
                      value="jdbc:mysql://localhost/jpabegin?characterEncoding=utf8"/>
            <property name="jakarta.persistence.jdbc.user" value="jpauser"/>
            <property name="jakarta.persistence.jdbc.password" value="jpapass"/>
            /*
            * 하이버네이트에 특화된 DB 종류를 설정한다.
            */
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            
            /*
            * 커넥션 풀 설정
            */
            <property name="hibernate.hikari.poolName" value="pool"/>
            <property name="hibernate.hikari.maximumPoolSize" value="10"/>
            <property name="hibernate.hikari.minimumIdle" value="10"/>
            <property name="hibernate.hikari.connectionTimeout" value="1000"/> <!-- 1s -->
        </properties>
    </persistence-unit>

 

* 클래스와 테이블 매핑

@Entity // DB 테이블과 매핑 대상 클래스임을 지정
@Table(name = "user") // user테이블과 User 클래스가 매핑됨을 설정

public class User {
    @Id // 식별자에 대응. 주로 table의 PK와 매핑하는 칼럼에 붙임. 특별한 설정이 없으면 필드명과 같은 이름을 같는 테이블 칼럼과 매핑됨.
    private String email; // email 칼럼과 매핑
    private String email; // name 칼럼과 매핑
    @Column(name = "create_date") //create_date 칼럼과 매핑. 필드명과 칼럼명의 이름이 다르기 때문에 해당 어노테이션을 사용.
    private LocalDateTime createDate;

 

* 정리

  • 간단한 설정으로 클래스와 테이블 간 매핑 처리가 가능하다.
    • 어노테이션을 이용해서 매핑을 처리.
  • EnityManager를 이용해서 DB 연동을 처리한다.
  • 객체 변경만으로 DB 테이블 업데이트가 가능하다.
  • 쿼리를 작성하지 않는다!
반응형