Admin Dashboard Implementation Guide

๊ด€๋ฆฌ์ž ํ™”๋ฉด(Admin Panel) ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ์„ค๊ณ„์„œ

1. ์ „์ฒด ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ตฌํ˜„ ๊ณ„ํš

๋ณธ ์„ค๊ณ„์„œ๋Š” ๊ด€๋ฆฌ์žํ™”๋ฉด_ํ†ตํ•ฉ๋Œ€์‹œ๋ณด๋“œ_UI์ œ์•ˆ.html ์ •์  ํŒŒ์ผ์˜ ์‚ฌ์šฉ์ž ๋™์ž‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ํ”„๋กœ๋•์…˜ ๊ธ‰ ์„œ๋ฒ„ ์ธํ”„๋ผ์— ์•ˆ์ฐฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„ ๋ช…์„ธ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์€ Node.js / PostgreSQL / MinIO S3 ๋ฐ Redis Queue ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

graph TD Client[Browser Admin Page] -->|REST API Requests| Backend[Express.js Web Server] Client -->|WebSocket Event Channel| SocketServer[Socket.io Server] Backend -->|SQL Query / PG client| DB[(PostgreSQL Database)] Backend -->|Enqueue / Monitor| Redis[(Redis / BullMQ Queue)] SocketServer -->|Active Session Cache| Memory[Node.js Process Memory]
โ„น๏ธ ๋ฐฑ์—”๋“œ ์—ฐ๋™ ๋ฐฉ์‹
๋ณธ ์‹œ์Šคํ…œ์€ ๊ด€๋ฆฌ ์—…๋ฌด์˜ ์—ฐ์†์„ฑ ํ™•๋ณด ๋ฐ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด REST API ์ฑ„๋„ ์™ธ์—๋„ Socket.io ์„œ๋ฒ„ ์ฑ„๋„์„ ๋™์‹œ์— ๊ฐ€์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์›น์†Œ์ผ“ ํ†ต์‹ ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋‹จ๊ณ„๋ณ„ ๊ฐœ๋ฐœ ๋กœ๋“œ๋งต

[1๋‹จ๊ณ„] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ํ™•์žฅ ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

[2๋‹จ๊ณ„] ๋ฐฑ์—”๋“œ RESTful API ๋ฐ WebSocket ํ•ธ๋“ค๋Ÿฌ ๊ฐœ๋ฐœ

[3๋‹จ๊ณ„] ํ”„๋ก ํŠธ์—”๋“œ ์–ด๋“œ๋ฏผ ๋Œ€์‹œ๋ณด๋“œ UI ์—ฐ๋™

2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์„ค๊ณ„ (ERD)

๊ธฐ์กด์— ์ด๋ฏธ ๋ณด์œ ํ•œ tb_project.category ๋ฐ tb_user."group" ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•œ ๊ด€๊ณ„ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

classDiagram class code_master { +main_code : VARCHAR(30) PK +main_code_nm : VARCHAR(100) +use_yn : CHAR(1) +rmk : VARCHAR(255) } class code_detail { +main_code : VARCHAR(30) PK/FK +sub_code : VARCHAR(30) PK +base_code : VARCHAR(61) UNIQUE +code_nm : VARCHAR(100) +sort_ord : INT +use_yn : CHAR(1) +rmk : VARCHAR(255) } class tb_project { +project_id : VARCHAR(50) PK +project_nm : VARCHAR(100) +category : VARCHAR(50) FK +limit_storage : INT +is_active : BOOLEAN } class tb_system_policy { +policy_id : INT PK +policy_key : VARCHAR(50) UNIQUE +limit_file_count : INT +limit_days : INT +is_active : BOOLEAN +upd_date : TIMESTAMP } class tb_user { +user_id : VARCHAR(50) PK +user_nm : VARCHAR(50) +user_pw : VARCHAR(255) +company : VARCHAR(50) +dept : VARCHAR(50) +position : VARCHAR(50) +group : VARCHAR(50) FK +is_resigned : BOOLEAN } class tb_permission { +project_id : VARCHAR(50) PK/FK +user_id : VARCHAR(50) PK/FK +lev : INT } class tb_banner_notice { +banner_id : SERIAL PK +project_id : VARCHAR(50) FK +reg_date : DATE +start_date : DATE +end_date : DATE +notice_text : TEXT +status_code : VARCHAR(61) FK } class tb_log { +log_id : SERIAL PK +project_id : VARCHAR(50) +activity : VARCHAR(100) +user_id : VARCHAR(50) +user_ip : VARCHAR(50) +log_date : TIMESTAMP +path_arr : TEXT[] } code_master "1" --> "0..*" code_detail code_detail "1" --> "0..*" tb_project : "category ์ฐธ์กฐ" code_detail "1" --> "0..*" tb_user : "group ์ฐธ์กฐ" code_detail "1" --> "0..*" tb_banner_notice : "status_code ์ฐธ์กฐ" tb_project "1" --> "0..*" tb_permission tb_user "1" --> "0..*" tb_permission tb_project "1" --> "0..*" tb_banner_notice

3. ํ™”๋ฉด๋ณ„ ์—ฐ๋™ ํ…Œ์ด๋ธ” ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ธ ๋งคํ•‘

๐Ÿ“Š ํ™”๋ฉด 1: ์ข…ํ•ฉ ์šฉ๋Ÿ‰ ๋ฐ ์ ‘์†์ž ํ˜„ํ™ฉ (Dashboard)

์ฃผ์š” ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐ ํ™œ์šฉ ํ…Œ์ด๋ธ”:

๐Ÿ—๏ธ ํ™”๋ฉด 2: ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ (Project Management)

์ฃผ์š” ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐ ํ™œ์šฉ ํ…Œ์ด๋ธ”:

๐Ÿ“ข ํ™”๋ฉด 3: ์‹ค์‹œ๊ฐ„ ๋ฐฐ๋„ˆ ๊ณต์ง€ (Banner Notice)

์ฃผ์š” ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐ ํ™œ์šฉ ํ…Œ์ด๋ธ”:

๐Ÿ‘ฅ ํ™”๋ฉด 4: ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (User Management)

์ฃผ์š” ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐ ํ™œ์šฉ ํ…Œ์ด๋ธ”:

๐Ÿ”Ž ํ™”๋ฉด 5: ๊ฐ์‚ฌ ๋กœ๊ทธ ์กฐํšŒ (Audit Logs)

์ฃผ์š” ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐ ํ™œ์šฉ ํ…Œ์ด๋ธ”:

โš™๏ธ ํ™”๋ฉด 6: ์ž๋™ ๋ณด์กด ๋ฐ ํŒŒ์ผ ์‚ญ์ œ ์ •์ฑ… ์„ค์ • (Delete Policy)

์ฃผ์š” ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐ ํ™œ์šฉ ํ…Œ์ด๋ธ”:

๐Ÿ”‘ ํ™”๋ฉด 7: ๊ณตํ†ต ์ฝ”๋“œ ๊ด€๋ฆฌ (Common Code Management)

์ฃผ์š” ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐ ํ™œ์šฉ ํ…Œ์ด๋ธ”:

4. ํ•ต์‹ฌ ๋ฐฑ์—”๋“œ CRUD API Endpoint ์„ค๊ณ„์•ˆ

ํ”„๋ก ํŠธ์—”๋“œ-๋ฐฑ์—”๋“œ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•ด ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•  RESTful API ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

1. ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ API (/api/admin/projects)

๋ฉ”์†Œ๋“œ ์—”๋“œํฌ์ธํŠธ ์„ค๋ช…
GET / ์ „์ฒด ํ”„๋กœ์ ํŠธ ๋ฐ ์นดํ…Œ๊ณ ๋ฆฌ ์ •๋ณด ์กฐํšŒ
POST / ์‹ ๊ทœ ํ”„๋กœ์ ํŠธ ๋“ฑ๋ก
PUT /:id ํŠน์ • ํ”„๋กœ์ ํŠธ ๋‚ด์šฉ(์นดํ…Œ๊ณ ๋ฆฌ category ๊ฐ’, ์šฉ๋Ÿ‰์ œํ•œ, ํ™œ์„ฑํ™”) ๊ฐฑ์‹ 
DELETE /:id ํ”„๋กœ์ ํŠธ ์˜๊ตฌ ์‚ญ์ œ (์ฐธ์—ฌ ๊ถŒํ•œ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ž๋™ CASCADE)

2. ํ”„๋กœ์ ํŠธ ๊ถŒํ•œ ๋ฐฐ์ • API (/api/admin/permissions)

๋ฉ”์†Œ๋“œ ์—”๋“œํฌ์ธํŠธ ์„ค๋ช…
GET /project/:projectId ํŠน์ • ํ˜„์žฅ์— ์ฐธ์—ฌ ์ค‘์ธ ์œ ์ € ๋ชฉ๋ก ์กฐํšŒ
POST /assign ํ˜„์žฅ์— ํŠน์ • ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์‹ ๊ทœ ๋ถ€์—ฌ (๋‹ค์ค‘ ๋ฐฐ์ •)
PUT /update ๋ฐฐ์ • ์œ ์ €์˜ ๊ถŒํ•œ ๋“ฑ๊ธ‰(lev) ์ˆ˜์ •
DELETE /remove ํ˜„์žฅ ์ฐธ์—ฌ ๊ถŒํ•œ ๋ฐฐ์ • ์ œ์™ธ (๋งคํ•‘ ํ–‰ ์‚ญ์ œ)

3. ์‹ค์‹œ๊ฐ„ ๋ฐฐ๋„ˆ ๊ณต์ง€ API (/api/admin/banners)

๋ฉ”์†Œ๋“œ ์—”๋“œํฌ์ธํŠธ ์„ค๋ช…
GET / ๋ฐฐ๋„ˆ ์†ก์ถœ ์ด๋ ฅ ์กฐํšŒ (์ƒํƒœ, ๋‚ ์งœ๊ฒ€์ƒ‰ ํ•„ํ„ฐ ์ง€์›)
POST / ์‹ ๊ทœ ๋ฐฐ๋„ˆ ๊ณต์ง€ ์ž‘์„ฑ ๋ฐ ๋“ฑ๋ก
PUT /stop/:id ๊ณต์ง€ ์ˆ˜๋™ ์†ก์ถœ ์ค‘์ง€ (์ƒํƒœ๋ฅผ expired๋กœ ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ)

4. ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ API (/api/admin/users)

๋ฉ”์†Œ๋“œ ์—”๋“œํฌ์ธํŠธ ์„ค๋ช…
GET / ์ „์ฒด ๊ณ„์ • ์ •๋ณด ๋ฐ ๊ถŒํ•œ๊ทธ๋ฃน ์กฐํšŒ
GET /:id/permissions ํ•ด๋‹น ์œ ์ €๊ฐ€ ์ฐธ์—ฌ ๊ถŒํ•œ์„ ์ง€๋‹Œ ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก ์กฐํšŒ
POST / ์‹ ๊ทœ ์‚ฌ์šฉ์ž ๊ณ„์ • ๋“ฑ๋ก (ํŒจ์Šค์›Œ๋“œ bcrypt ์•”ํ˜ธํ™”)
PUT /:id ์‚ฌ์šฉ์ž ์ •๋ณด(๊ถŒํ•œ ๊ทธ๋ฃน group ํฌํ•จ) ๋ฐ ์žฌ์ง ์ƒํƒœ ๊ฐฑ์‹ 
DELETE /:id ์‚ฌ์šฉ์ž ๊ณ„์ • ์‚ญ์ œ (๊ถŒํ•œ ์ •๋ณด ๋ฐ ์„ค์ • ์—ฐ์‡„ ์‚ญ์ œ)

5. ๊ณตํ†ต ์ฝ”๋“œ ๊ด€๋ฆฌ API (/api/admin/common-codes)

๋ฉ”์†Œ๋“œ ์—”๋“œํฌ์ธํŠธ ์„ค๋ช…
GET /masters ๋Œ€๋ถ„๋ฅ˜ ๋งˆ์Šคํ„ฐ ์ฝ”๋“œ ๋ชฉ๋ก ์กฐํšŒ
POST /masters ์‹ ๊ทœ ๋Œ€๋ถ„๋ฅ˜ ๋“ฑ๋ก
PUT /masters/:code ๋Œ€๋ถ„๋ฅ˜ ์ˆ˜์ •
DELETE /masters/:code ๋Œ€๋ถ„๋ฅ˜ ์‚ญ์ œ (ํ•˜์œ„ ์†Œ๋ถ„๋ฅ˜ ์ž๋™ ์—ฐ์‡„ ์‚ญ์ œ)
GET /details/:mainCode ์„ ํƒ๋œ ๋Œ€๋ถ„๋ฅ˜์— ํ•ด๋‹นํ•˜๋Š” ์†Œ๋ถ„๋ฅ˜ ์ •๋ ฌ ์กฐํšŒ
POST /details ์‹ ๊ทœ ์†Œ๋ถ„๋ฅ˜ ๋“ฑ๋ก (base_code ์ž๋™ ์—ฐ์‚ฐ ์ƒ์„ฑ)
PUT /details/:mainCode/:subCode ์†Œ๋ถ„๋ฅ˜ ์ˆ˜์ • (๋ช…์นญ, ์ •๋ ฌ์ˆœ์„œ, ์‚ฌ์šฉ์—ฌ๋ถ€)
DELETE /details/:mainCode/:subCode ์†Œ๋ถ„๋ฅ˜ ์‚ญ์ œ

6. ์‹œ์Šคํ…œ ๊ณตํ†ต ๋ณด์กด ์ •์ฑ… API (/api/admin/system-policy)

๋ฉ”์†Œ๋“œ ์—”๋“œํฌ์ธํŠธ ์„ค๋ช…
GET / ์‹œ์Šคํ…œ ๊ธ€๋กœ๋ฒŒ ๋ณด์กด ์ •์ฑ… ์กฐํšŒ
POST /update ๊ธ€๋กœ๋ฒŒ ๋ณด์กด ์ •์ฑ… ๊ฐ’ ๊ฐฑ์‹  ๋ฐ ์ €์žฅ