저장소이다. 메모리 저장소인데 DB는 물리저장소에 실제 저장이 되는데 redis는 그런게 아니다. 서버를 끄면 사라지는 휘발성이 있는 저장소이다. 아래는 gpt 답변이다.


Redis를 써본적이 없지만 블로그 글을 보면서 하나씩 따라했다. 이렇게 하면 금방 머리에서 사라지지만, 구현에 있어서는 가장 빠르며, 대략적인 흐름을 파악할 수 있다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis
@RequiredArgsConstructor
@Configuration
@EnableRedisRepositories
public class RedisRepositoryConfig {
private final RedisProperties redisProperties;
@Bean
public RedisConnectionFactory redisConFactory() {
return new LettuceConnectionFactory(redisProperties.getHost(),
redisProperties.getPort());
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConFactory());
/**
* setKeySerializer, setValueSerializer 설정해주는 이유는
* RedisTemplate를 사용할 때 Spring - Redis 간 데이터 직렬화, 역직렬화 시
* 사용하는 방식이 Jdk 직렬화 방식이기 때문입니다.
*
* 동작에는 문제가 없지만 redis-cli을 통해 직접 데이터를 보려고 할 때
* 알아볼 수 없는 형태로 출력되기 때문에 적용한 설정입니다.
* */
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
@Slf4j
@RequiredArgsConstructor
public class UserDupleLoginInterceptor implements HandlerInterceptor {
private final RedisTemplate redisTemplate;
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 로그인 요청 id와 session
String loginId = request.getParameter("id");
HttpSession session = request.getSession();
// get은 loginForm이고, post가 로그인 요청이다.
// 로그인 성공 했을 때만 session에 로그인 id를 담아주기 때문에 두 아이디를 비교후 같으면
// 로그인 성공으로 처리한다.
if(request.getMethod().toLowerCase().equals("post")
&& loginId.equals(session.getAttribute("loginId"))){
ValueOperations valueOperations = redisTemplate.opsForValue();
// 해당 아이디가 이미 redis 저장소에 있는지 확인한다.
if(redisTemplate.hasKey(loginId)){
log.info(loginId + " : 중복로그인 입니다. 기존 로그인은 로그아웃 됩니다.");
request.getSession().setAttribute("message", "중복로그인 입니다. 기존 로그인은 로그아웃 됩니다.");
}
valueOperations.set(loginId, session.getId());
}
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
}
@Slf4j
@RequiredArgsConstructor
public class UserCertificationInterceptor implements HandlerInterceptor {
private final RedisTemplate redisTemplate;
public boolean preHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object handler ) throws Exception {
HttpSession session = httpServletRequest.getSession();
String loginId = (String) session.getAttribute("loginId");
String sessionId = session.getId();
ValueOperations valueOperations = redisTemplate.opsForValue();
String redisSessionId = (String) valueOperations.get(loginId);
// 로그인을 하지 않았거나 || 레디스에 저장된 세션아이디와 현재 요청중인 세션 아이디가 다르다면
if (ObjectUtils.isEmpty(redisSessionId) || !sessionId.equals(redisSessionId)){
httpServletResponse.sendRedirect("/user/login");
return false;
} else {
return true;
}
}
}
이렇게 중복로그인이 방지가 되긴 했는데 일단 이렇게 해서 테스트를 해보니 되긴 했는데 아쉬움이 몇가지 남는다.
LettuceConnectionFactory로 커넥션을 만드는 방식이 있고, 다른 방식이 하나 더 있는 것으로 알고있는데 뭐가 다른지 아직은 모른다.redis를 아예 처음 써보고 설치도 3시간 전에 해본거라 아쉬움을 느끼는 부분들이 실제로 아쉬운 부분인지는 좀 더 공부해봐야 알 것 같다.