"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다."
www.inflearn.com/course/ORM-JPA-Basic#
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그
www.inflearn.com
기본 키 매핑 전략(3) - TABLE 전략
- @GeneratedValue(strategy = GenerationType.TABLE)
: 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
장점
- 어떤 데이터베이스는 autoincrement 가 있고 어떤 데이터베이스는 sequence 가 있다.
둘 중 하나를 선택해야 하는데, TABLE 전략은 모든 데이터베이스에 다 적용할 수 있다.
테이블 하나를 만들어서 그곳에서 다 generate 를 뽑는다.
단점
- 테이블을 직접 사용하므로 별도의 테이블 이라고 해도 아무래도 성능에 있어 이슈가 있다.
sequence object 와 같은 경우는 숫자를 뽑는데 최적화가 되어 있는데 TABLE 은 최적화가 되어 있지 않은 것이 예시이다.
코드 예시
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumn = "MEMBER_SEQ", allocationSize = 1
)
public class Member{
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
hiberante SQL & message
Hibernate:
create table MY_SEQUENCES ( // MY_SEQUENCES 테이블 생성
sequence_name varchar(255) not null,
next_val bigint, // next_val 값은 entity 가 새로 삽입되면 될 수록 점점 값이 증가한다.
primary key (sequence_name)
)
Hibernate:
insert into MY_SEQUENCES(sequence_name, next_val) values ('MEMBER_SEQ',0)
그런데 운영에서는 테이블 전략을 사용하기는 조금 부담스럽다.
DB 에서 보통 관례로 쓰는 것이 있기 때문에 되도록이면 관례적으로 쓰는 전략을 활용하자.
사실 TABLE 매핑 전략을 잘 쓰진 않는다고 한다.
권장하는 식별자 전략?
- 데이터베이스의 기본 키 제약 조건에 대해 생각해보는게 필요하다.
- null 이 아니고, 유일해야 하며, 변하면 안된다.(변하면 안된다는 속성이 가장 어렵다, 정말 먼 미래까지 변하면 안되기 때문, 애플리케이션 전체 수명동안 바뀌면 안된다.)
- 미래까지 이 조건을 만족하는 자연키(주민등록번호, 전화번호 같은 것들)는 찾기 어렵다. 대신 대리키(대체키)를 사용하자.(비즈니스와 전혀 상관없는 키)
- 주민 등록번호도 기본 키로 적절하지 않다.(주민 등록번호를 기본 키로 쓰면 기본 키만 문제가 아니라, 회원을 가져다 쓴 나머지 테이블들이 join 하려면 외래키를 들고 있어야 하는데 당연히 기본키를 외래 키로 들고 있다.)
(즉, 주민 등록번호 기본 키가 다 퍼져있는 것이다. 그거 하나하나 전부 바꿔줘야 한다. -> 나라에서 주민 등록번호를 보관하고 있으면 안된다고 했는데, 주민 번호를 기본 키로 활용하고 있는 경우 일어나는 문제)
- 그런데 만약 데이터베이스 기본 키를 그냥 대체키(랜덤 값 또는 GeneratedValue, Sequence....) 로 사용하고 있는 경우, 그냥 회원 테이블에 있는 주민 번호 하나만 지우거나 대체했으면 되는 문제이다.
-> 즉 기본 키로 권장되는 것은 Long 형 + 대체 키 + 키 생성전략 사용
위 3가지 방식이 혼합되어 만들어진 기본 키인 것이다.(절대 비즈니스를 기본 키로 끌고 오는 것은 권장하지 않는다.)
'JPA' 카테고리의 다른 글
실전 예제 1 - 요구사항 분석과 기본 매핑(2) (0) | 2020.09.22 |
---|---|
실전 예제 1 - 요구사항 분석과 기본 매핑(1) (0) | 2020.09.22 |
기본 키 매핑 - 2 (0) | 2020.09.21 |
기본 키 매핑 - 1 (0) | 2020.09.21 |
필드와 컬럼 매핑 - 2 (0) | 2020.09.19 |