@Entity
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다.
- @Entity 적용 시 주의사항
- 기본 생성자는 필수다.(파라미터가 없는 public 또는 protected 생성자)
- final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
- 저장할 필드에 final을 사용하면 안 된다.
@Table
- @Table은 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
다양한 매핑 사용
- @Enumerated : enum 매핑 시 사용하는 어노테이션
- @Temporal : 날짜 타입 매핑 시 사용하는 어노테이션
- @Lob : CLOB, BLOB 타입 매핑 시 사용하는 어노테이션
데이터베이스 스키마 자동 생성
spring:
jpa:
hibernate:
ddl-auto: create
- create : 데이터베이스 테이블을 자동으로 생성한다.(기존 테이블 삭제)(DROP + CREATE)
- create-drop : 애플리케이션 종료 시 생성한 DDL을 제거한다.(DROP + CREATE + DROP)
- update : 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정한다.
- validate : 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. DDL을 수정하지 않는다.
- none : 자동 생성 기능을 사용하지 않는다.(유효하지 않은 옵션 값)
===> 운영 서버에서 DDL을 수정하는 옵션인 create, create-drop, update를 사용하면 절대 안 된다.
DDL 생성 기능
- 제약 조건 추가
@Entity
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint(
name = "NAME_AGE_UNIQUE",
columnNames = {"NAME", "AGE"} )}) // 추가
public class Member {
@Id
@Column(name = "ID")
private String id;
@Column(name = "NAME", nullable = false, length = 10) // 추가
private String username;
...
}
- 이러한 기능들은 JPA의 실행 로직에는 영향을 주지 않는다. 따라서 직접 DDL을 만든다면 사용할 이유가 없다. 그래도 애플리케이션 개발자가 엔티티만 보고도 손쉽게 다양한 제약 조건을 파악할 수 있는 장점이 있다.
기본 키 매핑
- JPA가 제공하는 데이터베이스 기본 키 생성 전략
- 직접 할당 : 기본 키를 애플리케이션에서 직접 할당한다. => @Id 를 이용한 매핑
- 자동 생성 : 대리 키 사용 방식
- IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
}
- SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.
@Entity
@SequenceGenerator(
name = "BOARD_SEQ_GENERATOR",
sequenceName = "BOARD_SEQ", // 매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
...
}
- TABLE : 키 생성 테이블을 사용한다.
@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;
...
}
- AUTO : 선택한 데이터베이스 방언에 따라 위의 전략 중 하나를 자동으로 선택한다.
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.AUTO) // 괄호 안의 내용 생략 가능
private Long id;
...
}
권장하는 식별자 선택 전략
- 데이터베이스 기본 키는 다음 3가지 조건을 모두 만족해야 한다.
- null 값은 허용하지 않는다.
- 유일해야 한다.
- 변해선 안 된다.
- 테이블의 기본 키를 선택하는 전략은 크게 2가지가 있다.
- 자연 키(natural key) : 비즈니스에 의미가 있는 키
- 대리 키(surrogate key, 대체 키) : 비즈니스와 관련 없는 임의로 만들어진 키
- 자연 키보다는 대리 키를 권장한다.
- 비즈니스 환경은 언젠가 변한다.
- JPA는 모든 엔티티에 일관된 방식으로 대리 키 사용을 권장한다.
'공부 기록 > Java' 카테고리의 다른 글
[이펙티브 자바 3/E] 아이템11 - equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2023.07.31 |
---|---|
[JPA] 4장 - 엔티티 매핑(2) - 필드와 컬럼 매핑 (0) | 2023.07.31 |
[이펙티브 자바 3/E] 아이템10 - equals는 일반 규약을 지켜 재정의하라 (0) | 2023.07.21 |
[이펙티브 자바 3/E] 아이템9 - try-finally보다는 try-with-resources를 사용하라 (0) | 2023.07.19 |
[이펙티브 자바 3/E] 아이템8 - finalizer와 cleaner 사용을 피하라 (0) | 2023.07.19 |