DevKim

[JPA] Entity 매핑 - 객체와 테이블, 필드와 컬럼, 기본키 매핑 본문

JPA

[JPA] Entity 매핑 - 객체와 테이블, 필드와 컬럼, 기본키 매핑

on_doing 2021. 6. 18. 21:40
728x90

1. 객체와 테이블 매핑: @Entity,@Table

2. 필드와 컬럼 매핑: @Column

3. 기본 키 매핑: @Id

이 세가지에 대해 정리해보려고한다.

프로젝트 할 때 기계적으로 사용했던 애들인데, 깊게 생각해볼 시간이 없었던 것 같다.


[ 객체와 테이블 매핑 ]

1. @Entity

- @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다.

 

* 주의 *

- 기본 생성자 필수

- final,enum,interface,inner 클래스 사용 X

 

* 속성 *

(1) name

=> 헷갈리니까 웬만하면 기본값으로 그냥 클래스 이름을 그대로 사용하는게 좋지만, 

만약 다른 패키지에 같은 클래스명이 있는데 그게 또 JPA에 매핑된 경우에,

name을 지정하여 JPA가 구분할 수 있게 지정할 수 있다.


2. @Table

- 엔티티와 매핑할 테이블 지정

 

* 속성*

(1) name

=>기본적으로 회사마다 사용하는 name이 있으니 따라가면 될 것 같다.

기본값은 엔티티 이름

 

(2) catalog / schema

=>DB catalog 매핑 / schema 매핑


[ 필드와 컬럼 매핑 ]

1. @Column : 컬럼 매핑

* 속성 *

(1) name

 

(2) insertable/updatable (기본값 True)

: DB 칼럼에 등록하거나 변경 가능 여부 설정

 

(3) nullable 

: False로 설정시, DDL 생성 시에 not null 제약조건 붙음

 

(4) length

: String 타입에만 사용. 문자 길이 제약조건 (기본값=255)

 

(5) precision,scale 

: BigDecimal 타입에서 사용. 아주 큰 숫자나 정밀한 소수를 다뤄야할 때만 사용


2. @Enumerated

: enum 타입 매핑

*주의*

ORDINAL 사용 금지!!!!!!!

기본값이 ORDINAL이니 실무에선 무조건 EnumType.STRING으로 설정하고 사용해야한다!!

ORDINAL로 들어가면 enum 이름이 아닌 순서가 DB에 저장되어 겉잡을 수 없이..오류가 크게 터질 수 있다고한다..


3. @Lob

:BLOB,CLOB 매핑

: 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB으로 자동 매핑되니 크게 신경쓸 필요는 없다.


4. @Transient

: 매핑 하지않음 (무시)


[ 기본 키 매핑 ]

@Id

: 직접 할당하고 싶을 땐 @Id만 사용하면 된다

 

@GeneratedValue

: 자동생성

 

* 전략 *

@GeneratedValue(strategy = GenerationType.____)

 

(1) IDENTITY

: PK 생성을 데이터베이스에 위임

=> 보통 JPA는 트랜잭션 커밋 시점에 INSERT 쿼리를 날려주는데,

AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 후에 ID값 알 수 있음

이렇게 되면, 영속성 컨텍스트의 1차캐시에 저장될 때 PK값을 JPA가 알 수 없으니 저장할 수 없게됨

--> 따라서 IDENTITY 전략은 특별히 em.persist() 시점에 즉시! INSERT SQL을 실행하고

데이터베이스에서 식별자를 조회한다고 한다.

 

그밖에도..

(2) SEQUENCE

(3) TABLE

(4) AUTO

 

**실무에서 권장하는 식별자 전략**

- PK 제약 조건 : null 아님, 유일해야함, 변하면 안된다 (10년이 지나도..)

- 비즈니스적으로 의미있는 내추럴 키 (주민번호,,전화번호..)는 PK로 절대 사용하지말고

비즈니스와 관련없는 대리키?를 사용하는 것이 좋다 ! (sequence 나 랜덤값.. 이런거)

 

=> Long 형 + 대체 키 +키 생성 전략 사용하자!

728x90
Comments