본문 바로가기

신세계 국비과정/신세계 - Spring 공부

19주차 배운점 - JPA 매핑, 식별자

728x90
반응형

 

 

엔티티 매핑

 

 

 

@Table 애노테이션

 

 

 

@Enumerated 애노테이션

 

 

 

매핑설정 예시

 

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

  @Enumerated(EnumType.STRING)
  private Grade grade;

  private LocalDateTime created;

  @Column(name = "modified")
  private LocalDateTime lastModified;

  public Hotel() {
  }
  
  생성자 + getter()

 

 

Grade

 

public enum Grade {
    S1, S2, S3, S4, S5, S6, S7
}

 

 

접근 타입

 

 

 

식별자 생성 방식

 

직접할당
식별칼럼방식
시퀀스사용방식
테이블 사용방식

 

 

직접 생성 방식


@Id 설정 대상에 직접 값 설정
사용자가 입력한 값, 규칙에 따라 생성한 값등
예) 이메일, 주문 번호
저장하기 전에 생성자 할당, 보통 생성 시점에 전달

 

 

 

식별 칼럼 방식


DB의 식별 칼럼에 매핑(예, MySQL 자동 증가 칼럼)
DB가 식별자를 생성하므로 객체 생성시에 식별값을 설정하지 않음
설정 방식
@GeneratedValue(strategy = GenerationType.IDENTITY) 설정
INSERT 쿼리를 실행해야 식별자를 알 수 있음
EntityManager#persist() 호출 시점에 INSERT 쿼리 실행
persist() 실행할 때 객체에 식별자 값 할당됨

public class Review {
   @Id
  @Column(name = "review_id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
   @Column(name = "hotel_id")
  private String hotelId;


}

 

생성 시점에 식별자를 지정하지 않아서 디비에 저장 후(persist()) 이후 식별자 받아서 사용가능

 

 

시퀀스 사용 방식


시퀀스를 사용해서 식별자 생성
JPA가 식별자 생성 처리 -> 객체 생성시에 식별값을 설정하지 않음
설정 방식
@SequenceGenerator로 시퀀스 생성기 설정
@GeneratedValue의 generator로 시퀀스 생성기 지정
EntityManager#persist() 호출 시점에 시퀀스 사용
persist() 실행할 때 객체에 식별자 값 할당됨
INSERT 쿼리는 실행하지 않음

 

create sequence activity_log_seq start with 1 increment by 1 nomaxvalue;

 

 

// JPA 엔티티임을 나타내며, 이 클래스의 인스턴스는 데이터베이스의 테이블과 매핑됩니다.
@Entity
// 이 엔티티가 매핑될 데이터베이스 테이블의 이름과 스키마를 지정합니다.
// 여기서는 'crm' 스키마의 'activity_log' 테이블과 매핑됩니다.
@Table(schema = "crm", name = "activity_log")
public class ActivityLog {
  
  // 엔티티의 기본 키를 나타냅니다. 아래의 설정에 따라 값은 자동으로 생성됩니다.
  @Id
  // 기본 키 값 생성을 위한 시퀀스 생성기를 정의합니다.
  // 'activity_seq' 시퀀스를 사용하여 기본 키 값을 생성하며, 값은 한 번에 하나씩 증가합니다.
  @SequenceGenerator(
          name = "log_seq_gen",
          sequenceName = "activity_seq",
          schema = "crm",
          allocationSize = 1
  )
  // 위에서 정의한 'log_seq_gen' 생성기를 사용하여 기본 키 값을 생성합니다.
  @GeneratedValue(generator = "log_seq_gen")
  private Long id;

  // 사용자 ID를 저장하는 필드입니다. 데이터베이스의 'user_id' 컬럼에 매핑됩니다.
  @Column(name = "user_id")
  private String userId;

  // 활동 유형(예: 로그인, 로그아웃)을 저장하는 필드입니다. 데이터베이스의 'activity_type' 컬럼에 매핑됩니다.
  @Column(name = "activity_type")
  private String activityType;

  // 활동이 기록된 시각을 저장하는 필드입니다. 이 필드는 자동으로 현재 시각으로 설정됩니다.
  private LocalDateTime created;

  // JPA 스펙에 따라 엔티티는 기본 생성자를 제공해야 합니다.
  // protected 접근 제한자를 사용하여 외부에서의 직접 생성을 제한합니다.
  protected ActivityLog() {}

  // 사용자 ID와 활동 유형을 받아 엔티티 인스턴스를 생성하는 생성자입니다.
  // 활동 시각은 현재 시각으로 자동 설정됩니다.
  public ActivityLog(String userId, String activityType) {
    this.userId = userId;
    this.activityType = activityType;
    this.created = LocalDateTime.now();
  }

  // 각 필드에 대한 getter 메서드들을 제공하여 클래스 외부에서 필드 값을 읽을 수 있도록 합니다.
  public Long getId() { return id; }
  public String getUserId() { return userId; }
  public String getActivityType() { return activityType; }
  public LocalDateTime getCreated() { return created; }
}

 

 

 

테이블 사용 방식


테이블을 시퀀스처럼 사용
테이블에 엔티티를 위한 키를 보관
해당 테이블을 이용해서 다음 식별자 생성
설정 방식
@TableGenerator로 테이블 생성기 설정
@GeneratedValue의 generator로 테이블 생성기 지정
EntityManager#persist() 호출 시점에 테이블 사용
persist() 할 때 테이블을 이용해서 식별자 구하고 이를 엔티티에 할당
INSERT 쿼리는 실행하지 않음

 

 
반응형