DevKim
[JPA] Entity 매핑 - 객체와 테이블, 필드와 컬럼, 기본키 매핑 본문
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 형 + 대체 키 +키 생성 전략 사용하자!
'JPA' 카테고리의 다른 글
[JPA] 상속관계 매핑 & MappedSuperclass (0) | 2021.06.21 |
---|---|
[JPA] 다양한 연관관계 매핑 - N:1/1:N/1:1/N:M (0) | 2021.06.21 |
[JPA] 연관관계 매핑 - 단방향,양방향 연관관계 ,연관관계의 주인 (0) | 2021.06.19 |
[JPA] 엔티티의 생명주기 & 플러시 (flush) (0) | 2021.05.20 |
[JPA] 영속성 컨텍스트 (Persistence Context) - 1차 캐시,쓰기 지연, 변경 감지 (0) | 2021.05.20 |