Controller 메소드에서
HttpSession파라미터를 선언하면 DispatcherServlet이 자동으로 주입해준다.
@Controller
public class MemberController{
@RequestMapping(value="/login", method=RequestMethod.POST)
public String doLogin(@ModelAttribute MemberVo memberVO, HttpSession session){
MemberVo loginMember = memberService.selectOneMember(memberVO);
if (loginMember == null){
return "redirect:/login";
}
// 세션에 로그인 사용자 정보 저장
session.setAttribute("loginMember", loginMember);
return "redirect:/board";
}
@RequestMapping("/logout")
public String doLogout(HttpSession session){
// 세션 무효화(로그아웃)
session.invalidate();
return "redirect:/";
}
}
세션에서 데이터 가져오기
@RequestMapping("/myPage"){
public String showMyPage(HttpSession session, Model model){
MemberVO loginMember = (MemberVO)session.getAttribute("loginMember");
if (loginMember == null){
return "redirect:/login";
}
model.addAttribute("member", loginMember);
return "member/myPage";
세션 생성/제어까지 명시적 가능하다
@RequestMapping("/login")
public String login(HttpServletRequest request) {
HttpSession session = request.getSession(); // 세션 가져오기
session.setAttribute("loginMember", new MemberVO()); // 세션에 값 저장
return "home";
}
Model에서 Session을 저장한다.
@Controller
@SessionAttributes("loginMember") // 이 이름의 모델 속성을 세션에 자동 저장
public class MemberController {
@RequestMapping("/login")
public String login(Model model) {
MemberVO member = new MemberVO(); // 로그인 성공했다고 가정
model.addAttribute("loginMember", member); // model → session 자동 이동
return "home";
}
@RequestMapping("/mypage")
public String myPage(@ModelAttribute("loginMember") MemberVO member) {
// 세션에서 loginMember 자동 주입
return "mypage";
}
}
@SessionAttributes는 컨트롤러 단위이기 때문에 다른 컨트롤러에선 접근 불가@RequestMapping("/mypage")
public String myPage(@SessionAttribute("loginMember") MemberVO member) {
// 세션에 있는 loginMember 값을 바로 파라미터로 주입
return "mypage";
}
| 어노테이션 | 용도 | 시점 | 설명 |
|---|---|---|---|
@SessionAttributes | 세션에 저장 | 데이터를 세션에 넣을 때 | Model에 담긴 값을 자동으로 세션에 저장함. (Controller 내부에서만 유효) |
@SessionAttribute | 세션에서 가져오기 | 데이터를 세션에서 쓸 때 | 이미 세션에 저장된 값을 직접 꺼내올 때 사용 (Controller와 무관하게 어디서든 사용 가능) |
Spring MVC에서 Interceptor는 클라이언트의 요청(Request)과 컨트롤러(Controller) 사이에서 실행되는 컴포넌트
웹 요청을 가로채어 공통 처리를 할 수 있게 도와주는 기능으로 주로 요청 전/후 처리, 인증/인가 체크, 로깅, 성능 측정 등에 사용된다.
| 용도 | 예시 |
|---|---|
| 로그인 여부 확인 | 로그인하지 않으면 특정 경로 접근 차단 |
| 권한 체크 | 관리자만 접근 허용 |
| 요청/응답 로그 | 요청 시간, URI 등 기록 |
| 처리 시간 측정 | 요청 소요 시간 측정 |
| 다국어 처리 | 요청에 따라 언어 설정 변경 |
| 메서드 | 설명 | 반환 |
|---|---|---|
preHandle() | 컨트롤러 실행 전 호출 로그인 체크 등 | false면 요청 중단 |
postHandle() | 컨트롤러 실행 후, View 렌더링 전 호출 | 주로 model 조작 |
afterCompletion() | View 렌더링 후 호출 리소스 정리, 예외 로깅 등 | void |
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("loginUser") == null) {
response.sendRedirect("/login");
return false; // ❌ 컨트롤러로 가지 않음
}
return true; // ✅ 컨트롤러로 진행
}
}
XML 기반 설정
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/mypage/**"/>
<bean class="com.example.interceptor.LoginCheckInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
Java Config 방식 (Spring 3.1+)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginCheckInterceptor())
.addPathPatterns("/mypage/**")
.excludePathPatterns("/login", "/resources/**");
}
}
오늘은 Spring MVC에서의 세션(Session) 처리 방식과 인터셉터(Interceptor)에 대해 공부했다.
처음에는 @SessionAttribute와 @SessionAttributes의 차이가 이름이 비슷해서 개념적으로 혼동됐지만, 실제로 코드를 작성해보니 용도가 명확히 구분된다는 점을 알 수 있었다. @SessionAttributes는 컨트롤러에서 Model에 데이터를 담을 때, 이를 자동으로 세션에 저장해주는 어노테이션이고, @SessionAttribute는 이미 세션에 저장되어 있는 데이터를 꺼내서 사용하는 데에 사용된다. 즉, 저장할 때와 사용할 때 쓰는 어노테이션이 다르다는 점이 가장 큰 차이다.
스프링에서 인터셉터는 클라이언트의 요청과 컨트롤러 사이에서 실행되는 컴포넌트로, 공통된 로직을 분리하여 처리할 수 있게 도와주는 역할을 한다. 특히 로그인 여부 확인이나 권한 체크 같은 로직을 모든 컨트롤러마다 반복해서 작성하지 않고 인터셉터의 preHandle() 메서드에서 한 번에 처리할 수 있다. postHandle()과 afterCompletion() 메서드를 통해 응답 이후의 처리나 예외 로그 처리도 가능하다.
이를 적절히 활용하면 코드의 재사용성과 유지보수성이 훨씬 좋아진다.