스프링 공부/JPA

[JPA] 6. 기본키 매핑

장아장 2022. 10. 20. 20:13

엔티티를 만들어서 @Entity, @Table만 매핑을 한다면 에러가 발생한다. 

이유는 테이블엔 무조건 기본키가 존재해야 하기 때문이다. 

 

이 기본키는 쉽게 @Id라는 어노테이션으로 등록시킬 수 있다. 

@Id만 존재한다면 기본키를 직접 입력시켜주어야 한다. 하지만, 다른 입력되는 값들, 연산되는 값들과 다르게 기본키는 다른 값을 통해서 사용하거나, 다른 값을 가져와 사용하면 안된다. (주민등록번호나 전화번호같은 경우에도 사람마다 다르겠지만, 사용하는 걸 권장하는 곳은 없다. )

 

그렇기 때문에 기본키 자체의 생성방식을 설정시켜준다. 

이를 @GeneratedValue(strategy = GenerationType.????)처럼 작성해 생성방식을 명시해준다. 

???? =

IDENTITY 데이터베이스에게 기본키 생성 방식의 결정을 양도시킨다. (MySql같은 경우엔 그냥 1씩 증가시킨다. )
SEQUENCE 시퀀스 오브젝트를 만들어내고, 그 시퀀스대로 기본키를 만들어낸다. 
TABLE 키 생성 전용 테이블을 만들어둔다. 이 테이블에 저장된 값들을 이용해 시퀀스와 비슷한 방식으로 동작한다. 
AUTO 위 3개 중에 데이터베이스 방언에 맞게 자동 생성시킨다. 

AUTO는 말 그대로 자동모드이므로, 다른 3가지를 공부해보았다. 

IDENTITY : 기본키는 DB가 알아서 생성시키게 한다. 

  • MySQL 은 IDENTITY 사용시, 하나씩 증가시키는 auto increment방식을 사용한다. 
  • IDENTITY의 애매한 부분은, 데이터베이스에서 기본키가 만들어진다는 것은, 앞에서 언급되었던 1차 캐시에 스냅샷, 엔티티와 매핑되는 기본키가 없다는 것이다. 
  • 그렇기 때문에, insert 쿼리문이 쓰기 지연 sql 저장소로 가지 않고 바로 전송된다. 
  • 이후에 DB에서 기본키를 다시 가져와 1차 캐시에 저장시킨다. 
  • 이러한 IDENTITY로 인한 쿼리문들을 로그로 나타나지 않는다. 

SEQUENCE : 시퀀스 오브젝트를 만들어 사용한다. 

  • 시퀀스는 SequenceGenerator로 특정 시퀀스를 만들거나, 자동 생성된 시퀀스를 사용한다. 
  • 시퀀스 오브젝트를 새팅한 후 값을 만들어 넣는다. (이 땐 기본키가 무조건 숫자형 변수를 사용해야한다. )
  • 시퀀스 세팅에 따라 다음 기본키들을 자동 설정해준다.
  • .persist()를 하게 되면 시퀀스에 따라 생성된 기본키로 1차 캐시에 저장시킨다. 
  • 커밋을 할 때 한번에 쓰기지연 SQL 저장소의 insert 쿼리들이 데이터베이스로 보내진다. 
  • 이 때 시퀀스의 allocationSize를 알맞게 설정해, 최적화를 해주는 것이 중요하다. 

TABLE : 키 생성 전용 테이블 생성 후 SEQUENCE와 같은 방식으로 동작한다. 

  • 시퀀스 테이블을 따로 만들어 저장시킨다. 각 테이블은 시퀀스테이블의 연관된 튜플에서 시퀀스를 보고 기본키를 만들어 쓴다. 
  • 데이터베이스마다 기본적으로 SEQUENCE, IDENTITY중 안되는 것이 있더라도, TABLE 방식은 테이블에 인스턴스로 값을 넣는 것이기에 어떤 DB에서건 사용할 수 있다. 
  • 문제는, 시퀀스도 테이블에 정해진 시퀀스에 따라 한번에 갈 수 있는데, TABLE은 시퀀스 테이블에서 기본키를 가져오고, 이를 다시 쓰는 방식으로, 같은 결과를 가져와도 손이 더 탄다.