김영한님이 지음, [자바 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
uniqueDDL) @TableuniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. 만약 두 컬럼 이상을 사용해서 유니크 제약조건을 사용하려면 클래스 레벨에서 @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의 결과가 저장 됨
    }
}

JPA 카테고리 내 다른 글 보러가기

댓글남기기