Home [JPA] JPA 기본 4
Post
Cancel

[JPA] JPA 기본 4

JPA 기본 4

엔티티 매핑

객체와 테이블

@Entity

  • @Entity가 붙은 클래스는 JPA가 관리한다.
  • JPA를 사용해 테이블과 매핑할 클래스는 @Entity 애너테이션을 필수로 붙여야 한다.
  • 기본 생성자를 필수로 생성해야 한다. (public or protected)
  • final 필드는 사용 불가하다.

@Table

  • @Table은 엔티티와 매핑할 테이블을 지정할 때 사용하는 애너테이션이다.

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

  • DDL을 애플리케이션 실행 시점에 자동 생성한다.
    • 객체 중심으로 데이터베이스 방언을 활용해 적절한 DDL을 구성해 사용한다.
  • 생성된 DDL은 개발 장비에서만 사용해야 한다.
    • 운영 서버에 적용 시에는 자동 생성된 DDL을 조금 다듬어서 사용해야 한다.
  • 옵션
    • create : 기존 테이블 삭제 후 새로 생성
    • create-drop : 어플리케이션 종료 시 drop
    • update : 변경분만 반영함
    • validate : 엔티티, 테이블의 정상 매핑 여부를 확인
    • none : 사용하지 않음
  • 운영 장비에서는 절대로 create, create-drop, update를 사용하면 안된다!!!
  • 권장 사항
    • 개발 초기 : create, update
    • 테스트 서버 : update, validate
    • 스테이징, 운영 서버 : validate, none

필드와 컬럼

  • @Column : 컬럼 매핑
    • name : 필드와 매핑할 테이블 컬럼
    • insertable, updatable : 삽입, 변경 가능 여부 (default : TRUE)
    • nullable : null 값 허용 여부 (false => NOT NULL 효과)
    • unique : 유니크 제약 조건을 걸 때 사용
      • 필드에서 잘 사용하지는 않는다.
        • 테이블 애너테이션의 옵션으로 유니크를 지정해야 이름을 지정해 사용하는 것이 가능하기 때문이다.
    • length : 문자 길이 제약조건
    • columnDefinition : 컬럼 정보를 직접 줄 수 있음
      • ex) varchar(10) default ‘hello’
    • precision, scale : BigDecimal 타입처럼 범위가 아주 크거나 소수점 값에 사용
  • @Temporal : 날짜 타입 매핑
    • 날짜 타입 때문에 사용한다.
    • Java8로 넘어오면서 LocalDate, LocalDateTime 타입이 추가되었기에 @Temporal의 사용 필요가 줄어들었다.
    • DATE, TIME, TIMESTAMP 옵션이 있다.
  • @Enumerated : enum 타입 매핑
    • value : ORDINAL(순서), STRING(이름) (default : ORDINAL)
      • ORDINAL을 사용하면 enum의 순서(integer)를 저장하기에 enum 값 변경에 따른 오류가 생길 수 있다. 치명적이다.
      • STRING 옵션을 사용하도록 하자!!
  • @Lob : BLOB, CLOB 매핑
    • 지정할 수 있는 속성이 없다.
    • 문자면 CLOB으로 설정되고, 나머지는 BLOB으로 매핑된다.
  • @Transient : 특정 필드를 메모리에서만 사용하고 DB에는 추가하고 싶지 않을 때 사용함

기본 키 매핑

  • @Id
    • 키로 사용할 값을 설정한다.
  • @GeneratedValue
    • 전략을 설정한다.
      • AUTO : 알아서 아래 3개 중 하나로 설정된다.
      • IDENTITY : ID 애너테이션이 붙은 값을 AUTO_INCREMENT(MySQL 기준)
      • SEQUENCE : 주로 Oracle 같은 DB에서 많이 사용한다.
      • TABLE : 키 생성 전용 테이블을 하나 만들어서 DB 시퀀스를 흉내내는 전략 (모든 DB에 적용가능하나 성능이 떨어짐)
  • @SequenceGenerator : 시퀀스에 관한 더 자세한 설정을 위해 사용한다.
  • @TableGenerator : 운영에서 테이블 전략을 사용하기는 부담스러울 것이다.

권장하는 식별자 전략

  • 기본 키 제약 조건 : null이 아니어야 한다, 유일해야 한다, 변하면 안된다.
    • 미래까지 변하지 않는다는 조건을 만족하는 자연키는 찾기 어렵다. 대체키를 사용하자.
      • 주민등록번호도 기본 키로 적절하지 않다.
  • 타입을 Long 형으로 사용하고, 대체키를 사용하며, 키 생성전략을 조합하여 사용해야 한다.

IDENTITY 전략의 특징

  • 영속 컨텍스트 사용을 위해서는 기본 키가 있어야 한다.
  • IDENTITY 전략은 DB에 넣어야 PK를 알 수 있기 때문에 persist 호출 시 바로 INSERT 쿼리가 날라간다.
    • 원래는 commit 시 INSERT 쿼리가 날라간다.
    • 이는 영속성 컨텍스트에서 PK 값을 사용하기 위함이다.

SEQUENCE 전략의 특징

  • Allocation size를 통해 앞으로 사용할 size 만큼을 미리 call 한다.
  • size 만큼을 메모리로 사용하게 된다.
  • 약 50 ~ 100 정도의 size를 주는 것이 좋을 것이다.
  • 호출을 줄일 수 있어 효율적이다.
This post is licensed under younghwani by the author.

[JPA] JPA 기본 3

[JPA] JPA 기본 5

Comments powered by Disqus.