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

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

gch03915님의 프로필 이미지
gch03915

작성한 질문수

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

프록시

Httpsession 에서 getAttribute 를 이용해 가져올때 타입캐스팅 문제

작성

·

576

0

안녕하세요.

HttpSession 에서 세션값을 가져올때 프록시 문제가 발생하는 것 때문에 질문을 남깁니다.

현재 Member 라는 Entity에는 '값 타입 컬렉션'이 정의되어 있는 상태입니다.

문제는 이 값타입 컬렉션은 지연로딩이 디폴트값이라서 세션값을 가져올때 Object -> Member 객체로 타입캐스팅 할때 proxy 객체인 상태에서 시도하려고 하여 에러가 발생해버립니다.

이런 상황에서 eager로 설정해주는 방법이 있겠지만 별로 좋지 못한 해결방안이라고 생각되어 어떻게 하면 더 좋은 방법으로 해결할 수 있는지 궁금하여 질문을 드립니다.

감사합니다.

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. gch03915님

HttpSession은 트랜잭션 범위를 넘어가고 영속성 컨텍스트도 제거됩니다. 따라서 엔티티를 저장하면 안됩니다.

HttpSession에는 엔티티를 보관하면 안되고, DTO로 변환해서 저장해야 합니다.

감사합니다.

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

아...

선생님이 말씀하신대로 해결하였습니다 ㅠㅠㅠ 감사합니다.

지금껏 문제가 영속성 컨텍스트에서 get으로 조회한 값을 그대로 HttpSession 에 넣었던 것이 문제였습니다....트랜잭션 범위를 벗어나서 영속성 컨텍스트도 제거되는 바람에

Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception. 이런 에러가 발생했던 것이였네요.

dto객체를 하나 선언해 준 후에 바로 get으로 조회한 값을 넣지 않고 값들을 받아와서 새롭게 생성한 dto 에 넣어주어서 해결할 수 있었습니다.

너무 감사합니다 ㅎㅎ 행복하네요

HttpSession session = request.getSession();
SessionMemberDto memberDto = transferLoginMember(loginMember);
session.setAttribute(SessionConst.LOGIN_MEMBER,memberDto);

 

private SessionMemberDto transferLoginMember(Member loginMember) {
SessionMemberDto memberDto = new SessionMemberDto();
memberDto.setMemberId(loginMember.getMemberId());
Map<Long,MemberStatus> statusMap = new HashMap<>();
for(Map.Entry<Long,MemberStatus> u : loginMember.getMemberStatus().entrySet()){
Long key = u.getKey();
MemberStatus value = u.getValue();
statusMap.put(key,value);
}
memberDto.setMemberStatus(statusMap);
return memberDto;
}
김영한님의 프로필 이미지
김영한
지식공유자

ㅎㅎ 다행입니다^^

gch03915님의 프로필 이미지
gch03915

작성한 질문수

질문하기