학습 목표
- 깔끔한 로그인 의 핵심 개념을 안다
- HandlerInterceptor + JSP include 의 동작을 안다
- 컨트롤러에서 if(session) 코드가 사라지고, 헤더가 통일된다. v4.
1. 문제
v3 에서 컨트롤러마다 if(session==null) 체크가 반복됨. 그리고 「OO님 환영합니다」 표시하려면 표시용 닉네임이 필요.
2. 새 도구
HandlerInterceptor + JSP include + nick 컬럼: 로그인 가드를 인터셉터로 자동화. 헤더는 공통 JSP 로 분리. Member 에 표시용 nick 추가.
3. 코드
-- 1) 스키마 마이그레이션
ALTER TABLE mymember ADD COLUMN nick VARCHAR(30) AFTER pwd;
// com.smhrd.domain.Member
@Data @AllArgsConstructor @NoArgsConstructor
public class Member {
private String id;
private String pwd;
private String nick; // ← 추가
}
// com.smhrd.interceptor.LoginInterceptor
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object h)
throws Exception {
HttpSession session = req.getSession();
if (session.getAttribute("loginUser") == null) {
resp.sendRedirect(req.getContextPath() + "/login");
return false; // 컨트롤러 호출 안 함
}
return true;
}
}
<!-- servlet-context.xml -->
<interceptors>
<interceptor>
<mapping path="/board/write"/>
<mapping path="/mypage/**"/>
<beans:bean class="com.smhrd.interceptor.LoginInterceptor"/>
</interceptor>
</interceptors>
<!-- header.jsp (공통) -->
<c:choose>
<c:when test="${not empty sessionScope.loginUser}">
${sessionScope.loginUser.nick}님 |
<a href="/logout">로그아웃</a>
</c:when>
<c:otherwise>
<a href="/login">로그인</a>
</c:otherwise>
</c:choose>
<!-- board/list.jsp -->
<%@ include file="/WEB-INF/views/header.jsp" %>
... 본문 ...
4. 정리
- Interceptor = 컨트롤러 진입 전 가드
- JSP include = 공통 레이아웃
- sessionScope 로 JSP 에서 세션 접근
- v4 — 깔끔한 코드
5. Before / After
전 차시
v3 에서 컨트롤러마다 if(session==null) 체크가 반복됨. 헤더에 로그인 상태도 표시 안 됨.
이번 차시
컨트롤러에서 if(session) 코드가 사라지고, 헤더가 통일된다. v4.
학습 확인 체크리스트
- Interceptor = 컨트롤러 진입 전 가드
- JSP include = 공통 레이아웃
- sessionScope 로 JSP 에서 세션 접근
- v4 — 깔끔한 코드