엔티티 매핑
- 객체와 테이블 매핑: @Entity, @Table
- 필드와 컬럼 매핑: @Column
- 기본 키 매핑: @Id
- 연관관계 매핑: @ManyToOne, @JoinColumn
1. 객체와 테이블 매핑
@Entity
- @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다.
주의
기본 생성자 필수!!
final 클래스, enum, interface, inner클래스에는 사용 불가능!
저장할 필드에 final 사용 불가능
@Entity 속성 정리
- 속성: name
JPA
에서 사용할 엔티티 이름- 기본값: 클래스 이름 그대로 사용
@Table
- @Table은 엔티티와 매핑할 테이블 지정
Table 속성 정리
속성 | 기능 | 기본값 |
---|---|---|
name | 매핑할 테이블 이름 | 엔티티 이름을 사용 |
catalog | 데이터베이스 catalog 매핑 | |
schema | 데이터베이스 schema 매핑 | |
uniqueConstraints(DDL) | DDL 생성 시에 유니크 제약 조건 생성 |
데이터베이스 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동 생성
- 테이블 중심 -> 객체 중심
- 데이터베이스 방언(
hibernate.dialect
)을 활용하여 데이터베이스에 맞는 적절한 DDL 생성 - 생성된 DDL은 개발장비에서만 사용하고 운영서버에서는 사용하지 않거나, 적절히 다듬어 사용
스키마 자동 생성 - 속성
hibernate.hbm2ddl.auto
옵션 | 설명 |
---|---|
create | 기존테이블 삭제 후 다시 생성 (DROP + CREATE) |
create-drop | create와 같으나 종료시점에 테이블 DROP |
update | 변경분만 반영(운영DB에는 사용하면 안됨) |
validate | 엔티티와 테이블이 정상 매핑되었는지만 확인 |
none | 사용하지 않음 |
주의
운영 장비에는 절대 create, create-drop, update 사용 x
개발 초기 단계는 create 또는 update
테스트 서버는 updqte 또는 validate
스테이징과 운영 서버는 validate 또는 none
DDL 생성기능
- 제약조건 추가: 회원 이름은 필수, 10자 초과x
@Column(nullable = false, length = 10)
- 유니크 제약조건 추가
@Table(uniqueConstraints = {@UniqueConstraints(name = "NAME_AGEUNIQUE", columnNames = {"NAME", "AGE"})})
참고
DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.
2. 필드와 컬럼 매핑
@Column
컬럼 매핑
@Column 속성
속성 | 설명 | 기본값 |
---|---|---|
name | 필드와 매핑할 테이블의 컬럼 이름 | 객체의 필드 이름 |
insertable, up datable | 등록, 변경 가능 여부 | TRUE |
nullable(DDL) | null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다. | |
unique(DDL) | @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. | |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. ex) varchar(100) default ‘EMPTY' | 필드의 자바 타입과방언 정보를 사용해서 적절한 컬럼 타입 |
length(DDL) | 문자 길이 제약조건, String 타입에만 사용한다. | 255 |
precision, scale(DDL) | BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자 릿수를, scale은 소수의 자릿수다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정 밀한 소수를 다루어야 할 때만 사용한다. | precision=19, scale=2 |
@Enumerated
자바 enum 타입을 매핑할 때 사용
@Enumerated 속성
- value
- EnumType.ORDINAL: enum 순서를 데이터베이스에 저장
- EnumType.STRING: enum 이름을 데이터 베이스에 저장
- 기본값: ORDINAL
주의
ORDINAL 사용x
@Temporal
날짜 타입을 매핑할 때 사용
@Temporal 속성
- value
- TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑 (예: 2013–10–11)
- TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑(예: 11:11:11)
- TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스 timestamp 타입과 매핑(예: 2013–10–11 11:11:11)
참고
LocalDate, LocalDateTime을 사용할 때는 생략 가능
@Lob
매핑하는 필드 타입이 문자면 CLOB핑, 나머지는 BLOB 매핑
- CLOB: String, char[], java.sql.CLOB
- BLOB: byte[], java.sql. BLOB
@Transient
- 매핑하지 않는 필드일때 사용
- 데이터베이스에 저장x, 조회x
3. 기본 키 매핑
기본 키 매핑 방법
• 직접 할당: @Id만 사용
• 자동 생성(@GeneratedValue)
• IDENTITY: 데이터베이스에 위임, MYSQL
• SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE
• @SequenceGenerator 필요
• TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용
• @TableGenerator 필요
• AUTO: 방언에 따라 자동 지정, 기본값
IDENTITY 전략
- 기본키 생성을 데이터 베이스에 위임(MYSQL)
- Id가 INSERT 쿼리가 날라가야 값이 생김
- JPA는 보통 트랜잭션 커밋 시 INSERT SQL 실행
- persist시 1차캐시에 엔티티를 저장하기 위해서는 PK(Id) 값이 필요함
- 따라서 IDENTITY전략은 em.persist() 시점에 즉시 INSERT로 Id(PK) 값은 null 인채로 쿼리를 보냄
- 그러면 DB에서 Id 값을 세팅하여 저장하고 JPA는 세팅된 값을 가져와 1차 캐시에 저장
SEQUENCE 전략
- 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(오라클, H2)
- allocationSize를 통해 여러 값을 한꺼번에 가져올 수 있다.(성능 최적화)
- persist() 할때마다 INSERT 쿼리를 날리지 않고 SQL 저장소(버퍼)에 보관했다가 트랜잭션 commit시에 한번에 보낼 수 있다.
- persist() 시에 쿼리를 보내지 않고, SequenceGenerator로 생성된 시퀀스를 호출한다.
- ex) initialValue = 1 , allocationSize = 50이라면, DB의 시퀀스 초기 값은 -49, 다음 값은 1이 저장되어있음.
- persist 호출시 allocationSize만큼 증가시키고 DB의 시퀀스를 호출 -> 시퀀스 값 1 반환, 다음 값은 51.
- persist 다시 호출시 allocationSize만큼 증가시키고 DB의 시퀀스를 호출 -> 시퀀스 값 51, 다음 값은 101.
- persist 다시 호출시 DB에서 시퀀스를 호출하지 않고, 1~51번까지의 시퀀스를 사용한뒤 호출
- ex) initialValue = 1 , allocationSize = 50이라면, DB의 시퀀스 초기 값은 -49, 다음 값은 1이 저장되어있음.
SequenceGenerator - 속성
속성 | 설명 | 기본값 |
---|---|---|
name | 식별자 생성기 이름 | 필수 |
sequenceName | 데이터베이스에 등록되어 있는 시퀀스 이름 | hibernate_sequence |
initialValue | DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 1 시작하는 수를 지정한다. | 1 |
allocationSize | 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨. 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다 | 50 |
catalog, schema | 데이터베이스 catalog, schema 이름 |
TABLE 전략
- 키 생성 전용 테이블을 하나 만들어서 테이터 베이스 시퀀스를 흉내내는 전략
- 장점: 모든 데이터베이스에 적용간으
- 단점: 성능
속성 | 설명 | 기본값 |
---|---|---|
name | 식별자 생성기 이름 | 필수 |
table | 키생성 테이블명 | hibernate_sequences |
pkColumnName | 시퀀스 컬럼명 | sequence_name |
valueColumnName | 시퀀스 값 컬럼명 | next_val |
pkColumnValue | 키로 사용할 값 이름 | 엔티티 이름 |
initialValue | 초기 값, 마지막으로 생성된 값이 기준이다. | 0 |
allocationSize | 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨) | 50 |
catalog, schema | 데이터베이스 catalog, schema 이름 | |
uniqueConstraints(DDL) | 유니크 제약 조건을 지정할 수 있다. |
권장하는 식별자 전략
- 기본 키 제약 조건: null 아님, 유일, 변하면 안된다.
- 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 사용하자.
- 예를 들어 주민등록번호도 기본 키로 적절하기 않다.
- 권장: Long형 + 대체키 + 키 생성전략 사용
4. 데이터 중심 설계의 문제점
- 객체 설계를 테이블 설계에 맞춘 방식
- 테이블의 외래키를 객체에 그래도 가져옴
- 객체 그래프 탐색 불가능
- 외래키의 사용으로 참조가 아니게 됨
'JPA > JPA Basic' 카테고리의 다른 글
[JPA] 5. 다양한 연관관계 매핑 (0) | 2023.01.29 |
---|---|
[JPA] 참고. @JoinColumn (0) | 2023.01.29 |
[JPA] 참고. Entity, DAO, DTO, VO (0) | 2023.01.27 |
[JPA] 에러. SQL Error 23505 (0) | 2023.01.27 |
[JPA] 4. 연관관계 매핑 기초 (0) | 2023.01.27 |
[JPA] 2. 영속성관리 (0) | 2023.01.25 |
[JPA] 1. 환경세팅 (0) | 2023.01.25 |
[JPA] 0. JPA 소개 (0) | 2023.01.25 |