JPA 엔티티 매핑

이상민·2021년 10월 28일
0

JPA

목록 보기
2/8
post-thumbnail

1. 객체와 테이블 매핑

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

1-1. @Entity

  • 위 애노테이션이 붙은 클래스는 JPA가 관리하는 엔티티

  • JPA를 통해 테이블과 매핑할 클래스에게 필수이다

  • @Entity 클래스는 기본생성자가 필수이다(리플렉션 때문)

  • final, enum, interface, inner 클래스에 사용할 수 없다

    • final 클래스에 사용은 할 수 있지만, 프록시 객체를 만들 수 없기 때문에 조회가 안된다
  • 데이터베이스 컬럼과 매핑될 필드에 final 사용할 수 없다

1-2. @Table

  • 엔티티와 매핑할 테이블을 지정한다

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

2-1. 속성

  • 아래와 같은 hibernate.hbm2ddl.auto 옵션을 통해 DDL을 자동적으로 생성하고 실행할 수 있다
옵션설명
create기존 테이블 삭제 후 다시 생성
create-dropcreate과 같으나 종료시점에 테이블 DROP
update변경분만 반영, 컬럼을 삭제하지는 않는다
validate엔티티와 테이블이 정상 매핑되었는지만 확인
none사용하지 않음
  • 운영 장비에는 절대 create, create-drop, update를 사용하면 안된다

    • 개발 초기 단계는 로컬 DB에서 create 또는 update

    • 테스트 서버는 update 또는 validate

    • 스테이징과 운영 서버는 validate 또는 none

2-2. 필드와 컬럼

  • 필드와 컬럼을 매핑시키며 다양한 옵션을 설정할 수 있다
// null 불가, 길이 최대 10자 컬럼 설정 
@Column(nullable = false, length = 10)
private String name;
  • 복합 유니크 제약도 설정할 수 있다
@Table(uniqueConstrints = {
    @UniqueConstraint(
        name = "NAME_AGE_UNIQUE", 
        columnNames = {"NAME", "AGE"})
    }
)
  • DDL 생성 기능은 DDL 자동 생성 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다

3. 필드와 컬럼 매핑

  • @Id : pk를 지정
  • @Column : 컬럼을 매핑
  • @Enumerated : enum 타입 필드를 매핑
  • @Temporal : 자바의 Date 타입은 시간을 포함하기 때문에, 컬럼 타입 지정이 필요하다
  • @Lob : CLOB, BLOB을 자동으로 매핑
  • @Transient : 데이터베이스 컬럼과 매핑하지 않도록 필드를 설정

3-1. @Column

  • 다음 옵션들을 사용할 수 있다
    • name : 컬럼 이름
    • insertable, updateable : 등록 변경 가능 여부
    • nullable(DDL)
    • unique(DDL) : 유니크 제약 이름이 읽을 수 없게 생성되어서 잘 사용하지 않는다
    • columnDefinition(DDL) : 컬럼 정보를 직접 설정할 수 있다
      ex) varchar(100) default "EMPTY"
    • length(DDL) : 문자열 타입에만 사용할 수 있는 길이 제약조건
    • precision, scale(DDL) : BigDecimal 타입을 사용할때 설정할 수 있다

3-2. @Temporal

  • 날짜 타입을 매핑한다

  • LocalDate, LocalDateTime을 사용하면 최신 하이버네이트가 지원하는 기능 덕분에 생략 가능하다


4. @GeneratedValue - SEQUENCE

  • 오라클 DB는 MySQL의 AUO INCREMENT와 비슷한 기능을 위해 시퀀스를 사용한다

  • MySQL의 AUTO INCREMENT 값은 삽입을 해야 생성되기 때문에, persist 호출에 insert 쿼리를 날리지만 SEQUENCE는 그렇지 않다

  • persist 호출 시에 (남은 키가 없다면) DB에서 가져오기만 하면된다

  • allocationSize를 통해 DB에서 한번에 가져올 SEQUENCE 값의 크기를 지정할 수 있다. 레코드를 생성할때마다 키 값을 위해 받아오는 것이 아니라, 한번에 여러개를 받아 모아놓고 사용하는 것이다

  • 의외로 동시성 문제도 없어서 성능 최적화도하고 좋다고 한다

profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글