저번 포스팅에서는 기본적인 엔티티 매핑에 대해 알아보았다.
[JPA] 엔티티 매핑
JPA가 하는일 중 가장 중요한 것은 엔티티를 테이블에 매핑하는 것이다. JPA는 다양한 어노테이션을 통해 엔티티-테이블 매핑을 지원한다. 이번 포스팅에서는 엔티티 매핑을 위한 어노테이션과
ohreallystore.tistory.com
이번 포스팅에서는 JPA가 지원하는 엔티티 매핑 기능 중에서도 기본 키(Primary Key) 매핑에 대해 알아보자.
기본 키(Primary Key)
기본 키는 DB에서 엔티티의 식별자 역할을 한다. @Id 어노테이션을 통해 기본 키 칼럼을 ㅌ지정해줄 수 있다.
@Entity
public class Member {
@Id
@Column(name = "ID")
private Long id;
...
}
기본 키 값을 직접 지정해 줄수도 있지만 보통의 경우 DB에서 생성해주는 값으로 기본 키 값을 할당해준다(자동생성) 하지만 DB마다 기본 키를 생성해주는 방법은 천차만별이다. JPA는 다양한 기본 키 생성전략을 제공함으로써 이러한 문제를 해결한다.
JPA가 제공하는 기본 키 생성 전략은 다음과 같다.
- IDENTITY : 기본 키 생성을 DB에 위임한다.
- SEQUENCE : DB의 시퀀스를 이용해 기본키를 할당한다.
- TABLE : 키 생성 테이블을 사용한다.
기본 키를 직접 할당하는 방법도 있지만 직접 할당 시에는 다음과 같은 사안을 주의해야 한다.
- 기본 키 값을 반드시 지정할 것
- 기본 키 값의 중복을 방지할 것
IDENTITY 전략
IDENTITY 전략은 기본 키 값 생성을 데이터베이스에 위임하는 전략이다. 예를 들면 IDENTITY 전략을 사용할 경우, MySQL은 AUTO_INCREMENT를 통해 기본 키를 생성한다.
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
}
기본 키 값을 자동 생성하고 싶다면 @GeneratedValue 어노테이션을 필드에 @Id 와 함께 붙여주면 된다. GeneratedValue의 인자로 strategy 속성을 IDENTITY로 지정해주면 된다.
SEQUENCE 전략
데이터베이스 시퀀스란 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트이다. SEQUENCE 전략이 이 시퀀스를 이용하여 기본 키를 생성한다. 이 전략은 시퀀스를 제공하는 오라클, PostgreSQL, DB2, H2 등에서 사용할 수 있다.
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "BOARD_SEQ",
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
...
}
먼저 @SequenceGenerator를 통해 시퀀스를 만들어줄 수 있다. SequenceGenerator는 인자로 Generator의 이름을 지정하는 name과 시작 값을 설정하는 initalValue, 한번 호출에 증가시킬 양을 설정하는 allocationSize를 갖는다.
그리고 IDENTITY 전략과 마찬가지로 @GeneratedValue 어노테이션을 기본 키 필드에 지정해주고 전략과 전략에 필요한 generator를 인자로 넣어주면 된다.
SEQUENCE 전략과 최적화
SEQUENCE 전략은 데이터베이스에 값을 저장 시 기본 키 생성을 위한 시퀀스 조회 작업이 추가적으로 필요하다.
그렇기 때문에 JPA는 시퀀스 접근 횟수를 줄이기 위해 allocationSize 변수의 값을 크게 설정하여 시퀀스 값을 메모리에 미리 선점해 놓는다. 예를 들어 allocationSize=50 이면, 시퀀스를 한번에 50을 증가시킨 다음, 1~50 식별자를 메모리에 할당하는 것이다.
이 방법은 다음과 같은 장점을 지닌다.
- 시퀀스 접근 횟수를 줄인다.
- 식별자 값을 미리 선점해 놓았으므로 여러 JVM이 동시에 접근해도 기본 키 충돌이 일어나지 않는다.
하지만 만약 시퀀스 값이 한번에 많이 증가하는 것이 부담스럽다면 INSERT 쿼리의 성능을 조금 포기하더라도 allocationSize 값을 1로 설정하면 된다.
이 최적화 방법을 사용하려면 hibernate.id.new_generator_mappings 속성의 값을 true로 설정해주어야 한다.
TABLE 전략
TABLE 전략은 키 생성 전용 테이블을 만들고 여기에 이름과 값으로 사용할 칼럼을 만들어 시퀀스를 흉내내는 전략이다. 이 전략은 테이블을 사용하는 DB라면 모두 적용할 수 있다.
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCE",
pkColumnValue = "MEMBER_SEQ", allocationSize=1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
...
}
@TableGenerator 어노테이션은 식별자를 생성하기 위해 테이블 생성기를 등록한다. 먼저 생성기이 이름(name)과 테이블의 이름(table)을 지정하고, pkColumnValue를 통해 키로 사용할 값의 이름을 지정한다. allocationSize를 통해 한번에 증가시킬 양을 설정한다.
@TableGenerator 의 속성은 아래와 같다.
속성 | 기능 | default |
name | 식별자 생성기 이름 | 필수 |
table | 키생성 테이블 이름 | hibernate_sequences |
pkColumnName | 시퀀스 칼럼명 | sequence_name |
valueColumnName | 시퀀스 값 칼럼명 | next_val |
pkColumnValue | 키로 사용할 값 이름 | 엔티티 이름 |
initailValue | 초기 값 | 0 |
allocationSize | 시퀀스 한 번 호출에 증가하는 값 | 50 |
catalog, schema | 데이터베이스 카탈로그, 스키마의 이름 | |
uniqueConstraints | 유니크 제약조건을 설정 |
TABLE 전략의 최적화 방법은 SEQUENCE 전략과 마찬가지로 allocation 값을 크게 설정해주면 된다.
AUTO 전략
AUTO 전략은 기본 키 생성 전략의 디폴트 전략으로 데이터베이스 방언에 따라 자동으로 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 선택해 기본 키를 생성한다.
개발단계에서 아직 키 생성 전략이 지정되지 않았을 때 사용하면 유용하다.
마무리
이번 포스팅에서는 JPA가 지원하는 기본 키 매핑에 대해 알아보았다. 이로써 2개의 포스팅에 걸쳐 엔티티 매핑에 대해 전반적으로 알아보았다. 엔티티 매핑에 필요한 어노테이션과 속성은 상황에 따라 다르고 정말 많다. 그렇기 때문에 전부다 알려고 하기보다는 기본적으로 필요한것들만 익혀두고 나머지는 레퍼런스 등을 참고하여 개발을 하면 될것 같다.
'JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑 2 (0) | 2022.08.07 |
---|---|
[JPA] 연관관계 매핑 1 (0) | 2022.08.02 |
[JPA] 엔티티 매핑 (0) | 2022.06.22 |
[JPA] SQL을 직접 다룰 때의 문제점과 ORM 프레임워크 JPA의 등장 (0) | 2022.06.14 |
[JPA] 영속성 컨텍스트 (Persistance Context) (0) | 2022.06.09 |