[3] JPA 프로그래밍 (4) - Entity Mapping 1 / @Entity @Table @Column

김정욱·2021년 3월 3일
0

[3] JPA 프로그래밍

목록 보기
4/15
post-thumbnail

Entity Mapping

[ Intro ]

연관관계 매핑이 제일 복잡하고 생각해야할 것이 많다. 나머지는 무난무난


  • 객체와 테이블 매핑 : @Entity / @Table
  • 필드와 컬럼 매핑 :@Column / @Enumrated / @Temporal
  • 기본 키 매핑 : @Id / @GeneratedValue [ IDENTITY / SEQUENCE / TABLE 등 ]
  • 연관관계 매핑 : @ManyToOne / @JoinColumn

객체(Entity)와 테이블(Table) 매핑

@Entity

  • @Entity 가 붙은 클래스는 JPA가 관리하며, 엔티티 라고 함
  • 하나의 객체를 의미, RDBTable과 매핑
  • 기본적으로 객체 이름으로 매핑되는데 이름을 지정할 수 도 있음
 @Entity(name = "Member")
 // @Entity 위와 동일!
 public class Member{
 ...
 }
  • 주의 할 점
    • 기본 생성자 필수 (파라미터가 없는 생성자)
    • final / enum / interface / inner 클래스 사용 X

@Table

  • 엔티티와 매핑할 테이블 지정
  • 기본적으로 객체 이름으로 매핑되는데 지정할 수도 있음
@Entity
@Table(name = "MEMBERS") // MEMBERS로 직접 지정!
public class Member{
...
}
  • 유니크 제약조건 추가
/* 사실 필드 자체에 @unique로 지정할 수도 있지만,
   제약조건의 이름을 지정할 수없어 나중에 확인하기 힘들고, 여러개 지정시 귀찮다
   --> 이 방법이 선호됨 */
@Entity
@Table(uniqueConstraints = {
/* name과 age column을 유니크로 지정하고, 유니크 제약조건의 이름을 지정한 것! */
     @UniqueConstraint( name ="NAME_AGE_UNIQUE",columnNames = {"NAME", "AGE"} )
     })
public class Member{
...
}

DataBase 스키마 자동 생성

[ 설명 & 사용 ]

  • DDL을 애플리케이션 실행 시점에 자동 생성할 수 있음
  • DB 방언을 활용해서 데이터베이스에 맞는 적절한 DDL을 생성해줌
  • hibernate.hbm2ddl.auto 속성 지정으로 사용

(persistence.xml 파일에 hibernate 옵션을 추가)

/* 기존 테이블 삭제 후 다시 생성 (DROP + CREATE) */
<property name="hibernate.hbm2ddl.auto" value="create" />
/* create옵션과 같으나 종료시점에 DROP을 해준다 */
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
/* 변경된 부분만 반영 --> 추가는 적용되나, 컬럼 삭제할 때에는 안됨 */
<property name="hibernate.hbm2ddl.auto" value="update" />
/* Entity와 Table이 정상 매핑되었는지만 확인 */
<property name="hibernate.hbm2ddl.auto" value="validate" />
/* 사실 none이라는 옵션은 없고 그냥 사용하지 않는다는 의미 --> 다른 값들어가도 됨 */
<property name="hibernate.hbm2ddl.auto" value="none" />

[ 주의 ]

  • 운영하는 product 장비에서는 절대로 create /create-drop / update 사용 X
    -->
    create는 table을 삭제할 수 있는 위험성이 있고,
    updatealter query가 실행되면서 tablerock걸리는 문제가 생길 위험
  • 정리
    • 개발 초기 단계 -> create / update
    • 테스트 서버 단계 -> validate
    • 운영 서버 단계 -> validate or none

필드(Field)와 컬럼(Column) 매핑

[ 종류 ]

  • 필드와 컬럼을 매핑할 때 사용되는 어노테이션의 종류
    • @Column : 칼럼 매핑
    • @Temporal : 날짜 타입 매핑
    • @Enumrated : enum 매핑
    • @Lob : BLOB / CLOB 매핑
    • @Transient : 매핑 무시 (칼럼에 매핑하고 싶지 않을 때 사용!)

@Column

  • name : 현재 필드와 매핑 될 테이블 column의 이름을 직접 지정
    (default로 필드 명으로 매핑된다)
  • insertable / updateable
    : 삽입 가능한지, 변경 가능한지에 대한 여부
  • nullable
    : null값의 허용여부를 결정 / (default)true -> null 가능, false -> null 불가능
      (DB에서 column에 대한 notnull 설정을 하는 것)
  • unique : 유니크 제약조건 여부
    (제약조건의 이름을 설정할 수 없어서 잘 사용하지 않는 옵션)

@Temporal

  • 날짜 타입을 매핑할 때 사용
  • java의 Date객체는 기본적으로 날짜, 시간을 모두 포함
    그러나, DB에서는 날짜, 시간, 날짜시간 3가지를 구분하기 때문에 그에 맞춰 우리도 Date객체를 구분해야 해서 이 어노테이션을 사용했었음.
  @Temporal(TemporalType.TIMESTAMP) -> 날짜 + 시간
  //@Temporal(TemporalType.DATE) -> 날짜
  //@Temporal(TemporalType.TIME) -> 시간
  private Date createdDate;
  • 하지만 ! Java 8 부터는 LocalDate / LocalDateTime이 제공되면서 이제 이 어노테이션을 사용하지 않아도 된다.
private LocalDateTime createdDate; // 날짜+시간
private LocalDateTime lastModifiedDate;

@Enumrated

  • Enum 타입을 매핑할 때 사용
  • ORDINAL / STRING 속성 이 있는데 무조건 STRING 권장!
    --> 숫자로 할 경우 enum의 순서가 수정되면 전부 바꿔야함;
  //@Enumerated(EnumType.ORDINAL) -> 숫자로 저장
  @Enumerated(EnumType.STRING) -> 문자열로 저장
  private RoleType roleType;

@Lob


@Transient

  • DB 컬럼과 매핑을 원하지 않는 필드에 지정하는 어노테이션
  • 주로 메모리상에서만 임시로 어떤 값을 보관할 때 사용
  @Transient
  private Integer temp;
profile
Developer & PhotoGrapher

0개의 댓글