[JPA] @Enumerated 어노테이션과 식별자 생성 방법

HeavyJ·2023년 3월 27일
0

스프링 이론 정리

목록 보기
2/5

@Enumerated 어노테이션

EnumType.STRING : enum 타입 값 이름을 저장

  • 문자열 타입 칼럼에 매핑
    EnumTyp.eORDINAL : enum 타입의 값의 순서를 저장
  • 숫자 타입 칼럼에 매핑
@Entity // 매핑 대상 엔티티
@Table(name = "hotel_info") // 테이블 이름에 해당하는 테이블과 매핑
public class Hotel{
	@Id // 식별자로 매핑
    @Column(name = "hotel_id") // 해당 이름의 칼럼에 매핑
    private String id;
    
    @Column(name = "nm") 
    private String name;
    
    private int year; // year 칼럼에 매핑
    
    @Enumerated(EnumType.STRING) // 열거타입 이름을 값으로 저장
    private Grade grade; 
    
    private LocalDateTime created;
    
    @Column(name = "modified")
    private LocalDateTime lastModified;

접근 타입

  • 두 개 접근 타입
    - 필드 접근 : 필드 값을 사용해서 매핑
    • 프로퍼티 접근 : getter/setter 메서드를 사용해서 매핑
  • 설정 방법
    -@Id 어노테이션을 필드에 붙이면 필드 접근
    -@Id 어노테이션을 getter 메서드에 붙이면 프로퍼티 접근
  • 주로 필드 접근을 선호, 불필요한 setter 메서드를 만들 필요가 없기 때문

식별자 생성 방법

직접 생성 방식

@Id 설정 대상에 직접 값 설정

  • 사용자가 입력한 값, 규칙에 따라 생성한 값 등
Hotel hotel = new Hotel("H-001", ...);
entityManager.persist(hotel);

식별 칼럼 방식

DB의 식별 칼럼에 매핑할 때 사용하는 방법
ex)
@GeneratedValue(strategy = GenerationType.IDENTITY) 설정

  • insert 쿼리를 실행해야 식별자를 알 수 있음
  • entityManager.persist() 호출 시점insert 쿼리가 실행
  • persist() 실행할 때 객체에 식별자 값이 할당

시퀀스 사용 방식

저장 시점에 시퀀스를 사용해서 식별자를 생성

  • 시퀀스를 사용해서 식별자 생성
    - JPA가 식별자 생성 처리 -> 객체 생성시에 식별값을 설정하지 않음
  • 설정 방식
    - @SequenceGenerator로 시퀀스 생성기 설정
    • @GeneratedValue의 generator로 시퀀스 생성기 지정
  • EntityManager persist() 호출 시점에 시퀀스 사용
    - persist() 실행할 때 객체에 식별자 값 할당됨
    • INSERT 쿼리는 실행하지 않음
@Id
@SequenceGenerator(
			name = "log_seq_gen",
            sequenceName = "activity_seq"
            schema = "crm",
            allocationSize = 1 // allocationSize를 1로 안 하면 여러 개의 시퀀스가 발생하는 문제 발생
)
@GeneratedValue(generator = "log_seq_gen")
// 생성 시점에 식별자 지정하지 않음
ActivityLog log = new ActivityLog("U01","VISIT");

// persist() 시점에 시퀀스로 식별자를 구함
em.persist(log);

// 커밋 시점에 INSERT 쿼리 실행
tx.commit();

테이블 사용 방식 -> 사용 빈도가 낮은 편

저장 시점에 테이블 사용해서 식별자를 생성

  • 테이블을 시퀀스처럼 사용
    - 테이블에 엔티티를 위한 키를 보관
    • 해당 테이블을 이용해서 다음 식별자 생성
  • 설정 방식
    - @TableGenerator로 테이블 생성기 설정
    • @GeneratedValue의 generator로 테이블 생성기 지정
profile
There are no two words in the English language more harmful than “good job”.

2개의 댓글

comment-user-thumbnail
2023년 3월 27일

@GeneratedValue(strategy = GenerationType.IDENTITY) 설정에 따라서 flush 시점이 달라집니다. 한번 이쪽 공부도 해보시는게 좋을거 같아요
jpa 전문가가 되기 위해 학습해 나가시는게 아주 멋집니다. querydsl도 깊게 학습해주세요!

1개의 답글