프리그로우
경력근거: REST·MQTT로 고객사 WMS·MES·ERP 등 기존 시스템과 데이터를 연동합니다
※ 실제 산출물이 아닌 AI 예측 시안입니다.
프리그로우는 삼성전자와 현대자동차 물류 야드와 전시관 같은 실제 현장에서 UWB·GPS-RTK·RFID·IMU 융합 기술을 검증해 왔고, 이 자리는 물류창고·제철소·전시장 같은 고객 현장에 직접 나가 UWB 실내측위 솔루션을 그 현장에 맞게 설치·연동·구축해 돌아가게 만드는 엔지니어입니다. 공고가 주요업무로 REST·MQTT 를 이용한 고객사 WMS·MES·ERP 연동을 못박았는데, 태그 위치 스트림을 고객사 시스템 형식으로 바꿔 넣는 이 브리지는 그 업무의 축소판이라 프리그로우의 현장이 있어야 성립하는 각도입니다. 이 포트폴리오가 보여주는 것은 MQTT 스트림 소비와 규칙 기반 이벤트 변환과 REST 연동과 예외 분리라는 구현 기술이며, UWB 측위 신호처리나 물류 현장 운영의 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
주요업무가 REST·MQTT 로 고객사 WMS·MES·ERP 와 데이터를 연동하는 일이라, 위치 스트림을 MQTT 로 받아 구역 이벤트로 바꾸고 WMS 형식의 REST 호출로 등록하는 브리지를 제품의 뼈대로 세웠습니다. 자격요건의 외부 시스템 연동 경험을 말이 아니라 도는 코드로 보입니다.
현장에서 발생하는 문제를 직접 트러블슈팅해 안정적으로 운영되게 만드는 자리입니다. 그래서 좌표 튐과 측위 실패와 미등록 태그와 중복 수신 같은 현장의 지저분함을 더미에 일부러 섞고, 판정할 수 없는 것은 추측하지 않고 미매핑·확인 필요·재전송 대기로 분리해 리포트로 남깁니다. 완벽한 설계보다 일단 돌아가게 만드는 실용주의를 브리지의 처리 규칙으로 옮겼습니다.
대시보드·실내 지도를 고객 현장에 맞게 커스터마이징하는 것도 주요업무라, 3주차에 구역 도면 위에 이벤트를 겹쳐 확인하는 한 장짜리 React 화면을 붙입니다. 필요하면 프론트도 서버도 잡는 사람을 찾는 공고라서, 브리지(백엔드)와 확인 화면(프론트)을 한 사람이 끝까지 만든 흐름을 보입니다.
물류창고 고객 현장에 설치된 UWB 태그의 위치 스트림(태그별 좌표·시각)과 고객사에서 받은 자산 대장, 창고 구역 도면(구역별 다각형 좌표)을 입력으로 받아, 점이 어느 다각형 안에 있는지 판정하는 기하 계산과 최소 체류 시간 규칙으로 구역 진입·이탈·체류 이벤트를 만들고, 태그를 자산 대장의 자산으로 매핑한 뒤 고객사 창고관리시스템(WMS)이 받는 형식의 REST 호출로 등록하는 연동 브리지입니다. 1주차는 녹화된 스트림 파일 재생으로 시작하고 2주차에 로컬 MQTT 브로커 구독과 모의 WMS 서버 등록으로 실시간 흐름을 완성합니다. 대장에 없는 태그, 측위 실패 프레임, 같은 태그가 두 자산에 걸린 충돌, 전송 실패는 추측 없이 미매핑·확인 필요·재전송 대기로 분리해 처리 결과 리포트에 남깁니다. 구역 판정과 이벤트 생성은 전부 규칙 계산이라 정답이 하나로 정해지고, Claude 는 3주차에 고객사 인터페이스 정의서 문서를 필드 매핑 초안으로 옮기는 변환 보조만 맡으며, 초안의 필드명이 원문에 실재하고 사람이 확인해야 등록됩니다.
물류창고 현장에 나간 솔루션 엔지니어입니다. 앵커 설치와 좌표 보정까지 끝나 태그 위치는 잘 잡히는데, 고객 요구는 결국 우리 WMS 화면에서 보이게 해 달라는 것이라, 위치 스트림을 고객사 시스템 형식으로 바꿔 넣는 연동을 현장에서 며칠 안에 붙여야 합니다. 지난 현장에서는 수작업 내보내기로 때우다가 이벤트가 빠져 고객 앞에서 곤란했던 기억이 있어, 이번에는 변환·매핑·전송을 재현 가능한 절차로 만들어 두고 싶은 사람입니다.
좌표에서 구역 진입·이탈과 체류를 판정하는 것은 기하와 시간 규칙이라 정답이 하나로 정해지고, 현장 연동이 어려운 진짜 이유는 판정이 아니라 태그·자산·필드 매핑의 지저분함과 전송 실패 처리에 있으므로, 그 지저분함을 분리해 보여주는 브리지를 만들면 연동 구축이 엔지니어의 감이 아니라 재현 가능한 절차가 된다는 가정입니다.
실제 하드웨어와 현장 없이 녹화된 위치 스트림 파일과 자산 대장과 구역 도면을 가정해 시작합니다. 명령 한 번을 돌리면 구역 진입·이탈·체류 이벤트가 JSON 으로 나오고, 대장에 없는 태그와 측위 실패 프레임과 태그 충돌이 미매핑·확인 필요로 분리된 처리 결과 리포트가 함께 나오는 완결품입니다. 만드는 덩어리는 점-다각형 구역 판정과 최소 체류 시간 규칙과 태그-자산 매핑 셋뿐이고 브로커·서버·화면·LLM 호출이 없어 평일 5일에 혼자 끝나는 범위입니다.
1주차 변환기를 그대로 쓰면서 입력을 로컬 MQTT 브로커 구독으로, 출력을 모의 WMS 서버로 향하는 REST 등록으로 바꿔 실시간 흐름을 완성합니다. 같은 이벤트가 두 번 등록되지 않게 멱등 키를 붙이고, 5xx 응답과 시간 초과는 재전송 대기로 돌리며, 보낸 이벤트와 모의 WMS 에 쌓인 결과를 대조하는 전송 대사 리포트를 만듭니다.
고객사에서 받은 인터페이스 정의서와 자산 대장 문서를 Claude 가 필드 매핑 초안으로 바꾸고, 초안의 필드명이 원문에 실재하는 문자열인지 대조한 뒤 사람 확인을 거쳐 어댑터에 등록합니다. 구역 도면 위에 이벤트를 겹쳐 확인하는 한 장짜리 React 화면을 붙이고, 세 주치 판정을 손계산 정답 회귀 테스트로 묶어 하드 케이스 30종이 미매핑·확인 필요·재전송 대기로 분리되는지 자동으로 확인합니다. 실제 고객사 시스템 접속이나 클라우드 구축은 하지 않습니다.
물류창고 하루치 위치 이벤트 500건과 자산 대장 12건을 넣고 명령 한 번으로, 구역 진입·이탈·체류 이벤트가 만들어져 모의 WMS 에 REST 로 등록되고 미매핑·확인 필요가 따로 분리되는 흐름을 시연합니다.
구역 진입·이탈 시각과 체류 시간과 이벤트 건수가 손으로 계산한 정답과 100% 일치합니다. 점-다각형 포함 판정과 최소 체류 시간 규칙은 규칙 계산이라 정답이 하나로 정해지므로, 자가채점이어도 정답 자체는 객관적입니다.
일부러 만든 하드 케이스 30종(순간이동 수준의 좌표 튐, 좌표가 빈 측위 실패 프레임, 자산 대장에 없는 태그, 같은 태그가 두 자산에 걸린 충돌, 구역 경계선 위 좌표, 같은 순번의 중복 수신, 시각 역전, 모의 WMS 의 5xx 응답과 시간 초과)을 넣어도 브리지가 멈추지 않고, 판정할 수 없는 것은 추측 없이 미매핑·확인 필요·재전송 대기로 분리해 리포트 끝에 따로 보여줍니다.
위 수치는 작성자가 만든 합성 스트림·대장 자가채점이라, 실제 UWB 현장의 측위 오차 분포나 고객사 WMS 의 실제 인터페이스와는 다릅니다. 그 값은 프리그로우의 실제 현장 스트림과 고객사 시스템 사양이 있어야 잡히며, 이 브리지는 브로커 주소와 필드 매핑만 실제 것으로 바꾸면 그 연동을 바로 돌릴 수 있는 상태로 만듭니다.
이건 고객사와 실제 현장 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 스트림과 대장의 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모가 도는 상태와 실검증 준비 상태로 솔직히 설명합니다
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 좌표 튐과 측위 실패 프레임과 미등록 태그와 태그 충돌과 경계선 좌표와 중복 수신과 시각 역전을 더미에 일부러 섞어 두었습니다.
실제 UWB 현장은 반사와 차폐로 좌표 노이즈 분포가 합성과 다르고, 고객사 WMS 는 인증·방화벽·전용 필드가 있어 어댑터를 현장에서 다시 맞춰야 합니다. 최소 체류 시간 같은 판정 문턱값도 도입 단계에서 현장 데이터로 다시 정해야 합니다.
이 포트폴리오가 보여주는 것은 MQTT 스트림 소비와 규칙 기반 이벤트 변환과 REST 연동과 예외 분리라는 구현 기술이고, UWB 측위 신호처리나 앵커 배치 설계, 물류 현장 운영의 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
Claude 가 만든 필드 매핑 초안은 원문 실재 대조를 통과해도 사람 확인 후에만 등록되고, 어떤 이벤트를 고객사 시스템에 넣을지 최종 확정하는 책임은 현장 엔지니어가 집니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
물류창고 현장의 UWB 태그 위치 스트림 하루치 녹화본입니다. 구역 판정과 이벤트 생성의 입력이며, 1주차에는 파일 재생으로 쓰고 2주차에 같은 행을 MQTT 로 흘려보냅니다. 현장 현실대로 순간이동 수준의 좌표 튐, 좌표가 빈 측위 실패 프레임, 자산 대장에 없는 태그, 구역 경계선 위 좌표, 같은 순번의 중복 수신, 시각 역전을 일부러 섞어 쉬운 데이터만 푸는 게 아님을 보입니다. x_m·y_m 은 창고 도면 원점 기준 미터 좌표이고 quality 는 0~1 측위 신뢰도입니다.
| seq | site_id | tag_id | ts | x_m | y_m | quality | note |
|---|---|---|---|---|---|---|---|
| 1 | s_wh_busan | T-1001 | 2026-08-03T08:00:00+09:00 | 2.1 | 4 | 0.93 | — |
| 2 | s_wh_busan | T-1001 | 2026-08-03T08:00:05+09:00 | 2.3 | 4.1 | 0.91 | — |
| 3 | s_wh_busan | T-1001 | 2026-08-03T08:02:10+09:00 | 15.2 | 6 | 0.88 | — |
| 4 | s_wh_busan | T-1001 | 2026-08-03T08:02:15+09:00 | 38.9 | 5.8 | 0.41 | 직전 좌표에서 5초 만에 23m 이동한 튐 프레임 |
| 5 | s_wh_busan | T-1001 | 2026-08-03T08:02:20+09:00 | 15.4 | 6.1 | 0.9 | — |
아래 JSON Schema 에 맞는 UWB 태그 위치 스트림 행을 부산 물류창고(s_wh_busan) 하루치로 500건 만들어 주세요. 태그 6~8개가 입고 게이트(x 0~10m), 보관 랙(x 10~30m), 출고 게이트(x 30~40m) 구역을 오가는 동선이 되게 좌표를 잇고, 수신 간격은 5초~2분 사이가 대부분이 되게 합니다.
{"type":"object","properties":{"seq":{"type":"integer"},"site_id":{"type":"string"},"tag_id":{"type":"string"},"ts":{"type":"string"},"x_m":{"type":["number","null"]},"y_m":{"type":["number","null"]},"quality":{"type":["number","null"]},"note":{"type":["string","null"]}},"required":["seq","site_id","tag_id","ts"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. 첫째 직전 좌표에서 몇 초 만에 20m 이상 이동한 좌표 튐 프레임 5건, 둘째 x_m·y_m·quality 가 모두 null 인 측위 실패 프레임 4건, 셋째 자산 대장에 없는 태그의 행 3건, 넷째 구역 경계선(x 10.0 또는 30.0) 위 좌표 3건, 다섯째 같은 seq 가 두 번 나오는 중복 수신 2쌍, 여섯째 뒤 순번인데 시각이 앞서는 시각 역전 2건, 일곱째 quality 0.1 미만의 저품질 프레임 3건, 여덟째 직전 수신에서 1시간 이상 비는 수신 공백 태그 1개. 형식을 깨뜨리는 시도는 3건까지 별도로 만들어 주세요. JSON 배열만 출력합니다.{"type":"object","properties":{"seq":{"type":"integer"},"site_id":{"type":"string"},"tag_id":{"type":"string"},"ts":{"type":"string"},"x_m":{"type":["number","null"]},"y_m":{"type":["number","null"]},"quality":{"type":["number","null"]},"note":{"type":["string","null"]}},"required":["seq","site_id","tag_id","ts"]}고객사 물류팀이 엑셀로 관리하다 내려준 자산 대장입니다. 태그를 자산으로 매핑해 이벤트에 붙이는 기준이고, WMS 등록에 쓰는 품목 코드도 여기서 나옵니다. 고객사 파일 현실대로 태그 번호의 표기 흔들림, 태그가 아직 안 붙은 자산, 같은 태그가 두 자산에 걸린 충돌, 품목 코드 누락, 폐기됐는데 태그가 계속 신호를 내는 자산을 일부러 섞어, 애매한 매핑을 만나면 추측하지 않고 미매핑·확인 필요로 분리하는지 보입니다. tag_id_raw 는 대장 원문 표기이고 tag_id 는 정규화된 태그 번호입니다.
| asset_id | asset_name | category | tag_id_raw | tag_id | wms_item_code | active | note |
|---|---|---|---|---|---|---|---|
| A-01 | 지게차 1호 | forklift | TAG-1001 | T-1001 | FLT-001 | true | — |
| A-02 | 전동 파레트 트럭 A | pallet_truck | TAG-1002 | T-1002 | PLT-014 | true | — |
| A-03 | 공구 카트 3층 | tool_cart | tag 1003 | T-1003 | TCT-003 | true | 원문이 소문자·공백 표기라 정규화가 필요한 행 |
| A-04 | 신규 입고 AGV | agv | — | — | AGV-007 | true | 태그 부착 전이라 매핑이 비어 있는 자산 |
| A-05 | 롤테이너 21 | container | TAG-1004 | T-1004 | — | true | 품목 코드 미입력이라 WMS 등록 전에 확인이 필요한 자산 |
아래 JSON Schema 에 맞는 물류창고 자산 대장 행을 20건 만들어 주세요. asset_name 은 지게차·파레트 트럭·AGV·공구 카트·롤테이너처럼 창고에서 실제로 부르는 한국어 이름으로 쓰고, tag_id 는 T-1001 형식으로 정규화합니다.
{"type":"object","properties":{"asset_id":{"type":"string"},"asset_name":{"type":"string"},"category":{"type":"string","enum":["forklift","pallet_truck","agv","tool_cart","container"]},"tag_id_raw":{"type":["string","null"]},"tag_id":{"type":["string","null"]},"wms_item_code":{"type":["string","null"]},"active":{"type":"boolean"},"note":{"type":["string","null"]}},"required":["asset_id","asset_name","category","active"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. 첫째 tag_id_raw 가 소문자·공백·접두사 생략 등으로 흔들려 tag_id 가 null 인 행 2건, 둘째 태그 부착 전이라 tag_id_raw 와 tag_id 가 모두 null 인 행 2건, 셋째 같은 tag_id 가 두 자산에 걸린 충돌 1쌍, 넷째 wms_item_code 가 null 인 행 2건, 다섯째 active 가 false 인데 스트림에는 신호가 있는 자산 1건. 형식을 깨뜨리는 시도는 3건까지 별도로 만들어 주세요. JSON 배열만 출력합니다.{"type":"object","properties":{"asset_id":{"type":"string"},"asset_name":{"type":"string"},"category":{"type":"string","enum":["forklift","pallet_truck","agv","tool_cart","container"]},"tag_id_raw":{"type":["string","null"]},"tag_id":{"type":["string","null"]},"wms_item_code":{"type":["string","null"]},"active":{"type":"boolean"},"note":{"type":["string","null"]}},"required":["asset_id","asset_name","category","active"]}| Kotlin | 위치 스트림 소비와 구역 판정과 REST 전송을 구현하는 브리지의 대표 언어입니다. |
| MQTT | UWB 태그 위치 스트림을 받는 구독 채널입니다. 1주차에는 녹화 파일 재생으로 시작하고 2주차에 로컬 브로커 구독으로 바꿉니다. |
| REST API | 변환된 구역 이벤트를 모의 WMS 에 등록하는 호출 층입니다. 멱등 키로 중복 등록을 막고 실패는 재전송 대기로 돌립니다. |
| ERP·MES·WMS 연동 | 고객사 시스템이 받는 이벤트 형식을 어댑터로 분리해, 필드 매핑만 갈아끼우면 WMS 말고 다른 시스템에도 붙습니다. |
| React | 3주차에 구역 도면 위에 이벤트를 겹쳐 확인하는 한 장짜리 화면을 만듭니다. 대시보드·실내 지도 커스터마이징 업무에 닿는 부분입니다. |
| UWB·RTLS 구축 어휘 | 태그·앵커·구역·체류라는 현장 어휘가 데이터 모델과 판정 규칙의 뼈대입니다. |
| Claude (LLM) | 3주차에 고객사 인터페이스 정의서와 자산 대장 문서를 필드 매핑 초안으로 바꾸는 변환 보조입니다. 필드명이 원문에 실재해야 하고 사람이 확인해야 등록됩니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차에서 MQTT 실시간 구독과 모의 WMS 등록을 붙입니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 3주차에서 문서 매핑 초안과 지도 확인 화면과 회귀 테스트 묶음을 붙입니다.