본문 바로가기

Project/Final-Project

[Whereware] 부트스트랩 사용시 세션 false 설정 주의하기

 

 

[문제 상황]

 

- 회원 가입, 로그인 기능 구현을 완료했고, 로그인도 제대로 되는 상황이다.

 

- 게시글 작성하기 버튼을 로그인한 멤버가 null이 아닐 경우( ! empty loginMember ) 일 경우에만 보이게 하려고 <c:if> 태그를 사용했다. 그런데 로그인이 된 상황임에도 불구하고 버튼이 제대로 보이지 않는 상황! (다른 팀원들도 전부 마찬가지) 

 

 

[생각해보기]

 

https://chichibaby.tistory.com/166

 

작성해놨던 블로그 글을 다시 찬찬히 읽어보면서 생각해봤다.

 

 

1) @SessionAttributes("키값")


Model 객체(requst scope)에 "키값"에 해당하는 Attribute를 Session Scope까지 범위를 확장시킨다.

 

- 단, 확장하는 역할만 할 뿐, 실제 session 객체에 저장하지는 않는다.

 

- 이 부분에서 로그인 관련 MemberController에서 분명히 @SessionAttributes("loginMember") 를 작성해놨기 때문에 세션 객체에 로그인 한 멤버 정보가 존재하고 있을 것이다.

 

@RequestMapping(value = "/login", method = {RequestMethod.POST})
public ModelAndView login(ModelAndView model,
    @RequestParam("id")String id, @RequestParam("password")String password) {

    log.info("{}, {}", id, password);
    
    // service에게 login을 하도록 하면서 id, password 전달
    Member loginMember = service.login(id, password);
    
    // login이 정상적으로 됐다면, 전달한 id, password를 가지는 member 객체를 리턴한다.
    // id가 없거나 password가 틀려서 로그인이 안되면 null을 리턴한다.

    if(loginMember != null) {

        model.addObject("loginMember", loginMember);
        model.setViewName("redirect:/");

    } else {

        model.addObject("msg","아이디나 비밀번호가 일치하지 않습니다.");
        model.addObject("location", "/");
        model.setViewName("common/msg");

    }
	
    model.setViewName("home");
    
     return model;
}

 

이렇게 로그인이 정상적으로 됐다면  id과 password 정보도 로그인 loginMember에 잘 담겨있을 것이다. 따라서 애플리케이션이 실행되고 있는 동안 창을 닫지 않고 세션이 유지되는 한은 다른 곳에서도 이 loginMember를 활용할 수 있을텐데 왜 안될까??

 

 

[문제 해결]

한 1시간의 팀원들과 문제 찾아보기, 여러 방법으로 테스트해보면서 loginMember가 어디까지 유효한지 등등 체크해보았다.  맨 처음 애플리케이션이 실행되고 처음 로그인 view 화면에서 로그인을 하고 home으로 redirect:/ 되어서 오면 여기까지는 loginMember 정보가 살아있지만, 다른 곳으로 이동하는 순간부터 전부 유지되지 않았다.

 

그러다가 찾은 문제점!

 

모든 jsp 파일에 <%@ page session="false"%> 이 문구가 포함되어 있었다.

 

 

우리가 부트스트랩 템플릿을 활용하여 우리 프로젝트에 커스터마이징 하면서 아마 이 부분을 놓치고 복사가 된 것 같다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
    <!-- ▼ 바로 여기 아래 줄!! -->
<%@ page session="false"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

 

 

<%@ page session="false"%>

 

바로 이 문구 한 줄 때문에 전체 애플리케이션이 엉망이였다.

이건 세션을 활용하지 않고 다른 서버에서도 세션 정보를 활용할 수 없도록 하는 설정이다.

그래서 나한테 해당하는 jsp 페이지 말고도 모든 jsp 파일 (애플리케이션에 다른 팀원들이 만든 jsp 파일에도 저 설정 태그가 있다면 모조리 삭제해야 한다. 1 곳이라도 저 설정이 있으면 안된다!) 을 확인하면서 저 태그가 적혀져 있는것들을 다 삭제하고 나니까 문제 없이 다 잘 작동되었다.

 

 

[느낀점]

 

정말 간단한 거였지만, 수업시간에 배우지 않은 내용이여서 미처 생각하지 못했다.

그나마 프로젝트 단계가 초반이기 때문에 모든 코드를 한 줄 한 줄 읽어가면서 뭐가 다른지 낯설고 생소한 코드가 적혀있다면 이게 무슨 뜻인지 정말 코드를 "읽는" 경험이 되었다.

 

얼른 이것 때문에 늦춰졌던 작업을 하러 가야겠다!