Spring

    [Redis] Redis์˜ ๋ฐฑ์—…๊ณผ HA๋ฅผ ์œ„ํ•œ ์ „๋žต (RDB, AOF, Replication, Sentinel, Sharding, Cluster)

    [Redis] Redis์˜ ๋ฐฑ์—…๊ณผ HA๋ฅผ ์œ„ํ•œ ์ „๋žต (RDB, AOF, Replication, Sentinel, Sharding, Cluster)

    ๐Ÿ0. ์„œ๋ก  ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ Redis๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€, ์‹ ๊ธฐํ•œ ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋„์ปค๋ฅผ ํ†ตํ•ด ๋ ˆ๋””์Šค ์„œ๋ฒ„๋ฅผ ๋Œ๋ฆฌ๊ณ  ์žˆ์—ˆ๊ณ , JWT Refresh Token์„ ๋ ˆ๋””์Šค ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋„์ปค๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ๋ฉฐ์น  ๋’ค์— ๋‹ค์‹œ ์‹คํ–‰์„ ํ•ด๋ณธ ๊ฒฐ๊ณผ ์•„์ง ํ•ด๋‹น ํ† ํฐ๋“ค์ด ๋‚จ์•„์žˆ๋Š” ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. "์—ฅ? Redis๋Š” InMemory DB๋กœ ์ข…๋ฃŒ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ํœ˜๋ฐœ๋˜์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š”๊ฒŒ ๋งž์ง€ ์•Š๋‚˜?" ์ด๋Ÿฌํ•œ ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๊ณ , Redis์˜ ๋ฐฑ์—…์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•˜์ž ํ•ด๋‹น ์‹ค๋งˆ๋ฆฌ๋ฅผ ํ’€์–ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๐Ÿค” 1. Redis์˜ ๋ฐฑ์—… ๋ฐฉ์‹ 1-1. RDB(Redis DataBase ๋ฐฉ์‹) ์—ฌ๊ธฐ์„œ RDB๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ, Redis์˜ ์ž์ฒด์ ์ธ ๋ฐฑ์—… ๋ฐฉ์‹์ธ Redis Database ๋ฐฉ์‹์„..

    [Spring] @Transactional๊ณผ DB Lock์— DeepDive - (1) DB ํŠธ๋žœ์žญ์…˜, ์‚ฌ์šฉ๋ฐฉ๋ฒ•, ๊ฒฉ๋ฆฌ์ˆ˜์ค€, ์ „ํŒŒ ๋‹จ๊ณ„ ํ›‘์–ด๋ณด๊ธฐ

    [Spring] @Transactional๊ณผ DB Lock์— DeepDive - (1) DB ํŠธ๋žœ์žญ์…˜, ์‚ฌ์šฉ๋ฐฉ๋ฒ•, ๊ฒฉ๋ฆฌ์ˆ˜์ค€, ์ „ํŒŒ ๋‹จ๊ณ„ ํ›‘์–ด๋ณด๊ธฐ

    ๐Ÿค” 0. DB ํŠธ๋žœ์žญ์…˜ ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ์ตœ์†Œ ๋‹จ์œ„์˜ ์ž‘์—…์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ, commit()์„ ํ†ตํ•ด ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๋“ ์ง€ ์•„๋‹ˆ๋ฉด rollback()์„ ํ†ตํ•ด ๋ชจ๋‘ ์ทจ์†Œ๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—… ๋‹จ์œ„. ํŠธ๋žœ์žญ์…˜์€ DB์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•˜๋‚˜์˜ ์ž‘์—… ๋‹จ์œ„์— ์†ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ INSERT, UPDATE, DELETE ๋“ฑ์˜ SQL๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด, ์ž๋™์œผ๋กœ ํ•œ ๋ผ์ธ๋งˆ๋‹ค ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์–ด Commit์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠธ๋žœ์žญ์…˜์˜ ์˜์—ญ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด, ํ•œ ํŠธ๋žœ์žญ์…˜ ์•ˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ช…๋ น๋ฌธ์„ ๋„ฃ๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. START TRANSACTION; .... COMMIT; ํŠธ๋žœ์žญ์…˜์€ ์šฐ๋ฆฌ๋ง๋กœ '๊ฑฐ๋ž˜'๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, A์™€ B๊ฐ€ ๊ฑฐ๋ž˜๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ A๊ฐ€ B์—๊ฒŒ ๋ˆ์„ ์ž…๊ธˆ ํ–ˆ์œผ๋‚˜, B์—๊ฒŒ ์‚ฌ์ •์ด ์ƒ๊ฒจ ๋ฌผ๊ฑด์„ ๋ณด๋‚ด์ง€..

    [Spring JPA] @Enumerated์™€ AttributeConverter

    [Spring JPA] @Enumerated์™€ AttributeConverter

    ๐Ÿ 0. ์„œ๋ก  ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด, ๋ฐฑ์—”๋“œ์—์„œ๋Š” ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ํ•ต์‹ฌ์ ์œผ๋กœ ๋ถ„๋ณ„๊ฐ€๋Šฅํ•œ ํŒŒํŠธ๋งŒ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์€ ์ •ํ•ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ด๋Ÿฌํ•œ ๊ฐ„๊ทน์„ ํ•ด๊ฒฐํ•ด์ค„ ๋‘ ๊ฐ€์ง€ ๊ธฐ์ˆ ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ๋Š” Enum ๊ฐ์ฒด๋กœ, DB์—์„œ๋Š” Enum์˜ ์ƒ์ˆ˜๊ฐ’(์ˆœ์„œ๊ฐ’)์ด๋‚˜ ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” @Enumerated์™€, Enum ๊ฐ์ฒด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ JPA๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํƒ€์ž…์„ ๋ณ€ํ™˜๊ฐ€๋Šฅํ•˜๋ฉฐ, ์‹ฌ์ง€์–ด ๋‘ ๊ฐœ ์ด์ƒ์˜ ์†์„ฑ์„ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ํ•œ ๊ฐœ ํ•„๋“œ์— ๋งคํ•‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” AttributeConverter์—..