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

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

u_innovation님의 프로필 이미지
u_innovation

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

회원 수정 API

영속성 컨텍스트에 먼저 있을 것 같습니다 !

작성

·

165

1

안녕하세요! 6분 31초 부분 질문드립니다.(update 메서드)

memberRepository.findOne(id)에서 membrer 객체를 찾아올 때, 영속성 컨텍스트에 없을 거니까 DB에서 조회할거라고 말씀하셨는데요,

사용자 -> name이 jjj으로 가입 , 자동으로 id 13번 등록 ->영속성 컨텍스트에 남음 -> 사용자 -> id가 13인 것을 name nnn으로 변경 -> memberRepository.findOne(13) -> 영속성 컨텍스트에서 변경감지 -> 영속성 컨텍스트 값 초기화(name:nnn)->DB에 값 변경(jjj -> nnn)

이렇게 이해를 했는데 혹시 제가 잘못 생각한 부분이 있을까요??ㅠㅠ



답변 1

1

안녕하세요, u_innivation 님. 공식 서포터즈 codesweaver 입니다.
.
API를 통해 여러번의 요청을 한 경우, 매번 새로운 영속성 컨텍스트를 만들게 됩니다. 
대략 과정을 표현하면 아래와 같습니다.

클라이언트, jjj로 가입요청 -> 서버, em.persist()로 영속성 생성 -> 서버, 클라이언트에 결과를 응답하며 종료. (영속성 컨텍스트 소멸)

클라이언트,  아이디 13을 nnn으로 변경 -> 서버 em.find()로 영속성 컨텍스트에 member 보관 -> 이름을 nnn으로 변경 -> 서버, 클라이언트에 응답하며 종료. (영속성 컨텍스트 소멸)

클라이언트가 서버에게 어떤 처리를 요청할때마다 영속성 컨텍스트는 새롭게 생성됩니다.
.
감사합니다.

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

포스트맨에서 같은 요청을 2번째에 했을 때는 쿼리를 보내지 않던데요..?ㅠㅠ

요청할때마다 영속성 컨텍스트가 새롭게 생성된다면, 두번째 요청때에도 영속성 컨텍스트에 저장된 것을 불러오는 것이 아닌, 새로운 영속성 컨텍스트가 생성되고 거기에 보관되기 때문에 다시 db에 쿼리를 날려야 하지 않을까요?

동일한 쿼리를 2번 요청햇을 때 쿼리가 실행되지 않는 이유는 앞에서 처음 요청했을 떄 이름이 바뀌었으니까, 이후에 들어온 쿼리에서는 동일한 이름이기 때문에 변경된게 없으니까 update쿼리가 실행안된거 아닐까요?? 

더티체킹은 변경된 영속객체에 한해서만 update쿼리를 만들어서 flush()시점에 실행시켜주니까용~

(지나가다가 생각나서 남겨봅니다~)

u_innovation님의 프로필 이미지
u_innovation

작성한 질문수

질문하기