Home > Backend Development > ๐Ÿ“š[Backend Development] ๋ฌดํ•œ Depth ๋Œ“๊ธ€ ์ •๋ ฌ - Path Enumeration(๊ฒฝ๋กœ ์—ด๊ฑฐ) ๋ฐฉ์‹๊ณผ ์ธ๋ฑ์Šค ํ™œ์šฉ

๐Ÿ“š[Backend Development] ๋ฌดํ•œ Depth ๋Œ“๊ธ€ ์ •๋ ฌ - Path Enumeration(๊ฒฝ๋กœ ์—ด๊ฑฐ) ๋ฐฉ์‹๊ณผ ์ธ๋ฑ์Šค ํ™œ์šฉ
Backend Ddevelopment

โ€œ๐Ÿ“š[Backend Development] Path Enumeration ๋ฐฉ์‹์—์„œ ๋Œ“๊ธ€์˜ ๊ฒฝ๋กœ(Path) ๊ฒฐ์ • ๊ณผ์ •.โ€

โœ…1๏ธโƒฃ ๋Œ“๊ธ€ ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์˜ path ๊ฒฐ์ •ํ•˜๊ธฐ

  • Path Enumeration(๊ฒฝ๋กœ ์—ด๊ฑฐ) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๋•Œ, ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ํ•ด๋‹น ๋Œ“๊ธ€์˜ path๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ“๊ธ€์€ ๋ถ€๋ชจ ๋Œ“๊ธ€์˜ path๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉฐ, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ๋Œ“๊ธ€์˜ path๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒˆ๋กœ์šด path๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ1๏ธโƒฃ ๊ธฐ์กด ๋Œ“๊ธ€ ํŠธ๋ฆฌ ๊ตฌ์กฐ.

  • ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋˜๊ธฐ ์ „์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ์ตœ์ƒ์œ„ ๋Œ“๊ธ€ 00a0z๊ฐ€ ์žˆ๊ณ , ํ•˜์œ„ ๋Œ“๊ธ€๋“ค์ด ๊ณ„์ธต์ ์œผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
    • path๋Š” ๋ถ€๋ชจ ๋Œ“๊ธ€์˜ path๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒ์„ฑ๋˜๋ฉฐ, ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋ ์ˆ˜๋ก ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ2๏ธโƒฃ ์ƒˆ๋กœ์šด ๋Œ“๊ธ€ ์ถ”๊ฐ€ ์š”์ฒญ.

  • ์–ด๋–ค ์‚ฌ์šฉ์‚ฌ์šฉ์ž๊ฐ€ 00a0z ๋Œ“๊ธ€์˜ ํ•˜์œ„์— ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ, ํ˜„์žฌ 00a0z์˜ ํ•˜์œ„ ๋Œ“๊ธ€๋“ค์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด path๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    - ํ˜„์žฌ 00a0z์˜ ํ•˜์œ„ ๋Œ“๊ธ€ ์ค‘ ๊ฐ€์žฅ ํฐ path(childernTopPath)๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ3๏ธโƒฃ childrenTopPath ์ฐพ๊ธฐ

  • ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š”, ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ํ•˜์œ„ ๋Œ“๊ธ€ ์ค‘ ๊ฐ€์žฅ ํฐ path(childrenTopPath)๋ฅผ ์ฐพ๊ณ  ํ•ด๋‹น ๊ฐ’์— +1์„ ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์˜ path๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค..
    • ํ˜„์žฌ 00a0z์˜ ํ•˜์œ„ ๋Œ“๊ธ€ ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ path๋Š” 00a0z 00002์ž…๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ, ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์˜ path๋Š” 00a0z 00003์ด ๋ฉ๋‹ˆ๋‹ค.

โœ…2๏ธโƒฃ Path Enumeration ๋ฐฉ์‹์—์„œ ์ธ๋ฑ์Šค ํ™œ์šฉ

  • Path Enumeration ๋ฐฉ์‹์—์„œ๋Š” ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์•˜์Šต๋‹ˆ๋‹ค.
  • ํŠนํžˆ descendantsTopPath๋ฅผ ์ฐพ์„ ๋•Œ Backward Index Scan์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น ๋ฅธ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ1๏ธโƒฃ descendantsTopPath๋ฅผ ์ฐพ๋Š” ๊ณผ์ •.

  • ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์„ ์ถ”๊ฐ€ํ•  ๋•Œ, ๊ฐ€์žฅ ํฐ descendantsTopPath๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • path ์ •๋ ฌ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์—ญ์ˆœ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด, ๊ฐ€์žฅ ํฐ path(descendantsTopPath)๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Backward Index Scan์„ ํ™œ์šฉํ•˜๋ฉด ๋กœ๊ทธ ์‹œ๊ฐ„(log time) ๋‚ด์— ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋จผ์ € ์•„๋ž˜์˜ ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ descendantsTopPath๋ฅผ DB์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
SELECT path FROM comment_v2
WHERE article_id = {article_id}
AND path > {parentPath} // parent ๋ณธ์ธ์€ ๋ฏธํฌํ•จ ๊ฒ€์ƒ‰ ์กฐ๊ฑด
AND path like {parentPath}% // parentPath๋ฅผ prefix๋กœ ํ•˜๋Š” ๋ชจ๋“  ์ž์† ๊ฒ€์ƒ‰ ์กฐ๊ฑด
ORDER BY path DESC LIMIT 1; // ์กฐํšŒ ๊ฒฐ๊ณผ์—์„œ ๊ฐ€์žฅ ํฐ path

๐Ÿ“Œ2๏ธโƒฃ Backward Index Scan ํ™œ์šฉ

  • path ํ•„๋“œ์— ์˜ค๋ฆ„์ฐจ์ˆœ(ASC) ์ธ๋ฑ์Šค๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์–ด๋„, ๋‚ด๋ฆผ์ฐจ์ˆœ(DESC) ์ •๋ ฌ์„ ํ†ตํ•ด ๊ฐ€์žฅ ํฐ path๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค ํŠธ๋ฆฌ(Leaf Node) ๊ฐ„์˜ ์–‘๋ฐฉํ–ฅ ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—ญ์ˆœ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญ์ˆœ์œผ๋กœ ์Šค์บ”ํ•˜์—ฌ LIMIT 1์„ ์ ์šฉํ•˜๋ฉด ๊ฐ€์žฅ ํฐ path๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ…3๏ธโƒฃ MySQL Query Plan ๋ถ„์„ (EXPLAIN)

  • MySQL์—์„œ descendantsTopPath๋ฅผ ์ฐพ๋Š” ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ๋ถ„์„ํ•ด๋ด…๋‹ˆ๋‹ค.
EXPLAIN SELECT path FROM comment_v2
WHERE article_id = 1
AND path > '00a0z'
AND path LIKE '00a0z%'
ORDER BY path DESC LIMIT 1;

๐Ÿ“Œ EXPLAIN ๋ถ„์„ ๊ฒฐ๊ณผ

    1. idx_article_id_path ์ธ๋ฑ์Šค ์‚ฌ์šฉ๋จ
      • โ†’ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ path๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ
    1. Backward Index Scan ์ ์šฉ๋จ
      • โ†’ ORDER BY path DESC LIMIT 1์„ ํ†ตํ•ด ์—ญ์ˆœ ํƒ์ƒ‰ ์ˆ˜ํ–‰
    1. Using Index ์ ์šฉ๋จ
      • โ†’ ์ธ๋ฑ์Šค์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€๋Šฅ

โœ…4๏ธโƒฃ ๊ฒฐ๋ก 

๐Ÿš€ Path Enumeration(๊ฒฝ๋กœ ์—ด๊ฑฐ) ๋ฐฉ์‹์—์„œ ๋Œ“๊ธ€์„ ์ถ”๊ฐ€ํ•  ๋•Œ, path๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •.

  • โœ… ๊ฐ€์žฅ ํฐ childrenTopPath๋ฅผ ์ฐพ๊ณ , +1์„ ํ•˜์—ฌ ์ƒˆ๋กœ์šด path๋ฅผ ์ƒ์„ฑ
  • โœ… descendantsTopPath๋ฅผ ์ฐพ์•„ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋Œ“๊ธ€์„ ์ •๋ ฌ
  • โœ… MySQL์˜ Backward Index Scan์„ ํ™œ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ descendantsTopPath๋ฅผ ๊ฒ€์ƒ‰
  • โœ… ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์—์„œ๋„ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ์œ ์ง€

๐Ÿ“Œ Path Enumeration ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š”, Backward Index Scan์„ ํ™œ์šฉํ•˜์—ฌ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.