FlashAttribute의 함정: 2시 배포 후 3시 오픈, 그리고 장애
SSG7CLUB 멤버십 가입 프로세스 오픈 중 FlashAttribute 사용으로 인한 장애 발생
다중 WAS 환경에서 FlashAttribute가 세션 기반으로 작동하여 서버 간 세션 불일치(Session Inconsistency) 문제 발생
문제 해결을 위해 redirect 및 FlashAttribute 제거, 단순 POST 요청 및 자동 submit 방식으로 변경
결과적으로 구조 단순화, 장애 포인트 제거, 운영 환경 안정성 확보
FlashAttribute의 동작 원리
FlashAttribute는 Spring MVC에서 일회성 데이터를 전달하기 위한 기능으로, 내부적으로 세션을 사용한다.
동작 방식: POST 요청 처리 후 redirect 시, 세션에 데이터를 저장하고, redirect된 GET 요청에서 해당 데이터를 꺼내 사용
문제점: 다중 WAS 환경에서 세션 공유(Session Sharing) 미설정 시, 서버 간 세션 불일치로 데이터 유실 발생
해결책: FlashAttribute 대신 POST 요청 및 쿼리 파라미터(Query Parameter) 사용 또는 데이터 격리 아키텍처(Data Isolation Architecture) 적용
결과적으로 FlashAttribute는 간단한 상황에 유용하지만, 분산 환경에서는 세션 관리(Session Management)에 대한 추가적인 고려가 필요하다.
Post-Redirect-Get 패턴의 함정
본문에서 Post-Redirect-Get(PRG) 패턴은 중복 전송 방지(Duplicate Submission Prevention)를 위해 사용되었지만, FlashAttribute와 결합되어 문제를 야기했다.
PRG 장점: 사용자가 새로고침 시 POST 요청이 다시 전송되는 것을 방지
PRG 단점: redirect 과정에서 세션 의존성(Session Dependency) 발생 및 데이터 유실 위험 증가
대안: POST 요청 후 바로 화면을 렌더링하거나, GET 요청으로 변경하여 세션 의존성을 제거
결론적으로 PRG 패턴은 유용하지만, 세션 관리(Session Management)에 대한 충분한 고려가 선행되어야 한다.
다중 WAS 환경에서의 세션 관리
다중 WAS 환경에서 FlashAttribute 사용 시, 세션 관리가 제대로 이루어지지 않으면 데이터 유실(Data Loss) 및 예측 불가능한 오류가 발생한다.
세션 클러스터링(Session Clustering): 세션 정보를 공유하여 서버 간 세션 불일치 문제 해결
Sticky Session: 사용자 요청을 특정 WAS로 고정하여 세션 공유 필요성 감소
데이터 격리 아키텍처(Data Isolation Architecture): 세션 대신 데이터베이스(Database) 또는 캐시(Cache) 사용
결과적으로 다중 WAS 환경에서는 세션 관리 전략(Session Management Strategy) 수립이 필수적이며, 서비스 특성에 맞는 적절한 방법을 선택해야 한다.
장애 해결 과정에서 얻는 교훈
본 사례는 단순함의 중요성(Importance of Simplicity)과 운영 환경에 대한 충분한 이해의 필요성을 강조한다.
불필요한 복잡성 제거: redirect, FlashAttribute, 세션 의존성 제거를 통해 코드 단순화(Code Simplification)
운영 환경 테스트: 로컬 및 스테이징 환경에서 재현되지 않는 문제를 방지하기 위해 운영 환경과 유사한 환경에서 테스트 수행
문제 해결 능력: 문제의 근본 원인을 파악하고, 가장 적합한 해결책을 제시하는 능력
결론적으로, 개발자는 기술적인 지식뿐만 아니라 시스템 전체에 대한 이해를 바탕으로 문제를 해결해야 한다.