1. ํ ํฐ ์ฌ๋ฐ๊ธ์ ์ ์ฅ๊ณต๊ฐ์ด ํ์ํ ์ด์
ํ์ฌ JWT ์ธ์ฆ๋ฐฉ์์ ์ ์ฉํ๊ณ ์๋ค.
ํด๋น ๋ฐฉ์์ ํ๋ก์ฐ๋ ๋๋ต ์๋์ ๊ฐ๋ค.
- ๋ก๊ทธ์ธ์ Access Token๊ณผ Refresh Token์ด ๋ฐ๊ธ๋๋ค.
- ๊ถํ์ด ํ์ํ API์ ๊ฒฝ์ฐ header์ Access Token์ ์ถ๊ฐํ์ฌ ์์ฒญํ๋ค.
- Access Token์ด ๋ง๋ฃ๋ ๊ฒฝ์ฐ์๋ Refresh Token์ ํตํด Access Token๊ณผ Refresh Token ๋ชจ๋ ์ฌ๋ฐ๊ธ ๋ฐ๋๋ค.
์ด๋ฌํ ์ ์ฐจ ๊ณผ์ ์์ ํ ํฐ์ ์ ์ฅํ ๊ณต๊ฐ์ด ํ์ํ๋ค.
ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ RDBMS์ธ MariaDB๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ Redis๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ธฐ๋ฅ, ์ฑ๋ฅ์ ์ฐจ์ด๋ฅผ ๋น๊ตํด๋ณด์๋ค.
์๋๋ ์ต์ข ๋น๊ต ๊ฒฐ๊ณผ์ด๋ค.
Redis์ ๋ํด ์์ธํ ์๊ณ ์ถ์ผ๋ฉด ์ด์ ์ ์์ฑํ ํฌ์คํ ์ ์ฐธ๊ณ ํ์!
2023.08.20 - [๐ข๏ธDatabase] - Redis ์๊ณ ์ฌ์ฉํ์!
์ ๊น! java์ HashMap์ ๋ฐ์ดํฐ ์ ์ฅํ๋ฉด ์๋๋?
private final Map<String, Object> map = new HashMap()
"HashMap์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ์ ์๋๋ฐ ์ด๊ฑธ ์ฌ์ฉํ๋ฉด ์๋๋?" ๋ผ๊ณ ์๊ฐํ ์ ์๋ค.
๋ฌธ์ ๋ ํฌ๊ฒ ๋๊ฐ์ง๊ฐ ์๋ค.
- ์๋ฒ๊ฐ ์ฌ๋ฌ๋์ธ ๊ฒฝ์ฐ Consistency ๋ฌธ์ ๊ฐ ๋ฐ์๊ฐ๋ฅํ๋ค.
- Multi-Threaded ํ๊ฒฝ์์ Race Condition ๋ฌธ์ ๊ฐ ๋ฐ์๊ฐ๋ฅํ๋ค.
Race Condition์ ๊ฒฝ์ฐ
RedIs๋ ๊ธฐ๋ณธ์ ์ผ๋ก Single Threaded์ด๊ณ ์๋ฃ๊ตฌ์กฐ๋ฅผ Atomicity Critical Section์ ๋ํ ๋๊ธฐํ๋ฅผ ์ ๊ณตํ๋ค.
Critical Section?
๋์์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํด์๋ ์๋๋ ์์ญ
๋ฐ๋ผ์, Redis๋ ์๋ก ๋ค๋ฅธ Transaction Read/Write๋ฅผ ๋๊ธฐํํด์ Race Condition ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
2. Redis์ TTL์ ์ฌ์ฉํ ๊ธฐ๋ฅ์ ์ด์ ๊ณผ RDB ์ฌ์ฉํ ๊ฒฝ์ฐ ๋์ฒด ๊ธฐ๋ฅ
Redis๋ ํน์ ์๊ฐ ๋์๋ง ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ TTL(Time To Live) ๊ธฐ๋ฅ์ 'expire'๋ผ๋ ๋ช
์นญ์ผ๋ก ์ ๊ณตํ๊ณ ์๋ค.
๊ฐ๋ตํ๊ฒ ์ค๋ช
ํ๋ฉด ์๋์ ๊ฐ์ ์์
์ ์งํํ๋ค.
Redis๊ฐ ์ด๋น 10ํ๋ก ๋ค์ ์์ ์ ์ํํ๋ค.
1. TTL์ด ์ฒจ๋ถ๋ ์์์ ํค 20๊ฐ๋ฅผ ํ ์คํธํ๋ค.
2. 20๊ฐ ์ค ๋ง๋ฃ๋ ๋ชจ๋ ํค๋ฅผ ์ญ์ ํ๋ค.
3. 20๊ฐ ์ค 25% ์ด์์ด ๋ง๋ฃ๋ ๊ฒฝ์ฐ, 1๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ๋ค.
์บ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์ ํ๊ฑฐ๋ ๋ง๋ฃ๊ธฐ๊ฐ์ ์ค์ ํ์ฌ ์๋์ผ๋ก ์ญ์ ๋๋๋ก ๊ตฌํํด์ผ ํ๋ค.
1. ๋ก๊ทธ์ธ ์์ ๋ฐ๊ธ๋ Refresh Token์ Redis์ ์ ์ฅํ๋ค. (ํด๋น ํ ํฐ์ ๋ง๋ฃ์๊ฐ์ TTL๋ก ์ค์ )
2. ํ ํฐ ์ฌ๋ฐ๊ธ์ ์์ฒญ๋ฐ์์ ๋ Redis์์ ํด๋ผ์ด์ธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ Refresh Token๊ณผ ์ผ์นํ๋๊ฒ ์๋์ง ํ์ธํ๋ค.
(1) ์ผ์นํ๋๊ฒ ์์ ๊ฒฝ์ฐ ํ ํฐ์ ์๋ก ๋ฐ๊ธํ์ฌ ์ ๋ฌํ๋ค.
(2) ์ผ์นํ๋๊ฒ ์์ ๊ฒฝ์ฐ ์ฌ๋ก๊ทธ์ธํ๋๋ก ํ๋ค.
์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
์ฌ๊ธฐ์ ๋ง์ฝ RDB๋ฅผ ์ฌ์ฉํ๋ค๋ฉด TTL ๊ธฐ๋ฅ์ ๋์ฒดํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
1. ์ ํ๋ฆฌ์ผ์ด์
์์ ์ค์ผ์ค๋ง ์์
์ ์์ฑํด์ ๋ง๋ฃ์๊ฐ์ด ์ง๋ Refresh Token ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค.
2. MariaDB์ event_scheduler ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ DB๋จ์์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ง๋ฃ์๊ฐ์ด ์ง๋ Refresh Token์ ์ญ์ ํ๋๋ก ํ๋ค.
3. ๋ง๋ฃ์๊ฐ์ด ์ง๋ Refresh Token ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ์ง ์๊ณ ๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๋ก ๋น๊ตํ๋ค.
์ด๋ ๋ฏ ๋ง๋ฃ์๊ฐ์ด ์ง๋ Refresh Token์ ์ญ์ ํ๊ธฐ ์ํด์ ๋ง์ ์์ ์ ์งํํด์ผ ํ๋ค.
3. ํ ํฐ ์ฌ๋ฐ๊ธ ๊ธฐ๋ฅ์ Redis์ MariaDB ์ฑ๋ฅ ๋น๊ต
ํ ํฐ ์ฌ๋ฐ๊ธ API์ ์ฑ๋ฅ์ Redis๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ MariaDB๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ธก์ ํด๋ณด์๋ค.
๊ฐ๊ฐ 10ํ์ฉ ์คํํ์ฌ Redis๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ํ๊ท ์ ์ผ๋ก 99.6ms, MariaDB๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ 130.8ms์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์๋ค.
๋ณ๋ก ์ฐจ์ด๊ฐ ์๋๋ณด์ผ ์ ์์ง๋ง, 99.6ms -> 130.8ms ์ฑ๋ฅํฅ์๋๋ฅผ ํผ์ผํธ๋ก ๋ํ๋ด๋ฉด 31.3% ํฅ์๋์์์ ์ ์ ์๋ค.
'๐จโ๐ฉโ๐งโ๐ฆ Project > ๐บ KIOSEK' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ฝ๋ด์ญ ํ์ด์ง ์กฐํ ๊ธฐ๋ฅ ์ฑ๋ฅ ์ต์ ํ (totalCount in Redis) (0) | 2023.08.22 |
---|---|
Index๋ฅผ ์ด์ฉํ์ฌ ์กฐํ ์ฟผ๋ฆฌ 1374% ์ฑ๋ฅ ํฅ์๊ธฐ (with MySQL) (0) | 2023.08.16 |
๋ฐฐํฌ ์๋ํ ๊ตฌ์ถ๊ธฐ (0) | 2023.07.31 |
๊ฐ๋ฐ ์๋ฒ AWS ํด๋ผ์ฐ๋ ์๋น์ค๋ก ์ด์ฃผ๊ธฐ (0) | 2023.07.31 |
ํ๋ก์ ํธ ํ๊ณ (0) | 2023.07.13 |