public Pair<Long, Jwts> refresh(String refreshToken) {
        JwtClaims claims = refreshTokenProvider.getJwtClaimsFromToken(refreshToken);

        Long userId = JwtClaimsParserUtil.getClaimsValue(claims, RefreshTokenClaimKeys.USER_ID.getValue(), Long::parseLong);
        String role = JwtClaimsParserUtil.getClaimsValue(claims, RefreshTokenClaimKeys.ROLE.getValue(), String.class);
        log.debug("refresh token userId : {}, role : {}", userId, role);

        RefreshToken newRefreshToken;
        try {
            newRefreshToken = refreshTokenService.refresh(userId, refreshToken, refreshTokenProvider.generateToken(RefreshTokenClaim.of(userId, role)));
            log.debug("new refresh token : {}", newRefreshToken.getToken());
        } catch (IllegalArgumentException e) {
            throw new JwtErrorException(JwtErrorCode.EXPIRED_TOKEN);
        } catch (IllegalStateException e) {
            throw new JwtErrorException(JwtErrorCode.TAKEN_AWAY_TOKEN);
        }

        String newAccessToken = accessTokenProvider.generateToken(AccessTokenClaim.of(userId, role));
        log.debug("new access token : {}", newAccessToken);

        return Pair.of(userId, Jwts.of(newAccessToken, newRefreshToken.getToken()));
    }
@Test
    @DisplayName("사용자 아이디에 해당하는 리프레시 토큰이 존재할 시, 리프레시 토큰 갱신에 성공한다.")
    public void RefreshTokenRefreshSuccess() {
        // given
        RefreshToken refreshToken = RefreshToken.builder()
                .userId(1L)
                .token("refreshToken")
                .ttl(1000L)
                .build();
        refreshTokenRepository.save(refreshToken);
        given(refreshTokenProvider.getJwtClaimsFromToken(refreshToken.getToken())).willReturn(RefreshTokenClaim.of(refreshToken.getUserId(), Role.USER.getType()));
        given(accessTokenProvider.generateToken(any())).willReturn("newAccessToken");
        given(refreshTokenProvider.generateToken(any())).willReturn("newRefreshToken");

        // when
        Pair<Long, Jwts> jwts = jwtAuthHelper.refresh(refreshToken.getToken());

        // then
        assertEquals("사용자 아이디가 일치하지 않습니다.", refreshToken.getUserId(), jwts.getLeft());
        assertEquals("갱신된 액세스 토큰이 일치하지 않습니다.", "newAccessToken", jwts.getRight().accessToken());
        assertEquals("리프레시 토큰이 갱신되지 않았습니다.", "newRefreshToken", jwts.getRight().refreshToken());
        log.info("갱신된 리프레시 토큰 정보 : {}", refreshTokenRepository.findById(refreshToken.getUserId()).orElse(null));
    }