이 험난한 세상에서어어~

@GenerateValue strategy 본문

이론/JPA, Spring, Spring boot

@GenerateValue strategy

토끼띠NJW 2023. 8. 1. 21:19

JPA에는 DB의 PK를 어떤 방식으로 생성할 것인지 전략을 설정해주는 어노테이션이 있다.

바로 @GenerateValue(strategy = GenerationTyep.원하는 타입)로 여기에는 AUTO, IDENTITY, SEQUENCE, TABLE이 있다.

 

사실 spring 공부 초반에는 강의에서 IDENTITY를 사용하는 것을 보고 그대로 따라 사용해줬다. 하지만, 각 타입 별로 동작하는 방식이 다르기 때문에 이를 정리해보려고 한다.

@GenerateValue(strategy = GenerationTyep.AUTO)

연결한 db에 따라서 IDENTITY, SEQUENCE, TABLE 중 하나로 선택이 된다. 내가 쓰는 maria db는 AUTO로 설정하면 hibernate_sequence가 자동 생성되는 것을 보아 SEQUENCE로 설정되는 모양이다.

@GenerateValue(strategy = GenerationTyep.IDENTITY)

IDENTITY는 pk의 관리를 db에 위임한다는 의미이다. 하지만, IDENTITY의 동작 방식을 알기 위해서는 JPA에서 쿼리가 언제 나가는지 알아야 한다.

 

보통 JPA를 사용하면 엔티티 메니저(영속 컨텍스트) 안에 엔티티들이 저장된다. 혹은 엔티티 메니저 안의 1차 캐시에 저장이 된다. 그렇다면 엔티티 메니저에 저장되기만 하면 자동으로 DB에 저장이 되는 것일까?

 

아니, DB에 저장을 하기 위해서는 따로 쿼리를 날려줘야 한다. 쿼리를 날릴 때는 보통 트랜잭션을 commit해서 날릴 수도 있고 혹은 flush를 이용해 강제로 쿼리를 실행할 수 있다.

 

여기까지가 JPA에서 쿼리가 날라가는 간략한 방식이다. 그렇다면 현재 pk는 영속 컨텍스트가 아닌 db에서 관리하고 있는데, 영속 컨텍스트가 어떻게 해당 엔티티의 pk를 알 수 있을까?

 

바로 IDENTITY는 영속 컨텍스트를 persist를 하는 순간 강제로 쿼리를 날려서 pk를 알아오는 방식을 이용한다. 때문에 쿼리 문을 보면 persist만 했는데, Insert문이 날라가는 모습을 볼 수 있다. 

 

참고로 createPostService와 연결된 레파지토리에 persist가 존재한다.

https://github.com/Jiwonna52/linkScrap

 

GitHub - Jiwonna52/linkScrap

Contribute to Jiwonna52/linkScrap development by creating an account on GitHub.

github.com

    @Test
    public void 포스트_등록(){
        Post post = new Post();
        post.setLink("1111.com");
        post.setContent("예쁜 물건이 많음");
        post.setTitle("쇼품 샵");

        System.out.println("=========================");
        postService.createPostService(post);
        System.out.println("=========================");
    }

@GenerateValue(strategy = GenerationTyep.SEQUENCE)

sequence는 db의 sequence를 이용해서 값을 생성하는 방식이다. 그래서 sequence를 사용하면 db에 hibernate_sequence 생기는 것을 알 수 있고 나가는 쿼리 문 또한 nextval(hibernate_sequence) 이렇게 나가는 것을 확인할 수 있다.

참고로 sequence의 설정을 하고 싶다면 @SenquenceGenerator를 사용하면 된다.

@GenerateValue(strategy = GenerationTyep.TABLE)

SEQUENCE를 모방한 것으로  SEQUENCE 객체가 아닌 테이블을 따로 만들어서 PK를 할당한다. SEQUENCE와 마찬가지로 추가적인 설정을 할 수 있는데, @TableGenerator를 사용하면 된다.

'이론 > JPA, Spring, Spring boot' 카테고리의 다른 글

JPA란?  (0) 2023.07.09