스프링 부트

JPA @GeneratedValue

포스틸 2025. 2. 18. 11:02
반응형
@Entity
@Getter @Setter
public class Member {
    ...
    
    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    
    @PersistenceContext
    private EntityManager em;

    public void save(Member member) {
        em.persist(member);
    
    ...
}

JPA에서 em.persist를 하면, 이 순간에 영속성 컨텍스트에 이 멤버 객체를 올린다.

@Entity
@Getter @Setter
public class Member {
    ...
    
    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    
    ...
}

그때, 영속성 컨텍스트는 PK키와 VALUE가 있는데, 이 id 값이 키가 된다.

DB, PK랑 매핑한 것이 키가 된다.

그래서, @GeneratedValue를 세팅하면 DB 마다 다르지만, 어떤 DB는 시퀀스를 넣기도 하고, 어떤 DB는 테이블을 가짜로 만들어서 그 테이블로부터 키를 따서 넣기도 한다. 어쨌든..

이 id 값이 항상 생성이 되어 있는 것이 보장된다. em.persist 할 때 말이다.

 

왜냐하면, 영속성 컨텍스트에 값을 넣어야 하는데, 보통 그 때 (키-벨류가 된다) 저 PK에 값을 그대로 넣는다. 그러면서 동시에 id에 값을 채워준다. 아직 DB에 들어간 시점이 아니어도 그렇게 해준다. 그래서 member.getId(); 이렇게 꺼내면 항상 값이 있다는 것이 보장된다.

 

 

 

반응형