Home > Backend Development > πŸ“š[Backend Development] μ΅œλŒ€ 2 Depth λŒ“κΈ€ μ •λ ¬ ꡬ쑰의 'νŽ˜μ΄μ§€ 번호 방식'μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸ“š[Backend Development] μ΅œλŒ€ 2 Depth λŒ“κΈ€ μ •λ ¬ ꡬ쑰의 'νŽ˜μ΄μ§€ 번호 방식'μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?
Backend Ddevelopment

β€œπŸ“š[Backend Development] μ΅œλŒ€ 2 Depth λŒ“κΈ€ μ •λ ¬ ꡬ쑰의 β€˜νŽ˜μ΄μ§€ 번호 λ°©μ‹β€™μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?”

βœ… μ΅œλŒ€ 2 Depth λŒ“κΈ€ μ •λ ¬ ꡬ쑰의 β€œνŽ˜μ΄μ§€ 번호 방식” μ„€λͺ….

  • μ΅œλŒ€ 2 Depth λŒ“κΈ€μ„ νŽ˜μ΄μ§€ 번호 기반으둜 μ‘°νšŒν•˜λŠ” 방식은 κ³ μ •λœ 개수의 λŒ“κΈ€μ„ λΆˆλŸ¬μ˜€λŠ” 전톡적인 νŽ˜μ΄μ§• λ°©μ‹μž…λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 였래된 λŒ“κΈ€λΆ€ν„° μˆœμ„œλŒ€λ‘œ 뢈러올 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ—οΈ1️⃣ νŽ˜μ΄μ§€ 번호 λ°©μ‹μ΄λž€?

  • νŽ˜μ΄μ§€ 번호 방식은 νŠΉμ • νŽ˜μ΄μ§€μ˜ λŒ“κΈ€μ„ 뢈러였기 μœ„ν•΄ OFFSETκ³Ό LIMIT을 ν™œμš©ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
SELECT * FROM comment
WHERE article_id = ?
ORDER BY parent_comment_id ASC, comment_id ASC
LIMIT ?, ?;
SQL ν‚€μ›Œλ“œ μ„€λͺ…
ORDER BY parent_comment_by ASC, comment_id ASC λŒ“κΈ€μ„ λΆ€λͺ¨-μžμ‹ 관계에 맞게 μ •λ ¬
LIMIT ?, ? λͺ‡ 개의 데이터λ₯Ό κ°€μ Έμ˜¬μ§€ 지정
OFFSET νŠΉμ • νŽ˜μ΄μ§€μ˜ λŒ“κΈ€μ„ κ±΄λ„ˆλ›΄ ν›„ κ°€μ Έμ˜΄

πŸ—οΈ2️⃣ μ •λ ¬ 방식

  • νŽ˜μ΄μ§€ 번호 λ°©μ‹μ—μ„œλŠ” λŒ“κΈ€μ„ λΆ€λͺ¨-μžμ‹ 관계λ₯Ό μœ μ§€ν•˜λ©΄μ„œ μ •λ ¬ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ •λ ¬ 기쀀은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
ORDER BY parent_comment_id ASC, comment_id ASC
    1. μ΅œμƒμœ„ λŒ“κΈ€μ„ λ¨Όμ € μ •λ ¬ ➞ parent_comment_id IS NULL μˆœμ„œλŒ€λ‘œ μ •λ ¬
    1. λŒ€λŒ“κΈ€μ€ 같은 λΆ€λͺ¨ μ•„λž˜μ—μ„œ μ •λ ¬ ➞ comment_id ASC μˆœμ„œλ‘œ μ •λ ¬
    1. νŽ˜μ΄μ§• 처리 ➞ LIMIT ?, ? μ‚¬μš©

πŸ—οΈ3️⃣ SQL 예제 (νŽ˜μ΄μ§€ 번호 기반 쑰회)

  • 예λ₯Ό λ“€μ–΄, ν•œ νŽ˜μ΄μ§€λ‹Ή 3개 λŒ“κΈ€μ„ κ°€μ Έμ˜€λ„λ‘ μ„€μ •ν•˜κ³ , 2번째 νŽ˜μ΄μ§€(page = 2)λ₯Ό μ‘°νšŒν•œλ‹€κ³  κ°€μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
SELECT * FROM comment
WHERE article_id = ?
ORDER BY parent_comment_id ASC, comment_id ASC
LIMIT 3 OFFSET 3;

πŸ“Œ νŽ˜μ΄μ§€ 번호 곡식.

OFFSET = (page - 1) * pageSize
  • page = 1 ➞ OFFSET = (1-1) * 3 = 0 (첫 번째 νŽ˜μ΄μ§€)
  • page = 2 ➞ OFFSET = (2-1) * 3 = 3 (두 번째 νŽ˜μ΄μ§€)
  • page = 3 ➞ OFFSET = (3-1) * 3 = 6 (μ„Έ 번째 νŽ˜μ΄μ§€)

πŸ—οΈ4️⃣ 데이터 μ˜ˆμ‹œ

πŸ“Œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 λŒ“κΈ€ 데이터.

comment_id parent_comment_id λ‚΄μš©
1 NULL λŒ“κΈ€1 (μ΅œμƒμœ„ λŒ“κΈ€)
2 1 λŒ“κΈ€2 (λŒ“κΈ€1의 λŒ€λŒ“κΈ€)
3 NULL λŒ“κΈ€3 (μ΅œμƒμœ„ λŒ“κΈ€)
4 1 λŒ“κΈ€4 (λŒ“κΈ€1의 λŒ€λŒ“κΈ€)
5 3 λŒ“κΈ€5 (λŒ“κΈ€3의 λŒ€λŒ“κΈ€)
6 NULL λŒ“κΈ€6 (μ΅œμƒμœ„ λŒ“κΈ€)

πŸ“Œ νŽ˜μ΄μ§€ 번호 기반 쑰회 κ²°κ³Ό (ν•œ νŽ˜μ΄μ§€μ— 3κ°œμ”©)

βœ… 1νŽ˜μ΄μ§€ 쑰회 (page = 1, pageSize = 3)

SELECT * FROM comment WHERE article_id = ?
ORDER BY parent_comment_id ASC, comment_id ASC
LIMIT 3 OFFSET 0;
comment_id parent_comment_id λ‚΄μš©
1 NULL λŒ“κΈ€1 (μ΅œμƒμœ„ λŒ“κΈ€)
2 1 λŒ“κΈ€2 (λŒ“κΈ€1의 λŒ€λŒ“κΈ€)
4 1 λŒ“κΈ€4 (λŒ“κΈ€1의 λŒ€λŒ“κΈ€)

βœ… 2νŽ˜μ΄μ§€ 쑰회 (page = 2, pageSize = 3)

SELECT * FROM comment WHERE article_id = ?
ORDER BY parent_comment_id ASC, comment_id ASC
LIMIT 3 OFFSET 3;
comment_id parent_comment_id λ‚΄μš©
3 NULL λŒ“κΈ€3 (μ΅œμƒμœ„ λŒ“κΈ€)
5 3 λŒ“κΈ€5 (λŒ“κΈ€3의 λŒ€λŒ“κΈ€)
6 NULL λŒ“κΈ€6 (μ΅œμƒμœ„ λŒ“κΈ€)
  • πŸ“Œ νŽ˜μ΄μ§€λ₯Ό λ„˜κΈΈ λ•Œλ§ˆλ‹€ λ‹€μŒ pageSize 만큼의 데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.

πŸ—οΈ5️⃣ μž₯점과 단점.

μž₯점 단점
κ°„λ‹¨ν•˜κ³  직관적인 νŽ˜μ΄μ§• κ΅¬ν˜„ κ°€λŠ₯ νŽ˜μ΄μ§€ λ²ˆν˜Έκ°€ 컀질수둝 OFFSET이 μ¦κ°€ν•˜μ—¬ μ„±λŠ₯ μ €ν•˜
λŒ“κΈ€μ„ μ •λ ¬λœ μˆœμ„œλŒ€λ‘œ κ°€μ Έμ˜¬ 수 있음 λŒ€λŸ‰μ˜ λ°μ΄ν„°μ—μ„œ OFFSET이 클 경우 속도가 느렀질 수 있음
  • πŸ“Œ λŒ€μ²΄ 방법
    • OFFSET이 큰 경우 β€œKeyset Pagination (λ¬΄ν•œμŠ€ν¬λ‘€ 방식)”을 μ‚¬μš©ν•˜λŠ” 것이 더 효율적일 수 있음
    • ORDER BY parent_comment_id ASC, comment_id ASC 정렬을 μœ μ§€ν•˜λ©΄μ„œ WHERE comment_id > ? 방식을 ν™œμš©ν•˜λŠ” 방식도 있음

πŸš€6️⃣ 정리.

  • βœ… νŽ˜μ΄μ§€ 번호 기반 λŒ“κΈ€ μ‘°νšŒλŠ” LIMIT ?, OFFSET ?을 μ‚¬μš©
  • βœ… ORDER BY parent_comment_id ASC, comment_id ASCλ₯Ό μ‚¬μš©ν•΄ 계측 ꡬ쑰 μœ μ§€
  • βœ… OFFSET 값이 클 경우 μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯ ➞ Keyset Pagination κ³ λ € κ°€λŠ₯
  • βœ… μ΅œλŒ€ 2 Depth λŒ“κΈ€ κ΅¬μ‘°μ—μ„œλŠ” μ„±λŠ₯ μ΄μŠˆκ°€ 적고 직관적인 λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ κ°€λŠ₯
    • πŸ“Œ μ΅œλŒ€ 2 Depth λŒ“κΈ€ κ΅¬μ‘°μ—μ„œλŠ” νŽ˜μ΄μ§€ 번호 방식이 효율적이며, 였래된 λŒ“κΈ€λΆ€ν„° μˆœμ„œλŒ€λ‘œ λΆˆλŸ¬μ˜€κΈ°μ— μ ν•©ν•©λ‹ˆλ‹€.