빅토리 코딩
article thumbnail
728x90
반응형
예전에 유지보수중인 사이트중 사이트에서 다른사이트로 넘어가는 링크가 있었는데 이부분에서 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;
	}
{"sessionData" :"asdasdasdasd"} 데이터를 session에 저장 하였다.

get 했을 때

정상적으로 나온다 이제 다른 서버에서 호출을 해보면

값이 비어 있다. 

쓰고있는 프로그램은 postman이다

저장 했던 SESSION을 다른 서버에 넣어서 다른 서버에서 호출 해보면

정상적으로 데이터가 나온다~!

https://github.com/victory940209/testspringboot/tree/main/simpleSpringboot

 

728x90
반응형
profile

빅토리 코딩

@빅토리 코딩

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그