v4
★ PART · BOARD

깔끔한 로그인

회원과 게시판 — 읽기 자료

📍 지금 어디를 만지고 있나요?
브라우저
회원과 게시판
DB

핵심 용어

HandlerInterceptorSpring 의 컨트롤러 진입/종료 시점에 끼어드는 부품.
preHandle컨트롤러 호출 전 실행. false 반환 시 호출 안 함.
sessionScopeJSP 의 EL 에서 세션 접근.

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. 정리

5. Before / After

전 차시 끝

v3 에서 컨트롤러마다 if(session==null) 체크가 반복됨. 헤더에 로그인 상태도 표시 안 됨.

이번 차시 끝

컨트롤러에서 if(session) 코드가 사라지고, 헤더가 통일된다. v4.