Home
>
Backend Development
>
๐[Backend Development] ๋ฌดํ Depth ๋๊ธ ์ ๋ ฌ ๊ตฌ์กฐ์ 'Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์'์ด๋ ๋ฌด์์ผ๊น์?
Backend Ddevelopment
โ๐[Backend Development] ๋ฌดํ Depth ๋๊ธ ์ ๋ ฌ ๊ตฌ์กฐ์ โPath Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์โ์ด๋ ๋ฌด์์ผ๊น์?โ
โ
๋ฌดํ Depth ๋๊ธ ์ ๋ ฌ ๊ตฌ์กฐ์ โPath Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์โ ์ค๋ช
.
- Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๊ณ์ธต์ ๋ฌธ์์ด ํํ๋ก ์ ์ฅํ์ฌ ์ ๋ ฌ ๋ฐ ๊ฒ์์ ํจ์จ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ์์
๋๋ค.
- ์ด ๋ฐฉ์์ ํธ๋ฆฌ์ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ์ ์งํ๋ฉด์ ๋น ๋ฅด๊ฒ ์ ๋ ฌ ๋ฐ ์กฐํํ ์ ์๋๋ก ๋์์ค๋๋ค.
๐๏ธ1๏ธโฃ Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์ด๋?
- Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์์๋ ๊ฐ ๋๊ธ์ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ๋ฌธ์์ด ๊ฒฝ๋ก(path)๋ก ์ ์ฅํฉ๋๋ค.
- ์ฆ, ๊ฐ ๋๊ธ์ด ํธ๋ฆฌ ๊ตฌ์กฐ์์ ์ด๋ค ์์น์ ์๋์ง ๊ฒฝ๋ก๋ฅผ ๋ฏธ๋ฆฌ ๊ธฐ๋กํ์ฌ ์ ๋ ฌ ๋ฐ ๊ฒ์์ ์ต์ ํํฉ๋๋ค.
๐๏ธ2๏ธโฃ ํ
์ด๋ธ ๊ตฌ์กฐ.
- Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ์ ์ธ path ์ปฌ๋ผ์ด ํ์ํฉ๋๋ค.
ํ๋๋ช
|
์ค๋ช
|
comment_id |
๋๊ธ์ ๊ณ ์ ID (PK) |
parent_comment_id |
๋ถ๋ชจ ๋๊ธ์ ID (์ต์์ ๋๊ธ์ด๋ฉด NULL) |
article_id |
ํด๋น ๋๊ธ์ด ์ํ ๊ฒ์๊ธ ID |
content |
๋๊ธ ๋ด์ฉ |
created_at |
๋๊ธ ์์ฑ ์๊ฐ |
path |
๋๊ธ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด (์: โ00001.00002.00005โ |
- ๐ path ํ๋๋ ๊ฐ ๋๊ธ์ด ํธ๋ฆฌ ๊ตฌ์กฐ์์ ์ด๋์ ์ํ๋์ง ๋ํ๋
- ๐ ์ด ๊ฐ์ ํ์ฉํ๋ฉด ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ์ ๋ ฌ ๋ฐ ์กฐํํ๋ ๊ฒ์ด ์ฌ์์ง
๐๏ธ3๏ธโฃ Path ๊ฐ ์ ์ฅ ๋ฐฉ์.
- path ๊ฐ์ ๋๊ธ์ด ํธ๋ฆฌ์์ ์ด๋ค ์์น์ ์๋์ง๋ฅผ ๋ํ๋
๋๋ค.
- ๊ฐ comment_id๋ฅผ 5์๋ฆฌ ๋ฌธ์์ด(00001, 00002 ๋ฑ)๋ก ๋ณํํ์ฌ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ์ ์ฅํฉ๋๋ค.
๐ Path ๊ฐ ์์
comment_id |
parent_comment_id |
path |
1 |
NULL |
00001 |
2 |
1 |
00001.00002 |
3 |
NULL |
00003 |
4 |
2 |
00001.00002.00004 |
5 |
4 |
00001.00002.00004.00005 |
6 |
NULL |
00006 |
- ๐ ๊ฐ ๋๊ธ์ ๋ถ๋ชจ path๋ฅผ ์์๋ฐ๊ณ , ์์ ์ ID๋ฅผ ์ถ๊ฐํ์ฌ path๋ฅผ ์์ฑ
- ๐ ๋ถ๋ชจ ๋๊ธ์ด ์ญ์ ๋๋๋ผ๋ path๋ฅผ ํตํด ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ์ ์ง ๊ฐ๋ฅ
๐๏ธ4๏ธโฃ Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ)์ ํ์ฉํ ์ ๋ ฌ.
- Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ)์ ํ์ฉํ๋ฉด ๊ฒฝ๋ก ์์๋๋ก ์ ๋ ฌํ๋ฉด ๋๊ธ์ ๊ณ์ธต ๊ตฌ์กฐ ๊ทธ๋๋ก ์ ์งํ ์ ์์ต๋๋ค.
SELECT * FROM comment
WHERE article_id = ?
ORDER BY path ASC;
- ๐ ORDER BY path ASC๋ฅผ ์ ์ฉํ๋ฉด ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ์ ๋ ฌ๋จ
- ๐ ์ผ๋ฐ์ ์ธ ORDER BY parent_comment_id, comment_id๋ณด๋ค ํธ๋ฆฌ ๊ตฌ์กฐ ์ ๋ ฌ์ด ์ ํํจ
๐๏ธ5๏ธโฃ Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์ผ๋ก ์กฐํ
๐ ์์ ๋ฐ์ดํฐ
comment_id |
parent_comment_id |
path |
1 |
NULL |
00001 |
2 |
1 |
00001.00002 |
3 |
NULL |
00003 |
4 |
2 |
00001.00002.00004 |
5 |
4 |
000001.00002.00004.00005 |
6 |
NULL |
00006 |
๐ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ.
SELECT * FROM comment
WHERE article_id = ?
ORDER BY path ASC;
โ
์ถ๋ ฅ ๊ฒฐ๊ณผ
1. ๋๊ธ1
โโโ ๋๊ธ2
โโโ ๋๊ธ4
โโโ ๋๊ธ5
2. ๋๊ธ3
3. ๋๊ธ6
- ๐ ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ์ ํํ๊ฒ ์ ์ง๋๋ฉด์ ์ ๋ ฌ๋จ.
๐๏ธ6๏ธโฃ ํน์ ๋๊ธ์ ํ์ ๋๊ธ ์กฐํ.
- Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์์๋ ํน์ ๋๊ธ์ ๋ชจ๋ ํ์ ๋๊ธ์ ์์ฝ๊ฒ ์กฐํํ ์ ์์ต๋๋ค.
SELECT * FROM comment
WHERE path LIKE '00001.00002%'
ORDER BY path ASC;
- ๐ ๊ฒฐ๊ณผ: 00001.00002๋ก ์์ํ๋ ๋ชจ๋ ํ์ ๋๊ธ์ ์กฐํ (๋๊ธ2, ๋๊ธ4, ๋๊ธ5 ํฌํจ)
๐๏ธ7๏ธโฃ Path Enumeration ๋ฐฉ์์ ์ฅ์ ๊ณผ ๋จ์ .
โ
์ฅ์ .
์ฅ์ |
์ค๋ช
|
ํธ๋ฆฌ ๊ตฌ์กฐ ์ ์ง๊ฐ ์ฌ์ |
ORDER BY path ASC๋ง์ผ๋ก ๊ณ์ธต ๊ตฌ์กฐ ์ ๋ ฌ ๊ฐ๋ฅ |
ํ์ ๋๊ธ ์กฐํ๊ฐ ๋น ๋ฆ |
LIKE โ๊ฒฝ๋ก%โ๋ก ์์ฝ๊ฒ ํ์ ๋๊ธ ์กฐํ ๊ฐ๋ฅ |
๋ถ๋ชจ ๋๊ธ ์ญ์ ์ ๊ณ์ธต ๊ตฌ์กฐ ์ ์ง ๊ฐ๋ฅ |
path๋ฅผ ํตํด ์์ ๋๊ธ์ ์๋ณ ๊ฐ๋ฅ |
โ ๋จ์ .
๋จ์ |
์ค๋ช
|
๋๊ธ ์ด๋ ์ path ์
๋ฐ์ดํธ ํ์ |
๋๊ธ์ ๋ค๋ฅธ ๋ถ๋ชจ๋ก ์ด๋ํ๋ฉด path๋ฅผ ๋ณ๊ฒฝํด์ผ ํจ |
path ๊ธธ์ด ์ฆ๊ฐ ๊ฐ๋ฅ์ฑ |
๋๊ธ์ด ๊น์ด์ง์๋ก path ๊ธธ์ด๊ฐ ๊ธธ์ด์ง ์ ์์ |
INSERT ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ์ฑ |
์๋ก์ด ๋๊ธ ์ถ๊ฐ ์ path๋ฅผ ๊ณ์ฐํด์ผ ํจ |
๐๏ธ8๏ธโฃ Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์์ ๋๊ธ ์ ์ฅ ๊ท์น.

- ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด, ๊ฐ depth(๊ณ์ธต)๋ณ๋ก 5๊ฐ์ ๋ฌธ์์ด๋ก ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
- 1 depth๋ 5์๋ฆฌ ๋ฌธ์์ด, 2 depth๋ 10์๋ฆฌ, 3 depth๋ 15์๋ฆฌ N depth๋ (N * 5)์๋ฆฌ๋ก ํํ๋ฉ๋๋ค.
- ๊ฐ ๋๊ธ์ ๊ฒฝ๋ก๋ ๋ชจ๋ ์์ ๋๊ธ์์ ํด๋น ๋๊ธ๊น์ง์ ๊ฒฝ๋ก๋ฅผ ํฌํจํ๋๋ก ์ ์ฅ๋ฉ๋๋ค.
- ๊ฒฝ๋ก๋ ๋ถ๋ชจ ๊ฒฝ๋ก๋ฅผ ์์ํ๋ฉฐ, ๋
๋ฆฝ์ ์ด๋ฉด์ ์์ฐจ์ ์ธ ํํ๋ฅผ ์ ์งํฉ๋๋ค.
- ๐ ์ด ๋ฐฉ์์ ๋๊ธ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ช
ํํ๊ฒ ํํํ๊ณ , ์ ๋ ฌ ๋ฐ ๊ฒ์์ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋๋ก ๋์์ค๋๋ค.
๐๏ธ9๏ธโฃ Path Enumeration ๋ฐฉ์์ ๊ณ์ธตํ ๋๊ธ ๊ตฌ์กฐ ์์

- ์ข์ธก ๊ทธ๋ฆผ์ ๊ณ์ธตํ ๋๊ธ ๊ตฌ์กฐ๋, ์ฐ์ธก ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- ๊ฐ ๊ฒฝ๋ก๋ ๋ถ๋ชจ ๋๊ธ์ ๊ฒฝ๋ก๋ฅผ ์์๋ฐ์ผ๋ฉฐ, ๊ฐ ๋๊ธ๋ง๋ค ๋
๋ฆฝ์ ์ด๊ณ ์์ฐจ์ ์ธ ๊ฒฝ๋ก(๋ฌธ์์ด ์ ๋ ฌ ๊ธฐ์ค)๊ฐ ์์ฑ๋ฉ๋๋ค.
- ๐ ์ด ๋ฐฉ์์ ๋๊ธ์ ๊ณ์ธต์ ์ผ๋ก ์ ๋ ฌํ๊ณ , ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๋๋ก ๋์์ค๋๋ค.
๐๏ธ1๏ธโฃ0๏ธโฃ Path Enumeration ๋ฐฉ์์์ ๊ฒฝ๋ก ํํ ๋ฒ์ ํ์ฅ ๋ฐฉ๋ฒ

- ๊ฐ ๊ฒฝ๋ก๋ depth(๊ณ์ธต)๋ง๋ค 5์๋ฆฌ์ ๋ฌธ์๋ก ํํ๋๋ฏ๋ก, ์ฌ์ฉํ ์ ์๋ ๊ฒฝ๋ก์ ๊ฐ์์๋ ์ ํ์ด ์์ต๋๋ค.
- ๋ง์ฝ ๊ฐ ์๋ฆฟ์๋ฅผ ์ซ์ (0~9)๋ก๋ง ์ฌ์ฉํ๋ค๋ฉด, ํ depth๋น 10โต = 100,000๊ฐ(00000 ~ 99999)์ ๊ฒฝ๋ก๋ง ํํํ ์ ์์ต๋๋ค.
- ํ์ง๋ง ๋ฌธ์์ด์ด๊ธฐ ๋๋ฌธ์, ๋ฐ๋์ ์ซ์(0~9)๋ง ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค.
- ๊ฐ ์๋ฆฟ์๋ 0~9(10๊ฐ), A~Z(26๊ฐ), a~z(26๊ฐ) ์ด 62๊ฐ์ ๋ฌธ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฌธ์์ด์ ์ ๋ ฌ ์์๋ ์ซ์(0~9) โ ๋๋ฌธ์ ์ํ๋ฒณ(A~Z) โ ์๋ฌธ์ ์ํ๋ฒณ(a~z) ์์๋ก ์ง์ ๋ฉ๋๋ค.
- ๋ฐ๋ผ์, ๊ฒฝ๋ก๋ 00000๋ถํฐ zzzzz๊น์ง ์์ฐจ์ ์ผ๋ก ์์ฑ๋ฉ๋๋ค.
- ์ด ๋ฐฉ์์์๋ ํ depth๋น 62โต = 16,132,832๊ฐ์ ๊ฒฝ๋ก๋ฅผ ํํํ ์ ์์ต๋๋ค.
- ๐ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ฒฝ๋ก ํํ ๋ฒ์๋ฅผ ํ์ฅํ๋ฉด, ๋ ๋ง์ ๋๊ธ์ ์ ์ฅํ ์ ์์ผ๋ฉฐ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋์ฑ ์ ์ฐํ๊ฒ ์ ์งํ ์ ์์ต๋๋ค.
๐ ์ ๋ฆฌ.
- โ
Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์ ๋๊ธ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ฌธ์์ด(path)๋ก ์ ์ฅํ๋ ๋ฐฉ์
- โ
ORDER BY path ASC๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ์ ๋ ฌ ๊ฐ๋ฅ
- โ
ํ์ ๋๊ธ ์กฐํ ์ LIKE โ๊ฒฝ๋ก%โ๋ฅผ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ๊ฒ์ ๊ฐ๋ฅ
- โ
๋ถ๋ชจ ๋๊ธ์ด ์ญ์ ๋๋๋ผ๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ ๋ฐ ์ ๋ฆฌ
- โ
๋๊ธ ์ด๋์ด ๋น๋ฒํ ๊ฒฝ์ฐ path ์
๋ฐ์ดํธ๊ฐ ํ์ํ๋ฏ๋ก ์กฐ์ฌํด์ผ ํจ
- โ
Path Enumeration ๋ฐฉ์์ ๋ฌดํ Depth ๋๊ธ ์ ๋ ฌ ๋ฐ ์กฐํ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค.
- โ
ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ORDER BY path ASC๋ง์ผ๋ก ์ ๋ ฌ์ด ๊ฐ๋ฅํ์ฌ ์ฑ๋ฅ์ด ์ฐ์ํฉ๋๋ค.
- โ
๊ฒฝ๋ก ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด Base62์ ๊ฐ์ ๋ฐฉ์์ ๊ณ ๋ คํ ์๋ ์์ต๋๋ค.
- ๐ ๋ฌดํ Depth ๋๊ธ ์ ๋ ฌ ๋ฐ ์กฐํ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค.