기본키(Primary Key) 매핑 - @Id, @GeneratedValue

2023. 7. 29. 21:00

 

 

 

💡 @Id

➡️ JPA 엔티티 객체의 식별자, 데이터베이스 테이블의 기본 키와 객체의 필드를 매핑시켜주는 어노테이션이다.

➡️ @Id만 사용할 경우 기본 키를 직접 할당해 주어야 하지만 대신 데이터베이스가 생성해 주는 값을 사용하려면 @GeneratedValue를 사용하면 된다. 

 

 

💡 GeneratedValue

➡️ 기본 키를 자동 생성해 주는 어노테이션이다. 속성으로는 strategy(전략)가 있으며 이를 통해 자동 생성 전략을 지정해 줄 수 있다. 

➡️ 자동 생성 전략은 총 네 가지가 존재한다. 

 

 

✔️ IDENTITY

@GeneratedValue(strategy = GeneratedType.IDENTITY)
Indicates that the persistence provider must assign primary keys for the entity using a database identity column.
: 영속성 제공자가 데이터베이스 ID 열을 사용하여 엔티티에 대한 기본키를 할당해야 함을 나타낸다. 

➡️ 즉 기본 키 생성을 데이터베이스에 위임하는 전략이다. AUTO_INCREMENT처럼 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용한다. 

➡️  em.persist() 시점에 INSERT SQL 실행하고 DB에서 식별자를 조회한다. 
     (Why? 영속성은 엔티티의 식별값을 기준으로 엔티티를 구별하는데 키 값이 필요하기 때문이다.)

➡️ IDENTITY 전략은 쓰기 지연 동작하지 않는다. 

➡️ 주로 MySQL, PostgreSQL, SQL Server, DB2

 

 

✔️ SEQUENCE

@GeneratedValue(strategy = GeneratedType.SEQUENCE)
Indicates that the persistence provider must assign primary keys for the entity using a database sequence.
:  영속성 제공자가 데이터베이스 시퀀스를 사용하여 엔티티에 대한 기본 키를 할당해야 함을 나타낸다. 

➡️ 즉 데이터베이스의 시퀀스 오브젝트를 사용해서 기본 키를 생성한다는 말이다.

➡️ 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트이다. 

➡️ em.persist()를 호출할 때 먼저 데이터베이스 시퀀스를 사용해서 식별자를 저장한다. 그리고 조회한 식별자를 엔티티에 할당한 후에 엔티티를 영속성 켄텍스트에 저장한다. 이후에 커밋이 일어나게 되면 실제 데이터베이스에 INSERT 된다. 

➡️ 시퀀스를 지원하는 오라클, PostgreSQL, H2 데이터베이스에서 사용할 수 있다.

 

 

✔️ TABLE

@GeneratedValue(strategy = GeneratedType.TABLE)
 Indicates that the persistence provider must assign primary keys for the entity using an underlying database table to ensure uniqueness.
: 영속성 공급자가 고유성을 보장하기 위해 기본 데이터베이스 테이블을 사용하여 엔티티에 대한 기본 키를 할당해야 함을 나타낸다. 

➡️ 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략이다.

➡️ 테이블을 사용하기 때문에 시퀀스를 지원하지 않는 데이터베이스에서도 사용할 수 있다. 

➡️ SEQUENCE 전략과 흡사하여 시퀀스 대신 테이블을 사용하는 것 이외에는 내부 동작 방식이 같다. 

 

 

✔️ AUTO

@GeneratedValue(strategy = GeneratedType.AUTO)
Indicates that the persistence provider should pick an appropriate strategy for the particular database.
: 영속성 공급자가 특정 데이터베이스에 대해 적절한 전략을 선택해야 함을 나타낸다. 

➡️ 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택하는 전략이다.

➡️ @GeneratedValue의 strategy 디폴트값은 AUTO이다.

➡️ SEQUENCE나 TABLE 전략이 선택되면 시퀀스나 키 생성용 테이블을 미리 만들어야한다. 

➡️ 스키마 자동 생성 기능(DDL-AUTO)을 사용하면 하이버네이트가 기본값을 사용해서 적절하게 만들어 준다.

'Spring > JPA' 카테고리의 다른 글

@Query 어노테이션  (0) 2023.08.15
쿼리 메서드(Query Method)  (0) 2023.06.28
JPA?  (0) 2023.06.01

BELATED ARTICLES

more