본문 바로가기

JPA

JPA 매핑 애너테이션들!

객체와 테이블 매핑

@Entity

JPA가 관리하는 Entity 객체

  • 주의사항
    • **기본 생성자 필수!**
    • final class, enum, interface, inner class 에서는 사용 불가
    • 저장할 필드에 final 사용 ❌

@Table

Entity와 매핑할 테이블 지정

@Entity
//name: 매핑할 테이블 이름
@Table(name = "")
public class className() {
    ...
}

@Entity
//catalog: DB catalog 매핑
@Table(catalog = "")
public class className() {
    ...
}

@Entity
//schema: DB Schema 매핑
@Table(schema = "")
public class className() {
    ...
}

@Entity
//uniqueConstraints: DDL 생성 시, 유니크 제약 조건
@Table(uniqueConstraints = "")
public class className() {
    ...
}

매핑 @애너테이션

  1. @Column
    • 컬럼 매핑(컬럼의 이름 설정)
    • 속성들
    • //컬럼의 이름 @Column(name = "name") //등록 가능 여부 @Column(insertable = True|False) //변경 가능 여부 @Column(updatable = True|False) //null값 허용 여부 (DDL) //False ➡️ not null @Column(nullable = True|False) //unique 제약 조건(DDL) @Column(unique = "") //DB 컬럼 정보(DDL) @Column(columnDefinition = "") //문자 길이 제약(DDL) String 타입에만 사용 가능 @Column(length = 10) //BigDecimal 사용(DDL) @Column(precision|scale )
  2. @Temporal
    • 날짜 타입 매핑
  3. @Enumerated
    • enum 타입 매핑
    //Default(사용 안하는걸 권장)
    //enum 순서를 DB에 저장
    @Enumerated(EnumType.ORDINAL)
    
    //String 사용을 권장
    //Enum 이름을 DB에 저장
    @EnumType(EnumType.STRING)
    • ORDINAL을 사용하면 안되는 이유
      • enum의 값의 순서에 따라 DB에는 0, 1, 2... 등 숫자로 저장된다.
      • 만약, 이후 새로운 Enum 값이 추가 될 경우, 기존의 0, 1, 2 값들과 새로운 Enum값이 꼬일 수 있다.
      • **STRING을 사용하자!**
  4. @Lob
    • BLOB, CLOB 매핑
  5. @Transient
    • 매핑 ❌

기본 키 매핑

@Id

  • @GeneratedValue
    • ID값을 자동으로 할당할 경우 사용
    • 속성들
      1. IDENTITY: 데이터베이스에 위임
      2. SEQUENCE: DB 시퀀스 오브젝트 사용
      3. TABLE: 키 생성용 테이블 사용
      4. AUTO: 방언에 따라 자동 지정(DEFAULT)
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      
      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE)
      ...

DB 스키마 자동 생성

  • DDL을 애플리케이션 실행 시점에 자동 생성
  • 테이블 중심 ➡️ 객체 중심
  • DB 방언 고려 ➡️ DB에 적절한 DDL 생성
    • 생성된 DDL ➡️ 개발 환경에서만 사용

스키마 자동 생성 속성

hinernate.hbm2ddl.auto

  1. create (DROP+CREATE)
    • 기존 테이블 삭제 + 다시 생성
    • **운영환경에서는 사용 ❌**
    <property name="hiberante.hbm2ddl.auto" value="create"></property>
  2. create-drop
    • 1.create + 종료 시점에 테이블 DROP
    • **운영환경에서는 사용 ❌**
    <property name="hiberante.hbm2ddl.auto" value="create-drop"></property>
  3. update
    • 변경분만 반영
    • **운영환경에서는 사용 ❌**
    <property name="hiberante.hbm2ddl.auto" value="update"></property>
  4. validate
    • Entity와 Table이 정상 매핑되었는지만 확인
    <property name="hiberante.hbm2ddl.auto" value="validate"></property>
  5. none
    • 사용하지 않음
    <property name="hiberante.hbm2ddl.auto" value="none"></property>

주의(중요)

  • 운영 장비에는 절대 Create, create-drop, update 설정 사용 ❌❌
  • 개발 초기 : create | update
  • 테스트 서버 : update | validate
  • **운영 환경 : validate | none**

강의

https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic