엔티티 매핑 (자바 ORM 표준 JPA 프로그래밍 - 기본편)

아양시·2022년 9월 19일
0

JPA

목록 보기
1/1

1. 객체와 테이블 매핑

@Entity

  • @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다.
  • JPA를 이용해 테이블과 매핑할 클래스는 @Entity가 필수
  • 기본 생성자 필수
  • final 클래스, enum, interface, inner 클래스를 사용 x
  • 저장할 필드에 final 사용 x

2. 데이터베이스 스키마 자동 생성

  • JPA는 애플리케이션 실행 시점에 DDL(데이터베이스 방언 활용)을 자동 생성하는 기능을 제공한다.
  • 테이블 따로 생성할 필요 x
  • 개발 장비에서만 사용하고, 운영서버에서는 사용하지 말 것

속성

hibernate.hbm2ddl.auto
  • create : 기존 테이블 삭제 후 다시 생성
  • create-drop : create와 같으니 종료 시점에 drop
  • update : 변경 부분만 반영(운영 DB에는 사용하면 안됨) - 삭제는 반영 x
  • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인 - DB에 없는 컬럼 멤버가 존재하면 에러 발생
  • none : 사용하지 않음

주의할 것

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

DDL 생성 기능

  • 제약조건 추가
    @Column(nullable = false, length = 10, unique = true)
  • 유니크 제약조건 추가
    @Table(uniqueConstraints={@UniqueConstraint(name="NAME_AGE_UNIQUE", columnNames={"NAME", "AGE"})})
  • JPA의 실행 로직에는 영향을 주지 않으며, DDL 자동 생성 시에만 사용된다.

3. 필드와 컬럼 매핑

@Column

컬럼 매핑

  • name : 필드와 매핑할 테이블의 컬럼 이름 (기본값 : 객체의 필드 이름)
  • insertable, updatable : 등록, 변경 가능 여부 (기본값 : TRUE)
  • nullable(DDL) : null값의 허용 여부
  • unique(DDL) : 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용
  • columnDefinition(DDL) : 데이터베이스 컬럼 정보 직접 작성
  • length(DDL) : 문자 길이 제약조건, String 타입에만 사용
  • precision, scale(DDL) : 아주 큰 숫자나 정밀한 소수를 다뤄야 할 때 사용 (기본값 : precision=19, scale=2)

@Temporal

날짜 타입 매핑 (DATE/TIME/TIMESTAMP)

  • 현재는 LocalDate, LocalDateTime 사용해서 생략 가능

@Enumerated

enum 타입 매핑

  • Enum.ORDINAL : enum 순서를 데이터베이스에 저장(integer)
  • EnumType.STRING : enum 이름을 데이터베이스에 저장
  • enum 값 추가 시 같은 값, 다른 의미인 경우가 발생할 수 있으므로 ORDINAL을 사용하지 말 것

@Lob

BLOB, CLOB 매핑 (varchar를 넘어서는 큰 문자열)

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

@Transient

특정 필드를 컬럼에 매핑하지 않음 (매핑 무시)


4. 기본 키 매핑

직접 할당

@Id

자동 생성

@GeneratedValue, stategy를 아래에서 선택 가능

  • AUTO(default) : 데이터베이스 방언에 맞춰 아래 중 자동 선택
  • IDENTITY
    • 기본 키 생성을 데이터베이스에 위임
    • 데이터베이스에 insert되어야 PK를 알 수 있다. -> 1차 캐시의 key를 위해 persist를 호출하자 마자 insert 쿼리를 날림. (commit하는 시점이 아니어도)
  • SEQUENCE
    • sequence object를 통해 유일한 값을 순서대로 생성
      테이블마다 다른 sequence를 사용하고 싶은 경우 @SequenceGenerator로 설정 가능
    • em.persist()를 하려면 pk 필요 -> 시퀀스 호출
  • TABLE
    • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
    • @TableGenerator로 설정 가능
  • allocationSize
    • 미리 DB에 특정 개수를 올려놓고 나는 메모리에서 1씩 사용, 다 쓰면 다시 호출
    • call next value 최초 호출로 시퀀스 값 세팅
    • 동시성 문제 없음.

권장하는 식별자 전략

  • 비즈니스에서 의미있는 자연키를 찾기 어렵기 때문에 대체키를 이용하자.
  • Long형 + 대체키(시퀀스, UUID 등) + 키 생성전략
profile
BE Developer

0개의 댓글