일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 이펙티브자바
- rabbitmq-delayed-message-exchange
- Domain Driven Design
- delayed message plugin
- GitHub Actions
- 밋업프로젝트
- 큐시즘
- 자동처리
- cicd
- Spring Batch
- springboot
- RESTClient
- 한국대학생it경영학회
- 교육기획팀
- 영속성
- jdbc
- scheduling messages with rabbitmq
- reactive operaton
- java
- 객체지향 쿼리 언어
- JPQL
- Spring
- 30기
- 자바 ORM 표준 JPA 프로그래밍
- kusitms
- 최범균
- ddd
- 도메인 주도 개발 시작하기
- 교육기획팀원
- JPA
Archives
- Today
- Total
코딩은 마라톤
[자바 ORM 표준 JPA 프로그래밍] 4장. 엔티티 매핑 본문
@Entity
- 테이블과 매핑할 클래스는 필수로 붙여야 한다.
속성 | 기능 | 기본값 |
name | JPA에서 사용할 엔티티 이름 지정 | 클래스 이름 |
주의사항
- 기본 생성자 필수 (@NoArgsConstructor)
- final 클래스, enum, interface, inner 클래스 사용 X
- 저장할 필드에 final 사용 X
@Table
- 엔티티와 매핑할 테이블 지정
속성 | 기능 | 기본값 |
name | 매핑할 테이블 이름 | 엔티티 이름 |
catalog | catalog 기능이 있는 db에서 매핑 | |
schema | schema 기능이 있는 db에서 매핑 | |
uniqueConstraints (DDL) |
DDL 생성 시 유니크 제약조건 생성. 2개 이상의 복합 유니크 제약 조건도 만들 수 있다. DDL을 만들 때만 사용. |
데이터베이스 스키마 자동 생성
- JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다.
- JPA는 매핑 정보와 데이터베이스 방언을 사용해서 스키마를 생성한다.
<property name="hibernate.hbm2ddl.auto" value="create"/>
- hibernate.hbm2ddl.auto 속성
옵션 | 설명 |
create | 기존 테이블을 삭제 + 새로 생성 (DROP + CREATE) |
create-drop | create 속성에 추가로 애플리케이션 종료시 생성한 DDL 제거 (DROP + CREATE + DROP) |
update | db 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정 |
validate | db 테이블과 엔티티 매핑 정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션 실행 X |
none | 자동 생성 기능 사용하지 않을시 속성 자체를 삭제하거나 유효하지 않은 옵션 값을 사용 (none은 유효하지 않은 값) |
기본 키 매핑
@Entity
public class Member {
@Id
@Column(name = "ID")
private String id;
...
}
기본 키 생성 전략
- 직접 할당 : 기본 키를 애플리케이션에서 직접 할당한다. (@Id로 매핑)
- @Id 적용 가능 자바 타입
- 자바 기본형
- 자바 Wrapper 형
- String
- Date
- BigDecimal, BigInteger
- em.persist()로 엔티티를 저장하기 전에 애플리케이션에서 기본 키를 직접 할당하는 방법
- @Id 적용 가능 자바 타입
Board board = new Board();
board.setId("id1"); // 기본 키 직접 할당
em.persist(board);
- 자동 생성 : 대리키 사용 방식
- IDENTITY : 기본 키 생성을 db에 위임한다.
- @GeneratedValue 어노테이션 + GenerationType.IDENTITY 지정
- em.persist() 호출 -> 엔티티 저장 -> 할당된 식별자 값 출력 (em.persist() 호출 즉시 INSERT SQL 동작, 쓰기 지연 X)
- ex) MySQL, PostgreSQL
- SEQUENCE : db 시퀀스를 사용해서 기본 키 할당
- 유일한 값을 순서대로 생성하는 특별한 db object
- @SequenceGenerator를 사용해서 시퀀스 생성기를 등록한다.
- GenerationType.SEQUENCE + generator = "시퀀스 생성기 name"
- em.persist()호출 -> db 시퀀스 사용해서 식별자 조회 -> 조회한 식별자를 엔티티에 할당 -> 엔티티를 영속성 컨텍스트에 저장 -> 트랜잭션 커밋 및 플러시 -> 엔티티 db 저장
- ex) Oracle, PostgreSQL, DB2, H2
- TABLE : 키 생성 테이블을 사용
- 테이블을 만들어 db 시퀀스를 흉내내는 전략이다. (모든 db에 적용 가능)
- @TableGenerator를 사용해서 테이블 키 생성기를 등록한다.
- GenerationType.TABLE + generator = "테이블 키 생성기 name"
- 시퀀스 전략과 내부 동작 방식은 같다. (시퀀스 대신 테이블 사용)
- AUTO : 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택
- @GeneratedValue.strategy의 기본값
- IDENTITY : 기본 키 생성을 db에 위임한다.
필드와 컬럼 매핑 : 레퍼런스
@Column
- 객체 필드를 테이블 컬럼에 매핑
- name, nullable 주로 사용
속성 | 기능 | 기본값 |
name | 필드와 매핑할 테이블의 컬럼 이름 | 객체의 필드 이름 |
insertable (거의 사용 X) | 엔티티 저장 시 이 필드도 같이 저장 (false : 읽기 전용) |
true |
updateable (거의 사용 X) | 엔티티 수정 시 이 필드도 같이 수정 (false : 읽기 전용) |
true |
table (거의 사용 X) | 하나의 엔티티를 두개 이상의 테이블에 매핑할 때 사용 | 현재 클래스가 매핑된 테이블 |
nullable(DDL) | null 값의 허용 여부 설정 (false : not null 제약조건) |
true |
unique(DDL) | @Table의 uniqueConstraints와 동일, 한 컬럼에 유니크 제약조건을 걸 때 사용 |
|
columnDefinition(DDL) | db 컬럼 정보를 직접 줄 수 있다. | 필드의 자바 타입과 방언 정보를 사용해 적절한 컬럼 타입을 생성 |
length(DDL) | 문자 길이 제약조건, String 타입에만 사용 | 255 |
precision, scale(DDL) | BigDecimal, BigInteger에서 사용, precision : 소수점 포함한 전체 자릿수, scale : 소수의 자릿수 |
precision = 19, scale = 2 |
@Enumerated
- 자바의 enum 타입을 매핑할 때 사용
속성 | 기능 | 기본값 |
value | - EnumType.ORDINAL : enum 순서를 db에 저장 - EnumType.STRING : enum 이름을 db에 저장 |
EnumType.ORDINAL |
- EnumType.ORDINAL은 enum에 정의된 순서대로 db에 저장하기 때문에, enum의 값이 바뀔 시(순서) 이미 저장된 이전 enum의 순서를 변경할 수 없는 단점이 있다.
@Temporal
- 날짜 타입을 매핑할 때 사용
속성 | 기능 | 기본값 |
value | - TemporalType.DATE : 날짜, db date 타입과 매핑 (2013-10-11) - TemporalType.TIME : 시간, db time 타입과 매핑 (11:11:11) - TemporalType.TIMESTAMP : 날짜, 시간, db timestamp 타입과 매핑 (2013-10-11 11:11:11) |
TemporalType은 필수로 지정 |
@Lob
- db BLOB, CLOB 타입과 매핑
- 속성 정리
- CLOB : 필드 타입이 문자일 경우 / String, char[], java.sql.CLOB
- BLOB : CLOB이 아닌 나머지 / byte[], java.sql.BLOB
@Transient
- 이 필드는 매핑하지 않는다. (db에 저장, 조회 X)
- 객체에 임시로 어떤 값을 보관하고 싶을 때 사용
@Access
- JPA가 엔티티 데이터에 접근하는 방식을 지정
- 필드 접근 : AccessType.FIELD, 필드에 직접 접근한다. private 필드도 접근 가능하다. (@Id의 위치가 필드에 있는 경우)
- 프로퍼티 접근 : AccessType.PROPERTY, 접근자(Getter)를 사용한다.
출처 : 자바 ORM 표준 JPA 프로그래밍 책
'Backend > JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 6장. 다양한 연관관계 매핑 (1) | 2024.02.12 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 5장. 연관관계 매핑 기초 (0) | 2024.02.04 |
[자바 ORM 표준 JPA 프로그래밍] 3장. 영속성 관리 (0) | 2024.01.29 |
[자바 ORM 표준 JPA 프로그래밍] 2장. Java + Gradle 설정 (1) | 2024.01.28 |
[자바 ORM 표준 JPA 프로그래밍] 1장. JPA 소개 (1) | 2024.01.27 |