JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다.
그러려면 JPA의 매핑 어노테이션을 잘 사용해야한다.
JPA가 지원하는 어노테이션은 크게 4가지로 분류할 수 있다.
@Id
만 사용하면, 기본키 값을 직접 할당해야 한다.
하지만 @GeneratedValue
를 함께 사용하면 ORACLE
의 sequence
혹은 MySQL
의 auto_increament
처럼 데이터베이스가 생성해 주는 값을 사용할 수도 있다.
이런 자동 생성 전략을 사용하려면 🔗persistence.xml
에 다음 속성을 추가해야 한다.
<property name="hibernate.id.new_generator_mappings" value="true" />
IDENTITY
는 기본키 생성을 데이터베이스에 위임하는 전략이다.
주로 MySQL
, PostgreSQL
, SQL Server
, DB2
에서 사용한다.
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
}
IDENTITY
전략은 MySQL
의 auto_increament
의 작동 방식과 유사하여,
데이터베이스에 값을 저장하고 나서야 기본키 값을 구할 수 있다.
🔍 영속성 컨텍스트에서 관리 되기 위해선, 기본키 값을 갖고 있어야 하는데,
IDENTITY
전략을 사용하면 em.persist(Entity);
라인에서 영속성 컨텍스트에 저장 할 수 없다.
때문에 @GeneratedValue(strategy = GenerationType.IDENTITY)
를 사용할 때만 예외적으로 em.persist(Entity);
라인에서 commit
을 날린다.
// ...
Board board = new Board();
board.title("title");
em.persist(board); // insert 쿼리는 이 시점에 바로 commit 된다.
// ...
transaction.commit(); // insert 쿼리 이외 SQL문은 이 때 commit
SEQUENCE
전략은 ORACLE
의 sequence
처럼 유일한 값을 순서대로 생성한다.
이 전략은 sequence
를 지원하는 ORACLE
, PostgreSQL
, DB2
, H2
데이터베이스에서 사용할 수 있다.
@Entity
@SequenceGenerator(name = "board_seq_generator",
sequenceName = "board_seq", // 매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "board_seq_generator")
private Long id;
...
}
💡
allocationSize
: 시퀀스 한 번 호출에 증가하는 수 (성능 최적화), 기본값은 50 이다.
💡@SequenceGenerator
는@GeneratedValue
옆에 위치해 사용해도 된다.@Entity public class Board { @Id @GeneratedValue(...) @SequenceGenerator(...) private Long id; ... }
@SequenceGenerator
를 사용해서 board_seq_generator
라는 시퀀스 생성기를 등록했다.
JPA는 sequenceName
속성의 값인 board_seq
를 실제 데이터베이스의 board_seq
시퀀스와 매핑한다.
SEQUENCE
전략에서는 @GeneratedValue
에 gernerator
속성이 추가 된다.
이 값으로는 @SequenceGenerator
의 name
속성 값과 같은 값을 할당 한다.
Board board = new Board();
em.persist(board); // 이 때, 데이터베이스 시퀀스를 사용해 식별자를 조회한다.
transaction.commit();
em.persisit(board)
호출 시, 시퀀스를 통해 식별자를 조회하고, 그 값을 board
에 할당 후 영속성 컨텍스트에 저장한다.
AUTO
전략은 선택한 데이터베이스의 방언에 따라 적절한 기본키 생성 전략을 자동으로 선택해준다.
위의 IDENTITY
전략과 SEQUENCE
전략 중 무엇을 써야할지 매번 고민하지 않아도 되는 것이다.
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
…
}
AUTO
전략의 장점은 데이터베이스를 변경해도 코드를 수정할 필요가 없다는 것이다.
💡
AUTO
전략을 사용할 때SEQUENCE
전략이 선택되면 시퀀스를 미리 만들어 두어야 한다. 만약 스키마 자동 생성 기능을 사용한다면, 하이버네이트가 기본값을 사용해 적절한 시퀀스를 만들어 줄 것이다.
기본키 생성 전략 중, 기본키를 관리하는 테이블을 생성하여 기본키를 할당하는 TABLE
전략도 있는데, 실무에서는 IDENTITY
, SEQEUNCE
그리고 AUTO
를 가장 많이 사용 할 것 같아 기록에서 제외하였다.
강의_자바 ORM 표준 JPA 프로그래밍 - 기본편
교재_자바 ORM 표준 JPA 프로그래밍(김영한)다정한 피드백 환영해요 🤗