
오늘은 레디스에 리프레쉬 토큰을 넣기 위해 퇴근 후 코딩을 시작했다.
내가 원했던 로직은
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는 레디스에 데이터를 저장하거나 조회할 때 문자열 형식으로 직렬화, 역직렬화해주는 역할이다. 그래서 키와 밸류값에 set으로 설정하는 것인데 UTF-8 바이트 배열로 변환해 레디스에 저장해준다.
내가 원했던 Long타입의 키값은 문자열로 저장하면 안되기 때문에 난 new GenericToStringSerializer<>(Long.class)를 써줬다.

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

이미지를 보면 실제 cli에서도 공백이 있는것을 알 수 있다. 이것 저것 찾아보고 고민해본 결과
new GenericToStringSerializer<>(Long.class)는 Long 타입과 같은 특정 객체타입을 문자열로 직렬화 역직렬화 해주는 역할을 한다. 즉 내가 Long타입을 주면 직렬화해서 문자열로 바꾼 후 레디스에 저장되는 것이다. 나는 단순히 타입만 맞추기 급급해 실수했다.

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