[JPA] JPA 프로그래밍 기본기 다지기 3강 - 필드와 컬럼매핑

업데이트:

여기서부터 실습은 인텔리제이로 시작…

💡필드와 컬럼매핑

✔데이터베이스 스키마 자동으로 생성하기

  • 애플리케이션 실행 시 DDL을 자동으로 생성할 수 있다(테이블 자동 생성)
  • 테이블 중심 -> 객체 중심으로 이동한 것
  • 데이터베이스 방언을 활용해 데이터베이스에 맞는 적절한 DDL 생성
  • 이렇게 생성한 DDL은 개발에서만 사용한다(운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용)

hibernate.hbm2ddl.auto

아래와 같은 여러가지 옵션 설정

  • create : 기존 테이블 삭제 후 다시 생성(DROP + CREATE)
  • create-drop : create와 같으나 종료시점에 테이블 DROP(테스트코드에서 도움됨)
  • update : 변경분만 반영(alter로 추가, 운영 DB에는 사용하면 안됨)
  • validate : 엔티티와 테이블이 정상매핑 되었는지만 확인
  • none : 자동 생성을 사용하지 않음

✔데이터베이스 스키마 자동 생성하기 주의!!!

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


✔매핑 어노테이션

철저하게 데이터베이스에 어떤식으로 매핑할지를 결정하는 매핑정보에 관련된 어노테이션들(Java코드에 영향을 주지 않음)

@Entity
public class Member {
  @Id
  private Lond id;
  
  @Column(name = "USERNAME")
  private String name;
  private int age;
  
  @Temporal(TemporalType.TIMESTAMP)
  private Date regDate;
  
  @Enumerated(EnumType.STRING)
  private MemberType memberType;
  
  ...
}

@Column

class의 필드명과 DB의 컬럼명이 일치하지 않을 경우 사용

  • @Column(name = “USERNAME”)
  • name: 필드와 매핑할 테이블의 컬럼 이름
  • insertable, updatable: TRUE/FALSE 설정. 읽기 전용
  • nullable: null 허용여부 결정, DDL 생성시 사용(not null 추가)
  • unique: 유니크 제약 조건, DDL 생성시 사용
  • columnDefinition, length, precision, scale(DDL)

    @Temporal

    날짜와 관련된 매핑

  • @Temporal(TemporalType.DATE) //날짜
  • @Temporal(TemporalType.TIMESTAMP) //시간
  • @Temporal(TemporalType.TIMESTAMP) //날짜와 시간
  • Date 뿐만아니라 자바8에서 지원하는 LocalDatetime도 지원한다.

@Enumerates

열거형 매핑, Enum 타입을 매핑을 지원

  • @Enumerated(EnumType.ORDINAL): 순서를 저장(기본값)
  • @Enumerated(EnumType.STRING): 열거형 이름을 그대로 저장, 가급적 이것을 사용
  • 현업에서는 EnumType을 무조건 STRING으로 지정 해야한다.
  • 기본 값인 ORDINAL로 설정하면 Enum 순서로 숫자가 매핑되는데, Enum 중간에 필드가 하나 추가 되면 다 꼬이게 된다.

@Lob

컨텐츠의 길이가 너무 길 경우 바이너리 파일로 DB에 바로 밀어 넣어야 하는데, 보통 이런 경우에 사용한다.

  • 공통적으로 @Lob으로 사용하면 된다.
  • CLOB, BLOB 매핑
  • CLOB(Character LOB) : String, char[], java.sql.CLOB
  • BLOB(Byte LOB) : byte[], java.sql.BLOB
  • @Transient: 이 필드는 매핑하지 않는다.
    • 애플리케이션에서 DB에 저장하지 않는 필드(객체에서만 들고 있음)
    • 웬만하면 쓰지 말자!!


✔식별자 매핑 어노테이션

식별자 매핑 방법

@Id(직접 매핑)

@GenerateValue(strategy = Generation Type[타입])

  • IDENTITY : 데이터베이스에 위임, MySQL
  • SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE
    • @SequenceGenerator 필요
  • TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용
    • @TableGenerator 필요
  • AUTO: 방언에 따라 자동 지정, 기본값
    • IDENTITY, SEQUENCE, TABLE 중 Dialect에 맞는 방식으로 자동 적용

권장하는 식별자 전략

  • 기본 키 제약조건: Not Null, Unique(유일성), 변하면 안된다(불변)
  • 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다.
    • 대체키(대리키)를 사용하자!
    • ex) 주민등록번호도 기본키로 사용하기에 적절하지 않다.
    • ex) 주민등록번호를 PK로 설정하고 다른 테이블과 FK참조시 그대로 주민번호가 넘어감. 갑자기 나라에서 개인정보 목적으로 DB에 주민번호 저장하지 마라고 하면 끝남…
  • 권장 : Long + 대체키 + 키 생성전략 사용
    • 대체키는 전혀 비즈니스랑 관계없는 키 권장
      *AUTO_INCREMENT로 PK사용 시 Int type 사용X! INT는 최대 10~20억까지이므로 생각보다 빨리 끝나기 때문! → Long type 사용하자!
    • 또는 UUID 사용! -> But, 성능 문제는 확인해보고 사용

태그:

카테고리:

업데이트: