BACKEND-DRIVEN SOFTWARE ENGINEER

김영식KIM YOUNGSIK

초당 4,800개 IoT 포인트를 다루는 실시간 데이터 파이프라인과, 누적 27.8억 건 시계열 이력을 운영하는 멀티테넌트 백엔드를 만듭니다. 백엔드에서 출발해 프론트엔드·모바일·보안까지 제품 전체 사이클을 다룹니다.

27.8억+누적 시계열 이력
94.6%DB 저장 용량 절감
4,800실시간 관리 포인트
11.6일연속 무중단 가동
김영식 프로필 사진
SCROLL
WHY ME

현업에서 검증된 백엔드,
사이드 프로젝트로 넓힌 프론트·보안

회사에서는 실시간 데이터와 대용량 시스템을 다루는 백엔드 개발자로 일하면서, 런덤메이트로 프론트엔드를, 바이브쉴드로 보안 영역을 직접 채워왔습니다. 백엔드가 중심이라는 점은 변하지 않았습니다.

GROWTH JOURNEY

2018년부터 지금까지, 성장 여정

각 단계를 클릭하면 그 시기에 무엇을 고민했는지 확인할 수 있어요

01

학부·해커톤

2018.03 – 2025.02
02

국비교육·팀프로젝트

2024.03 – 2024.08
03

엑센솔루션 입사

2025.02 –
04

백엔드 핵심 프로젝트

2025.03 – 2025.10
05

사이드 프로젝트 확장

2026.01 –
06

지금, 그리고 다음

2026.08 –
HOW I WORK

제가 일하는 방식

기술보다 먼저 답할 수 있어야 한다고 생각하는 세 가지 기준입니다

안정성 우선

캐시 갱신이 실패해도 파이프라인은 멈추지 않아야 합니다. 실패를 가정하고 설계합니다.

근거로 답하기

"왜 1.5초인가"에 실측으로 답할 수 있어야 한다고 생각합니다. 감이 아니라 트레이드오프로 결정합니다.

경계 밖으로

백엔드가 중심이지만, 내가 만든 API가 어떻게 쓰이는지 프론트에서, 안전한지 보안 관점에서 직접 확인합니다.

협업 가능한 코드

Devhub 프로젝트 이후로, 인터페이스를 먼저 정하고 구현은 나중에 하는 습관이 생겼습니다.

TECH STACK

기술 스택

백엔드·인프라를 중심으로, 필요에 따라 프론트·모바일까지

Backend & DB

NestJSTypeScript TypeORMPrisma Spring BootPostgreSQL TimescaleDBRedis

Realtime & Infra

WebSocketSSE GraphQL SubDocker nginxPM2 PrometheusGrafana

Frontend & Mobile

Next.jsReact ZustandVue.js FlutterModbus/MQTT OPC-UABACnet
PROJECTS

프로젝트

카드를 클릭하면 상세 내용을 확인할 수 있어요

아래 실시간 데이터 파이프라인 · 인증·인가 체계 · TimescaleDB 운영은 모두 SI(시스템 통합, System Integration) · FMS(설비관리시스템, Facility Management System) 리뉴얼 프로젝트(xnsolution_si · xnsolution_fms)에서 나온 결과물입니다.
🖼️ 파이프라인 아키텍처 다이어그램
추가 예정
BACKEND · 회사

실시간 데이터 파이프라인

Redis Pub/Sub·Stream 이중화로 4,800개 포인트 실시간 수집·배포

🖼️ 인증 흐름도
추가 예정
BACKEND · 회사

인증·인가 체계

JWT 2단 가드와 토큰 갱신 single-flight 처리

🖼️ TimescaleDB 대시보드
스크린샷 추가 예정
BACKEND · 회사

TimescaleDB 대용량 운영

27.8억 건 이력, 압축 정책으로 653GB → 35GB

🖼️ 순찰관리 앱 스크린샷
추가 예정
BACKEND · MOBILE · 회사

순찰관리 오프라인 동기화

Flutter 로컬 DB 기반 오프라인 우선 동기화 계층

🖼️ 런덤메이트 앱 스크린샷
추가 예정
FRONTEND · 사이드

런덤메이트

WebSocket 실시간 채팅을 갖춘 러닝 크루 매칭 앱, App Store 출시

🖼️ 바이브쉴드 리포트 화면
스크린샷 추가 예정
SECURITY · 사이드

바이브쉴드

AI 환각 API 탐지 83% · 로컬 실행형 보안 검사 도구, 모두의 창업 선정

FAQ

자주 나오는 기술 질문

면접에서 실제로 물어볼 법한 질문에 미리 답해봤습니다

화면은 최신값만 지연 없이 필요해서 Pub/Sub을, 알람 평가·이력 적재는 값이 유실되면 안 되기 때문에 Stream을 씁니다. deliveryReliability 값(realtime / durable / both)으로 구독마다 채널을 선택하게 해서, 소비자 특성에 안 맞는 채널을 강제하지 않도록 했습니다.
→ 자세히 읽기
500ms는 트랜잭션 수 대비 화면 체감 개선이 미미했고, 5초는 운영자가 느리다고 느끼는 지연이었습니다. 가장 느린 프로토콜(BACnet)의 폴링 사이클을 온전히 담는 최소 단위가 1.5초였고, 실측 p99 이벤트 루프 지연(38.6ms)에도 여유가 남는 값이었습니다.
→ 자세히 읽기
구독 설정 변경 빈도가 데이터 유입 빈도보다 압도적으로 낮아서, 최대 30초 지연은 감내할 수 있다고 판단했습니다. 캐시 갱신 자체가 실패하면 예외만 로깅하고 기존 캐시를 그대로 유지해, 파이프라인 전체가 멈추지 않도록 했습니다.
→ 자세히 읽기
서버가 받은 순서를 신뢰하지 않고, 디바이스가 값을 측정한 시각을 기준으로 최신값을 판정합니다. 화면용 미러 테이블은 최신값 덮어쓰기로 충분하다고 보고 별도 순서 보장 장치를 두지 않았고, 원본 이력은 전량 적재해 필요하면 타임스탬프로 재정렬할 수 있습니다.
→ 자세히 읽기
배포와 장애가 서로 전이되지 않게 됐습니다. poller만 재시작해도 API가 끊기지 않고, API를 배포해도 수집이 멈추지 않아 조회 시점 기준 11.6일 연속 무중단 가동을 유지할 수 있었습니다.
→ 자세히 읽기
장애 격리(한 서비스의 쓰기 부하가 다른 서비스 커넥션 풀에 영향을 주지 않아야 함)와 배포 독립성(서비스마다 마이그레이션 시점이 다름) 때문입니다. 스키마만 나누면 커넥션 풀과 락 경쟁은 여전히 공유되어 리소스 격리가 되지 않습니다.
→ 자세히 읽기
순찰은 회차·구역별로 담당자 1인이 배정되는 운영 구조라 동시 수정 자체가 발생하지 않도록 이미 배제돼 있었습니다. 그래서 복잡한 병합 로직 대신, 작성 시각 기준 업로드와 회차·포인트 단위 고유 키로 중복만 막는 단순한 규칙을 선택했습니다.
→ 자세히 읽기
회사에서는 백엔드·서버 운영이 중심이고, 제가 만든 API가 실제로 어떻게 소비되는지(런덤메이트) 그리고 제가 만든 코드가 안전한지(바이브쉴드)를 직접 확인해보고 싶어서 사이드 프로젝트로 채웠습니다. 두 경험 모두 결국 백엔드를 더 잘하기 위한 확장이라고 생각합니다.
→ 자세히 읽기

함께 이야기 나누고 싶습니다

궁금한 점이나 면접 제안이 있다면 편하게 연락 주세요.