[문제 상황]
- 회원 가입, 로그인 기능 구현을 완료했고, 로그인도 제대로 되는 상황이다.
- 게시글 작성하기 버튼을 로그인한 멤버가 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 곳이라도 저 설정이 있으면 안된다!) 을 확인하면서 저 태그가 적혀져 있는것들을 다 삭제하고 나니까 문제 없이 다 잘 작동되었다.
[느낀점]
정말 간단한 거였지만, 수업시간에 배우지 않은 내용이여서 미처 생각하지 못했다.
그나마 프로젝트 단계가 초반이기 때문에 모든 코드를 한 줄 한 줄 읽어가면서 뭐가 다른지 낯설고 생소한 코드가 적혀있다면 이게 무슨 뜻인지 정말 코드를 "읽는" 경험이 되었다.
얼른 이것 때문에 늦춰졌던 작업을 하러 가야겠다!
'Project > Final-Project' 카테고리의 다른 글
[WhereWare] 파일 삭제 하면서 작성자 PK가 사라지는 문제점 (0) | 2022.03.16 |
---|---|
[WhereWare] 게시글 작성 view에서 안 보이는 문제 (0) | 2022.03.02 |
[Whereware 그룹웨어] 게시판 (0) | 2022.02.08 |