์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ! ์ ๋ Java + Spring์ผ๋ก ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์์ฑํ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์์ ๋๋ค. ์ ๋ Tinkoff์ ๋ด๋ถ ์ ํ ๊ฐ๋ฐ ํ ์ค ํ ๊ณณ์์ ์ผํ๊ณ ์์ต๋๋ค.
์ฐ๋ฆฌ ํ์์๋ DBMS์์ ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๋ ๋ฌธ์ ๊ฐ ์์ฃผ ๋ฐ์ํฉ๋๋ค. ํญ์ ์ข ๋ ๋น ๋ฅธ ์๋๋ฅผ ์ํ์ง๋ง ์ ์คํ๊ฒ ๊ตฌ์ฑ๋ ์ธ๋ฑ์ค๋ก๋ ํญ์ ์ฑ๊ณตํ ์๋ ์์ต๋๋ค. ๋ช ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ ํฉ๋ฆฌ์ ์ธ ์ต์ ํ๋ฅผ ์ฐพ๊ธฐ ์ํด ์น์ ๋์๋ค๋๋ ๋์ ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ค์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋๋ ๋น์ ์ ์ํด Marcus์ ์งง์ ๊ธฐ์ฌ๋ฅผ ๋ฒ์ญํ๊ณ ์ถ์ต๋๋ค. ์ด๋ ์ค๋๋์์ง๋ง ์ฌ์ ํ SQL ํ์ค์ ๋ฐ๋ฅธ ์คํ์ ์์ ์ฑ๋ฅ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์ ๊ด์ฌ์ ๋๋ ค๋ ์ ์ธ๋ฌธ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์ด๋ค ๊ณณ์์๋ ์ ์์๊ฒ ์ค๋ช ๊ณผ ์๊ฒฌ์ ์ถ๊ฐํ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๋ฌํ ๋ชจ๋ ์ฅ์๋ฅผ "๋๋ต"์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค. ๋ ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด
์์ ์๊ฐ
๋ง์ ์ฌ๋๋ค์ด ์คํ์ ์ ํตํ ํ์ด์ง ์ ํ ์์ ์ด ์ผ๋ง๋ ๋ฌธ์ ๊ฐ ๋ง๊ณ ๋๋ฆฐ์ง ์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ข ๋ ํจ์จ์ ์ธ ๋์์ธ์ผ๋ก ์์ฃผ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์๋ค๋ ์ฌ์ค์ ์๊ณ ๊ณ์ จ๋์?
๋ฐ๋ผ์ offset ํค์๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฒญ์ ์ฒ์ n๊ฐ ๋ ์ฝ๋๋ฅผ ๊ฑด๋๋ฐ๋๋ก ์ง์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฃผ์ด์ง ์์๋๋ก ๋์คํฌ์์ ์ฒ์ n๊ฐ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ด์ผ ํ๋ฉฐ(์ฐธ๊ณ : ์ง์ ๋ ๊ฒฝ์ฐ ์ ๋ ฌ ์ ์ฉ), ๊ทธ๋ฐ ๋ค์์๋ง n+1๋ถํฐ ๋ ์ฝ๋๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ์ ์ ๋ฌธ์ ๊ฐ DBMS์ ํน์ ๊ตฌํ์ ์๋ ๊ฒ์ด ์๋๋ผ ํ์ค์ ๋ฐ๋ฅธ ์๋ ์ ์์ ์๋ค๋ ๊ฒ์ ๋๋ค.
...ํ์ ๋จผ์ ๋ค์์ ๋ฐ๋ผ ์ ๋ ฌ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฒ์๋ถํฐ...
-SQL:2016, Part 2, 4.15.3 ํ์ ํ ์ด๋ธ(์ฐธ๊ณ : ํ์ฌ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํ์ค)
์ฌ๊ธฐ์ ์ค์ํ ์ ์ offset์ด ๋จ์ผ ๋งค๊ฐ๋ณ์(๊ฑด๋๋ธ ๋ ์ฝ๋ ์)๋ฅผ ์ทจํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด ์ ์์ ๋ฐ๋ผ DBMS๋ ๋ชจ๋ ๋ ์ฝ๋๋ง ๊ฒ์ํ ๋ค์ ๋ถํ์ํ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค. ๋ถ๋ช ํ ์ด๋ฌํ ์คํ์ ์ ์๋ก ์ธํด ์ฐ๋ฆฌ๋ ์ถ๊ฐ ์์ ์ ์ํํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด SQL์ธ์ง NoSQL์ธ์ง๋ ์ค์ํ์ง ์์ต๋๋ค.
์กฐ๊ธ๋ง ๋ ์ํ๋ฉด ๋ผ
์คํ์ ๋ฌธ์ ๋ ์ฌ๊ธฐ์ ๋๋์ง ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋์คํฌ์์ ๋ ํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์ฌ์ด์ ๋ค๋ฅธ ์์ ์ด ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ ๊ฒฝ์ฐ ์ด ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋ ๊น์?
์ด์ ํ์ด์ง์ ๋ ์ฝ๋๋ฅผ ๊ฑด๋๋ฐ๊ธฐ ์ํด ์คํ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์๋ก ๋ค๋ฅธ ํ์ด์ง๋ฅผ ์ฝ๋ ์ฌ์ด์ ์ ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ์ํฉ์์ ์ค๋ณต์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค(์ฐธ๊ณ : ์ด๋ ๊ตฌ์ฑ๋ณ ์์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ณ๋ก ์ฝ์ ๋ ๊ฐ๋ฅํฉ๋๋ค. ์ถ๋ ฅ ์ค๊ฐ์ ์๋ก์ด ํญ๋ชฉ์ด ๋ํ๋ ์ ์์ต๋๋ค).
๊ทธ๋ฆผ์ ์ด๋ฌํ ์ํฉ์ ๋ช ํํ๊ฒ ๋ฌ์ฌํฉ๋๋ค. ๋ฒ ์ด์ค๋ ์ฒ์ 10๊ฐ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ ์ ๋ ์ฝ๋๊ฐ ์ฝ์ ๋์ด ๋ชจ๋ ์ฝ๊ธฐ ๋ ์ฝ๋๋ฅผ 1๋งํผ ์คํ์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฒ ์ด์ค๋ ๋ค์ 10๊ฐ์ ๋ ์ฝ๋์์ ์ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ 11๋ฒ์งธ ๋ ์ฝ๋๋ถํฐ ์์ํ์ง ์๊ณ ๋ค์๋ถํฐ ์์ํฉ๋๋ค. 10์ผ, ์ด ๊ธฐ๋ก์ ๋ณต์ ํ์ต๋๋ค. ์ด ํํ์ ์ฌ์ฉ๊ณผ ๊ด๋ จ๋ ๋ค๋ฅธ ์์ธ ์ฌํญ์ด ์์ง๋ง ์ด๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ ๋๋ค.
์ด๋ฏธ ์๊ณ ์๋ฏ์ด ์ด๋ ํน์ DBMS๋ ๊ทธ ๊ตฌํ์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๋ฌธ์ ๋ SQL ํ์ค์ ๋ฐ๋ผ ํ์ด์ง ๋งค๊น์ ์ ์ํ๋ ๋ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ์ ธ์ฌ ํ์ด์ง๋ ๊ฑด๋๋ธ ๋ ์ฝ๋ ์๋ฅผ DBMS์ ์๋ ค์ค๋๋ค. ์ด์ ๋ํ ์ ๋ณด๊ฐ ๋๋ฌด ์ ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ด๋ฌํ ์์ฒญ์ ์ต์ ํํ ์ ์์ต๋๋ค.
์ด๋ ํน์ ํค์๋์ ๋ฌธ์ ๊ฐ ์๋๋ผ ์ฟผ๋ฆฌ์ ์๋ฏธ์ ๋ํ ๋ฌธ์ ๋ผ๋ ์ ์ ๋ช ํํ ํ๋ ๊ฒ๋ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ์๋ ํน์ฑ์ ๋์ผํ ๊ตฌ๋ฌธ์ด ๋ช ๊ฐ์ง ๋ ์์ต๋๋ค.
- offset ํค์๋๋ ์์ ์ธ๊ธํ ๋ฐ์ ๊ฐ์ต๋๋ค.
- ๋ ๊ฐ์ ํค์๋๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ Limit [offset]์ ๋๋ค(ํ๊ณ ์์ฒด๋ ๊ทธ๋ ๊ฒ ๋์์ง๋ ์์ง๋ง).
- ํ ๋ฒํธ ๋งค๊ธฐ๊ธฐ(์: row_number(), rownum ๋ฑ)๋ฅผ ๊ธฐ์ค์ผ๋ก ํํ์ผ๋ก ํํฐ๋งํฉ๋๋ค.
์ด๋ฌํ ๋ชจ๋ ํํ์ ์ถ๊ฐ ์ ๋ณด๋ ๋งฅ๋ฝ ์์ด ๊ฑด๋๋ธ ์ค ์๋ง ์๋ ค์ค๋๋ค.
์ด ๊ธฐ์ฌ์ ๋ท๋ถ๋ถ์์๋ offset ํค์๋๊ฐ ์ด๋ฌํ ๋ชจ๋ ์ต์ ์ ์์ฝ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์คํ์ ์๋ ์ถ
์ด์ ์ด๋ฌํ ๋ชจ๋ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ์ฐ๋ฆฌ ์ธ์์ด ์ด๋ค ๋ชจ์ต์ผ์ง ์์ํด ๋ด ์๋ค. ์คํ์ ์๋ ์ํ์ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ต๋๋ค. ์ ํ์ ์ฌ์ฉํ๋ฉด where์ ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ์์ง ๋ณด์ง ๋ชปํ ํ(์ฐธ๊ณ : ์ด์ ํ์ด์ง์ ์์๋ ํ)๋ง ์ ํํ ์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ, ์ ํ์ด ์์๊ฐ ์ง์ ๋ ์ธํธ(์ค๋๋ ์์ ๊ธฐ์ค)์์ ์คํ๋๋ค๋ ์ฌ์ค๋ถํฐ ์์ํฉ๋๋ค. ์์๊ฐ ์ง์ ๋ ์ธํธ๊ฐ ์์ผ๋ฏ๋ก ๋งค์ฐ ๊ฐ๋จํ ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ํ์ด์ง์ ๋ง์ง๋ง ๋ ์ฝ๋ ๋ค์ ์๋ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
SELECT ...
FROM ...
WHERE ...
AND id < ?last_seen_id
ORDER BY id DESC
FETCH FIRST 10 ROWS ONLY
์ด๊ฒ์ด ์ด ์ ๊ทผ๋ฒ์ ์ ์ฒด ์์น์
๋๋ค. ๋ฌผ๋ก ๋ง์ ์ด์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ฉด ์ํฉ์ด ๋ ์ฌ๋ฏธ์์ด์ง์ง๋ง ์์ด๋์ด๋ ์ฌ์ ํ ๋์ผํฉ๋๋ค. ์ด ๋์์ธ์ ๋ง์ ์ฌ๋๋ค์๊ฒ ์ ์ฉ ๊ฐ๋ฅํ๋ค๋ ์ ์ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ํ์ ๋ฐฉ๋ฒ ๋๋ ํค ์ธํธ ํ์ด์ง ๋งค๊น์ด๋ผ๊ณ ํฉ๋๋ค. ์ด๋ ๋ถ๋ ๊ฒฐ๊ณผ ๋ฌธ์ (์ฐธ๊ณ : ์์์ ์ค๋ช
ํ ํ์ด์ง ์ฝ๊ธฐ ์ฌ์ด์ ์ฐ๊ธฐ ๋ฌธ์ )๋ฅผ ํด๊ฒฐํ๋ฉฐ ๋ฌผ๋ก ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ข์ํ๋ ์ ์ ๊ธฐ์กด ์คํ์
๋ณด๋ค ๋ ๋น ๋ฅด๊ณ ์์ ์ ์ผ๋ก ์๋ํ๋ค๋ ๊ฒ์
๋๋ค. ์์ ์ฑ์ ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ์ด ์์ฒญ๋ ํ
์ด๋ธ ์์ ๋น๋กํ์ฌ ์ฆ๊ฐํ์ง ์๋๋ค๋ ์ฌ์ค์ ์์ต๋๋ค. (์ฐธ๊ณ : ํ์ด์ง ๋งค๊น์ ๋ํ ๋ค์ํ ์ ๊ทผ ๋ฐฉ์์ ์์
์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
์ฌ๋ผ์ด๋ ์ค ํ๋
๋๊ตฌ๋ ์ด๋ป์ต๋๊น?
ํค์ ๋ํ ํ์ด์ง ๋งค๊น์ ์ด ๋ฐฉ๋ฒ์ ๋ํ ๋๊ตฌ์ ์ง์์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ์ข ์ข ์ ํฉํ์ง ์์ต๋๋ค. ๋ค์ํ ํ๋ ์์ํฌ๋ฅผ ํฌํจํ ๋๋ถ๋ถ์ ๊ฐ๋ฐ ๋๊ตฌ์์๋ ํ์ด์ง ๋งค๊น ์ํ ๋ฐฉ๋ฒ์ ์ ํํ๊ฒ ์ ํํ ์ ์์ต๋๋ค.
์ค๋ช ๋ ๋ฐฉ๋ฒ์๋ DBMS๋ถํฐ ๋์๋ ์คํฌ๋กค์ ํตํด ๋ธ๋ผ์ฐ์ ์์ AJAX ์์ฒญ ์คํ๊น์ง ์ฌ์ฉ๋๋ ๊ธฐ์ ์ ๋ํ ์๋ํฌ์๋ ์ง์์ด ํ์ํ๋ค๋ ์ฌ์ค๋ก ์ธํด ์ํฉ์ด ๋์ฑ ์ ํ๋ฉ๋๋ค. ์ด์ ํ์ด์ง ๋ฒํธ๋ง ์ง์ ํ๋ ๋์ ๋ชจ๋ ํ์ด์ง์ ๋ํ ํค ์ธํธ๋ฅผ ํ ๋ฒ์ ์ง์ ํด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ํค์ ๋ํ ํ์ด์ง ๋งค๊น์ ์ง์ํ๋ ํ๋ ์์ํฌ์ ์๊ฐ ์ ์ฐจ ๋์ด๋๊ณ ์์ต๋๋ค. ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
jOOQ ์๋ฐ์ ๊ฒฝ์ฐ;์ฃผ๋ฌธ_์ฟผ๋ฆฌ ๋ฃจ๋น์ ๊ฒฝ์ฐ;์ฒญ์ปคํฐ ะธDjango ๋ฌดํ ์คํฌ๋กค ํ์ด์ง ๋งค๊น ์ฅ๊ณ ์ ๊ฒฝ์ฐ;SQL ์ฐ๊ธ์ sqlakeyset ํ์ด์ฌ์ ๊ฒฝ์ฐ;๋ถํ์ค๋ฅด๋ ์ง์์ฑ โ JPA ๊ตฌํ์ ์ํ ๊ธฐ์ค API;DBIx::ํด๋์ค::๋ํผ ํ์ ๊ฒฝ์ฐ;Massive.js , Node.js์ฉ ๋งคํผํค์ธํธ ๋ฌธ์ .
(์ฐธ๊ณ : ๋ฒ์ญ ๋น์ ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ 2017-2018๋ ์ดํ ์ ๋ฐ์ดํธ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ๋งํฌ๊ฐ ์ ๊ฑฐ๋์์ต๋๋ค. ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ ์๋ณธ ์์ค๋ฅผ ๋ณผ ์ ์์ต๋๋ค.)
์ง๊ธ ์ด ์๊ฐ ๋น์ ์ ๋์์ด ํ์ํฉ๋๋ค. ํ์ด์ง ๋งค๊น์ ์ฌ์ฉํ๋ ํ๋ ์์ํฌ๋ฅผ ๊ฐ๋ฐํ๊ฑฐ๋ ์ง์ํ๋ ๊ฒฝ์ฐ ํค์ ๋ํ ํ์ด์ง ๋งค๊น์ ๋ํ ๊ธฐ๋ณธ ์ง์์ ์ ๊ณตํ๋๋ก ์์ฒญํ๊ณ ์ด๊ตฌํฉ๋๋ค. ์ง๋ฌธ์ด ์๊ฑฐ๋ ๋์์ด ํ์ํ์๋ฉด ๊ธฐ๊บผ์ด ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค(
ํค๋ณ ํ์ด์ง ๋งค๊ธฐ๊ธฐ๋ฅผ ์ง์ํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐ๋๋ ๊ธฐ์ฑ ์๋ฃจ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ๋ฅํ๋ฉด ์์ฒญ์ ์์ฑํ๊ฑฐ๋ ๊ธฐ์ฑ ์๋ฃจ์ ์ ์ ๊ณตํ์ญ์์ค. ์ด ๊ธฐ์ฌ์ ๋งํฌ๋ฅผ ๊ฑธ ์๋ ์์ต๋๋ค.
๊ฒฐ๋ก
ํค์ ์ํ ํ์ด์ง ๋งค๊น๊ณผ ๊ฐ์ ๊ฐ๋จํ๊ณ ์ ์ฉํ ์ ๊ทผ ๋ฐฉ์์ด ๋๋ฆฌ ๋ณด๊ธ๋์ง ์์ ์ด์ ๋ ๊ธฐ์ ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ด๋ ต๊ฑฐ๋ ํฐ ๋ ธ๋ ฅ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด ์๋๋๋ค. ์ฃผ๋ ์ด์ ๋ ๋ง์ ์ฌ๋๋ค์ด ์คํ์ ์ ๋ณด๊ณ ์์ ํ๋ ๋ฐ ์ต์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ํ์ค ์์ฒด์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ด์ง ๋งค๊น ์ ๊ทผ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ํด ์๊ฐํ๋ ์ฌ๋์ ๊ฑฐ์ ์์ผ๋ฉฐ ์ด๋ก ์ธํด ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ตฌ ์ง์์ด ์ ๋๋ก ๊ฐ๋ฐ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก, ์คํ์ ์๋ ํ์ด์ง ๋งค๊น์ ๋ํ ์์ด๋์ด์ ๋ชฉํ๊ฐ ์ฌ๋ฌ๋ถ์๊ฒ ๊ฐ๊น๋ค๋ฉด ์ด๋ฅผ ๋๋ฆฌ ์๋ฆฌ๋ ๋ฐ ๋์์ ์ฃผ์ธ์!
์ถ์ฒ :
์ ์: ๋ง๋ฅด์ฟ ์ค ์๋๋
์ถ์ฒ : habr.com