v4
★ LAB · BOARD

깔끔한 로그인

회원과 게시판 — 실습

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

사전 준비

이번 실습의 목표

로그인 가드를 인터셉터로 자동화. 헤더는 공통 JSP 로 분리.

1
스키마 마이그레이션 — nick 컬럼 추가
-- 표시용 닉네임 컬럼 추가
ALTER TABLE mymember ADD COLUMN nick VARCHAR(30) AFTER pwd;

-- 기존 회원에게 임시 nick 채우기
UPDATE mymember SET nick = id WHERE nick IS NULL;
// com.smhrd.domain.Member — 필드 추가
@Data @AllArgsConstructor @NoArgsConstructor
public class Member {
    private String id;
    private String pwd;
    private String nick;     // ← 추가
}
CHECKPOINT
  • DESC mymember;nick varchar(30) 이 보이는가?
2
인터셉터 + 공통 레이아웃
// 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" %>
... 본문 ...
CHECKPOINT
  • 코드를 작성한 뒤 빨간 줄(컴파일 오류)이 없는가?
3
실행 + 결과 확인

로그아웃 상태에서 보호 URL 직접 접근 → 자동 리다이렉트 확인.

CHECKPOINT
  • 비로그인 상태로 /board/write 직접 접속 시 — F12 Network 응답 Status 302, Location 이 /login 인가?
  • 로그인 후 헤더에 ${nick}님 이 표시되는가?

실습 완료 체크리스트

Interceptor = 컨트롤러 진입 전 가드
JSP include = 공통 레이아웃
sessionScope 로 JSP 에서 세션 접근
v4 — 깔끔한 코드