Session Clustering

์ด๋ฏธ์—ฐยท2024๋…„ 8์›” 9์ผ

[spring]

๋ชฉ๋ก ๋ณด๊ธฐ
4/7

๐Ÿ”Ž ์™œ ์„ธ์…˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง์ด ํ•„์š”ํ•œ๊ฐ€?

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ๋‹จ์ผ ์„œ๋ฒ„๋กœ๋Š” ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๋“œ๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์šฉ์ž ์„ธ์…˜ ์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ์„œ๋ฒ„์— ์ ‘์†ํ•˜๋”๋ผ๋„ ์ผ๊ด€๋œ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๐Ÿ”Ž Spring Session๊ณผ Redis

Spring Session์€ ์„ธ์…˜ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Redis์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ์„ธ์…˜์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Redis๋Š” ๊ณ ์„ฑ๋Šฅ ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋กœ, ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ์˜์กด์„ฑ ์ถ”๊ฐ€

๋จผ์ € build.gradle ํŒŒ์ผ์— ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.session:spring-session-data-redis'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // ๊ธฐํƒ€ ํ•„์š”ํ•œ ์˜์กด์„ฑ๋“ค...
}

2. Redis ์„ค์ •

Redis ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ application.properties ๋˜๋Š” application.yml ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

spring:
  redis:
    host: localhost
    port: 6379

3. Spring Session ์„ค์ •

Spring Session์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด @EnableRedisHttpSession ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ • ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

@Configuration
@EnableRedisHttpSession
public class SessionConfig {
}

4. ์„ธ์…˜ ์ง๋ ฌํ™” ๋ฐฉ์‹ ๋ณ€๊ฒฝ

๊ธฐ๋ณธ์ ์œผ๋กœ Java ์ง๋ ฌํ™”๊ฐ€ ์‚ฌ์šฉ๋˜์ง€๋งŒ, JSON ๋“ฑ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
    return RedisSerializer.json();
}

์ฃผ์˜์‚ฌํ•ญ

JSON ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ SecurityContext์™€ ๊ฐ™์€ ์ผ๋ถ€ ๊ฐ์ฒด์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ์„ธ์…˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ •

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)

์ฃผ์˜์‚ฌํ•ญ

์„ธ์…˜ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ: Redis์— ์ €์žฅ๋˜๋Š” ์„ธ์…˜ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋„คํŠธ์›Œํฌ ์ง€์—ฐ: Redis ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์— ๋”ฐ๋ฅธ ์•ฝ๊ฐ„์˜ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณด์•ˆ: Redis ์„œ๋ฒ„์˜ ๋ณด์•ˆ ์„ค์ •์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”Ž ๋™์ž‘ ์›๋ฆฌ

Spring Session์€ HTTP ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์–ด ๊ธฐ์กด์˜ HttpSession์„ Spring Session์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
์„ธ์…˜ ๋ฐ์ดํ„ฐ๋Š” Redis์— ์ €์žฅ๋˜๋ฉฐ, ๊ฐ ์„ธ์…˜์€ ๊ณ ์œ ํ•œ ํ‚ค๋กœ ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค.
ํด๋ผ์ด์–ธํŠธ์—๋Š” SESSION ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜๋ฉฐ, ์ด ์ฟ ํ‚ค๋Š” Redis์— ์ €์žฅ๋œ ์„ธ์…˜์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์žฅ์ 

์„œ๋ฒ„ ๊ฐ„ ์„ธ์…˜ ๊ณต์œ : ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์—์„œ ๋™์ผํ•œ ์„ธ์…˜ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ™•์žฅ์„ฑ: ์„œ๋ฒ„๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ฑ๋Šฅ: Redis์˜ ๋น ๋ฅธ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์†๋„๋กœ ์ธํ•ด ์„ธ์…˜ ๊ด€๋ฆฌ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€