/*
* [ hibernate.hbm2ddl.auto 속성 ]
* JPA에서 지원해주는 DB Schema 자동 생성 기능
* 운영중인 서버에서 사용하기에는 테이블이나 컬럼이 삭제될 위험성이 있어서 사용하지 않는다.
*/
[기본키(Primary Key) 매핑]
1. JPA 기본 키 생성 전략
▶ 직접 할당 : PK를 애플리케이션에서 직접 할당
@Entity
public class Item(){
@Id
@Column(name="id")
private String id;
}
▶ 자동 생성 : 대리 키 사용 방식
- IDENTITY : PK 생성을 DB에 위임
AUTO-INCREAMENT 처럼 DB에 저장하고 나서야 PK를 구할 수 있을 때 사용
@Entity
public class Item(){
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
- SEQUENCE : DB 시퀀스를 사용하여 PK 할당
/*
* [allocationSize]
* default : 50
* sequence에 접근하는 횟수를 줄이기 위해
* 설정한 값만큼 한번에 증가시키고 그만큼 메모리에 sequence값을 할당한다.
* 이 방법은 sequence값을 선점하므로 여러 JVM이 동시에 동작해도 PK 충돌이 일어나지 않는다는 장점이 있다.
* 허나 DB에 저장할때, sequence값이 한번에 많이 증가한다는 점이 존재한다.
*/
@Entity
@SequenceGenerator(
name = "ITEM_SEQ_GENERATOR" //식별자 생성기 이름
, sequenceName = "ITEM_SEQ" //DB에 등록되어있는 sequence명
, allocationSize = 1 //sequence 호출마다 증가 수
)
public class Item(){
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ITEM_SEQ_GENERATOR")
private Long id;
}
- TABLE : 키 생성 전용 테이블 사용(sequence를 테이블로 흉내, 모든 DB에서 사용 가능)
/*
* [SEQUNCE TABLE 설계]
* CREATE TABLE SEQUENCE_MANAGER(
* sequence_name varchar(100) not null
* , next_val bigint
* , primary key (sequence_name)
* )
*/
@Entity
@TableGenerator(
name = "ITEM_SEQ_GENERATOR"
, table = "SEQUENCE_MANAGER"
, pkColumnValue = "ITEM_SEQ"
, allocationSize = 1
)
public class Item(){
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ITEM_SEQ_GENERATOR")
private Long id;
}
자동 생성 전략이 다양한 이유는 DB 벤더마다 지원하는 방식이 다르기 때문
ex) Oracle은 sequence 지원 / MySQL은 sequence대신 auto-increament 지원
[테이블의 기본키를 선택하는 전략]
▶ 자연 키(Natural Key)
- 비지니스에 의미가 있는 키 (주민등록번호, 전화번호 등등)
▶ 대리 키(Surrogate Key)
- 임의로 만들어진 키 (시퀀스, auto_increament)
자연키 보다는 대리키를 권장
유일하며 변하지 않는다고 생각했지만 변하는 경우가 있을 수 있다.
심지어 주민등록번호 조차도 변경될 수 있다.
기본키는 대리키로 사용하고, 주민등록번호 같은 부분들은 유니크 인덱스로 사용하는 것을 권장한다.
2. @Enumerated
▶ JAVA의 enum 타입을 매핑할 때 사용
enum ColorType{
RED, YELLOW, GREY, BLACK
}
@Enumerated(enumType.STRING)
private ColorType colorType;
item.setColorType(ColorType.YELLOW); //DB에 YELLOW 로 저장
//Default 속성
@Enumerated(enumType.ORDINAL)
private ColorType colorType;
item.setColorType(ColorType.YELLOW); //DB에 INDEX번호 1 로 저장
3. @Temporal
▶ 날짜 타입을 매핑할 때 사용
@Temporal(TemporalType.DATE)
private Date date;
@Temporal(TemporalType.TIME)
private Date time;
/*
* DB 방언에 따라 timestamp대신에 datetime으로도 자동 인식
* Date 형식의 데이터에 @Temporal 생략시 Default 값으로 들어간다.
*/
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
4. @Transient
▶ 이 필드는 매핑 제외, DB에 저장하지도 않고 조회하지도 않는다.
객체에 임시 데이터를 보관하고 싶을 때 사용
5. @Access
▶ JPA가 엔티티 데이터에 접근하는 방식 지정
▶ 설정하지 않으면 @Id의 위를 기준으로 접근 방식이 설정된다.
▶ 필드 접근 : AccessType.FIELD
필드 접근 권한이 private이어도 접근할 수 있다.
@Entity
@Access(AccessType.FIELD) //생략 가능
public class User(){
@Id
private String id;
private String userName;
...
}
▶ 프로퍼티 접근 : AccessType.PROPERTY
접근자(Getter) 사용
@Entity
@Access(AccessType.PROPERTY) //생략 가능
public class User(){
private String id;
private String userName;
@Id
public String getId(){
return id;
}
@Column
public String getUserName(){
return userName;
}
}
▶ 함께 사용
@Entity
public class User(){
@Id
private String id;
@Transient
private String firstName;
@Transient
private String lastName;
@Access(AccessType.PROPERTY)
public String getFullName(){
return firstName + lastName;
}
....
}
'Jpa' 카테고리의 다른 글
번외. QueryDSL & JPA (0) | 2023.01.19 |
---|---|
5. 연관관계 매핑 (0) | 2023.01.19 |
3. 영속성(Persistence) 관리 (0) | 2023.01.19 |
2. JPA 설정 및 객체 매핑, 기본 어플리케이션 세팅 (0) | 2023.01.19 |
1. JPA 란? (0) | 2023.01.19 |