[JPA]엔티티 매핑

Jimin·2023년 1월 1일
0

JPA

목록 보기
1/6

엔티티 매핑 소개

  • 객체와 테이블 매핑: @Entity, @Table
  • 필드와 컬럼 매핑: @Column
  • 기본 키 매핑: @Id
  • 연관관계 매핑: @ManyToOne, @JoinColumn

@Entity

  • JPA가 관리하는 클래스, 엔티티라고 함
  • 기본 생성자 필수 (public or protected 생성자): 스펙상 필요함 (객체를 프록싱하기 위해)
  • final class, enum, interface, inner class 사용 불가
  • 저장할 필드에 final 사용 불가

@Table

  • 엔티티와 매핑할 테이블 지정
  • 속성
    • name: 매핑할 테이블 이름 -> 기본값: 엔티티 이름을 사용

데이터베이스 스키마 자동 생성

  • DDL을 애플리케이션 실행 시점에 자동 생성
  • 테이블 중심 -> 객체 중심
  • 데이터베이스 방언을 활용해 적절한 DDL 생성
  • 생성된 DDL은 개발 장비에서만 사용
  • 속성
    • create (drop + create)
    • create-drop: 종료 시점에 drop
    • update: 변경 부분만 반영
    • validate: 엔티티와 테이블이 정상 매핑됐는지만 확인
    • none
    • 운영 장비에는 절대 create, create-drop, update 사용하면 안 됨!

@Column

  • ex) @Column(unique = ture, lenth = 10): 테이블에 영향을 줌 (DDL 생성에만 영향을 줌)

필드와 컬럼 매핑

  • ex) @Column(name = "name"): 객체명과 데이터베이스 컬럼명이 다를 때
  • 데이터베이스에서는 Date, Time, Timestamp 세 가지를 구분하기 때문에 매핑 정보를 제공해야 함
    • ex) @Temporal(TemporalType.YIMESTAMP)
  • @Lob: varchar를 넘는 큰 데이터
    • String 타입일 경우 자동으로 clob으로
  • @Transient: 메모리에서만 사용하겠다!

@Column 속성

  • name: 필드와 매핑할 테이블 컬럼 이름
  • insertable, updatable: 등록, 변경 가능 여부
  • nullable: false일 경우 not null 조건이 적용됨
  • unique: 유니크 제약 조건
    • 이름이 랜덤으로 적용됨 -> 운영에서는 사용 안 함
    • @Table(uniqueConstraints = ??): 유니크 제약조건 이름 지정 가능
  • columnDefinition: 데이터베이스 컬럼 정보 직접 줄 수 있음
  • precision, scale(DDL): BigDecimal 타입에서 사용 (BigInteger도 사용 가능)

@Enumerated

  • EnumType.ORDINAL: enum 순서를 데이터베이스에 저장 (기본값) -> 사용❎
  • EnumType.STRING: enum 이름을 데이터베이스에 저장

기본키 매핑

  • @Id: 직접 할당
  • @GeneratedValue: 자동 생성
    • ex) @GeneratedValue(strategy = GenerationType.AUTO): 데이터베이스 방언에 맞게 자동으로 지정
    • IDENTITY: 데이터베이스에 위임 (MYSQL - autoIncrement)
    • SEQUENCE: 시퀀스오브젝트를 통해 값을 가져와서 세팅함
      • Long 사용: 10억 넘어가면 타입을 바꾸기 힘듦
    • TABLE: 키 생성 전용 테이블 만들어서 데이터베이스 시퀀스 흉내냄, 성능 이슈 발생

식별자 전략

  • 기본키 제약 조건: NULL 아님, 유일, 변하면 안 됨
  • 자연키 찾기 어려움, 대리키 사용함
  • 권장: Long형 + 대체키 + 키 생성 전략

  • 영속성 컨텍스트 @Id에 pk가 들어가는데 identity 전략을 사용하면 데이터베이스에 값이 들어가면 pk를 알 수 있음
    • em.persist() 호출하는 시점에 insert query가 날아감
  • sequence 전략을 사용할 때 트랜잭션 commit 시점에 insert query가 날아감

0개의 댓글