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

김태희님의 프로필 이미지
김태희

작성한 질문수

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

회원 수정 API

7:31초쯤 영속성이 끊긴 멤버 반환

작성

·

473

0


안녕하세요. 많이 찾아봤는데 없는것같기도 하고, 7:31초쯤을 시작으로 영속상태가 끊긴 멤버가 반환이 된다라는 말씀을 듣고 질문드립니다.

Service에서 반환이 되는 Controller에서 Entity Manager를 사용하기 위해서 @PersistenceContext 어노테이션을 사용해서 em을 주입받았습니다.
# MemberApiController
controller.png

# MemberService

service.png

# 로그

로그.png

이렇게 됬을때 PK가 1인 Member를 Controller에서 찾아보았는데, 만약에 영속성이 끊긴 Member가 반환이 된다면 로그에 "???"이라는 문구 사이에 Select문을 통해서 PK가 1인 멤버를 가져와야하지 않나요? 영속성컨텍스트에서 관리를 하지 않은 Member를 반환했고, 그 Member를 다시 찾으려고 시도하기때문입니다.

# EntityManager.contains 사용

contain.png

영속성 컨텍스트에서 관리되는 Object인지 확실히 확인하기 위해서 EntityManager의 contains 메서드를 통해서 확인해보았을때 로그가 아래와 같이 나왔습니다.

containlog.png

결론적으로 memberService.update를 통해서 반환된 Member객체는 영속성이 끊기지 않은 객체이지 않나요??

감사합니다 :D

답변 2

1

안녕하세요, 김태희 님. 공식 서포터즈 y2gcoder 입니다.

테스트를 통해 강의에서의 내용과 다르게 Controller 단에서도 영속성 컨텍스트의 관리를 받고 있는 member 객체를 발견했고 이 이유에 대해서 질문주셨습니다.

해당 부분은 뒷부분에 나오겠지만, OSIV와 관련된 내용입니다. 쉽게 설명드리면 스프링 부트에서는 기본적인 옵션으로 OSIV를 켜놓고 있고, 이것 덕분에 API 응답이 끝나기 전까지 영속성 컨텍스트가 유지됩니다. 그래서 컨트롤러 단에서도 영속성 컨텍스트를 유지하고 있습니다.
application.properties에서 spring.jpa.open-in-view를 false로 주고 다시 실행해보시겠습니까?

감사합니다.

0

김태희님의 프로필 이미지
김태희
질문자

답변 감사드립니다. 저도 강의를 쭉 진행하고나서 open-in-view에 대해서 알게 되었고, 해당 질문과 관련이 있다고 알게 되었습니다. 하지만 제가 질문드린건 영한님이 7:31초쯤에 "영속성이 끊긴 멤버가 반환이 된다"라고 말씀해 주셨는데, 회원 수정 API강의중에는 open-in-view에 대한 어떠한 설정도 없었기 때문에 기본값인 true로 되어있어서 더더욱 "반환되는 멤버는 영속성이 끊기지 않은 멤버"가 아닌가 싶어서 질문드렸습니다!

답변도 영속성 컨텍스트의 관리를 받고 있는 객체라고 말씀해주셨는데, 그러면 7:31분쯤에 영한님의 말씀("영속성이 끊긴 멤버가 반환이 된다")이 혹시 틀린건 아닌지 여쭤보고싶습니다.

안녕하세요. 김태희님, 공식 서포터즈 David입니다.

해당 강의에서는 말씀하신대로 별도로 OSIV에 대한 내용을 언급하지 않으셔서 혼란이 발생한 것 같습니다. 실무에서는 주로 OSIV를 끄고 개발하기 때문에 (이유에 대해서는 본 강의 OSIV 편에서 설명하고 있습니다.) 영속성이 끊긴 멤버가 반환이 된다라고 언급하신 것 같습니다. 이 부분 참고해 주시면 이해에 큰 어려움이 없으실 것 같습니다.

감사합니다.

김태희님의 프로필 이미지
김태희

작성한 질문수

질문하기