인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

twosom님의 프로필 이미지
twosom

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

양방향 연관관계와 연관관계의 주인 2 - 주의점, 정리

아주 기초적인거지만 질문드립니다 ㅠㅠ

해결된 질문

작성

·

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

twosom님의 프로필 이미지
twosom
질문자

헉 자세하게 설명해주셔서 정말 감사합니다!

마지막으로 질문 한가지만 더 드려도 될까요?

강사님께서 일전에 추천해주신 토비의 스프링3.1 책을 구매해볼까 생각하고있는데요.

이게 보니 2012년에 출간된 책이더라구요. 지금으로부터 거진 10년전 책인데,

지금 구매해서 봐도 예제를 따라하는데 무리가 없을까요?

항상 친절한 답변 감사드립니다~~

0

twosom님의 프로필 이미지
twosom
질문자

앗 혼자서 여러가지 실험(?)을 한 결과 저 나름대로 조금은 정답에 가까운 결과를 찾은 것 같네요!

이게 IDENTITY 전략을 사용했을 때 모습이고,

(em.persist()를 기준으로 BEFORE PERSIST, AFTER PERSIST 문구를 추가했습니다!)

이거는 아무 전략도 사용하지 않고 제가 setId로 값을 할당한 후의 모습이네요! 아무래도 IDENTITY전략을 사용하면 persist메소드를 호출할 때 데이터베이스에 바로 insert문을 넣어주나 봐요!

그래서 영속성 컨텍스트에 아이디 값이 저장되서 그게 조회될 수 있었던  것 같아요!!

반대로 시퀀스 전략을 사용하니까

persist 메서드를 호출하니까 select문을 쏴서 시퀀스 값을 조회해서 엔티티에 저장 후에 영속성 컨텍스트에 저장하는거 같더라구요!! 그래서 커밋하지 않아도, 1차캐시에서 id값을 조회할 수 있는거구요!!

제가 올바르게 이해한 게 맞을까요? 

twosom님의 프로필 이미지
twosom

작성한 질문수

질문하기