개발
Day 53 - Interceptor
·3분 읽기
이 글은 2026년 05월 16일 작성된 글입니다.
오늘은 인터셉터 기반 인증/인가 처리와 스코프(scope), 세션, request 객체 활용까지 정리했다.
1. 인터셉터 프로젝트 세팅
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")Spring MVC 기반 웹 프로젝트 환경을 구성했다.
2. 인터셉터 등록
registry.addInterceptor(new LoginInterceptor());인터셉터를 등록하고 요청 흐름에서 로그를 확인했다.
3. 로그인 체크 인터셉터
public class LoginCheckInterceptor implements HandlerInterceptor {
}로그인 여부를 검사하는 인터셉터를 추가했다.
4. 로그인 폼 구현
<form method="post">
<input type="text" name="username">
<input type="password" name="password">
</form>5. 로그인 / 로그아웃 처리
session.setAttribute("loginedMember", member);session.invalidate();세션 기반 로그인/로그아웃을 구현했다.
6. 로그인 기능 보완
- 로그인 실패 처리
- 세션 유지
- 리다이렉트 흐름 개선
등 로그인 흐름을 보완했다.
7. 싱글톤 스코프
@Scope("singleton")기본적으로 스프링 빈은 싱글톤 스코프를 사용한다.
특징:
- 컨테이너당 1개
- 메모리 효율적
- 상태 공유 주의 필요
8. 세션 스코프
@SessionScope브라우저(HTTP 세션)마다 별도의 객체가 생성된다.
9. 세션 스코프와 프록시
@SessionScope(proxyMode = ScopedProxyMode.TARGET_CLASS)세션 스코프 빈은 내부적으로 프록시 객체를 사용한다.
10. 세션에 로그인 정보 저장
session.setAttribute("member", member);사용자별 로그인 상태를 유지할 수 있게 되었다.
11. Request 스코프
@RequestScope
public class Rq {
}Rq 객체를 request 스코프로 변경했다.
12. Request 스코프 특징
request 스코프 객체는 하나의 요청 안에서 데이터를 공유하기 좋다.
활용 예시:
- 인터셉터
- 컨트롤러
- 템플릿
13. 현재 URL 조회
rq.getCurrentUrl();현재 요청 주소를 쉽게 가져올 수 있도록 개선했다.
14. rq에 로그인 정보 저장
rq.setLoginedMember(member);rq 객체에서 로그인 정보를 직접 관리하도록 변경했다.
15. rq 기반 코드 개선
rq 중심 구조로 리팩토링하면서
- 중복 제거
- 로그인 처리 통합
- 코드 가독성 향상
효과를 얻을 수 있었다.
16. rq에서 Member 객체 직접 관리
기존:
Integer memberId개선:
Member member객체 기반 접근으로 코드가 더 직관적으로 바뀌었다.
17. 스코프 종류 정리
| 스코프 | 범위 | 특징 |
|---|---|---|
| singleton | 컨테이너당 1개 | 기본 스코프 |
| prototype | 요청마다 새 객체 | 상태 독립 |
| application | ServletContext 단위 | 웹 전역 |
| session | 세션당 1개 | 사용자별 상태 |
| request | 요청당 1개 | 요청 임시 데이터 |
18. Singleton vs Prototype
| 구분 | Singleton | Prototype |
|---|---|---|
| 생성 횟수 | 1개 | 매번 생성 |
| 메모리 사용 | 적음 | 많음 |
| 상태 공유 | O | X |
✅ 정리
- 인터셉터를 사용하면 공통 인증/인가 처리를 효율적으로 관리할 수 있다.
- 세션을 이용하면 사용자별 로그인 상태를 유지할 수 있다.
- 세션 스코프와 request 스코프를 통해 상황에 맞는 객체 생명주기를 사용할 수 있다.
- request 스코프 객체는 요청 단위 데이터 공유에 특히 유용하다.
- rq 객체를 중심으로 로그인 정보를 관리하면서 코드 구조를 더 깔끔하게 정리할 수 있었다.