교재: 자바 ORM 표준 JPA 프로그래밍
JPA는 다양한 어노테이션을 지원하는데 크게 4가지로 나눌 수 있다:
4장에서 객체와 테이블 매핑, 기본 키 매핑, 필드와 컬럼 매핑을 다룰 것이다.
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수로 붙여야 한다.
public Member() {} // 직접 만든 기본 생성자
// 임의 생성자
public Member(String name) {
this.name = name;
}
@Table은 엔티티와 매핑할 테이블을 지정한다.
요구사항:
package jpabook.start;
import javax.persistence.*;
import java.util.Date;
@Entity
@Table(name="MEMBER")
public class Member {
@Id
@Column(name="ID")
private String id;
@Column(name="NAME")
private String username;
private Integer age;
//===추가===
@Enumerated(EnumType.String)
private RoleType roletype;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
//Getter, Setter
...
}
package jpabook.start;
public enum RoleType {
ADMIN, USER
}
JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다. 이 기능은 persistence.xml 또는 application.yml에서 설정할 수 있다.
<property name="hibernate.hbm2ddl.auto" value="create" />
<property namee="hibernate.show_sql" value="true" />
@Column(name="NAME", nullable=false, lengeth=10) // 추가 제약조건
@Column 매핑 정보
nullable = false
→ DDL에서NOT NULL제약 조건을 설정한다.length
→ DDL에서 문자 길이(컬럼 크기)를 설정한다.
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint( //추가 //**
name = "NAME_AGE_UNIQUE",
columnNames = {"NAME", "AGE"} )})
엔티티의
@Column속성들은 주로 DDL 자동 생성 시에만 사용되고 애플리케이션 실행 로직에는 영향을 주지 않는다. 하지만 엔티티만 보고도 제약조건을 쉽게 파악할 수 있어 코드 가독성과 유지보수에 도움이 된다.
JPA가 제공하는 데이터베이스 기본 키 생성 전략은 다음과 같다
기본 키를 직접 할당하려면 다음 코드와 같이 @Id 로 매핑하면 된다.
@Id
@Column(name="id")
private String id;
Board board = new Board();
board.setID("id") // 기본 키 직접할당
em.persist(board);
IDENTITY는 기본키 생성을 데이터베이스에 위임하는 전략이다.
IDENTITY 전략을 사용하려면 @GeneratedValue의 strategy 속성값을 GenerationType.IDENTITY로 지정하면 된다. 이전략을 사용하면 JPA는 기본 키 값을 얻어오기 위해 데이터베이스를 추가로 조회한다.
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
private static void logic(EntityManager em) {
Board board = new Board();
em.persist(board);
System.out.println("board.id = " + board.getId);
}
// 출력: board.id=1
시퀀스: 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트다. SEQUENCE 전략은 이 시퀀스를 사용해서 기본 키를 생성한다.
CREATE TABLE BOARD {
ID INT NOT NULL PRIMARY KEY,
DATA VARCHAR(255)
}
CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;
@Entity
@SequenceGenerator(
name = "BOARD_SEQ_GENERATOR",
sequenceName = "BOARD_SEQ", //매핑할 db 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
..
}
@SequenceGenerator: 는 시퀀스 생성 방식을 정의하는 설정이고, 실제로는 @GeneratedValue에서 generator 이름을 통해 사용된다. 즉, @SequenceGenerator는 정의, @GeneratedValue는 실행 역할을 한다.
TABLE 전략: 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉낸다.
CREATE table MY_SEQUENCES {
sequence_name varchar(255) not null,
next_val bigint,
primary key (sequence_name)
}
@Entity
@TableGenerator(
name = "BOARD_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "BOARD_SEQ", allocationSize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
..
}
GenerationType.AUTO 는 선택한 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABL 전략 중 하나를 자동으로 선택한다.
ex: 오라클을 선택하면 SEQUENCE, MySQL을 선택하면 IDENTITY를 사용한다.
em.persist() 를 호출한 직후에 발생하는 일을 식별자 할당 전략별로 정리하면 다음과 같다.
@Column의 속성:
자바의 enum 타입을 매핑할 때 사용한다
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
데이터베이스 BLOB, CLOB 타입과 매핑한다.
이 필드는 매핑하지 않는다. 데이터베이스에 저장하지 않고 조회하지도 않는다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
@Transient
private Integer temp;
JPA가 엔티티 데이터에 접근하는 방식을 지정한다: