예전에 유지보수중인 사이트중 사이트에서 다른사이트로 넘어가는 링크가 있었는데 이부분에서 sesison clustering이 제대로 되지 않아서 session Clustering을 하는 방법을 찾아보다가 그 당시에 많이 썻었다는 redis를 이용한 session Clustering을 만들었었다. 하지만 유지보중인 서버의 메모리가 좋지않아,,, memory기반인 redis는 결국 쓰지 못했다. 이번프로젝트에는 사용할 수 있는 cloud 서버여서 다시 적용해보기로했다...!
개요
-Redis
오픈 소스 In-Memory 데이터 구조 저장소이며, Key-Value 형식으로 데이터를 저장하고 캐시, 메시지 브로커 및 데이터베이스로 사용할 수 있다. Redis는 매우 빠른 속도와 고성능을 가지고 있어서 대규모 웹 애플리케이션에서 많이 사용된다.
구현
구현은 spring boot를 이용하기 때문에 springfamework에있는 라이브러리를 사용하여 구현 할것이다.
- pom.xml
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
...
spring-boot-starterdata-redis : spring boot에서 redis의 데이터를 저장, 조회등을 이용할때 쓰는 라이브러리
spring-session-data-redis : spring에서 세션정보를 redis랑 연결하여 이용하는 라이브러리
구현 방법은 java에서 configuration을 이용하여 redis를 연결 하는 방법이 있고 나는 spring boot를 이용하기 때문에 application.yml 파일에다가 설정을 하겠다.
- application.yml
server:
port: 8188
servlet:
session:
timeout: 8m # session유지 시간 8분
spring:
application:
name: redisSpringboot
session:
redis:
flush-mode: on-save #on-save(default, 호출될 때만 Redis에 세션 저장), immediate(즉시 Redis에 저장)
store-type: redis #spring session정보는 redis를 이용한다.
redis:
host: 192.168.103 # redis server ip
port: 6379 # redis port
-redis Service
redis에 key : value를 저장 조회가 되는지 확인을 위해 만듬 session clusting 확인이랑 별개
@Slf4j
@Service
public class RedisSampleService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
public String getRedisStringValue(String key) {
ValueOperations<String, String> stringValueOperations = stringRedisTemplate.opsForValue();
log.info("Redis key : " + key);
return stringValueOperations.get(key);
}
public void setRedisStringValue(Map<String, Object> param) {
ValueOperations<String, String> stringValueOperations = stringRedisTemplate.opsForValue();
for (Map.Entry<String, Object> entry : param.entrySet())
{
log.info(entry.getKey() + " : " + entry.getValue().toString());
stringValueOperations.set(entry.getKey(), entry.getValue().toString());
}
}
}
contoller에 해당 서비스를 호출 하는것을 추가 한뒤 저장 을 먼저 호출하면
로그상에는 잘 저장 되어있는거 처럼 보인다. 이제 key를 호출해보면
정상적으로 성공했다. 이제 session을 확인해보자
session Clustering 확인
session Clustering이 잘되는지 확인을 위해 session이 redis에 저장되는지 redis-cli 명령어로 monitor(해당 redis에서 사용되는 명령어들을 모두 나옴)를 해놓고 기동한 springboot에서 하나의 서비스를 호출 해보자
먼가가 저장 되고 spring:seession이라는 데이터가 보인다.
session Clustering이 잘 되는지 확인을 위해 session에다가 데이터 하나를 저장하고 같은session이면 저장 데이터가 보이게 해보겠다.
- controller
@PostMapping("/setSessionId")
public void setSessionId(@RequestBody Map<String, Object> params, HttpSession session) {
session.setAttribute("requestParam", params);
}
@PostMapping("/getSessionId")
public Map<String, Object> getSessionId(HttpSession session, Model model) {
Map<String, Object> result = new HashMap<>();
log.info("session >>>>>>>>>" +session.getAttribute("requestParam"));
result.put("test", session.getAttribute("requestParam"));
return result;
}
get 했을 때
정상적으로 나온다 이제 다른 서버에서 호출을 해보면
값이 비어 있다.
쓰고있는 프로그램은 postman이다
저장 했던 SESSION을 다른 서버에 넣어서 다른 서버에서 호출 해보면
정상적으로 데이터가 나온다~!
https://github.com/victory940209/testspringboot/tree/main/simpleSpringboot