✏️ 배경
프로젝트 진행 중 Redis 세션 로그아웃과 만료시 로그를 저장해야 하는 작업이 있었다. Redis 세션 로그아웃과 만료 관련 처리 작업을 하면서 알게 된 ApplicationListener과 Event를 활용해 처리하는 방법에 대해 공유하고자 한다.
📌 필수 등록
Session 관련 작업을 수행하기 위해서 pom.xml에 해당 Session Dependency를 추가해주어야 한다.
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
🔎 로그아웃
로그아웃할 때 무언가 처리해야 된다고 생각하면 일반적으로 Security의 LogoutHandler 또는 LogoutSuccessHandler를 구현하고 Security 설정 파일에 등록해서 사용할 것으로 생각한다.
충분히 좋은 방식이며 이미 구현되어 있다면 해당 방식으로 굳이 바꿀 필요는 없다.
* SessionDeletedEvent
@Component
public class SessionDeletedListener implements ApplicationListener<SessionDeletedEvent> {
@Override
public void onApplicationEvent(SessionDeletedEvent event) {
// 관련 처리 작성
}
}
해당 방식은 SessionDeletedEvent를 활용해서 이벤트 기반으로 처리하는 방법이다.
ApplicationListener에 SessionDeletedEvent를 등록하면 직접 로그아웃하는 경우에 관련 처리를 수행한다.
그렇다면 LogoutHandler, LogoutSuccessHandler, Event가 동시에 존재하는 경우 로그아웃시 어떤 순서로 수행될까? 🤔
해당 이벤트는 LogoutHandler 보다는 뒤, LogoutSuccessHandler 보다는 앞에서 처리한다.
🔎 타임아웃
* SessionExpiredEvent
@Component
public class SessionExpiredListener implements ApplicationListener<SessionExpiredEvent> {
@Override
public void onApplicationEvent(SessionExpiredEvent event) {
// 관련 처리 작성
}
}
해당 방식은 SessionExpiredEvent를 활용해서 이벤트 기반으로 처리하는 방법이다.
ApplicationListener에 SessionExpiredEvent를 등록하면 세션에 부여한 시간이 만료될 때 발생한다.
⛔️ 주의사항
SessionDeletedEvent, SessionExpiredEvent 모두 SessionDestroyedEvent을 상속받은 자식 객체이다.
따라서 SessionDestroyedEvent를 이벤트로 등록하는 경우 로그아웃(SessionDeletedEvent) 또는 타임아웃(SessionExpiredEvent) 이벤트 이후 추가적인 작업으로 수행될 수 있다.
다만, 이 부분은 서비스에서 활용하기 나름이라 로그아웃, 타임아웃 처리 이후 별도로 공통적인 무언가를 처리해야 한다면 이벤트로 등록해서 활용해 볼 수 있다.
'Spring' 카테고리의 다른 글
Spring DB Migration Tool Flyway, Liquibase 특징, 유사점, 차이점 (0) | 2023.05.13 |
---|---|
ObjectMapper 사용할 때 Validator 활용하기 (0) | 2023.05.01 |
Spring Redis Session 설정, 특징, 데이터 조회 (0) | 2023.04.08 |
[Spring] 데이터와 연관된 파일 데이터(multipart)를 목록으로 받기 (0) | 2023.04.02 |
Spring으로 네이버 비로그인 방식 오픈 API 사용해보기 (0) | 2023.03.26 |
댓글