Entity
📌 클래스에 @Entity가 있다면 JPA가 관리하는 Entity로 만들어진다.
- db 테이블 매핑되는 자바 객체
persistence.xml
📌 JPA 관련 설정
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="test"> <!-- createEntityManagerFactory에서 사용할 이름 -->
<class>org.entity.Tutor</class>
<properties>
<property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- DB 아이디 -->
<property name="jakarta.persistence.jdbc.user" value="root"/>
<!-- DB 비밀번호 -->
<property name="jakarta.persistence.jdbc.password" value="1111"/>
<!-- 스키마 -->
<property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/sparta"/>
<!-- 스키마 자동생성 속성 -->
<property name="hibernate.hbm2ddl.auto" value="create" />
<!-- Hibernate가 DB에 전송하는 DDL, DML SQL을 콘솔에 출력한다. -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<!-- 한꺼번에 전송될 SQL 수량 설정 -->
<!-- <property name="hibernate.jdbc.batch_size" value="10"/>-->
</properties>
</persistence-unit>
</persistence>
@Entity
@Entity(name = "Tutor") // 기본 값, name 속성은 생략하면 된다.
@Table(name = "tutor")
public class Tutor {
// PK
@Id
private Long id;
// 필드
private String name;
// 기본 생성자
public Tutor() {
}
// 쉽게 사용하기 위해 생성자 추가
public Tutor(Long id, String name) {
this.id = id;
this.name = name;
}
}
- JPA를 사용하여 객체를 테이블과 매핑할 때 사용한다.(필수)
- PK 값이 필수이다.(@Id 사용)
- 기본 생성자가 필수이다.
- final, enum, interface, inner 클래스에는 사용할 수 없다.
- 필드에 final 키워드를 사용할 수 없다.
- 속성
- name
- Entity 이름 지정
- 기본 값은 클래스 이름과 같다.
- 혼동을 방지하기 위해 기본 값을 사용(생략)하면 된다.
- name
@Table
@Entity
@Table(name = "tutor")
public class Tutor {
}
- 속성
- name
- Entity와 매핑할 테이블 이름을 지정
- 기본 값은 Entity 이름(Tutor)을 사용
- catalog
- 데이터베이스 catalog 매핑
- schema
- 데이터베이스 schema 매핑
- uniqueConstraints
- DDL 생성 시 유니크 제약 조건 설정
- name
JPA 실행
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Tutor tutor = new Tutor(1L, "wonuk");
em.persist(tutor);
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
hibearnate.hbm2ddl.auto
📌 SessionFactory가 생성될때 스키마 DDL을 db로 검증하고 내보내는 기능을 상황에 따라 다르게 설정할수 있도록 하는 프로퍼티
- SessionFactory = 도메인 모델을 데이터베이스로 맵핑하는 thread-safe하고 immutable한 표현이다.
- JPA는 Application 로딩 시점에 DDL을 자동으로 생성하는 기능을 지원한다. 방언(dialect)을 사용하여 Entity Mapping만 하여도 데이터베이스에 맞는 적절한 DDL이 생성된다.
- 실무에서는 validate 혹은 none 을 사용하고 개발 단계에서는 상황에 맞게 사용하면 된다.
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Tutor tutor = new Tutor(1L, "wonuk");
em.persist(tutor);
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
<property name="hibernate.hbm2ddl.auto" value="create" /> |
<property name="hibernate.hbm2ddl.auto" value="create-drop" /> |
<property name="hibernate.hbm2ddl.auto" value="update" /> |
<property name="hibernate.hbm2ddl.auto" value="validate" /> |
제약조건 설정
📌 테이블에 입력되는 데이터가 사용자가 원하는 조건을 만족하는 데이터만 입력되는 것을 보장하는 것
- JPA를 사용하면 DDL 생성 시 제약조건을 설정할 수 있다. 실행 로직과는 별개로 DDL 생성시에만 활용된다.
DDL 자동생성 제약조건 설정
- @Column
- unique : 유니크, 기본값 false
- nullable : 필수 여부, 기본값 true
- length : 길이
@Column(unique = true, length = 20, nullable = false)
- @Table
- uniqueConstraints : 유니크, 이름을 직접 설정할 수 있다.
@Table(uniqueConstraints = {@UniqueConstraints
(
name = "name_unique",
columnNames= {"name"}
)
}
)
// 클래스
필드 매핑
📌 JPA로 관리되는 클래스인 Entity의 필드는 테이블의 컬럼과 매핑된다.
@Entity
@Table(name = "board")
public class Board {
@Id
private Long id;
// @Column을 사용하지 않아도 자동으로 매핑된다.
private Integer view;
// 객체 필드 이름과 DB 이름을 다르게 설정할 수 있다.
@Column(name = "title")
private String bigTitle;
// DB에는 기본적으로 enum이 없다.
@Enumerated(EnumType.STRING)
private BoardType boardType;
// VARCHAR()를 넘어서는 큰 용량의 문자열을 저장할 수 있다.
@Column(columnDefinition = "longtext")
private String contents;
// 날짜 타입 DATE, TIME, TIMESTAMP를 사용할 수 있다.
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Transient
private int count;
public Board() {
}
}
사용되는 Annotation
@Column 속성
속성 | 설명 | Default |
name
|
객체 필드와 매핑할 테이블의 컬럼 이름
|
객체 필드 이름
|
nullable
|
DDL 생성 시 null 값의 허용 여부 설정
|
true(허용)
|
unique
|
DDL 생성 시 하나의 컬럼에 유니크 제약조건을 설정
|
|
columnDefinition
|
DDL 생성 시 데이터베이스 컬럼 정보를 직접 설정할 수 있다.
|
|
length
|
DDL 생성 시 문자 길이 제약조건 설정 단, String만 사용 가능
|
255
|
insertable
|
설정된 컬럼의 INSERT 가능 여부
|
true
|
updatable
|
설정된 컬럼의 UPDATE 가능 여부
|
true
|
@Enumerated
- 기본 설정인 ORDINAL을 사용하면 0, 1 과 같은 순서가 저장된다.
EnumType.ORDINAL을 사용하면 Enum 값이 추가될 때 마다 순서가 바뀌기 때문에 실제로 사용하지 않는다. |
@Temporal
기본 키
📌 JPA Entity를 생성할 때 기본키는 필수로 생성해야 한다.
- 사용되는 Annotation
- @Id
- 수동 생성
- @Id
Tutor tutor = new Tutor(1L, "wonuk");
- @GeneratedValue
- 자동 생성
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
PK 생성 전략
- 영속성 컨텍스트는 PK가 필수이다.
- 가장 권장되는 방식은 Long Type의 기본 키를 사용하는 것
- strategy 속성
- GenerationType
- IDENTITY : MySQL, PostgreSQL에서 사용, 데이터베이스가 PK 자동 생성
- SEQUENCE : Oracle에서 사용, @SequenceGenerator 와 함께 사용
- TABLE : 키 생성용 테이블을 사용, @TableGenerator 와 함께 사용
- AUTO : dialect에 따라 자동 지정, 기본값
- MySQL이면 IDENTITY, Oracle이면 SEQUENCE 로 설정
- GenerationType
- 실행 결과
'DB 접근 > JPA ( Java Persistence API )' 카테고리의 다른 글
연관관계 (0) | 2025.01.12 |
---|---|
[JPA] Spring Data JPA (0) | 2025.01.07 |
[JPA] 연관관계 Mapping (0) | 2025.01.06 |
[JPA] 영속성 컨텍스트 (2) | 2025.01.04 |
[JPA] 페러다임 불일치 문제 [객체 관계형 데이터베이스] (1) | 2025.01.02 |