B2C 플랫폼 설계/트러블슈팅
🛠️ [트러블슈팅] Redis TTL 설정 누락으로 RefreshToken 만료가 안 되던 문제 해결기 (‘동작한다’보다 ‘정상 동작하는지’를 확인)
2025.06.16
❗ 문제 상황Spring Cloud 기반 B2C 커머스 프로젝트에서 auth-service가 RefreshToken을 Redis에 저장하고 만료시간을 설정하는 구조를 도입했습니다.하지만 테스트 중, 토큰이 일정 시간이 지나도 만료되지 않고 그대로 Redis에 남아 있는 현상이 발견되었습니다.🔍 원인 분석처음에는 다음과 같이 Redis에 토큰을 저장했습니다:redisTemplate.opsForValue().set("refreshToken:" + userId, token); 문제는 이 코드가 단순히 키-값만 저장하고 TTL(Time To Live) 설정이 빠졌다는 점이었습니다.Redis에서는 TTL을 지정하지 않으면 해당 키는 영구 저장됩니다.인증 시스템에서는 반드시 만료시간이 필요하기 때문에 보안상 큰 ..
B2C 플랫폼 설계/트러블슈팅
🛠️ [트러블슈팅] Redis PubSub + WebSocket 알림 연동 시 알림 미수신 이슈
2025.06.01
📌 문제 상황Spring Cloud 기반의 B2C 플랫폼에서 주문 성공 시 Redis를 통해 알림을 발행하고, notification-service에서 이를 수신하여 WebSocket으로 사용자에게 알림을 전송하는 구조를 구현했다. 하지만 다음과 같은 문제가 발생했다:주문 성공 로그는 정상 출력됨Redis CLI에서 SUBSCRIBE notification:channel 명령어로 수신 대기했으나 메시지 수신 불가WebSocket 연결 후에도 HTML 페이지에서 알림(Alert)이 수신되지 않음🔍 원인 분석WebSocket 클라이언트의 subscribe 주소 오류WebSocket 구독 경로 /topic/notification → 실제 서버는 /topic/notifications 로 메시지를 전송경로 m..
B2C 플랫폼 설계/트러블슈팅
🛠️ [트러블슈팅] Redis 장바구니 직렬화 오류 해결
2025.05.31
🧩 문제 상황cart-service에서 사용자 장바구니 데이터를 Redis에 저장하기 위해 RedisTemplate을 활용하고 있었고,Redis에 다음과 같은 객체를 저장하려던 중 애플리케이션 실행 시 오류가 발생했습니다:org.springframework.data.redis.serializer.SerializationException: Cannot serializeRedis에 값을 저장할 수 없어 서비스 기능이 정상 작동하지 않는 상황이었습니다.🔍 원인 분석RedisTemplate은 기본적으로 JdkSerializationRedisSerializer를 사용합니다.이 Serializer는 저장하려는 객체가 java.io.Serializable 인터페이스를 구현해야 정상 동작합니다.그런데 CartIte..
B2C 플랫폼 설계/트러블슈팅
🛠️ [트러블슈팅] JPA @Enumerated(EnumType.STRING) 사용 시 Data truncated for column 오류 해결
2025.05.28
🧩 문제 상황Spring Data JPA를 사용하여 주문 상태(OrderStatus)를 변경하는 로직을 구현하던 중, 다음과 같은 오류가 발생했습니다.Error: 1265-01000: Data truncated for column 'status' at row 1해당 오류는 주문 상태를 업데이트하는 과정에서 발생했습니다.🔍 원인 분석JPA에서 Enum 타입을 DB에 매핑할 때, 기본적으로 다음 두 가지 방식이 있습니다:전략설명DB에 저장되는 값EnumType.ORDINALEnum의 순서(숫자) 저장0, 1, 2...EnumType.STRINGEnum의 이름(문자열) 저장"CREATED", "PAID" 등 이번 프로젝트에서는 가독성과 유지보수를 위해 EnumType.STRING을 사용했습니다:@Enume..
B2C 플랫폼 설계/트러블슈팅
🛠️ [트러블슈팅] Redis에 저장된 RefreshToken이 갱신되지 않아 발생한 토큰 충돌 문제
2025.05.23
⚠️ 문제 상황JWT 인증 기반 로그인 시스템을 구축한 후,/auth/refresh 요청 시 아래와 같은 예외가 발생했습니다.java.lang.NumberFormatException: Cannot parse null string코드는 분명 수정되었고, RefreshToken 생성 시 userId를 subject에 넣도록 반영했는데도이 에러는 계속 발생했습니다.🔍 원인 분석문제의 핵심은 Redis에 저장된 이전 토큰이 여전히 사용되고 있었다는 점입니다.초기 구현 당시 refreshToken 생성 시 sub(subject)이 누락됨Redis에 저장된 토큰도 sub 없는 상태로 남아있었음extractUserId(token) 호출 시 Long.parseLong(null) 예외 발생🔧 해결 과정1. JwtPr..