Jpa

4. 엔티티 매핑

배고픈 징징이 ㅣ 2023. 1. 19. 14:19

/*

* [ 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