[Redis] <Long,String> 넣었다가 공백 맞은 후기

김정연·2024년 11월 5일
0

oauth2 & redis

목록 보기
1/3
post-thumbnail

오늘은 레디스에 리프레쉬 토큰을 넣기 위해 퇴근 후 코딩을 시작했다.

내가 원했던 로직은
1. 로그인 시도
2. acessToken, refreshToken 생성
3. 로컬 스토리지 > acessToken , 레디스 > refreshToken
4. 로그인 완료

이렇게 누구나 아는 단순한 로직이였는데 난 레디스의 키값을 단순히 유저Idx로 하고싶었다.
그래서 나는 RedisTemplate<Long, String> 으로 설정해버렸다.

@Bean
    public RedisTemplate<Long, String> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Long, String> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        template.setKeySerializer(new GenericToStringSerializer<>(Long.class));
        template.setValueSerializer(new StringRedisSerializer());

        return template;
    }

StringRedisSerializer

StringRedisSerializer는 레디스에 데이터를 저장하거나 조회할 때 문자열 형식으로 직렬화, 역직렬화해주는 역할이다. 그래서 키와 밸류값에 set으로 설정하는 것인데 UTF-8 바이트 배열로 변환해 레디스에 저장해준다.

내가 원했던 Long타입의 키값은 문자열로 저장하면 안되기 때문에 난 new GenericToStringSerializer<>(Long.class)를 써줬다.

여기서부터 문제가 시작됐다.

토큰을 레디스에 저장은 잘 됐는데 실제 포스트 맨으로 호출해서 보면 앞에 빨간색으로 이상한 부분이 있었다. 그래서 redis cli에서도 확인해봤다.

이미지를 보면 실제 cli에서도 공백이 있는것을 알 수 있다. 이것 저것 찾아보고 고민해본 결과

레디스는 문자열 기반 데이터 저장소임을 잊고 있었다.

new GenericToStringSerializer<>(Long.class)는 Long 타입과 같은 특정 객체타입을 문자열로 직렬화 역직렬화 해주는 역할을 한다. 즉 내가 Long타입을 주면 직렬화해서 문자열로 바꾼 후 레디스에 저장되는 것이다. 나는 단순히 타입만 맞추기 급급해 실수했다.

결과

결론적으로 다시 string 타입으로 바꿨더니 토큰이 제대로 들어가는 것을 확인했다.
사실 Long에서 String으로 타입을 변환하는 과정에서 예기치 않은 공백이나 특수문자가 생길 수 있다는 것을 오늘 처음 알았다. 앞으로는,, 불필요한 변환을 줄이기 위해 타입을 잘 체크해야겠다. 끝

profile
백엔드 개발자

0개의 댓글