Python

ํŽ˜์ด์ง€๋„ค์ด์…˜ Offset๊ธฐ๋ฐ˜๊ณผ Cursor๊ธฐ๋ฐ˜ Pagination ์ฐจ์ด์ 

emhaki 2024. 1. 1. 14:00
728x90
๋ฐ˜์‘ํ˜•
SMALL

๐Ÿ“Œ ํŽ˜์ด์ง€๋„ค์ด์…˜

๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ ์„œ๋ฒ„์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์„œ๋ฒ„์ž…์žฅ์—์„œ๋„ ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ๋„ ์ข‹์€ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ "ํŠน์ •ํ•œ ์ •๋ ฌ ๊ธฐ์ค€"๊ณผ "์ง€์ •๋œ ๊ฐฏ์ˆ˜"์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋ฅผ ํŽ˜์ด์ง€๋„ค์ด์…˜(Pagination)์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ฐพ์•„๋ณด๋‹ˆ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

1. ์˜คํ”„์…‹ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜ (Offset-based Pagination)

2. ์ปค์„œ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜ (Cursor-based Paginantion)

 

1๋ฒˆ์˜ ๋ฐฉ๋ฒ•์ด ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์›ฌ๋งŒํ•ด์„  2๋ฒˆ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค. 1๋ฒˆ์˜ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ณ  2๋ฒˆ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

๐Ÿ”‘  1. ์˜คํ”„์…‹ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜ (Offset-Based Pagination)

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ MySQL์—์„œ ๊ฐ„๋‹จํžˆ LIMIT์ฟผ๋ฆฌ์— ์ฝค๋งˆ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฑด๋„ˆ ๋›ธ ์ˆซ์ž๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

SELECT id FROM 'reservations' ORDER BY id DESC LIMIT 10, 20

LIMIT์ ˆ์— ๋ถ™๋Š” ์ˆซ์ž๋ฅผ ํ†ตํ•ด ๊ฑด๋„ˆ ๋›ธ ๊ฐฏ์ˆ˜(offset)์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์˜คํ”„์…‹ = (ํ˜„์žฌ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ -1) * ํŽ˜์ด์ง€ ๋‹น ์š”์ฒญํ•˜๋Š” ์ž๋ฃŒ ๊ฐฏ์ˆ˜์ด๋‹ค.

 

์œ„ ๋ฐฉ์‹์€ id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ๊ฐ’์—์„œ ์ง€์ •๋œ ๊ฐฏ์ˆ˜๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— "๋ฐ์ดํ„ฐ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ"์™€ "์ฟผ๋ฆฌ์˜ ํผํฌ๋จผ์Šค ์ด์Šˆ์˜ ๋ฌธ์ œ"๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์กฐ๊ธˆ ๋” ํ’€์–ด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด SNS ์„œ๋น„์Šค์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ์˜ ์ธ์•„์›ƒ์ด ํ™œ๋ฐœํ•˜๊ฒŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ 1ํŽ˜์ด์ง€์—์„œ 2ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ”์„ ๋•Œ 1ํŽ˜์ด์ง€์—์„œ ๋ดค๋˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์œ ์ž…์œผ๋กœ 2ํŽ˜์ด์ง€์—์„œ๋„ ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ๋‹ค. RDBMS์—์„œ ๋ชจ๋“  ์ •๋ ฌ ๊ธฐ์ค€์— ๋Œ€ํ•ด row์ˆ˜๊ฐ€ ์•„์ฃผ ๋งŽ์€ ๊ฒฝ์šฐ offset๊ฐ’์ด ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ์ฟผ๋ฆฌ์˜ ํผํฌ๋จผ์Šค๋Š” ์ด์— ๋น„๋ก€ํ•ด์„œ ๋–จ์–ด์ง€๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— offset ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๊ธฐ ์ ์ ˆํ•˜๋‹ค.

 

1. ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋Ÿ‰์ด ์ ์–ด ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋  ํ™•๋ฅ ์ด ์ ์€ ๊ฒฝ์šฐ

2. ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋˜์–ด๋„ ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ

3. ๊ฒ€์ƒ‰์—”์ง„์ด ์ธ๋ฑ์‹ฑ ํ•  ์ด์œ ๋„, ์œ ์ €๊ฐ€ ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€๋ฅผ ๊ฐˆ ์ด์œ ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ

4. row์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š์•„ ํผํฌ๋จผ์Šค ์ด์Šˆ๋ฅผ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ

 

๐Ÿ”‘  2. ์ปค์„œ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜ (Cursor-based Pagination)

์ปค์„œ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜์€ ์šฐ๋ฆฌ๊ฐ€ ์ฑ…์„ ์ฝ์„ ๋•Œ์— '์ฑ…๊ฐˆํ”ผ'๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ด๊ฐ€ ์‰ฝ๋‹ค. ์˜คํ”„์…‹ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡ ๋ฒˆ์งธ์— ์žˆ๋‹ค๋Š”๋ฐ์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ปค์„œ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ์˜ ๋‹ค์Œ์— ์žˆ๋Š”์ง€์— ์ง‘์ค‘ํ•œ๋‹ค. 

SELECT id FROM 'reservations' WHERE id > 10 ORDER BY id ASC LIMIT 5

์œ„์˜ ๊ฒฝ์šฐ Cursor๊ฐ€ reservationsํ…Œ์ด๋ธ”์˜ id์ด๊ณ  ๊ฐ’์€ 10์ด๋‹ค. 10๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•œ๋‹ค.

id๊ฐ’์˜ ๊ฒฝ์šฐ์—๋Š” ๊ณ ์œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ price์™€ ๊ฐ™์ด ์ค‘๋ณต๊ฐ’์ด ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ๋‹ค. ๋•Œ๋ฌธ์— id์™€ price ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.

SELECT id, price
FROM 'reservation'
WHERE (price > 10000 OR (price = 10000 AND id > 10))
OREDER BY price ASC, id ASC
LIMIT 5

 

์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ ์ฑ…์„ ์ฝ์„๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฑ…๊ฐˆํ”ผ ์ฒ˜๋Ÿผ ๊ธฐ์ค€์  ๋‹ค์Œ์ด ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

728x90
๋ฐ˜์‘ํ˜•

'Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Jupyter Notebook ์„ค์น˜, ๊ฒ€์€ ํ™”๋ฉด ์‹คํ–‰ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ๋ฒ•  (0) 2022.05.17