๐Ÿ“Œ MyBatis๋ฅผ ํ™œ์šฉํ•œ ์กฐ์ง๋„ ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ์ž ์กฐํšŒ ์ •๋ ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

๐Ÿ“ ๊ฐœ์š”

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŠน์ • ํšŒ์‚ฌ์˜ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ์กฐ์ง๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ ฌํ•ด์•ผ ํ•˜์ง€๋งŒ, ๊ธฐ์กด ์ฟผ๋ฆฌ์—์„œ ์ผ๋ถ€ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ ฌ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์œ„ ์กฐ์ง ์ฝ”๋“œ์™€ ์ •๋ ฌ ์ˆœ์„œ(sort_order)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ •๋ ฌ ๊ธฐ์ค€์„ ๋ช…ํ™•ํžˆ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๊ฐœ์„ ํ–ˆ๋‹ค.


๐Ÿš€ ๊ตฌํ˜„ ๋‚ด์šฉ

๐Ÿ”น ๊ธฐ์กด ๋ฌธ์ œ์ 

โœ… ์กฐ์ง๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ์กฐํšŒํ•  ๋•Œ, ์ •ํ™•ํ•œ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Œ

โœ… ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋“ค์˜ sort_order ๊ฐ’์ด ์—†๊ฑฐ๋‚˜ 0์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด, ์ •๋ ฌ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Œ

โœ… ์ƒ์œ„ ๋ถ€์„œ์™€์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•œ ์ •๋ ฌ์ด ํ•„์š”


๐Ÿ”น ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

โœ… ์กฐ์ง ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด WITH RECURSIVE๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์กฐ์ง๋„๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์กฐํšŒ

โœ… ์‚ฌ์šฉ์ž์˜ ๋ถ€์„œ ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด dept_sort_order ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์กฐ์ง๋„ ๊ธฐ๋ฐ˜ ์ •๋ ฌ์„ ๋ณด์žฅ

โœ… ์ •๋ ฌ ๊ธฐ์ค€์„ ๋ช…ํ™•ํžˆ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ ์ผ๊ด€๋œ ์ˆœ์„œ๋ฅผ ์œ ์ง€

๐Ÿ“Œ ์ˆ˜์ • ํ›„ MyBatis ์ฟผ๋ฆฌ

WITH RECURSIVE CTE AS (
    SELECT code, parent_code
    FROM company_structure
    WHERE code = #{company_code} AND enabled = true
    UNION ALL
    SELECT c.code, c.parent_code
    FROM company_structure c
    INNER JOIN CTE ON c.parent_code = CTE.code AND c.enabled = true
)
SELECT
    u.*,
    d.name AS department_name,
    d.full_hierarchy AS department_hierarchy,
    (SELECT sort_order
     FROM department_structure
     WHERE code = u.department_code AND company_code = u.company_code) AS department_sort_order
FROM users u
JOIN department_structure d
    ON u.company_code = d.company_code
    AND u.department_code = d.code
JOIN (
    SELECT * FROM CTE
) c ON c.code = u.company_code
WHERE u.sort_order IS NOT NULL AND u.sort_order > 0 -- ์ •๋ ฌ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ์ž ์ œ์™ธ
ORDER BY
    u.company_code,
    department_sort_order,
    u.sort_order;


๐Ÿ“Œ ์ž‘์—…ํ•˜๋ฉด์„œ ๋ฐฐ์šด ์ 

โœ… ์กฐ์ง๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.