들어가기 전에)
JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류
-객체와 테이블 매핑: @Entity, @Table
-기본 키 매핑 : @Id
-필드와 컬럼 매핑:@Column
-연관관계 매핑:@ManyToOne, @JoinColumn
먼저 객체와 테이블 매핑 어노테이션부터 알아보자.
4.1 @Entity
@Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라 부른다.
-@Entity 속성 정리
속성 | 기능 | 기본값 |
name | JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용한다. 만약 다른 패키지에 이름이 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야 한다. | 설정하지 않으면 클래스 이름을 그대로 사용(예: Member) |
-주의사항
- 기본 생성자는 필수다(파라미터가 없는 public 또는 protected 생성자)
- final 클래스,enum,interface,inner 클래스에는 사용할 수 없다.
- 저장할 필드에 final을 사용하면 안 된다.
4.2 @Table
@Table을 엔티티와 매핑할 테이블을 지정한다.
생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
-속성 정리
속성 | 기능 | 기본값 |
name | 매핑할 테이블 이름 | 엔티티 이름을 사용한다. |
catalog | catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다. | |
schema | schema 기능이 있는 데이터베이스에서 schema를 매핑한다. | |
uniqueConstraints | DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용된다. |
4.7 필드와 컬럼 매핑: 레퍼런스
-필드와 컬럼 매핑 분류
분류 | 매핑 어노테이션 | 설명 |
필드와 컬럼 매핑 | @Column | 컬럼을 매핑한다. |
@Enumerated | 자바의 enum 타입을 매핑한다. | |
@Temporal | 날짜 타입을 매핑한다. | |
@Lob | BLOB,CLOB 타입을 매핑한다. | |
@Transient | 특정 필드를 데이터베이스에 매핑하지 않는다. | |
기타 | @Access | JPA가 엔티티에 접근하는 방식을 지정한다. |
4.7.1 @Column
@Column은 객체 필드를 테이블 컬럼에 매핑한다. 속성 중에 name, nullable이 주로 사용되고 나머지는 잘 사용되지 않는 편이다.
-속성 정리
속성 | 기능 | 기본값 |
name | 필드와 매핑할 테이블의 컬럼 이름 | 객체의 필드 이름 |
insertable (거의 사용하지 않음) |
엔티티 저장 시 이 필드도 같이 저장한다. false로 설정하면 이 필드는 데이터베이스에 저장하지 않는다. false옵션은 읽기 전용일 때 사용한다. | true |
updatable (거의 사용하지 않음) |
엔티티 수정 시 이 필드도 같이 수정한다. false로 설정하면 데이터베이스에 수정하지 않는다. false옵션은 읽기 전용일 때 사용한다. | true |
nullable(DDL) | null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙은다. | true |
unique(DDL) | @Table의 uniqueConstraintes와 같이만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. 만약 두 컬럼 이상을 사용해서 유니크 제약조건을 사용하려면 클래스 레벨에서 @Table.uniqueConstraints를 사용해야 한다. | |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. | 필드의 자바 타입과 방언 정보를 사용해서 적절한 컬럼 타입을 생성한다. |
length(DDL) | 문자 길이 제약조건, Sting 타입에만 사용한다. | 255 |
4.7.2 @Enumerated
-속성 정리
속성 | 기능 | 기본값 |
value | EnumType.ORDINAL : enum 순서를 데이터베이스에 저장 EnumType.STRING : enum 이름을 데이터베이스에 저장 |
EnumType.ORDINAL |
-사용 예
//enum 클래스
enum RoleType{
ADMIN, USER
}
//enum 이름으로 매핑
@Enumerated(EnumType.STRING)
private RoleType roleType;
//사용
member.setRoleType(RoleType.ADMIN); //DB에 문자 ADMIN으로 저장됨
- EnumType.ORDINAL은 enum에 정의된 순서대로 ADMIN은 0, USER는 1 값이 데이터베이스에 저장된다.
-장점 : 데이터베이스에 저장되는 데이터 크기가 작다.
-단점 : 이미 저장된 enum의 순서를 변경할 수 없다.
- EnumType.STRING은 enum 이름 그대로 ADMIN은 'ADMIN', USER는 'USER'라는 문자로 데이터베이스에 저장된다.
-장점 : 저장된 enum의 순서가 바뀌거나 enum이 추가되어도 안전하다
-단점 : 데이터베이스에 저장되는 데이터크기가 ORDINAL에 비해서 크다
->EnumType.STRING을 권장한다.
4.7.3 @Temporal
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
-속성 정리
속성 | 기능 | 기본값 |
value | TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑 (예: 2013-10-11) TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑(예: 11:11:11) TemporalType.TIMESTAMP : 날짜와 시간,데이터베이스 timestamp 타입과 매핑 (예 : 2013-10-11 11:11:11) |
TemporalType은 필수로 지정해야 한다. |
@Temporal을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의된다.
데이터베이스 방언에 따라 생성되는 DDL은 다음과 같다
datetime : MYSQL
timestamp : H2, 오라클, PostgreSQL
'Backend > JPA' 카테고리의 다른 글
[JPA] 여러개의 insert문을 한번에 날릴 수 있을까? (0) | 2022.02.08 |
---|---|
[JPA] 3. 영속성 관리 (0) | 2021.08.18 |
[JPA] 2-2. 애플리케이션 개발 (0) | 2021.08.04 |
[JPA] 2-1. JPA 시작 (0) | 2021.08.03 |
[JPA] 1. JPA란 무엇인가? (1) | 2021.07.01 |