Evidence portfolio

직접 만든 제품과 운영에서 바꾼 시스템

실제 제품 화면 3개와 문제, 판단, 결과가 남은 운영 사례 3개만 보여드립니다. 경력과 기술 목록은 이력서로 분리했습니다.

공개 제품 표면
3
대표 운영 사례
3
백엔드 설계·운영
6년

01 · Product evidence

제품은 실제 화면과 공개 링크로

스크린샷만으로 운영 규모를 주장하지 않습니다. 화면, 스토어·로그인 표면, 공개 소스와 구현 기록을 함께 둡니다.

Talkak macOS 대시보드 실제 화면

실제 macOS 앱 화면

Talkak (딸깍)

여러 AI·CLI 작업을 한 창에서 운영·승인·검증

tmux 세션으로 장수명 서브프로세스 상태를 React 리마운트·앱 내비게이션에서도 보존하는 데스크톱 프로세스 매니저

Rust · Tauri · React · tmux

Mimi iOS 앱의 쉐도잉 학습 화면

iOS App Store 출시

Mimi

YouTube 클립을 영어 쉐도잉 훈련으로 변환

Spring AFTER_COMMIT + bounded @Async로 LLM 호출을 DB 트랜잭션 밖에서 실행 - PENDING → READY/FAILED를 짧은 트랜잭션으로 기록

Spring Boot · Next.js · PostgreSQL · AWS

DocVault 포트폴리오 데모 대시보드 화면
포트폴리오 데모 화면 · 표시 수치는 시드 데이터

로그인 가능한 포트폴리오 데모

DocVault

Windows 엔드포인트 감사와 파일 볼트를 한곳에서 운영

일회용 설치 토큰·하트비트·텔레메트리 자가진단을 갖춘 에이전트 온보딩

Go · PostgreSQL · Windows Agent

02 · Transfer

제조에서 제품으로 이어진 설계 원칙

트랜잭션 경계

운영 · MES 완공과 ERP 호출을 분리

제품 · Mimi에서 LLM 호출을 DB 트랜잭션 밖으로 이동

상태 무결성

운영 · Oracle 행 잠금으로 LOT ID 유일성 보장

제품 · DocVault에서 해시체인으로 변경 흔적 보존

실패 격리

운영 · PK-only 요청과 서버 최신 조회

제품 · Mimi에서 제한 재시도와 명시적 실패 상태 기록

03 · Production decisions

운영 사례 3개

성공 화면만 보여주지 않고, 실패 상태와 선택하지 않은 대안까지 장면별로 남겼습니다.

01

트랜잭션 경계

ERP 장애와 MES 완공 상태를 분리

평균 처리시간 60% 단축 · 월 약 20건 수동 재처리를 거의 없앰

Case 01 · ERP 장애가 공장 기록을 되돌리지 않게

MES↔ERP 연동 - 트랜잭션 경계 재설계

SETUP
MES — factory floor
ERP — finance
ONE transaction
local tx — commits instantly
🏭Final processproduct discharged
⚙️MES Appcompletion save
🗄️Completion recordMES DB
📥Staging rowPENDING → SENT/FAIL
🤖Batch workerown schedule · retry ≤3
🧾ERPcost posting
floor ✓ done · system ✗ missing

“An external system's failure must not roll back my system's core state.”

→ cut the transaction boundary in two

LOT number = idempotency key
🧑‍💻me · backend
🧑‍🔬DBA
👷floor operator
🧑‍💼ERP manager

마지막 공정 — 제품은 물리적으로 완성되어 출고된다. MES가 기록하고, ERP가 원가를 처리한다.

02

동시성 제어

오늘 날짜의 카운터 행만 잠그고 잠금 구간 축소

다중 인스턴스에서도 LOT ID 유일성 보장

Case 04 · 두 서버가 같은 번호를 만들 때

다중 인스턴스 LOT ID 충돌 - Oracle 행 잠금으로 유일성 보장

SETUP
MES instances
Oracle
🖥️Server Aread seq
🖥️Server Bread seq (same ms)
🔢counter row · todaycurrent_seq = 1042
🔒 row lock — today's row only
B queued: waits statement + commit, not the app round-trip

“Serialize at the row, and hold the lock for a statement — not a conversation.”

FOR UPDATE on one row → refined to atomic UPDATE … RETURNING

여러 MES 인스턴스가 DB의 공유 카운터 행 하나에서 날짜 기반 LOT ID를 발급한다.

03

페이로드와 최신성

PK만 전송하고 저장 시점의 최신 상태를 서버에서 조회

모바일 스캔 배치 30 → 80

Case 03 · 상태 대신 식별자를 전송

모바일 스캔 HTTP 413 - PK-only 요청과 서버 최신 조회

SETUP
Floor — PDA
Shared legacy server
📟PDA batch savefull LOT objects
🚧middlewareforwards
🗄️Legacy C# servershared · other services live here
📚DBsource of truth
plant code + LOT no. only
fresh read at save time

just raise the shared server's payload limit

“Send identifiers, not state — the DB is the source of truth.”

don't push your risk onto a shared server

👷operator
🧑‍💼customer
🧑‍💻me · backend

작업자가 PDA로 LOT를 스캔해 배치로 저장 — 저장은 미들웨어를 거쳐 다른 서비스와 '공유 중인' 레거시 서버로 간다.

글로 남긴 다른 운영 사례

공통 API 통합과 원가 PL/SQL 분해는 긴 기술 기록으로 연결합니다.

46개 엔드포인트 → 1개 ↗7.7K줄 PL/SQL 분해 ↗

이력서는 2쪽으로 분리했습니다

경력, 수치, 기술과 학력은 제출용 문서에서 빠르게 훑을 수 있습니다.

한국어 이력서 보기 ↗