๐Ÿ’ฅ ์ง๋ ฌํ™”๋œ Session์ด ๋‚˜๋ฅผ ์ฃฝ์ผ ์ค„์ด์•ผ โ€“ Redisson๊ณผ ์„ธ์…˜ ์—ญ์ง๋ ฌํ™” ์ด์Šˆ ์ •๋ฆฌ

์„ํ˜„ยท2025๋…„ 7์›” 6์ผ

Issues

๋ชฉ๋ก ๋ณด๊ธฐ
8/8
post-thumbnail

์ตœ๊ทผ ์ •๋ง ๋‹นํ™ฉ์Šค๋Ÿฌ์šด ๊ฒฝํ—˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‰์†Œ์ฒ˜๋Ÿผ Java ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ์‚ฌ์šฉ์ž ์„ธ์…˜์„ Redis์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Redisson์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์–ด์š”. ๊ทธ๋Ÿฐ๋ฐ ๊ฐ‘์ž๊ธฐ ์„œ๋ฒ„๊ฐ€ ํ„ฐ์กŒ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋ฐ”๋กœ ์ง๋ ฌํ™”๋œ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”๋ฐ, ์—ญ์ง๋ ฌํ™”๊ฐ€ ์‹คํŒจํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•œ ๋Œ€๊ทœ๋ชจ ์žฅ์•  ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์ด ์ด์Šˆ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”, Redisson ์„ค์ •, ์‹ค์ œ ์žฅ์•  ์ƒํ™ฉ, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿง  Redisson์ด๋ž€?

Redisson์€ Java์—์„œ Redis๋ฅผ ๋งˆ์น˜ ๋กœ์ปฌ Java ๊ฐ์ฒด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” Redis ํด๋ผ์ด์–ธํŠธ์ž…๋‹ˆ๋‹ค. Redis๋ฅผ ๋‹จ์ˆœํ•œ ์บ์‹œ ์„œ๋ฒ„๋ฅผ ๋„˜์–ด์„œ ๋ถ„์‚ฐ ๋ฝ, ์„ธ์…˜ ์ €์žฅ์†Œ, pub/sub, ์›๊ฒฉ ์„œ๋น„์Šค ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

ํŠนํžˆ Redisson์€ Java ๊ฐ์ฒด๋ฅผ Redis์— ์ €์žฅํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ์˜ ์‹œ์ž‘์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”„ ์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™” ๊ฐ„๋‹จ ์ •๋ฆฌ

๊ฐœ๋…์„ค๋ช…
์ง๋ ฌํ™”(Serialization)Java ๊ฐ์ฒด๋ฅผ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํŒŒ์ผ, ๋„คํŠธ์›Œํฌ, Redis ๋“ฑ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ณผ์ •
์—ญ์ง๋ ฌํ™”(Deserialization)์ €์žฅ๋œ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ๋‹ค์‹œ Java ๊ฐ์ฒด๋กœ ๋ณต์›ํ•˜๋Š” ๊ณผ์ •

๋ณดํ†ต Java ๊ฐ์ฒด๊ฐ€ Serializable์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์œผ๋ฉด ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜... ๊ทธ๊ฑด ์–ด๋””๊นŒ์ง€๋‚˜ ๊ธฐ๋ณธ ์ง๋ ฌํ™” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๋•Œ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.


๐Ÿ˜ฑ ๋ฌธ์ œ์˜ ์›์ธ: Redisson Codec + ํด๋ž˜์Šค ๋ณ€๊ฒฝ

Redisson์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Java ์ง๋ ฌํ™” ๋ฐฉ์‹์„ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  Codec์ด๋ผ๋Š” ์„ค์ •์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ง๋ ฌํ™”ํ• ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

config.setCodec(new JsonJacksonCodec());

์ด๋ ‡๊ฒŒ JsonJacksonCodec์ด๋‚˜ KryoCodec ๊ฐ™์€ ์ฝ”๋ฑ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ํด๋ž˜์Šค ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋„ Java์˜ ๊ธฐ๋ณธ serialVersionUID ์ฒดํฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, Redisson ์ž…์žฅ์—์„  "๊ธฐ์กด์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๊ตฌ์กฐ์˜€๋Š”์ง€"๋ฅผ ๋ชฐ๋ผ๋ฒ„๋ฆฌ๋Š” ๊ฑฐ์ฃ .

๊ทธ๋ž˜์„œ ๊ฐ์ฒด์— ํ•„๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•ด๋„ ์—ญ์ง๋ ฌํ™”๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋Š” ๋Œ€๊ฐœ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "newField"

โ˜ ๏ธ ์žฅ์•  ์ƒํ™ฉ: ์„ธ์…˜ ๊ฐ์ฒด ์—ญ์ง๋ ฌํ™” ์‹คํŒจ โ†’ ์„œ๋ฒ„ ํ„ฐ์ง

๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์„ Redis์—์„œ ๊บผ๋‚ด์˜ค๋ฉด์„œ ์ด ์—ญ์ง๋ ฌํ™” ์˜ˆ์™ธ๊ฐ€ ์ˆ˜์‹ญ, ์ˆ˜๋ฐฑ ๋ฒˆ ๋ฐœ์ƒํ–ˆ๊ณ , ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฑธ ๋ฌด์‹ฌ์ฝ” try-catch๋กœ ๊ฐ์ŒŒ์Šต๋‹ˆ๋‹ค.

try {
  Session session = redissonClient.getBucket("session-key").get();
} catch (Exception e) {
  logger.error("Session fetch failed", e);
}

ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ๋งŽ๋‹ค ๋ณด๋‹ˆ ์˜ˆ์™ธ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ–ˆ๊ณ , JVM์—์„œ Exception ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์ƒ์„ฑ๋˜๊ณ  GC๋˜์ง€ ์•Š์œผ๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์„œ๋ฒ„๊ฐ€ OOM(Out Of Memory) ๋กœ ์ฃฝ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.


๐Ÿงน ํ•ด๊ฒฐ ์ „๋žต: ๊ณผ๊ฐํ•œ flush๋กœ ์ดˆ๊ธฐํ™” ์ฒ˜๋ฆฌ

๋ฌธ์ œ์˜ ์›์ธ์ด ๊ธฐ์กด์— Redis์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ง๋ ฌํ™”๋œ ์„ธ์…˜ ๊ฐ์ฒด์˜€๊ธฐ ๋•Œ๋ฌธ์—, ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค:

  1. ๊ธฐ์กด ์„ธ์…˜ ๋ฐ์ดํ„ฐ ์ „๋ถ€ ์‚ญ์ œ (flushdb)
  2. ํด๋ž˜์Šค ๊ตฌ์กฐ ์•ˆ์ •ํ™” ํ›„ ์žฌ๋ฐฐํฌ
  3. ์ง๋ ฌํ™” ๋ณ€๊ฒฝ ์‹œ ๋ฏธ๋ฆฌ flush ์ž‘์—… ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณ ๋ ค

์šฐ๋ฆฌ๋Š” ๊ณผ๊ฐํ•˜๊ฒŒ flushdb๋ฅผ ์ ์šฉํ–ˆ๊ณ , ์ƒˆ๋กญ๊ฒŒ ์ €์žฅ๋œ ๊ตฌ์กฐ๋ถ€ํ„ฐ๋Š” ์—ญ์ง๋ ฌํ™”์— ์‹คํŒจํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.


โœ… ์˜ˆ๋ฐฉ์„ ์œ„ํ•œ ํŒ

  • ์ง๋ ฌํ™” ์ฝ”๋ฑ์˜ ํŠน์„ฑ์„ ๋ฐ˜๋“œ์‹œ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊ฟ€ ๋• ๊ฐ€๋Šฅํ•œ ํ•œ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜, ๋ฒ„์ „ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋กœ์ง์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์™ธ๋Š” ๋ฌด์กฐ๊ฑด try-catch๋กœ ๊ฐ์‹ธ์ง€ ๋ง๊ณ , ๋ฃจํ”„์„ฑ ํ˜ธ์ถœ ๋˜๋Š” ์š”์ฒญ ํ•„ํ„ฐ๋ง ์ „ ์ „๋žต์ ์œผ๋กœ ์ฐจ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ๋ฐ˜๋ณต ํ˜ธ์ถœ๋˜๋Š” ์˜์—ญ์ด๋ผ๋ฉด GC ๋ถ€ํ•˜๊นŒ์ง€ ๊ณ ๋ คํ•œ ์˜ˆ์™ธ ๊ด€๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

๐Ÿ”š ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ด๋ฒˆ ์žฅ์• ๋Š” "๊ทธ๊นŸ ํ•„๋“œ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ์„ ๋ฟ์ธ๋ฐ..."๋ผ๋Š” ๋ฐฉ์‹ฌ์—์„œ ์‹œ์ž‘๋œ ๋Œ€์ฐธ์‚ฌ์˜€์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ Redisson์ฒ˜๋Ÿผ ์™ธ๋ถ€ ์ฝ”๋ฑ์„ ์“ฐ๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” Java ๊ธฐ๋ณธ ์ง๋ ฌํ™”์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑธ ๊ผญ ๊ธฐ์–ตํ•˜์„ธ์š”.

์ง๋ ฌํ™”๋Š” ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ ์•ฝ์†์ž…๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ์ด ์žˆ์„ ๋• ๋ฐ˜๋“œ์‹œ ๊ทธ ์•ฝ์†์„ ์ง€ํ‚ค๊ณ , ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์•ฝ์†์„ ๋งŒ๋“ค ์ค€๋น„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ๊ธฐ ์ „์—, ์ €์žฅ๋œ ๊ฐ์ฒด๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ์ง๋ ฌํ™”๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ๋จผ์ € ํ™•์ธํ•ด๋ณด๋Š” ์Šต๊ด€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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