@Id, @GeneratedValue

JPA를 사용할 때, @Id를 명시한 컬럼은 PK로 사용하겠다는 의미다.

단, @Id만 사용할 경우에는 직접 기본키를 할당해주어야된다.

@GeneratedValue를 사용하면 기본키를 직접 할당하는 대신 데이터베이스가 자동으로 생성해주는 값을 사용할 있다. strategy 속성을 통해 자동 생선 전략을 지정할 수 있으며, 크게 4가지 전략이 있다.

Untitled


IDENTITY 전략

해당 전략은 DB에 데이터를 넣는 순간 PK값을 알려주는 전략이다. (MySQL, PostreSQL 등 지원)

즉, DB에 데이터를 넣을(Insert) 때, MySQL는 AUTO_INCREMENT 기능으로 기본키를 자동으로 생성해주게 된다.

Untitled

해당 전략을 벌크 연산에 사용할 경우 문제가 발생한다. 그 이유를 살펴보자.

기본적으로 JPA는 쓰기 지연 전략으로 동작한다.

💡 쓰기 지연이란 DB 커밋전까지 쿼리를 모았다가 트랜잭션 커밋 시점에 쿼리를 한번에 실행시키는 것을 의미한다.

하지만, IDENTITY 전략을 사용하면 쓰기 지연 전략으로 동작하지 않는다.

Entity를 영속화(persist) 하기 위해선 Id(PK) 값이 필수이다. 따라서, save() 를 호출하게 되면 영속화를 위해 즉시 INSERT 쿼리가 DB에 실행된다.

DB에 값이 들어가는 순간 AUTO_INCREMENT 기능으로 PK 값이 생기고, 이 PK 값을 받아 엔티티를 영속화 한다.