API๋ MCP๋ ์๋ ํ์์ธ์์(๊ทผํ SaaS) ์ ๋ธ๋ผ์ฐ์ ์๋ํ๋ก ๊ฐ์ธ, ๋ก๊ทธ์ธ๋ถํฐ ๋ฐ์ดํฐ ์์งยท๋ถ์ยท์๊ฐํ๊น์ง ๋์ ํด์ฃผ๋ ๋๊ตฌ.
"API๋ฅผ ์ ์ฃผ๋(๋ชป ์ฃผ๋) ์๋น์ค๋, ์๋ํ๊ฐ ๊ณง ๊ทธ ์๋น์ค์ API๊ฐ ๋๋ค."
๋ณธ์ธ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ๋ฉด โ ๊ฐ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋์ ํ์์ธ์์์ ์ ์ํด ๋ด ๊ทผํ๋ฅผ ๊ธ์ด์ โ ์ด๊ณผ๊ทผ๋ฌด๋ฅผ ๊ณ์ฐํด โ ๋ฆฌํฌํธ๋ก ๋ณด์ฌ์ค๋ค. ๊ด๋ฆฌ์ ๊ถํ ๋ถํ์.
- ์ง์(๋ณธ์ธ) ๋ชจ๋ โ
user.timeinout.kr๋ก๊ทธ์ธ๋ง์ผ๋ก ๋ด ๊ทผํ ์กฐํ (๊ด๋ฆฌ์ ๊ถํ X) - ์ฐ ํด๊ทผ ๊ธฐ์ค ์ด๊ณผ๊ทผ๋ฌด โ ํ์ฌ์ "์ ๋ 12์๊ฐ ์ธ์ ์ํ"์ ๋ฌด์ํ๊ณ ์ค์ ์ถํด๊ทผ ํ์น๋ก ๊ณ์ฐ
- ์ 52์๊ฐ ์ฒดํฌ + KPI: ์ด ๊ทผ๋ก / ์ด๊ณผ๊ทผ๋ฌด(ํ์ผ 8h ์ด๊ณผ) / ํด์ผ๊ทผ๋ฌด(์์ธ ๋ณ๋ ์ง๊ณ)
- ์ถํด๊ทผ ์๊ฐ ๋ถํฌ ๊ทธ๋ํ โ ํ๋ฃจ๋ฅผ
๊ทผ๋ฌด 4h โ ์ ์ฌ 1h โ ๊ทผ๋ฌด 4h โ ์ ๋ 30m โ ์ผ๊ทผ์ผ๋ก ๋ถํ , ์์ ๋๋ ํด๊ทผ์ 24h ์๋ก- ์: ๊ทผ๋ฌด(ํ๋) ยท ์ผ๊ทผ(๋นจ๊ฐ) ยท ํด์ผ๊ทผ๋ฌด(๋ณด๋ผ) ยท ํด๊ฐ(์ด๋ก) ยท ์ ์ (์ฒญ๋ก) ยท ๊ธฐ๋ก๋๋ฝ(ํ์)
- ์๋ ๋ถ๋ฅ โ ์ฃผ๋ง/๊ณตํด์ผ, ์ฐ์ฐจยท๋ฐ์ฐจ, ์ ์ (์๋์์ ) ๋ด์ญ, ๋ฏธ์ฒดํฌ์์/ํ์ชฝ๋ง ์ฐํ/๊ฒฐ๊ทผ = ๊ธฐ๋ก๋๋ฝ
- ๊ฐ์ ์ฌํ๋ฆฌ ์ค๋ ์ท ํ๋ ์ด์ด โ ๋ก๊ทธ์ธ โ ์์ง โ ๋ฆฌํฌํธ๋ฅผ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์ฌ์ (โน โบ ์๋ค ํ์, โป ๋ค์ํ๊ธฐ)
๋ธ๋ผ์ฐ์ (Playwright) โโโถ user.timeinout.kr ๋ก๊ทธ์ธ
โโโถ ๋์ ๊ทผํ(์ผ๋ณ ์นด๋) ์คํฌ๋ํ โ
โโโถ ๋์ ํด๊ฐ ๋ด์ญ ์คํฌ๋ํ โโโถ ๋ถ์(์ด๊ณผ๊ทผ๋ฌดยท๋ถ๋ฅ) โโถ ์น ๋์๋ณด๋
๊ฐ ๋จ๊ณ ์ค๋
์ท ์บก์ฒ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ (Chart.js)
โโถ NDJSON ์คํธ๋ฆผ์ผ๋ก ํ๋ก ํธ์ ์ค์๊ฐ ์ ์ก
- ์์ง
src/lib/timeinout.mjsโ ๋ก๊ทธ์ธ/์คํฌ๋ํ/๋ถ์ (๊ด๋ฆฌ์ยท์ง์ ๋ชจ๋ ๊ณต์ฉ ๊ณ์ฐ๋ถbuildDays) - ์๋ฒ
server.mjsโ Express,/api/overtime/stream(์ค๋ ์ท ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ) - UI
public/index.htmlโ ๊ฐ์ ๋ธ๋ผ์ฐ์ + ์ค๋ ์ท ํ๋ ์ด์ด + ๋์๋ณด๋ (์์กด์ฑ ์์ด ๋จ์ผ ํ์ผ + Chart.js CDN)
npm install
npx playwright install chromium # ํค๋๋ฆฌ์ค ํฌ๋กฌ (~150MB)
# ์๊ฒฉ์ฆ๋ช
(์ ํ โ UI์์ ์ง์ ์
๋ ฅํด๋ ๋จ)
cp .env.example .env && vi .env # TIMEINOUT_ID / TIMEINOUT_PW
npm run dev # โ http://localhost:8181๋ธ๋ผ์ฐ์ ์์ ์ด๊ณ ์์ด๋ยท๋น๋ฒยท์ ๋ฃ๊ณ ๋ก๊ทธ์ธํ๊ณ ์๋ ๋ถ์ โถ. .env์ ๊ฐ์ ๋ฃ์ด๋๋ฉด ์๋ ํ๋ฆฌํ๋๋ค.
- ํฌ๋กฌ(Playwright)์ด ํ์ โ ์ง์ง ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ ์กฐ์ํ๋ฏ๋ก ์คํ ํ๊ฒฝ์ด ๋ฌต์งํ๋ค(์์ฒญ๋น ํค๋๋ฆฌ์ค ํฌ๋กฌ 1๊ฐ, ~20โ30์ด). ๊ฐ์ธยท์๊ท๋ชจ์ฉ. ํฌ๋กฌ ์ธ์คํด์ค๋ ์ฌ์ฌ์ฉํ๋ค.
- ์๊ฒฉ์ฆ๋ช
์ ๋ก์ปฌ
.env์๋ง ์ ์ฅ๋๋ฉฐ git์ ์ฌ๋ผ๊ฐ์ง ์๋๋ค(.gitignore). ํ๋ฉด ํ๋ฆฌํ๋ ์๋ฒ๊ฐ.env์์ ์ฝ์ด์ค๋ ๋ฐฉ์. - ๊ณ์ฐ ์ ์ : ํด๊ฒ 90๋ถ(์ ์ฌ60+์ ๋ 30) ์ผ๊ด ์ฐจ๊ฐ, ์ฃผ๋ง/ํด์ผ ๊ทผ๋ก๋ ์ ์ฒด๋ฅผ ์ด๊ณผ๋ก ์ง๊ณ, ๋ฏธ์ฒดํฌ์์ ์์ฌ(>16h)ยท๊ฒฐ๊ทผยทํ์ชฝ๋ง ์ฐํ์ "๊ธฐ๋ก๋๋ฝ"์ผ๋ก ํฉ๊ณ์์ ์ ์ธ.
- ํ์์ธ์์ ํ๋ฉด ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ฉด ์ ๋ ํฐ๋ฅผ ์๋ด์ผ ํ ์ ์๋ค.
- ์๋ํ ์ฌ์ฉ์ ๋์ ์๋น์ค ์ฝ๊ด์ ํ์ธํ๊ณ ๋ณธ์ธ ๊ณ์ ยท์ ๋นํ ์ฉ๋๋ก๋ง.
Private.