엔티티 매핑

bird.j·2021년 5월 20일
0

JPA

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



💡 객체와 테이블 매핑


@Entity

@Entity가 붙은 클래스는 JPA가 관리하는 엔티티.
따라서 JPA를 사용해서 테이블로 매핑할 클래스는 @Entity가 필수이다.

  • 기본 생성자는 필수이다.(파라미터가 없는 public 또는 protected 생성자)
  • final 클래스, enum, interface, inner 클래스에는 @Entity붙일 수 없음
  • db에 저장할 필드에는 final x

@Table

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



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


  • DDL을 애플리케이션 실행 시점에 자동 생성
  • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
    • ex) hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
  • 이렇게 생성된 DDL은 개발서버에서 사용
  • 생성된 DDL은 운영서버에서는 사용하지 않거나 적절히 다듬어서 사용할 것

hibernate.ddl-auto

  • create : drop + create 기존 테이블 삭제 후 다시 생성
  • create-drop : create와 같으나 종료 시점에 테이블 drop
  • update : 변경문만 반영(추가만)
  • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
  • none : 사용하지 않음

주의할 점

  • 운영 장비에는 절대 create, create-drop, update를 사용하면 안된다.
  • 개발 초기 단계에는 create, update
  • 테스트 서버는 update 또는 validate
  • 스테이징과 운영 서버는 validate 또는 none

DDL 생성 기능

  • 제약 조건 추가
    • @Column(nullable=false, length=10)
  • 유니크 제약 조건 추가
  • DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않음



💡 필드와 컬럼 매핑


매핑 어노테이션

  • @Id : pk매핑
  • @Column(name="") : 컬럼매핑. 데이터베이스의 컬럼 이름 지정
  • @Enumerated : enum타입 매핑
  • @Temporal(TemporalType.TIMESTAMP) : 날짜 타입 매핑
    • DATE
    • TIME
    • TIMESTAMP
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
  • @Lob : 데이터베이스의 varchar를 넘어서는 컨텐츠를 넣고 싶을 때. BLOB, CLOB매핑
  • @Transient : 매핑 하고 싶지 않을 때

@Column

  • name : 필드와 매핑할 테이블의 컬럼 이름
    • 기본값 - 객체의 필드 이름
  • insertable, updatable : 등록, 변경 가능 여부
    • 기본값 - TRUE
  • nullable : null값의 허용 여부 설정.
    • false로 설정하면 not null 제약 조건 붙는다.
  • unique : 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용. 그러나 이름을 반영하기 어려워서 @Table의 uniqueConstraints를 선호.
  • columnDefinition : 데이터베이스 컬럼 정보를 직접 줄 수 있다.
  • length : 문자 길이 제약 조건, String타입에서만 사용
  • precision, scale : BigDecimal 타입에서 사용. 아주 큰 수, 소수점 쓸 때

@Enumerated

자바 enum타입을 매핑할 때 사용.
ORDINAL 사용 x (enum타입이 추가되었을 때 운영의 어려움)

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

@Temporal

날짜 타입을 매핑할 때 사용.
LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)

 private LocalDateTime created;
  • value
    • TemporalType.DATE : 날짜
    • TemporalType.TIME : 시간
    • TemporalType.TIMESTAMP : 날짜와 시간

@Lob

데이터베이스 BLOB, CLOB타입과 매핑

  • @Lob에는 지정할 수 있는 속성이 없다.

  • 매핑하는 필드 타입이 문자이면 CLOB매핑, 나머지는 BLOB매핑

    • CLOB : String, char[], java.sql.CLOB
    • BLOB : byte[], java.sql.BLOB

@Transient

  • 필드 매핑 x
  • 데이터베이스에 저장 x, 조회 x
  • 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
  @Transient
  private Integer temp;


💡 기본키 매핑


  • @Id
  • @GeneratedValue

기본키 매핑 방법

  • 직접 할당 : @Id만 사용
  • 자동 생성(@GeneratedValue)
    • IDENTITY : 데이터베이스에 위임. (MySQL)
    • SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용 (Oracle)
    • TABLE : 키 생성 용 테이블 사용. 모든 DB에서 사용
    • AUTO : 방언에 따라 자동 지정

IDENTITY

@GeneratedValue(strategy =GenerationType.IDENTITY)

  • 기본 키 생성을 데이터베이스에 위임
  • 주로 MySQL에서 사용
  • JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행
  • AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 ID값을 알 수 있음
    • 값을 직접 세팅할 수 없으므로 db에 들어가봐야 pk값을 알 수 있음

SEQUENCE

@GeneratedValue(strategy =GenerationType.SEQUENCE)

  • 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
  • 오라클, H2데이터베이스에서 사용

TABLE

@GeneratedValue(strategy =GenerationType.TABLE)

  • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
    • 장점 : 모든 데이터베이스에 적용 가능
    • 단점 : 성능
  • 잘 쓰진 않는다

권장하는 식별자 전략

  • 기본키 제약 조건 : null x, 유일, 변하면 안됨
  • 변하지 않는다는 조건 만족하기 어려움. 따라서 대체키를 사용하자(비즈니스와 상관없는)
  • => Long형 + 대체키 + 키 생성전략 사용

0개의 댓글