본문 바로가기
JAVA/JPA

인프런 JPA 4화 필드 컬럼 "김영한 강사" -PlusUltraCode-

by PlusUltraCode 2024. 7. 19.

엔티티 매핑에 대해 알아보자

@Entity와 @Table 어노테이션

 
@Entity @Table(name="MBR")

위와 같이 선언하면, MBR이라는 데이터베이스의 테이블을 매핑한다.

Hibernate DDL 생성 옵션

 
<property name="hibernate.hbm2ddl.auto" value="create" />

hbm2ddl.auto 옵션은 다음과 같이 설정할 수 있다:

  • create: 기존 테이블을 삭제하고 다시 생성
  • create-drop: 애플리케이션 종료 시 테이블 삭제
  • update: 변경된 내용만 반영 (삭제는 하지 않음)
  • validate: 엔티티와 테이블이 정상적으로 매핑되었는지 확인

권장 사용 시점

  • 개발 초기: create 또는 update
  • 테스트 서버: update 또는 validate
  • 스테이징과 운영 서버: validate 또는 none

주의: 운영 서버에서는 절대 create, create-drop, update를 사용하지 말 것. 문제를 야기할 수 있다.

DDL 생성 기능

 
@Column(nullable = false, length = 10)

이와 같은 어노테이션은 런타임 시에는 영향을 주지 않으며, JPA 실행 로직에는 영향을 미치지 않는다.

필드와 컬럼 매핑

Enum 타입 매핑

데이터베이스에는 enum 타입이 없기 때문에 다음과 같이 매핑한다:

 
@Enumerated(EnumType.STRING) private MemberStatus status;

큰 문장 데이터 매핑

긴 텍스트를 저장하고 싶다면 다음 어노테이션을 사용한다:

 
@Lob or @Text private String largeText;

BigDecimal 타입 매핑

정밀한 숫자 데이터를 다룰 때:

 
@Column(precision=17, scale=4)
private BigDecimal amount;

EnumType 기본 설정

기본적으로 EnumType은 숫자로 저장되지만, 문자열로 저장하기 위해서는 다음과 같이 설정해야 한다:

 
@Enumerated(EnumType.STRING)

주의: 숫자로 설정할 경우, enum에 데이터 추가 시 순서상의 오류로 인해 문제가 발생할 수 있다. 따라서 문자열로 설정하는 것이 안전하다.

매핑 제외 필드

데이터베이스와 매핑을 원하지 않는 필드에는 다음 어노테이션을 사용한다:

 
@Transient private String tempData;

기본키 매핑 전략

IDENTITY 전략

 
@GeneratedValue(strategy = GenerationType.IDENTITY)

이 설정은 데이터베이스가 자동으로 키 값을 증가시키도록 한다.

SEQUENCE 전략

반복문 배열의 인덱스처럼 원하는 형태로 키 값을 설정할 수 있다.

AUTO_INCREMENT 사용

가장 일반적으로 사용된다.

IDENTITY 전략의 문제점

IDENTITY 전략을 사용할 경우, 데이터베이스에 삽입되기 전에는 ID 값이 null이 된다. 이 문제는 jpa가 identity로 설정되어 있따느 것을 알게 되면 em.persist() 시점에 바로 insert 쿼리문을 실행하여 해결할 수 있다.

이렇게 엔티티 매핑에 대해 기본적인 개념들을 정리해보았다. 실무에서 적용할 때에는 각 상황에 맞는 매핑 전략을 선택하고, 데이터베이스 설정을 신중히 해야 한다.