JPA에 대해 알아보자 : 4장 엔티티 매핑

ParkIsComing·2023년 6월 5일

Spring

목록 보기
8/21
post-thumbnail

@Entity

  • @Entity가 붙은 클래스는 JPA가 관리
  • 기본 생성자는 필수!
  • final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.

@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; // 1

	@Temporal (TemporalType. TIMESTAMP) 
	private Date createdDate; // 2

	@Temporal (TemporalType. TIMESTAMP)  
	private Date lastModifiedDate; // 2
 
	@Lob 
	private String description; //3
}

//Getter, Setter 
package jpabook.start; 

public enum RoleType { 
	ADMIN, USER
}

기본키 매핑

직접 할당하는 방법과 자동 생성하는 방법이 있다.

  • 직접 할당 : 기본 키를 애플리케이션에서 직접 할당한다.
  • 자동 생성 : 대리 키 사용 방식
    • IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.
    • SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.
    • TABLE : 키 생성 테이블을 사용한다

IDENTITY

IDENTITY 전략의 경우 데이터를 데이터베이스에 INSERT한 후에 기본 키 값을 조회할 수 있다.

-> em.persist()를 호출하는 즉시 INSERT SQL이 데이터베이스에 전달
-> 트랜잭션을 지원하는 쓰기 지연 동작X

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

SEQUENCE

  • 트랜잭션을 지원하는 쓰기 지연 동작
    • em.persist()` 를 호출할 때 데이터베이스 시퀀스에서 식별자를 조회한다.
    • 식별자를 엔티티에 할당한 후 영속성 컨텍스트에 저장한다.
    • 트랜잭션이 커밋되고 플러시가 일어나면 엔티티를 데이터베이스에 저장한다
@Entity
@SequenceGenerator(
	name = "BOARD_SEQ_GENERATOR".
	sequenceName = ”BOARD_SEQ”, //매핑할 데이터베이스 시퀀스 이름
	initialvalue = 1, 
	allocationsize = 1)
public class Board {

	@IdQGeneratedValue(
	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;
	...
}

자동 생성

GenerationType.AUTO: 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

ddl auto

none : 사용하지 않음
create : 기존 테이블 삭제 후 테이블 생성
create-drop : 기존 테이블 삭제 후 테이블 생성, 종료 시점에 테이블 삭제
update : 변경된 스키마 적용
validate : 엔티티와 테이블 정상 매핑 확인

운영 장비에서는 절대 crate, create-drop, update 사용하면 안된다.
개발 초기 단계는 create 또는 update
테스트 서버는 update 또는 validate
스테이징과 운영 서버는 validate 또는 none

기타 어노테이션

@Enumerated

  • 자바의 enum 타입을 매핑
  • value 속성 지정 가능 (default : ORDINAL)
    • EnumType.ORDINAL : enum 순서를 DB에 저장
    • EnumType.STRING : enum 이름을 DB에 저장

@Transient

  • 해당 어노테이션을 가지면 테이블과 매핑하지 않음
  • 객체에 임시로 어떤 값을 보관하고 싶을 때 사용

0개의 댓글