3434import java .util .HashMap ;
3535import java .util .Map ;
3636import java .util .Optional ;
37+ import java .util .concurrent .TimeUnit ;
3738
3839@ Slf4j
3940@ Service
@@ -51,7 +52,7 @@ public class UserService {
5152 private final JwtProvider jwtProvider ;
5253 private final TokenProperties tokenProperties ;
5354
54- private RedisTemplate <String , String > redisTemplate ;
55+ private final RedisTemplate <String , String > redisTemplate ;
5556 private final TokenService tokenService ;
5657
5758 private static final String domain = "" ;
@@ -241,6 +242,9 @@ public ResponseResult login(LoginReqDto loginReqDto, HttpServletResponse respons
241242 User user = userRepository .findByLoginId (loginReqDto .loginId ())
242243 .orElseThrow (NoUserDataException ::new );
243244
245+ // 로그인하면 Redis에 유저데이터 캐싱
246+ userRepository .findByUserIdWithCache (user .getUserId ());
247+
244248 String accessToken = jwtProvider .createAccessToken (user .getUserId ());
245249 String refreshToken = jwtProvider .createRefreshToken (user .getUserId ());
246250
@@ -259,6 +263,12 @@ public ResponseResult login(LoginReqDto loginReqDto, HttpServletResponse respons
259263 }
260264 }
261265
266+ // Redis에서 유저 캐시 삭제
267+ private void evictUserCache (Long userId ) {
268+ String key = "user::" + userId ;
269+ redisTemplate .delete (key ); // 직접 삭제
270+ }
271+
262272 // 로그아웃
263273 public ResponseResult logout (HttpServletResponse response , HttpServletRequest request ) {
264274 try {
@@ -277,10 +287,12 @@ public ResponseResult logout(HttpServletResponse response, HttpServletRequest re
277287 Long userId = jwtProvider .getUserId (accessToken ); // 액세스 토큰을 넘겨서 userId 추출
278288
279289 tokenService .deleteRefreshToken (userId );
290+ this .evictUserCache (userId );
280291
281292 return new ResponseResult (ErrorCode .SUCCESS ,"로그아웃 되었습니다." );
282293
283294 } catch (Exception e ) {
295+ log .info ("[ERROR] " + e .getMessage ());
284296 return new ResponseResult (ErrorCode . INTERNAL_SERVER_ERROR ,"로그아웃 중 오류가 발생했습니다." );
285297 }
286298 }
@@ -347,6 +359,10 @@ public ResponseResult reissueToken(HttpServletRequest request, HttpServletRespon
347359 Map <String , String > responseBody = new HashMap <>();
348360 responseBody .put ("accessToken" , newAccessToken );
349361
362+ // Redis에서 user::userID TTL을 30분으로 다시 갱신
363+ redisTemplate .expire ("user::" + userId , 30 * 60 , TimeUnit .SECONDS );
364+
365+
350366
351367 return new ResponseResult (ErrorCode .SUCCESS , responseBody );
352368 } else {
0 commit comments