자바 웹 session과 Interceptor

Dear·2025년 6월 26일

TIL

목록 보기
49/74

💙 HttpSession 객체 (Servlet API + Spring DI)

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";

💙 HttpServletRequest로부터 HttpSession 얻기 (Servlet API 기반)

세션 생성/제어까지 명시적 가능하다

@RequestMapping("/login")
public String login(HttpServletRequest request) {
    HttpSession session = request.getSession(); // 세션 가져오기
    session.setAttribute("loginMember", new MemberVO()); // 세션에 값 저장
    return "home";
}

💙 @SessionAttributes (Model 객체에 저장 → 자동 세션 저장)

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는 컨트롤러 단위이기 때문에 다른 컨트롤러에선 접근 불가
    -> 동일한 컨트롤러 내부에서만 작동

💙 @SessionAttribute (Spring 3.1 이상, 세션에서 직접 가져오기)

@RequestMapping("/mypage")
public String myPage(@SessionAttribute("loginMember") MemberVO member) {
    // 세션에 있는 loginMember 값을 바로 파라미터로 주입
    return "mypage";
}
  • 장점 : 세션 접근이 간단하고 깔끔하다
  • 단점 : Spring 3.1 이상부터 지원 (Spring 3.0에는 없다)

💙 @SessionAttribute 와 @SessionAttributes 차이


어노테이션용도시점설명
@SessionAttributes세션에 저장데이터를 세션에 넣을 때Model에 담긴 값을 자동으로 세션에 저장함. (Controller 내부에서만 유효)
@SessionAttribute세션에서 가져오기데이터를 세션에서 쓸 때이미 세션에 저장된 값을 직접 꺼내올 때 사용 (Controller와 무관하게 어디서든 사용 가능)

- 로그인 직후: → model.addAttribute("loginUser", member); → @SessionAttributes("loginUser") 로 저장
  • 이후 다른 페이지:
    → @SessionAttribute("loginUser") 로 세션 값 바로 주입해서 사용

💙 Interceptor

Spring MVC에서 Interceptor는 클라이언트의 요청(Request)과 컨트롤러(Controller) 사이에서 실행되는 컴포넌트

웹 요청을 가로채어 공통 처리를 할 수 있게 도와주는 기능으로 주로 요청 전/후 처리, 인증/인가 체크, 로깅, 성능 측정 등에 사용된다.

용도예시
로그인 여부 확인로그인하지 않으면 특정 경로 접근 차단
권한 체크관리자만 접근 허용
요청/응답 로그요청 시간, URI 등 기록
처리 시간 측정요청 소요 시간 측정
다국어 처리요청에 따라 언어 설정 변경

동작 흐름

  1. 클라이언트 요청
  2. Interceptor - preHandle()
  3. Controller 처리
  4. Interceptor - postHandle()
  5. View 렌더링 완료 후 - afterCompletion()
  6. 응답 반환

주요 메소드

메서드설명반환
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; // ✅ 컨트롤러로 진행
    }
}

인터셉터 등록 (Spring 3)

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() 메서드를 통해 응답 이후의 처리나 예외 로그 처리도 가능하다.

이를 적절히 활용하면 코드의 재사용성과 유지보수성이 훨씬 좋아진다.

profile
친애하는 개발자

0개의 댓글