JPA

엔티티 매핑 어노테이션 정리

Beekei 2021. 12. 28. 16:34
반응형

JPA르 사용하는데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다. 따라서 매핑 어노테이션을 숙지하고 사용해야 한다. 아래 자주 쓰이는 기본적인 엔티티 매핑 어노테이션을 정리해보았다.

@Entity

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여햐 한다.

@Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라 부른다.

속성 기능 기본값(Default)
name 엔티티 이름을 지정한다. 이름이 같은 엔티티 클래스가 있다면 다른 이름을 지정해서 충돌되지 않게 해야한다. 미 설정 시 클래스 이름을 그대로 사용
  • 기본 생성자는 필수 (public, protected)
  • final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
  • 저장할 필드에 final을 사용하면 안 된다.
@Entity
public class Member {
	...
}

@Table

엔티티와 매핑할 테이블을 지정한다. 생략 시 매핑한 엔티티 이름을 테이블 이름으로 사용한다.

속성 기능 기본값(Default)
name 매핑할 테이블 이름 엔티티 이름 사용
catalog catalog 기능이 있는 데이터베이스에서 catalog를 매핑  
schema schema 기능이 있는 데이터베이스에서 schema를 매핑  
uniqueConstraints
(DDL)
DDL 생성 시에 유니크 제약조건을 만든다.
2개 이상의 복합 유니크 제약조건도 만들 수 있다.
참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들때만 사용한다.


@Entity
@Table(name="table_member")
public class Member {
	...
}

@Id, @GeneratedValue

기본키 컬럼을 지정(@Id)하고 기본키 매핑 전략을 설정(@GeneratedValue)한다. 

속성 기능 기본값(Default)
strategy GenerationType.TABLE : 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략(모든 데이터베이스 적용 가능) 
GenerationType.SEQUENCE : 데이터베이스 Sequence Object 사용
GenerationType.IDENTITY : 데이터베이스에 위임
GenerationType.AUTO : 방언에 따라 위의 세 가지 전략을 자동으로 지정
(MYSQL -> IDENTITY, 오라클 -> SEQUENCE)
GenerationType.AUTO
@Entity
@Table(name="table_member")
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
}

참고

 

 

[JPA] 기본키(PK) 매핑 방법 및 생성 전략 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io


@SequenceGenerator

시퀀스를 생성한다.

속성 기능 기본값(Default)
name 식별자 생성기 이름 필수
sequenceName 데이터베이스에 등록되어 있는 시퀀스 이름 hibernate_sequence
initialValue DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다. 1
allocationSize 시쿼스 한 번 호출에 증가하는 수(성능 최적화에 사용됨) 50
catalog, scheme 데이터베이스 catalog, schema 이름  

시퀀스 생성 DDL 

create sequence [sequenceName]
start with [initialValue] increment by [allocationSize]
@Entity
@Table(name="table_member")
@SequenceGenerator(
	name = "MEMBER_SEQ_GENERATOR",
    sequenceName = "MEMBER_SEQ",
    initialValue = 1,
    allocationSize = 1
)
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
    private long id;
    
}

SequenceGenerator.allocationSize의 기본값이 50인것에 주의해야 한다.

스퀀스를 호출할 떄마다 값이 50씩 증가하게 된다.

데이터베이스 스퀀스 값이 하나씩 증가하도록 설정되어 있다면 반듯이 값을 1로 설정해야 한다.


@TableGenerator

키 생성 전용 테이블 생성

속성 기능 기본값(Default)
name 식별자 생성기 이름 필수
table 키생성 테이블명 hibernate_sequences
pkColumnName 시퀀스 컬럼명 sequence_name
valueColumnName 시퀀스 값 컬럼명 next_val
initialValue 초기 값, 마지막으로 생성된 값이 기준 0
allocationSize 시쿼스 한 번 호출에 증가하는 수(성능 최적화에 사용됨) 50
catalog, scheme 데이터베이스 catalog, schema 이름  
uniqueConstraints
(DDL)
유니크 제약 조건을 지정할 수 있다.  
@Entity
@Table(name="table_member")
@TableGenerator(
    name = "MEMBER_SEQ_GENERATOR",
    table = "MY_SEQUENCES",
    pkColumnValue = "MEMBER_SEQ",
    allocationSize = 1
)
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")
    private long id;
    
}

@Column

객체 필드를 테이블 컬럼에 매핑한다.

속성 기능 기본값(Default)
name 필드와 매핑할 테이블 컬럼 이름 객체의 필드 이름
insertable false 설정 시 해당 필드는 데이터베이스에 저장되지 않는다.   true
updatable false 설정 시 해당 필드는 데이터데이스에 수정되지 않는다. true
table 하나의 엔티티를 두 개 이상의 테이블에 매필할 때 사용 현재 엔티티에 매핑된 테이블
nullable(DDL) null 값의 허용 여부를 설정
false 설정 시 NOT NULL 제약조건 DDL 생성
true
unique(DDL) 유니크 제약조건 설정  
columnDefinition
(DDL)
데이터베이스 컬럼 정보를 직접 줄 수 있다. 필드의 자바 타입과 방언 정보를 사용해서 적절한 컬럼 타입을 생성
length(DDL) 문자 길이 제약 조건
String 타입에만 사용한다.
255
precision, scale
(DDL)
BigDecimal, BigInteger 타입에 사용(아주 큰 숫자나 정밀한 소수)
precision은 소수점을 포함한 전체 자릿수
scale은 소수 자릿수
double, float 타입에는 적용되지 않는다.
precision = 19
scale = 2
@Entity
@Table(name="table_member")
public class Member {
    
    @Column(name = "member_name", length = 30, nullable = false)
    private String memberName;
   
}

@Enumerated

enum 타입을 컬럼과 매핑한다.

속성 기능 기본값(Default)
value
EnumType.ORDINAL : enum 값의 순서를 DB에 저장
EnumType.STRING : enum 값의 이름을 DB에 저장
EnumType.STRING

EnumType.ORDINAL

  • 장점 : 데이터베이스에 저장되는 데이터 크기가 작다.
  • 단점 : 이미 저장된 enum의 순서를 변경할 수 없다.

EnumType.STRING

  • 장점 : 저장된 enum의 순서가 바뀌거나 enum이 추가되어도 안전하다.
  • 단점 : 데이터베이스에 저장되는 데이터 크기가 ORDINAL에 비해서 크다.
@Entity
@Table(name="table_member")
public class Member {
    
    @Enumerated(value = EnumType.STRING)
    private MemberType memberType;
   
}

@Temporal

날짜 형식 컬럼에 Date 객체를 매핑

속성 기능 기본값(Default)
@Temporal(타입)
TemporalType.Date : 년-월-일 의 date 타입
TemporalType.Time : 시:분:초 의  time 타입
TemporalType.TIMESTAMP :date + time 의 timestamp(datetime) 타입
TemporalType.TIMESTAMP
@Entity
@Table(name="table_member")
public class Member {
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;
   
}

@Lob

데이터베이스 BLOB, CLOB 타입과 매핑한다.

@Lob에는 지정할 수 있는 속성이 없다. 대신 매핑하는 필드 타입이 문자면 CLOB으로, 나머지는 BLOB으로 매핑한다.

  • CLOB : String, char[], java.sql.CLOB
  • BLOB : byte[], java.sql.BLOB
@Entity
@Table(name="table_member")
public class Member {
    
    @Lob
    private String lobString;
   
}

@Transient

데이터베이스 컬럼과 필드를 컬럼하지 않는다.

조회도 하지않고 저장도 하지 않기 때문에 임시로 어떤 값을 보관하고 싶을 때 사용한다.

@Entity
@Table(name="table_member")
public class Member {
    
    @Transient
    private Integer temp;
   
}

@Access

JPA가 엔티티 데이터에 접근하는 방식을 지정한다.

@Access가 설정되어있지 않으면 @Id의 위치를 기준으로 접근방식이 설정된다.

AccessType.FIELD - 필드에 직접 접근한다. 필드 접근 권한이 private이어도 접근할 수 있다.

@Entity
@Table(name="table_member")
@Access(AccessType.FIELD)
public class Member {
    
    @Id
    private String id;
   
}

AccessType.PROPERTY - 접근자(Getter)를 사용한다. 

@Entity
@Table(name="table_member")
@Access(AccessType.PROPERTY)
public class Member {
    
    private String id;
    
    @Id
    public String getId() {
    	return id;
    }
   
}

 

필드 접근방식과 프로퍼티 접근방식을 함께 사용하는 것도 가능하다.

@Entity
@Table(name="table_member")
public class Member {
    
    @Id // 필드 접근방식
    private String id;
    	
    private String firstName;
    private String lastName;
    
    @Transient
    private String fullName;
    
    @Access(AccessType.PROPERTY) // 프로퍼티 접근방식
    public String getFullName() {
    	return firstName + lastName;
    }
   
}
반응형