JPA 필드와 컬럼 매핑

2021-02-01

JPA를 공부하면서 정리를 한 내용들 입니다.

-참고 김영한 개발자님 : [토크ON세미나] JPA 프로그래밍 기본기 다지기 - 필드와 컬럼 매핑 T아카데미

3강. JPA 필드와 컬럼 매핑

1.데이터베이스 스키마 자동 생성하기

JPA를 사용하면 JPA가 매핑을 다 해주기 때문에,

JPA를 통해서 테이블을 만들 수 있습니다.

왜냐하면 메타정보가 있기 때문에, JPA가 클래스를 보고 Create 할 수 있습니다.

  • DDL을 애플리케이션 실행 시점에 자동 생성

이렇게 생성된 DDL은 개발 단계에서만 사용해야합니다.

운영에서 사용한다면 Table을 Drop시키고 Create하고 한다면 큰일이 납니다.

  • 테이블 중심 -> 객체중심

  • 데이터베이스 방언(dialect)를 활용해서 데이터베이스에 맞는 적절한 DDL 생성

hibernate.hbm2ddl.auto 의 옵션(value)을 아래의 것들로 사용

  • create: 기존 테이블 삭제 후 다시 생성 (DROP + CREATE)

  • create-drop: create와 같으나 종료시점에 테이블 DROP(테스트 코드 작성시 도움되는)

  • update: 변경된 부분만 반영 (운영 DB에 사용하면 안됌)

  • validate: entity와 table이 정상 매핑되었는지만 확인

  • none: 사용하지 않음

★주의

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

2.매핑어노테이션

철저하게 데이터베이스에 어떤 식으로 매핑 될 지에 대한 매핑정보입니다.

@Column (DB의 컬럼이름)

가장많이 사용되는 어노테이션

  • name : 필드와 매핑할 테이블의 컬럼이름
  • insertalbe, updatalbe : 읽기전용
  • nullalbe : null 허용여부 결정 , DDL 생성 시 사용
  • unique : 유니크 제약조건, DDL 생성 시 사용
  • columnDefinition, length, precision, scale(DDL)

@Enumerated(EnumType.STRING)

  • Default는 EnumType.ORDINAL인데 Enum에 정의된 순서를 숫자로 반환합니다.
  • 그런데 만약 중간에 어떤 값이 들어가 순서가 바뀌면 꼬여버리므로 운영에서는 절대 사용하면 안됩니다.
  • EnumType.STRING 옵션을 주면 Enum에 정의된 글자가 그대로 들어가므로, 이 옵션이 권장합니다.

@Temporal

날짜 타입 매핑 어노테이션

  • @Temporal(TemporalType.DATE) // 날짜
  • @Temporal(TemporalType.TIME) // 시간
  • @Temporal(TemporalType.TIMESTAMP) // 날짜와 시간

요즘에는 LocalDate, LocalDateTime이 있어서 이것들을 사용하면 됩니다.

@Lob

  • 컨텐츠의 길이가 너무 길 경우에 binary파일로 DB에 넣을 경우 @Lob을 사용합니다.
  • CLOB과 BLOB이 있다. CLOB은 Character 형태의 긴 컨텐츠를 저장하는 것이고, BLOB은 Binary 형태의 긴 컨텐츠를 저장합니다.
  • @Lob 어노테이션을 String 타입에 쓰면 CLOB이 되고, Byte 타입에 쓰면 BLOB이 됩니다.

@Transient

  • 이 컬럼은 매핑하지 않습니다.
  • 애플리케이션에ㅔ서 DB에 저장하지 않는 필드
  • 컬럼을 DB에는 저장하지 않지만 객체에는 두고 싶을 때 사용 (ex 임시 flag값)

3.식별자 매핑 어노테이션

@Id(직접매핑)

  • @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    • 데이터베이스에 위임합니다. (MySQL의 AUTO INCREMENT)
  • @Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
    • 데이터베이스 시퀀스 오브젝트 사용 (Oracle)
    • @SequenceGenerator 필요합니다.
  • @Id @GeneratedValue(strategy = GenerationType.TABLE)
    • 키 생성용 테이블 사용, 모든 DB에서 사용
    • @TableGenerator 필요합니다.
  • @Id @GeneratedValue(strategy = GenerationType.AUTO)
    • 디폴트
    • 방언(dialect)에 따라 위의 3가지 방법 중 자동 지정합니다.

4.권장하는 식별자 전략

  • 기본키의 제약 조건: null 아니고, 유일하며, 변하면 안됩니다.
  • 미래까지 이 조건을 만족하는 자연키는 찾기 어려우니 대체키를 사용해야 합니다.

    왜냐하면? 변하지 않는 것은 없기 때문에

  • 대체키는 데이터베이스의 Sequence, Auto Increment, 키 생성 테이블 등 비즈니스와 전혀 관계없는 것을 쓰는 것이 좋습니다.
  • int타입은 10억~20억 사이에서 끝나기 때문에 Long을 쓰는 것을 권장합니다.
  • 권장: Long타입 + 대체키 + 키 생성전략 사용