4

Frontend Engineer

42dot

๐ŸŒ Asia ๐Ÿ  Remote โฑ Part-time ๐Ÿ’ผ Mid-level ๐Ÿ—“ 2 weeks ago

WE ARE LOOKING FOR THE BEST

About Us

42dot์€ ์†Œํ”„ํŠธ์›จ์–ด์™€ AI๋กœ ๋ชจ๋นŒ๋ฆฌํ‹ฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๋Š” ๋ชจ๋นŒ๋ฆฌํ‹ฐ AI ๊ธฐ์—…์ž…๋‹ˆ๋‹ค. ํ˜„๋Œ€์ž๋™์ฐจ๊ทธ๋ฃน ๊ธ€๋กœ๋ฒŒ ์†Œํ”„ํŠธ์›จ์–ด ์„ผํ„ฐ๋กœ์„œ, 42dot์€ ์†Œํ”„ํŠธ์›จ์–ด ์ •์˜ ์ฐจ๋Ÿ‰ ๊ฐœ๋ฐœ์„ ์„ ๋„ํ•˜๋ฉฐ ๋ฏธ๋ž˜ ๋ชจ๋นŒ๋ฆฌํ‹ฐ๋ฅผ ๊ฐœ์ฒ™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Agentic AI Platform ํŒ€์€ LLM ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค์˜ ์šด์˜ ๊ฐ€์‹œ์„ฑ(Observability)์„ ํ™•๋ณดํ•˜๊ณ , ๋น„์šฉยท์†๋„ยทํ’ˆ์งˆ ์ง€ํ‘œ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ด€์ธกยท์ œ์–ดํ•˜๋Š” Agentic AI Console ํ”Œ๋žซํผ์„ ์„ค๊ณ„ยท๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž ๋Œ€์‹œ๋ณด๋“œ, RBAC ๊ธฐ๋ฐ˜ ์–ด๋“œ๋ฏผ ์ฝ˜์†”, Grafana ์ž„๋ฒ ๋”ฉ ์‹œ๊ฐํ™” ๋“ฑ ๋ณต์žกํ•œ ์šด์˜ ๋„๊ตฌ์˜ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์ฃผ๋„์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•  ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Responsibilities

- Next.js 14+ (App Router, TypeScript) ๊ธฐ๋ฐ˜ Agentic AI Console ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„ ๋ฐ ๊ฐœ๋ฐœ

- ๋Œ€์‹œ๋ณด๋“œ UI ๊ตฌํ˜„ (Grafana IFrame ์ž„๋ฒ ๋”ฉ + Recharts ์ปค์Šคํ…€ ์ฐจํŠธ)

- RBAC(SuperAdmin/Admin/Operator/Viewer) ๊ธฐ๋ฐ˜ ์–ด๋“œ๋ฏผ ๊ด€๋ฆฌ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ

- TanStack Query(์„œ๋ฒ„ ์ƒํƒœ) + Zustand(ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ) ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ ์„ค๊ณ„

- Console API(FastAPI)์™€์˜ RESTful/JSON:API ์—ฐ๋™ ๋ฐ BFF ํŒจํ„ด ์ ์šฉ

- ํšŒ์› ๊ด€๋ฆฌ, ๋ฏธํ„ฐ๋ง ์กฐํšŒ, ์•Œ๋ฆผ ์„ค์ •, ๋ฆฌํฌํŠธ ๋ทฐ์–ด ๋“ฑ ๋„๋ฉ”์ธ๋ณ„ UI ๊ตฌํ˜„

- SSE/WebSocket ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ UI ์ฒ˜๋ฆฌ

- Google IAM(OIDC/JWT) ๊ธฐ๋ฐ˜ ์ธ์ฆ ํ”Œ๋กœ์šฐ ๊ตฌํ˜„

- ๋””์ž์ธ ์‹œ์Šคํ…œ ์ˆ˜๋ฆฝ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์ถ•

- ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œยท๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ์ตœ์ ํ™” (Turbopack, Docker)

Qualifications

- ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ 7๋…„ ์ด์ƒ ๊ฒฝํ—˜

- Next.js (App Router) ๋ฐ TypeScript ๊ธฐ๋ฐ˜ ํ”„๋กœ๋•์…˜ ์„œ๋น„์Šค ๊ฐœ๋ฐœยท์šด์˜ ๊ฒฝํ—˜

- React ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (TanStack Query, Zustand, Redux ๋“ฑ) ์‹ค๋ฌด ํ™œ์šฉ ๊ฒฝํ—˜

- RESTful API ์—ฐ๋™ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํŒจ์นญ ํŒจํ„ด์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด

- ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”, ํผ, ํ•„ํ„ฐ๋ง UI ๋“ฑ ์–ด๋“œ๋ฏผ/๋Œ€์‹œ๋ณด๋“œ ๋„๊ตฌ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

- ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Recharts, D3.js, Chart.js ๋“ฑ) ํ™œ์šฉ ๊ฒฝํ—˜

- ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™” (SSR/CSR ํ˜ผํ•ฉ, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ฒˆ๋“ค ์ตœ์ ํ™”) ๊ฒฝํ—˜

- ๋ฐ˜์‘ํ˜• ์›น ๋ฐ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ ์ฒ˜๋ฆฌ ๊ฒฝํ—˜

- ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋…ผ๋ฆฌ์  ์‚ฌ๊ณ ์™€ ๊ธฐ์ˆ ์  ๋ฆฌ๋”์‹ญ

- ์ ๊ทน์ ์œผ๋กœ ์˜๊ฒฌ์„ ์ œ์‹œํ•˜๊ณ  ํŒ€์›๋“ค๊ณผ ์›ํ™œํžˆ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ

Preferred Qualifications

- Grafana ๋Œ€์‹œ๋ณด๋“œ ์ž„๋ฒ ๋”ฉ ๋˜๋Š” IFrame ๊ธฐ๋ฐ˜ ์™ธ๋ถ€ ์‹œ๊ฐํ™” ๋„๊ตฌ ํ†ตํ•ฉ ๊ฒฝํ—˜

- RBAC ๊ธฐ๋ฐ˜ ๊ถŒํ•œ ์ œ์–ด UI ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ ๊ฒฝํ—˜

- SSE(Server-Sent Events) ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ UI ๊ตฌํ˜„ ๊ฒฝํ—˜

- JSON:API ์ŠคํŽ™ ๊ธฐ๋ฐ˜ API ์—ฐ๋™ ๊ฒฝํ—˜

- OAuth 2.0 / OIDC ๊ธฐ๋ฐ˜ ์ธ์ฆ ํ”Œ๋กœ์šฐ ๊ตฌํ˜„ ๊ฒฝํ—˜

- ๋””์ž์ธ ์‹œ์Šคํ…œ ๋˜๋Š” UI ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค๊ณ„ยท๊ตฌ์ถ• ๊ฒฝํ—˜

- Storybook ๋“ฑ ์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œํ™” ๋„๊ตฌ ํ™œ์šฉ ๊ฒฝํ—˜

- ๋ชจ๋…ธ๋ ˆํฌ(Turborepo ๋“ฑ) ํ™˜๊ฒฝ์—์„œ์˜ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๊ฒฝํ—˜

- GitOps(ArgoCD, Flux ๋“ฑ) ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ฒฝํ—˜

- Docker/Kubernetes ํ™˜๊ฒฝ์—์„œ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œยท๋ฐฐํฌ ๊ฒฝํ—˜

- E2E ํ…Œ์ŠคํŠธ (Playwright, Cypress ๋“ฑ) ๊ตฌ์ถ• ๊ฒฝํ—˜

- ์• ์ž์ผ(Agile) ๋ฐ ์Šคํฌ๋Ÿผ(Scrum) ๋ฐฉ์‹์˜ ํ˜‘์—… ๊ฒฝํ—˜

Interview Process

- ์„œ๋ฅ˜์ „ํ˜• - ์ฝ”๋”ฉํ…Œ์ŠคํŠธ - ํ™”์ƒ๋ฉด์ ‘ (1์‹œ๊ฐ„ ๋‚ด์™ธ) - ๋Œ€๋ฉด ํ˜น์€ ํ™”์ƒ๋ฉด์ ‘ (3์‹œ๊ฐ„ ๋‚ด์™ธ) - ์ตœ์ข…ํ•ฉ๊ฒฉ

- ์ „ํ˜•์ ˆ์ฐจ๋Š” ์ง๋ฌด๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์šด์˜๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ผ์ • ๋ฐ ์ƒํ™ฉ์—...

Share this job: