Programming/JPA & Spring Data JPA 기초
01. 일단 해보기
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 테이블 업데이트가 가능하다.
- 쿼리를 작성하지 않는다!
반응형