• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

로그인 처리하기 - 직접 만든 세션 적용 질문있습니다.

24.05.05 22:41 작성 24.05.05 22:42 수정 조회수 43

0

로그인 처리하기 - 직접 만든 세션 적용 3분 51초 부분에 요.

public class HomeController {

public String homeLoginV2(HttpServletRequest request, Model model){

//세션 관리자에 저장된 회원 정보 조회

Member member=(Member)sessionManager.getSession(request);//Object이기 때문에 member로 캐스팅 한다.

 

 SessionManager코드 중

public Object getSession(HttpServletRequest request){

Cookie sesionCookie=findCookie(request,SESSION_COOKIE_NAME);

if (sesionCookie==null){

return null;

}

return sessionStore.get(sesionCookie.getValue());

}

sessionManager가 Object객체인데 Member로 캐스케이딩하는 데 member가Object의 부모인가요?

답변 1

답변을 작성해보세요.

0

OMG님의 프로필

OMG

2024.05.06

안녕하세요. zzzzz님, 공식 서포터즈 OMG입니다.

(Member)로 캐스팅해야하는 이유는 올리신 코드에서 한단계 더 내부 코드로 들어가서 확인해보셔야 하는데요,

getSession()의 반환을 보면

return sessionStore.get(sesionCookie.getValue());

sessionStore.get()으로 반환하는 대상이 Object타입이기 때문에 getSession()을 호출한 곳에서 Object로 반환을 받게되니, 실제 필요한 타입인 Member로 캐스팅하게 되는 것입니다.

그렇다면 sessionStore에서 get으로 조회할 때의 데이터 저장 구조를 보게되면 고민이 해결되는데요,

imagesessionStore는 Map의 구조로 되어있습니다.

sessionStore에서 꺼내오는 구조가 sessionStore.get이라면, sessionStore에 넣는 과정을 살펴볼게요.

imagesessionStore의 key는 sessionId가 되고, value는 createSession의 첫번째 파라미터(Object타입)가 됩니다.

그렇다면 createSession을 호출하는 코드를 보게되면 모든 궁금증이 풀리게 되겠죠?

image

Member타입의 loginMember를 createSession의 첫번째 인자로 전달하였습니다.

설명드린 과정의 호출과정을 역으로 추적하다보면 왜

(1) Object타입으로 넣게되었는지

(2) Object타입을 Member타입으로 형변환이 가능한지

가 자연스레 이해되실거에요 😀

이해가 안되는 부분이 있다면 댓글남겨주세요

감사합니다.

zzzzz님의 프로필

zzzzz

질문자

2024.05.06

안녕하세요.

답변감사합니다. 답변은 실제 필요한 타입인 Member로 캐스팅 하는것이 맞다고 하셨는데요.

그런데 자바 (초급 김영한선생님강의 중)다형성을 배울 때 부모는 자식을 감싸준다라고 배웠는데요.

메소드 객체(여기서는 Object)가 사용자가 만든 객체(여기서는 Member)보다 부모라고 생각했는데요.

이 개념과 위에 코드와는 상관없는 내용인가요?

 

 

OMG님의 프로필

OMG

2024.05.06

영한님이 다형성을 설명하실 때의 표현은

"부모는 자식을 품을 수 있다" 라고 표현하시는데요, 이를 현재 올리신 코드 상황에 대입하면

 

createSession의 메서드의 첫번째 인자는 Object Value 로 정의되어 있습니다.

image

이를 호출하여 사용하는 코드에서는 Object 타입을 인자로 전달하지 않고,

sessionManger.createSession(loginMember,..) 로 Object타입이 아닌 Member 타입을 전달하고 있습니다.

image

createSession의 함수 시그니처는 Object인데, Member를 전달해도 문제가 없음을 볼 수 있습니다.

즉, 부모(Object)는 자식(Member)를 품을 수 있는 상황으로 볼 수 있습니다.

이해하신 것과 같이 Object 클래스는 모든 타입의 조상이므로 Member의 부모(상위 타입 클래스)의 개념으로 보아도 문제가 없습니다.(잘 이해하신 내용으로 보입니다 😀)

하지만 zzzzz님이 이해한 부모는 자식을 감싸준다 라는 내용과 제가 설명 드린 '부모는 자식을 품을 수 있다' 의 이해의 차이(괴리감)에서 오는 개념 불일치로 인해 혼선이 있으신 것으로 생각합니다.(제 설명이 미흡했을 수도 있구요^^;;)

 

추가로 궁금하신 사항은 댓글 남겨주세요 😀