김영한님이 지음, [자바 ORM 표준 JPA 프로그래밍] 책을 읽고 정리한 필기입니다.📢
필드 & 컬럼 매핑 레퍼런스
필드와 컬럼 매핑 분류
분류 | 매핑 어노테이션 | 설명 |
---|---|---|
필드와 컬럼 매핑 | @Column |
컬럼을 매핑 |
@Enumerated |
자바의 enum과 매핑 | |
@Temporal |
날짜 타입과 매핑 | |
@Lob |
BLOB, CLOB 타입을 매핑 | |
@Transient |
특정 필드를 데이터베이스에 매핑하지 않음 | |
기타 | @Access |
JPA가 엔티티에 접근하는 방식을 지정 |
@Column
속성 | 기능 | 기본값 |
---|---|---|
name |
필드와 매핑할 데이틉의 컬럼 이름 | 객체의 필드 이름 |
insertable (거의 사용하지 않음) |
엔티티 저장 시 이 필드도 같이 지정한다. false 로 설정하면 이 필드는 데이터베이스에 저장하지 않는다. false 옵션은 읽기 전용일 때만 사용한다. |
true |
updatable (거의 사용하지 않음) |
엔티티 저장 시 이 필드도 같이 지정한다. false 로 설정하면 이 필드는 데이터베이스에 저장하지 않는다. false 옵션은 읽기 전용일 때만 사용한다. |
true |
table (거의 사용하지 않음) |
하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용한다. 지정한 필드를 다른 테이블에 매핑할 수 있다. | 현재 클래스가 매핑된 테이블 |
nullable (DDL) |
null 값의 허용 여부를 설정한다. false 로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다. |
true |
unique DDL) |
@Table 의 uniqueConstraints 와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. 만약 두 컬럼 이상을 사용해서 유니크 제약조건을 사용하려면 클래스 레벨에서 @Table.uniqueConstraints 를 사용해야 한다. |
|
columnDefinition (DDL) |
데이터베이스 컬럼 정보를 직접 줄 수 있다. | 필드의 자바 타입과 방언 정보를 사용해서 적절한 컬럼 타입을 생성한다. |
length (DDL) |
문자 길이 제약조건, String 타입에만 사용한다. |
255 |
percision , scale (DDL) |
BigDecimal 타입에서 사용한다.(BigInteger 도 사용 가능) percision 은 소수점을 포함한 전체 자릿수를, scale 은 소수의 자릿수다. 참고로 double , float 타입에는 적용되지 않는다. 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다. |
percision =19, scale =2 |
name
,nullable
이 주로 사용되며 나머지는 잘 사용되지 않는 편insertable
,updatable
속성은 데이터베이스에 저장되어 있는 정보를 읽기만 하고 실수로 변경하는 것을 방지하고 싶을 때 사용
@Enumerated
enum 타입과 매핑할 때 사용한다.
속성 | 기능 | 기본값 |
---|---|---|
value |
- EnumType.ORDINAL : enum 순서를 데이터베이스에 저장- EnumType.STRING : enum 이름을 데이터베이스에 저장 |
EnumType.ORDINAL |
사용 예
1
2
3
4
5
6
7
8
9
10
11
//정의
enum RoleType{
ADMIN, USER
}
//매핑
@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
에 비해서 크다.
@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 은 필수로 지정해야 한다. |
사용 예
1
2
3
4
5
6
7
8
@Temporal(TemporalType.DATE)
private Date date; //날짜
@Temporal(TemporalType.TIME)
pricate Date time; //시간
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp; //날짜와 시간
@Lob
데이터베이스 BLOB, CLOB 타입과 매핑한다.
지정할 수 있는 속성은 없고 매핑하는 핑드 타입에 따라 결정 된다.
- CLOB :
String
,char[]
,java.sql.CLOB
- BLOB :
byte[]
,java.sql.BLOB
사용 예
1
2
3
4
5
@Lob
private String lobString;
@Lob
private byte[] lobByte;
1
2
3
4
5
6
7
8
9
10
11
12
//생성된 DDL
//오라클
lobStirng clob,
lobByte blob,
//MySQL
lobString longtext,
lobByte longblob,
//PostgreSQL
lobString text,
lobByte oid,
@Transient
이 필드는 매핑하지 않는다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용
1
2
@Transient
private Integer temp;
@Access
JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
- 필드 접근 :
AccessType.FIELD
로 지정. 필드에 직접 접근. 필드 접근 권한이private
여도 접근 가능 - 프로퍼티 접근 :
AccessType.PROPERTY
로 지정. 접근자(Getter)를 사용.
해당 어노테이션을 지정하지 않을 경우 @Id
의 위치를 기준으로 접근 방식이 설정 됨
사용 예
1
2
3
4
5
6
7
8
9
@Entity
@Access(AccessType.FIELD) // @Id 가 필드에 있으므로 생략 가능
public class Member {
@Id
private String id;
private String data1;
private String data2;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Entity
@Access(AccessType.PROPERTY) // @Id 가 프로퍼티에 있으므로 생략 가능
public class Member {
private String id;
private String data1;
private String data2;
@Id
public String getId(){
return id;
}
@Column
public String getData1(){
return data1;
}
public String getData2(){
return data2;
}
}
필드, 프로퍼티 접근 함께 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Entity
public class Member {
@Id
private String id;
@Transient
private String firstName;
@Transient
private String lastName;
@Access(AccessType.PROPERTY)
public String getFullName(){
return firstName + lastName; //이 엔티티를 저장하면 테이블의 FULLNAME 컬럼에 firstName + lastName의 결과가 저장 됨
}
}
댓글남기기