1. Entity 매핑 어노테이션
-
객체, 테이블 매핑
@Entity, @table -
필드와 컬럼 매핑
@Column -
기본 키 매핑
@Id -
연관관계 매핑
@ManyToOne, @JoinColumn
Entity 의미
@Entity가 붙은 클래스는 JPA가 관리하고 하는 엔티티라고 하며 JPA에서 사용하는 테이블과 매핑할 클래스는 @Entity는 필수로 사용되어지고 있습니다.
여기서 가장 중요한것은 기본 생성자는 필수로 있어야하며, final, enum, interface, inner 클래스는 사용할 수없습니다. 즉, 해당것들을 매핑이 불가능하게 됩니다. 그리고 저장할 필드에서는 final을 사용하면 안됩니다.
Entity 속성
name속성 같은경우는 사용할 엔티티 이름을 지정합니다. 기본값은 현재 클래스의 이름을 그대로 사용하고 같은 클래스 이름이 없으면 가급적으로 기본값을 사용하는것이 가장 좋습니다.
2. 테이블 매핑 어노테이션
@Table 어노테이션은 엔티티와 매핑할 테이블일 지정합니다. 테이블 매핑 어노테이션은 여러가지 속성들을 가지고 있는데 대표적인것들이 4가지로 나눌 수 있습니다.
- name: 매핑할 테이블 이름
- catalog: 데이터베이스 catalog 매핑
- schema: 데이터베이스 schema 매핑
- uniqueConstraints DDL 생성 시에 유니크 제약 조건 생성
3. 데이터 베이스 DDL 스키마
데이터베이스에서 스키마가 자동생성은 DDL을 애플리케이션 생성 시점에 자동 생성이 됩니다. 이것은 테이블 중심에서 객체중심으로 옮겨간 패러다임이라고 할 수 있으며 데이터베이스마다 방언(dialect) Mysql, Oracle 등 데이터베이스에 맞는 적절한 DDL을 생성시킬 수 있습니다. 이것은 데이터베이스에서 사용되는것이 아니라 현재 개발중인 DDL에서만 적용되게 됩니다.
3.1. 데이터베이스 스키마 자동 생성(속성)
- craete: 기존테이블 삭제 후 다시 생성합니다.(drop + create)
- create-drop: create와 같지만 종료시점에 테이블을 다시 drop시켜버립니다.
- update: 변경된 부분만 반영하고 운영쪽에서는 사용하면 위험합니다.
- validate: 엔티티와 테이블이 정상 매핑되었는지만 확인합니다.
- none: 사용하지 않는 속성
3.1.1. 코드 예제
DB Dialect 를 설정 할 수 있으며 javax로 시작하는것은 여러가지를 가지고 있는데 하이버네이트 라이브러리나 또 다른 구현체 라이브러리를 써도 사용할 수 있다. 즉, 하이버네이트 전용 옵션이라고 할 수 있습니다.
1 | <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> |
차이점이라고 하면 예를 들어 오라클같은경우는 varchar2, Mysql은 varchar과 같은 예를 들 수 있습니다. 여기서 가장 중요한점은 운영하는 서버에서는 craete, create-drop, update를 사용하면 절대 안됩니다.
개발 초기단계에는 create 또는 update를 사용하고 테스트 서버에서는 update 또는 validate를 처리할 수 있습니다. 스테이징과 운영서버는 validate 또는 none으로 처리하여 진행하면 됩니다.
3.2. DDL 생성 기능
1 |
다음과 같은 컬럼 어노테이션 속성이 있다고 가정하면 해당 컬럼은 null값이 올 수 없으며 10자를 초과할 수 없다라는 의미가 됩니다.
1 |
다음과 같은 유니크 테이블 제약조건을 처리할 수도 있습니다.
즉, DDL 생성 기능은 DDL을 자동 생성할때만 사용되고 JPA실행 로직에는 영향을 주지 않는다는점을 알고 있어야합니다.
4. 필드 및 컬럼 매핑
매핑 어노테이션 hibernate.hbm2ddl.auto
- @Column: 컬럼 매핑
- @Temporal: 날짜 타입 매핑
- @Enumerated: enum 타입 매핑
- @Lob: BLOB, CLOB 매핑(varchar 범위 넘어설때)
- @Transient: 특정 필드를 매핑하지 않음.(무시)
@Column 속성
- name: 필드와 매핑할 테이블의 칼럼 이름
- insertable, updatable: 등록,변경 가능여부
- nullable(DDL): null값의 허용 여부를 설정하고 false로 설정하면 DDL 생성시에 not null 제약조건을 붙입니다.
- unique(DDL): @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸때 사용됩니다.
- columnDefinition(DDL): 데이터베이스 컬럼 정보를 직접 줄 수 있습니다. (varchar(100) default ‘EMPTY’)
- length(DDL): 문자 길이 제약조건, String 타입에만 사용한다.
- precision, scale(DDL): BigDecimal 타입에서 사용하고 precision은 소수점을 포함한 전체 자릿수며 scale은 소수의 자릿수입니다. (double, float 타입에는 적용 X)
@Enumerated
Java Enum타입을 매핑할때 사용하며 ORDINAL 속성은 사용하지 않는게 좋다. 왜냐하면 DB에서 값이 변경되면 누락된 값이 들어갈 수 있기 때문이다.
즉, String을 사용하여야한다.
- value 속성: EnumType.ORDINAL enum순서를 DB 저장, EnumType.STRING enum 이름을 DB 저장 (기본값은 ORDINAL)
@Temporal
날짜 타입을 매핑할때 사용합니다. LocalDate, LocalDateTime을 사용할시에는 생략이 가능합니다.(java8문법)
- value 속성:
- TemporalType.DATE: 날짜 타입과 매핑 (2021-01-01 yyyy-mm-dd)
- TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑 (24:00:00 hh-mm-ss)
- TemporalType.TIMESTAMP: 날짜와 시간, timestamp와 매핑(2021-01-01 24:00:00 yyyy-mm-dd hh-mm-ss)
@Lob
데이터베이스 BLOB, CLOB 타입과 매핑
- @Lob에는 지정할 수 있는 속성이 없습니다.
- 매핑하는 필드타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
CLOB: String, char[], java.sql.CLOB
BLOB: byte[], java.sql.BLOB
@Transient
- 필드 매핑을 하지 않습니다.
- 데이터베이스에 저장 및 조회를 진행하지 않습니다.
- 주로 메모리상에서만 임시로 어떤값을 보관하고 싶을때 사용합니다.
5. 기본키 매핑
5.1. 기본 키 매핑 어노테이션
@Id, @GeneratedValue의 두가지 어노테이션을 가지고 있습니다.
기본키 매핑 방법
직접 할당은 @Id를 사용하여 할당하고 자동생성을 진행하기 위해서는 @GeneratedValue을 사용합니다.
- IDENTITY: 데이터베이스에 위임, MYSQL
- SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용 Oracle, @SequenceGenerator
- Table: 키 생성용 테이블 사용하고 모든 데이터베이스에서 사용될 수 있습니다. @TableGenerator
- AUTO: 방언에 따라 자동 지정하고 기본값으로 세팅됩니다.
IDENTITY 전략
기본키 생성을 데이터베이스에 위임하고 주로 Mysql, PostgreSQL, SQL Server, DB2에서 사용됩니다. (AUTO_INCREMENT)
그리고 JPA는 주로 트랜잭션 커밋 시점에 INSERT SQL을 실행합니다. AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 ID값을 알 수 있고 IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL을 실행하고 DB에서 식별자를 조회해옵니다.
1 |
|
SEQUENCE 전략
데이터 베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트입니다. 예를 들면 오라클 시퀀스와 같습니다. 그리고 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용됩니다.
1 |
|
- name: 식별자 이름
- sequenceName: 데이터베이스에 등록되어있는 시퀀스 이름
- initialValue: DDL 생성시에만 사용되고 시퀀스 DDL을 생성할때 처음 1 시작하는 수를 지정합니다.
- allocationSize: 시퀀스 한 번 호출에 증가하는 수이며 성능최적화에 주로 사용됩니다. 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정하여야합니다.
- catalog, schema: 데이터베이스 catalog, schema 이름
6. 테이블 전략
키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략인데 모든 데이터베이스에 적용이 가능하지만 성능적으로 뛰어나지는 않다는 단점을 가지고 있습니다.
1 |
|
@TableGenerator 속성
- name: 식별자 이름(필수값)
- table: 키생성 테이블명
- pcColumnName: 시퀀스 컬럼명
- valueColumnNa: 시퀀스 값 컬럼명
- pkColumnValue: 키로 사용할 이름
- initialValue: 초기 값, 마지막으로 생성된 값이 기준
- allocationSize: 시퀀스 한 번 호출에 증가하는 수이며 최적화에 사용된다.
- catalog, schema: 데이터베이스 catalog, schema 이름
- uniqueConstraint: 유니크 제약조건 지정
7. 권장하는 식별자 전략
기본 키 제약조건을 사용하고 null이 아니여야하고 변경성이 없어야합니다. 그리고 대체키를 활용하여 사용하도록 합니다. 즉, UUID와 같은 Long형+대체키+키생성전략을 사용하여 대체키를 생성할 수 있어야합니다. 예) 주민번호 PK