Entity Mapping (엔티티 매핑)

김성인·2023년 9월 27일
0

🧷SpringBoot JPA

목록 보기
8/10

@Entity

엔티티 클래스 지정

테이블과 매핑할 클래스에 붙이는 어노테이션, 해당 어노테이션을 통해 JPA가 클래스를 관리한다.

@Entity(name = "엔티티 지정명")

  • name : 서로 같은 이름을 가지는 엔티티 클래스가 존재하면 해당 옵션을 통해 이름 설정을 변경해준다.
  • @Entity 어노테이션에서 기본 생성자를 필수로 작성해야함. (@NoArgsConstructor)
  • 필드에 final 예약어 X, final/enum/interface/inner 클래스에 사용 불가능

@Table

엔티티와 매핑할 테이블명을 지정

  • @Table(name = "매핑할 테이블명") : 매핑할 테이블의 이름을 직접 지정
    (기본값: 엔티티 이름을 사용함)
  • @Table(catalog = ) : catlog 매핑
  • @Table(schema = ) : schema 매핑
  • @Table(uniqueConstraints = ) : 유니크 제약 조건 생성, DDL 쿼리에만 사용됨
    ex)
@Table(uniqueConstraints 
= {@UniqueConstraint(name = "제약조건 이름", columnNames={ "키 이름1", "키 이름2"})})

@Id

엔티티의 기본키를 명시하는 어노테이션

  • 직접 할당 : 애플리케이션 단계에서 기본키 값을 직접 설정해줌.
    • 기본키 미 설정시 영속성 컨텍스트에 저장시 예외 발생.
      (javax.persistence.PersistenceException, org.hiberenate.id.IdentifierGenerationException)
  • 자동 생성 (옵션)
    @GeneratedValue(strategy=GenerationType.옵션) 어노테이션과 함께 사용가능하다.
    (데이터 베이스마다 기본키 생성 전략이 모두 달라서 해당 옵션이 주어짐)

application.yml

spring:
  jpa:
    hibernate:
      ddl-auto: none
      use-new-id-generator-mappings: true| false

IDENTITY : 기본키 생성을 데이터베이스를 통해서 함.

  • AUTO_INCREMENT : 기본키 값을 획득 하기 위해 JPA는 데이터베이스를 추가로 조회해야함.
  • 데이터베이스에 선 INSERT 후 기본키 값을 획득 함. EntityManager.persist()호출 하자마자 INSERT SQL을 DB에 전달함. = 쓰기 지연 X

SEQUENCE : 데이터 베이스의 시퀀스를 이용하여 기본키 값을 할당.

@Entity
@SequenceGenerator
(name ="시퀀스 생성자 이름", sequenceName = "시퀀스 이름", initialValue = 1, allocationSize = 1)
public class 엔티티클래스{
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "시퀀스 생성자 이름")
    private Long id;
}
  • 시퀀스를 사용하여 식별자 조회하고, 해당 식별 값을 엔티티와 함께 영속성 컨텍스트에 저장.
  • 트랜젝션, 커밋 후에 해당 엔티티를 데이터베이스에 저장하게됨. (IDENTITY 와 반대)
  • 쓰기 지연 O
  • @SequenceGenerator
    • name : 시퀀스 생성자 이름 (필수)
    • sequenceName: DB에 등록된 시퀀스 이름
    • initialValue : DDL 생성시에 지정할 시퀀스의 시작 번호
    • allocationSize : 시퀀스 한번 호출에 증가하는 수 (Default: 50)
    • catalog, schem : 데이터베이스 카탈로그, 스키마 이름
CREATE SEQUENCE [시퀀스이름]
START WITH [시작 번호] INCREMENT BY [증가 단위]

TABLE : 키 생성 테이블을 사용

SEQUENCE 옵션을 모방

SEQUENCE 와 비슷하지만, 기본키를 조회한 후 UPDATE를 통해 한번 더 DB에 액세스함
-> allocationSize 옵션도 같이줘서 최적화 가능

@Entity
@TableGenerator
(name ="테이블 생성자 이름", sequenceName = "테이블 이름", pkColumnValue = "기본키 이름", allocationSize = 1)
public class 엔티티클래스{
	@Id
	@GeneratedValue(strategy = GenerationType.TABLE, generator = "테이블 생성자 이름")
    private Long id;
}
  • name: 테이블 생성자 이름 (필수)
  • table: 테이블 이름
  • pkColumnName : 시퀀스 칼럼명
  • valueColumnName : 시퀀스 값 칼럼명
  • pkColumnValue : 키로 사용할 값 이름
  • initailValue : 초기 값, 마지막으로 생성된 값 기준
  • allocationSize : 시퀀스 한번 호출에 증가하는 수
  • catalog, schema
  • uniqueConstraints : 유니크 제약 조건 지정

AUTO : 자동

IDENTITY, SEQUENCE, TABLE 중 하나를 DB환경에 맞게 자동 선택

  • SEQUENCE, TABLE의 생성자를 미리 만들어 놔야함..!

@Column

열에 속성을 지정하기위한 어노테이션

  • name: 엔티티의 필드를 매핑할 테이블의 열 이름으로 지정할 수 있다.
  • nullale: 해당 칼럼에 null 을 허용할지 안할지 여부 (defulat: true)
  • length: 문자열 자료형의 길이를 지정 가능하다 VARCHAR(길이)
  • insertable : 엔티티 저장 시 필드도 같이 저장.
  • updatable : 엔티티 수정 시 필드도 같이 수정
  • table : 하나의 엔티티를 두개 이상의 테이블에 매핑할 때 사용
  • unique : 한 컬럼에 간단한 유니크 제약 조건 (두개이상은 @Table.uniqueConstraints사용)
  • columnDefinition : 데이터 베이스 칼럼 정보를 직접 설정
  • precision, scale : Decimal 타입 을 설정할때 사용
    [precision-소수점을 포함한 전체 자리수, scale-소수의 자리수]

@Enumerated

자바의 enum을 사용하기 위한 어노테이션 매핑

@Enumerated(EnumType.ORDINAL) : enum 순서를 DB에 저장 (0, 1~~)

-> 이미 저장된 enum 순서번호를 변경 불가능, but 저장되는 크기가 작다

@Enumerated(EnumType.STRING) : enum 이름을 DB에 저장 (admin, user ~~)
-> enum 의 순서가 바뀌거나 추가되어도 상관 X, 데이터 크기가 좀 더 큼


@Temporal

자바의 날짜 타입 매핑 어노테이션

@Temporal(TemporalType.TIMESTAMP)

  • TemporalType.DATE : YYYY-MM-DD
  • TemporalType.TIME : HH:mm:ss
  • TemporalType.TIMESTAMP : YYYY-MM-DD HH:mm:ss

@Lob

java.sql.*
길이 제한이 없는 문자열

  • @CLOB : 문자열
  • @BLOB : 바이트

@Transient

매핑을 하지 않는 필드를 지정

객체에 임시로 값을 저장할 때


@Acccess

JPA가 엔티티 데이터에 접근하는 방식

  • 필드 접근 : AccessType.FILED, private필드도 접근 가능
  • 프로퍼티 접근 : AccessType.PROPERTY (Getter 사용), Getter 함수에도 어노테이션 적용 가능
profile
개발자가 꿈인 25살 대학생입니다.

0개의 댓글