기본키(Primary Key) 매핑 - @Id, @GeneratedValue
💡 @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 |