해결된 질문
작성
·
206
0
본 강의랑 연관이 없는 내용이긴 한데,
강사님이 적극 추천하신 자바ORM표준 JPA프로그래밍 책을 구입해서 복습은 책으로 하고있는데요~!
교재 내용중에서 시퀀스 전략에 관한 내용 중에
IDENTITY와 SEQUENCE의 차이에 대한 내용이 있더라구요~!
제가 교재 보면서 이해하기로는
SEQUENCE전략은 엔티티를 em.persist 메소드를 호출하는 순간 데이터베이스한테 시퀀스에 대한 select문을 쏴서(?) 그 값을 엔티티의 id값으로 사용하고 그 후에 영속성컨텍스트에 저장하는 방식이면,
IDENTITY는 em.persist를 해도 데이터베이스한테서 조회해서 저장하는 것이 아닌 데이터베이스를 저장(커밋) 해야만 그 이후에 식별자를 조회해서 엔티티의 식별자에 할당한다고 이해했는데요!
제가 그래서 엔티티를 하나 만들고 persist메소드로 영속성 컨텍스트에 저장한 직후에 id값을 조회해봤는데, 시퀀스전략, 아이덴티티 전략 모두 조회가 되더라구요.
분명 커밋은 맨 마지막 줄에 있는데 말이죠 ..ㅠㅠ
분명히 제가 이해한 대로라면 시퀀스전략은 조회가 되고, 아이덴티티 전략은 null값이 조회될 줄 알았는데, 그게 아니네요!
참고로 시퀀스전략 시에는 오라클, 아이덴티티전략 시에는 mysql을 사용했습니다!!
마지막으로 이 방식의 차이가 현업에서 많이 중요한가요?
안중요하다고 안외울건 절대 아닌데, 이런 방식의 차이로 인해서 비즈니스코드가 확 바뀌거나 하는지 궁금합니다!!
항상 좋은강의 감사드립니다~ 책도 너무 재밌게 보고있어요.
강의로 공부하고 책으로 복습하니 너무 머릿속에 잘 들어오네요~~~
답변 4
1
안녕하세요. if0rever님
IDENTITY 전략은 mysql의 경우 auto increment라고 하는데요.
데이터베이스에 PK값을 비워두고, insert 문을 넣으면 데이터베이스에서 자동으로 PK값을 채워서 저장합니다.
그리고 INSERT 문이지만, 애플리케이션에서 INSERT문의 결과로 DB의 PK 값을 얻을 수 있습니다.
JPA는 이 값을 바로 조회해서 엔티티의 ID에 할당하게 됩니다.
mysql auto increment로 검색해보시면 먼저 데이터베이스에서 어떤 식으로 동작하는지 이해하실 수 있을거에요.
시퀀스에 대한 부분은 생각하신 내용이 맞습니다^^
감사합니다.
0
0
헉 자세하게 설명해주셔서 정말 감사합니다!
마지막으로 질문 한가지만 더 드려도 될까요?
강사님께서 일전에 추천해주신 토비의 스프링3.1 책을 구매해볼까 생각하고있는데요.
이게 보니 2012년에 출간된 책이더라구요. 지금으로부터 거진 10년전 책인데,
지금 구매해서 봐도 예제를 따라하는데 무리가 없을까요?
항상 친절한 답변 감사드립니다~~
0
앗 혼자서 여러가지 실험(?)을 한 결과 저 나름대로 조금은 정답에 가까운 결과를 찾은 것 같네요!
이게 IDENTITY 전략을 사용했을 때 모습이고,
(em.persist()를 기준으로 BEFORE PERSIST, AFTER PERSIST 문구를 추가했습니다!)
이거는 아무 전략도 사용하지 않고 제가 setId로 값을 할당한 후의 모습이네요! 아무래도 IDENTITY전략을 사용하면 persist메소드를 호출할 때 데이터베이스에 바로 insert문을 넣어주나 봐요!
그래서 영속성 컨텍스트에 아이디 값이 저장되서 그게 조회될 수 있었던 것 같아요!!
반대로 시퀀스 전략을 사용하니까
persist 메서드를 호출하니까 select문을 쏴서 시퀀스 값을 조회해서 엔티티에 저장 후에 영속성 컨텍스트에 저장하는거 같더라구요!! 그래서 커밋하지 않아도, 1차캐시에서 id값을 조회할 수 있는거구요!!
제가 올바르게 이해한 게 맞을까요?