라이드
인턴·신입근거: 차량 판매와 관리 서비스를 제공하는 모빌리티 통합 플랫폼 기업입니다.
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고는 라이드를 '차량 판매와 관리 서비스를 제공하는 모빌리티 통합 플랫폼 기업' 으로 소개하고, FDE 의 첫 업무로 '영업·운영 등 현업 담당자와 소통하며 기존 시스템이나 수작업 중심 업무의 문제를 파악하고' 를 적었습니다. 차량 관리 서비스에서 운영 담당자가 날마다 하는 수작업 가운데 계산이 들어가고 놓치면 고객사 차량이 바로 손해를 보는 일이 정비 시기 계산이라, 이 관리자 페이지는 그 계산 하나를 규칙으로 옮깁니다. 주요업무의 '요구사항을 구체화하고 화면, 데이터 구조, API 및 업무 흐름을 설계합니다' 는 네 엑셀을 표로 정하고 판정 API 를 영업 화면과 나눠 쓰는 설계로, 'AI 코딩 도구를 활용해 웹 서비스와 업무 자동화 기능을 개발하고' 는 Codex 로 만든 판정 함수를 경계값 테스트로 확인하는 과정으로 이어집니다. 이 포트폴리오는 현업 엑셀을 판정 규칙과 화면으로 바꾸는 기술을 보여줍니다. 차량 정비에 대한 전문성은 주장하지 않으며, 주기표는 운영팀이 정한 값을 받아 씁니다.
주요업무 첫 줄이 '영업·운영 등 현업 담당자와 소통하며 기존 시스템이나 수작업 중심 업무의 문제를 파악하고' 입니다. 사내형 FDE 라 고객은 라이드의 운영·영업 담당자이고, 정비 시기 계산이 그 수작업 가운데 하나입니다.
'요구사항을 구체화하고 화면, 데이터 구조, API 및 업무 흐름을 설계합니다' 와 'HTTP/API와 데이터베이스 등 웹 서비스의 기본 구조를 이해하고' 가 있습니다. 엑셀 네 장을 표로 정하고 판정 API 를 운영·영업 화면이 나눠 쓰게 하는 설계가 이 두 줄을 받습니다.
자격요건에 '생성된 코드의 동작을 설명하고 오류를 확인·수정할 수 있는 분' 이, 우대사항에 'LLM API·AI 에이전트 연동, 자동화 테스트' 가 있습니다. Codex 로 만든 판정 함수를 경계값 테스트로 확인하고 안내 전화 첫마디를 클로드로 쓰는 구성이 두 항목에 닿습니다.
라이드케어는 라이드가 렌터카·캐피탈 고객사와 개인 고객의 차량을 맡아 엔진오일 교체 같은 정비와 사고 처리를 대신 챙겨 주는 차량 관리 서비스입니다. 라이드 운영 담당자와 영업 담당자가 쓰는 사내 관리자 페이지로, 그 관리 차량의 명단·주행거리 기록·정비 이력 엑셀과 차종별 정비 주기표를 올리면 차량마다 다섯 판정 중 하나를 냅니다. 차량별로 가장 최근 주행거리를 고르고, 정비 항목마다 마지막 정비 뒤 달린 거리와 지난 개월을 계산해 차종별 주기와 견주며, 주행거리가 60일 넘게 들어오지 않은 차량과 정비 기록이 한 건도 없는 차량을 따로 세웁니다. 걸린 차량에는 클로드가 쓴 안내 전화 첫마디 초안이 붙고, 영업 담당자는 같은 판정을 고객사별로 봅니다.
라이드케어 관리 차량의 정비 일정을 잡고 고객에게 안내 전화를 거는 라이드 운영 담당자와, 렌터카·캐피탈 고객사를 맡는 영업 담당자 — 지금은 주행거리 기록과 정비 이력을 엑셀로 옮겨 정비 시기를 손으로 계산한다
운영 담당자가 정비 시기를 놓치는 까닭은 정보가 없어서가 아니라 주행거리 기록과 정비 이력이 서로 다른 엑셀에 있고, 차량마다 마지막 기록을 골라 빼고 개월을 세는 계산을 매번 손으로 하기 때문입니다. 차종마다 주기가 다르고 디젤과 전기차는 정비 항목도 달라, 같은 수식을 복사해 쓰면 쏘렌토 디젤의 7,500km 나 아이오닉 5 의 에어컨 필터가 빠집니다. 네 표를 차량 번호와 차종으로 이어 계산을 한 번 규칙으로 고정하면, 담당자는 걸린 차량 목록에서 전화할 순서만 정하면 됩니다.
운영 담당자가 관리 차량 명단·주행거리 기록·정비 이력·정비 주기표 엑셀을 올리고 기준일을 고르면, 차량마다 다섯 판정과 마지막 정비 뒤 주행거리·경과 개월·기록이 묵은 날 수가 판정별 표로 나오는 관리자 페이지입니다. 걸린 차량에는 클로드가 쓴 안내 전화 첫마디가 붙고 Vercel 에 올려 링크로 엽니다. 엑셀은 사내 시스템에서 내려받은 파일을 그대로 받는다고 두고, 시스템에서 직접 가져오는 연동은 3주차로 미룹니다.
운영 담당자가 손으로 계산해 둔 차량 200대 판정과 화면 판정을 견주는 정답 대조 화면을 더하고, 같은 판정 API 로 영업 담당자가 고객사별 걸린 차량 수와 목록을 보는 화면을 엽니다. 업로드한 엑셀과 판정 이력은 PostgreSQL 에 쌓고, 2주차부터 AWS 에서 운영합니다.
사내 차량 관리 API 형태로 만든 모의 API 에서 주행거리와 정비 이력을 매일 아침 받아 판정을 다시 돌리고, 전날보다 새로 걸린 차량만 운영 담당자 첫 화면 위에 올립니다. 영업 담당자용으로 클로드가 고객사별 주간 정비 현황 문단을 씁니다. 사용법과 운영 방법은 문서로 남깁니다.
운영 담당자가 엑셀 네 장을 올리고 기준일 2026-10-02 를 고르면 12하3456 이 주행거리로 정비 시기 지남 칸에 엔진오일 11,820km / 기준 10,000km 로, 45허1122 는 주행거리 기록이 끊김 칸에 마지막 기록 74일 전으로 섭니다. 담당자는 걸린 차량 옆 첫마디 초안을 읽고 바로 전화를 겁니다.
영업 담당자가 같은 판정을 고객사별로 열어 한빛렌터카 걸린 차량 수와 목록을 읽습니다.
운영 담당자가 엑셀로 계산해 둔 형식으로 작성자가 만든 합성 차량 200대 판정과 화면 판정이 일치하는 대수를 셉니다. 200대 모두 작성자가 꾸민 차량이라, 어긋난 차량이 나오면 그건 차량 쪽이 아니라 마지막 기록 고르기나 개월 세기 코드 쪽 실수입니다.
기준과 같은 주행거리·같은 개월, 정비 당시 주행거리가 빈 영수증, 같은 차량의 주행거리 기록 두 건, 114일 묵었지만 이미 기준을 넘은 기록, 정비 기록이 없는 신규 관리 차량 열 대를 Vitest 고정 입력으로 묶어, 부등호나 우선순위를 손댄 커밋이 이 열 대의 판정 하나라도 바꾸면 테스트가 깨지게 합니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 합성 엑셀로 잰 값이라, 라이드 운영 담당자가 정비 시기를 덜 놓치게 되는지는 실제 관리 차량 엑셀과 몇 주 치 전화 기록을 봐야 압니다. 실제 엑셀이 오면 업로드 화면에 그대로 올려 담당자 계산과 어긋난 차량부터 펼쳐 볼 수 있게 대조 화면을 1주차부터 열어 둡니다.
200대 일치 수는 운영 담당자의 실제 계산이 아니라 제가 지은 엑셀에서 나온 숫자라, 이 화면이 놓치는 차량을 줄인다는 말은 아직 할 수 없습니다. 보여줄 수 있는 것은 56호7788 처럼 주기와 꼭 같은 차량이 어느 쪽으로 떨어지는지와, 실제 엑셀을 받았을 때 담당자 계산과 갈린 차량을 행 단위로 나란히 펼치는 대조 화면까지입니다.
정비 주기와 차량 기록을 한 사람이 지으면 기준과 딱 맞물리는 차량이 빠지기 쉬워, 그런 차량을 먼저 정해 두고 나머지를 채웠습니다. 기준과 꼭 같은 56호7788(10,000km)·23바9012(12개월), 주행거리가 빈 정비 영수증 67허5566, 기록이 두 건인 90호1234, 묵은 기록으로도 넘은 11더2233, 이력이 없는 77라3030 이 그 차량입니다.
차종별 주기표는 라이드 운영팀이 정한 값이어야 합니다. 이 포트폴리오의 주기는 예시라서 제조사 권장 주기나 실제 운영 기준과 다를 수 있고, 판정이 맞는지는 표의 값에 달려 있습니다.
정비 이력이 없는 항목(대부분 차량의 에어컨 필터)은 판정하지 않고 따로 적기만 합니다. 실제 도입에서는 관리 시작일의 주행거리를 기준으로 삼을지 운영팀과 정해야 하며, 그 전까지 이 화면은 그 항목을 정비 시기 전이라고 말하지 않습니다.
엑셀에는 고객 이름과 연락처가 함께 내려오는 경우가 많습니다. 판정에는 차량 번호와 고객사 이름만 쓰고, 안내 전화 초안을 쓰는 모델에도 개인 연락처는 넘기지 않습니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
라이드케어로 관리하는 차량 명단을 사내 시스템에서 엑셀로 내려받은 표입니다. 차량 번호, 관리를 맡긴 고객사, 차종 코드, 관리 시작일을 둡니다. 렌터카 고객사 차량은 하·허·호 번호판이고 개인 고객 차량도 섞여 있습니다.
| vehicle_no | client_name | model_code | managed_since |
|---|---|---|---|
| 12하3456 | 한빛렌터카 | AVANTE-CN7 | 2025-02-01 |
| 34나5678 | 새움캐피탈 | K5-DL3 | 2024-11-15 |
| 45허1122 | 한빛렌터카 | SORENTO-MQ4 | 2025-06-10 |
| 77라3030 | 개인 고객 | CARNIVAL-KA4 | 2026-05-02 |
| 56호7788 | 도담렌터카 | AVANTE-CN7 | 2025-09-01 |
아래 JSON Schema 를 그대로 만족하는 관리 차량 명단을 150줄 더 만들어 주세요. 고객사는 렌터카 세 곳, 캐피탈 두 곳, 개인 고객을 섞고 렌터카 차량은 '12하3456' 처럼 하·허·호 번호판을, 나머지는 일반 번호판을 씁니다. model_code 는 AVANTE-CN7·K5-DL3·SORENTO-MQ4·CARNIVAL-KA4·IONIQ5-NE 가운데서 고릅니다. 쉬운 데이터만 만들지 말고 최근 몇 달 안에 관리를 시작해 정비 이력이 아직 없는 차량을 몇 대 섞으세요. 판정 결과는 넣지 마세요. 형식 깨뜨리기 시도로 관리 시작일을 '2025.02.01'·'25/02/01' 처럼 적은 줄 3건을 따로 만듭니다.
{"type":"object","properties":{"vehicle_no":{"type":"string","description":"차량 번호판입니다. 렌터카는 하·허·호 번호를 씁니다"},"client_name":{"type":"string","description":"차량 관리를 맡긴 고객사 이름입니다. 개인 고객은 '개인 고객'입니다"},"model_code":{"type":"string"},"managed_since":{"type":"string","description":"관리 시작일, YYYY-MM-DD"}},"required":["vehicle_no","client_name","model_code","managed_since"]}{"type":"object","properties":{"vehicle_no":{"type":"string","description":"차량 번호판입니다. 렌터카는 하·허·호 번호를 씁니다"},"client_name":{"type":"string","description":"차량 관리를 맡긴 고객사 이름입니다. 개인 고객은 '개인 고객'입니다"},"model_code":{"type":"string"},"managed_since":{"type":"string","description":"관리 시작일, YYYY-MM-DD"}},"required":["vehicle_no","client_name","model_code","managed_since"]}차량 반납 점검, 고객 앱 입력, 정비소 방문 때 받은 누적 주행거리 기록입니다. 한 차량에 기록이 여러 건 쌓이고 가장 최근 것을 씁니다. 장기 렌트나 개인 고객 차량은 몇 달씩 기록이 들어오지 않기도 합니다.
| vehicle_no | reported_at | odometer_km | source |
|---|---|---|---|
| 12하3456 | 2026-09-28 | 58,420 | 반납 점검 |
| 34나5678 | 2026-09-30 | 41,200 | 고객 앱 입력 |
| 45허1122 | 2026-07-20 | 70,100 | 반납 점검 |
| 56호7788 | 2026-09-29 | 31,000 | 반납 점검 |
| 23바9012 | 2026-10-01 | 52,300 | 고객 앱 입력 |
아래 JSON Schema 를 그대로 만족하는 주행거리 기록을 300줄 더 만들어 주세요. 관리 차량 명단의 차량마다 2026-01 부터 2026-10-01 사이에 기록을 한 건에서 다섯 건 두고, 같은 차량의 odometer_km 는 날짜가 늦을수록 커지게 씁니다. 쉬운 데이터만 만들지 말고 다음을 섞으세요: 마지막 기록이 기준일보다 60일 넘게 앞선 차량, 마지막 기록이 정확히 60일 전인 차량, 오래된 기록만으로도 마지막 정비 뒤 주기를 넘긴 차량, 기록이 한 건도 없는 신규 차량. 판정 결과는 넣지 마세요.
{"type":"object","properties":{"vehicle_no":{"type":"string"},"reported_at":{"type":"string","description":"주행거리를 받은 날, YYYY-MM-DD"},"odometer_km":{"type":"integer","minimum":0,"description":"그날 계기판 누적 주행거리(km)입니다"},"source":{"type":"string","enum":["고객 앱 입력","반납 점검","정비소 방문"]}},"required":["vehicle_no","reported_at","odometer_km","source"]}{"type":"object","properties":{"vehicle_no":{"type":"string"},"reported_at":{"type":"string","description":"주행거리를 받은 날, YYYY-MM-DD"},"odometer_km":{"type":"integer","minimum":0,"description":"그날 계기판 누적 주행거리(km)입니다"},"source":{"type":"string","enum":["고객 앱 입력","반납 점검","정비소 방문"]}},"required":["vehicle_no","reported_at","odometer_km","source"]}협력 정비소 영수증을 운영 담당자가 옮겨 적은 정비 이력입니다. 차량 번호, 정비 항목, 정비한 날, 그때 주행거리, 정비소를 둡니다. 영수증에 주행거리가 적히지 않은 건은 주행거리가 비어 있고, 한 번 입고에 여러 항목을 갈면 같은 날짜로 줄이 여럿 생깁니다.
| vehicle_no | service_type | serviced_at | odometer_km | shop_name |
|---|---|---|---|---|
| 12하3456 | 엔진오일 | 2026-03-10 | 46,600 | 송파 협력정비 |
| 12하3456 | 에어컨 필터 | 2026-03-10 | 46,600 | 송파 협력정비 |
| 34나5678 | 엔진오일 | 2025-08-14 | 33,900 | 분당 오토케어 |
| 45허1122 | 엔진오일 | 2026-05-02 | 65,000 | 송파 협력정비 |
| 56호7788 | 엔진오일 | 2026-04-20 | 21,000 | 하남 스피드메이트 |
아래 JSON Schema 를 그대로 만족하는 정비 이력을 200줄 더 만들어 주세요. 관리 차량마다 엔진오일(전기차는 감속기오일)과 에어컨 필터 이력을 0~3건씩 두고, 한 번 입고에 두 항목을 같이 간 날도 섞습니다. 쉬운 데이터만 만들지 말고 다음을 섞으세요: odometer_km 가 null 인 영수증, 마지막 정비 뒤 주행이 주기와 정확히 같은 차량, 마지막 정비가 기준일과 같은 날짜로 정확히 12개월 전인 차량, 주행은 적은데 기간이 지난 차량. 판정 결과는 넣지 마세요.
{"type":"object","properties":{"vehicle_no":{"type":"string"},"service_type":{"type":"string","enum":["엔진오일","에어컨 필터","감속기오일"]},"serviced_at":{"type":"string","description":"정비한 날, YYYY-MM-DD"},"odometer_km":{"type":["integer","null"],"minimum":0,"description":"정비 당시 누적 주행거리(km)입니다. 정비소 영수증에 주행거리가 적히지 않았으면 null 입니다"},"shop_name":{"type":"string"}},"required":["vehicle_no","service_type","serviced_at","odometer_km","shop_name"]}{"type":"object","properties":{"vehicle_no":{"type":"string"},"service_type":{"type":"string","enum":["엔진오일","에어컨 필터","감속기오일"]},"serviced_at":{"type":"string","description":"정비한 날, YYYY-MM-DD"},"odometer_km":{"type":["integer","null"],"minimum":0,"description":"정비 당시 누적 주행거리(km)입니다. 정비소 영수증에 주행거리가 적히지 않았으면 null 입니다"},"shop_name":{"type":"string"}},"required":["vehicle_no","service_type","serviced_at","odometer_km","shop_name"]}라이드 운영팀이 차종과 정비 항목마다 정해 둔 교체 주기표입니다. 주행거리 주기와 개월 주기를 함께 두고, 둘 중 먼저 닿는 쪽이 정비 시기입니다. 이 화면은 이 표를 기준으로 받아 쓰고 값을 새로 정하지 않습니다.
| model_code | model_name | service_type | interval_km | interval_months |
|---|---|---|---|---|
| AVANTE-CN7 | 아반떼 가솔린 | 엔진오일 | 10,000 | 12 |
| AVANTE-CN7 | 아반떼 가솔린 | 에어컨 필터 | 15,000 | 12 |
| K5-DL3 | K5 가솔린 | 엔진오일 | 10,000 | 12 |
| K5-DL3 | K5 가솔린 | 에어컨 필터 | 15,000 | 12 |
| SORENTO-MQ4 | 쏘렌토 디젤 | 엔진오일 | 7,500 | 6 |
아래 JSON Schema 를 그대로 만족하는 정비 주기표를 다른 차종 열 가지 몫으로 20줄 더 만들어 주세요. 가솔린·디젤 차종은 엔진오일과 에어컨 필터를, 전기차는 감속기오일과 에어컨 필터를 둡니다. 디젤 차종 몇 곳은 엔진오일 주기를 7,500km·6개월처럼 짧게 둡니다. 판정 결과는 넣지 마세요.
{"type":"object","properties":{"model_code":{"type":"string"},"model_name":{"type":"string"},"service_type":{"type":"string","enum":["엔진오일","에어컨 필터","감속기오일"]},"interval_km":{"type":"integer","minimum":1,"description":"라이드 운영 기준으로 정한 교체 주기(km)입니다"},"interval_months":{"type":"integer","minimum":1,"description":"라이드 운영 기준으로 정한 교체 주기(개월)입니다"}},"required":["model_code","model_name","service_type","interval_km","interval_months"]}{"type":"object","properties":{"model_code":{"type":"string"},"model_name":{"type":"string"},"service_type":{"type":"string","enum":["엔진오일","에어컨 필터","감속기오일"]},"interval_km":{"type":"integer","minimum":1,"description":"라이드 운영 기준으로 정한 교체 주기(km)입니다"},"interval_months":{"type":"integer","minimum":1,"description":"라이드 운영 기준으로 정한 교체 주기(개월)입니다"}},"required":["model_code","model_name","service_type","interval_km","interval_months"]}| TypeScript | 엑셀 행을 타입이 있는 레코드로 바꾸고, 차량별 마지막 기록 고르기·주행거리 뺄셈·개월 계산·판정 우선순위를 순수 함수로 짭니다. |
| 웹 서비스(Next.js) | 엑셀 업로드, 판정별 차량 표, 고객사별 보기를 한 관리자 페이지로 만듭니다. |
| HTTP/API | 기준일을 받아 차량별 판정을 돌려주는 판정 API 를 두고 운영 화면과 영업 화면이 같은 API 를 씁니다. |
| 데이터베이스 | 2주차에 PostgreSQL 에 업로드 이력과 날짜별 판정을 쌓아 전날 대비 새로 걸린 차량을 셉니다. |
| Git | 판정 규칙을 고칠 때마다 경계값 테스트와 함께 커밋해 어떤 규칙 변경이 어느 차량 판정을 바꿨는지 남깁니다. |
| Codex | 엑셀 파서와 판정 함수를 Codex 로 만들고, 기준과 같은 주행거리·같은 개월의 차량으로 생성된 코드의 부등호를 직접 확인합니다. |
| LLM API | 걸린 차량의 안내 전화 첫마디와 3주차 고객사별 주간 문단을 클로드로 씁니다. |
| 자동화 테스트 | Vitest 로 경계값·결측 판정을, Playwright 로 엑셀 업로드에서 판정 표까지의 흐름을 테스트합니다. |
| AWS | 2주차부터 판정 API 와 화면을 AWS 에서 운영하고, 3주차 아침 판정은 EventBridge 일정으로 돌립니다. |
| 외부 API·기존 시스템 연동 | 3주차에 사내 차량 관리 시스템을 흉내 낸 모의 API 에서 주행거리와 정비 이력을 받아 엑셀 업로드를 대신합니다. |
| JavaScript | 브라우저에서 SheetJS 로 엑셀을 읽어 헤더 위치와 날짜 서식을 맞춘 뒤 서버로 보냅니다. |
✗ fail → 기준과 같은 차량의 판정이 뒤집히면 부등호와 우선순위부터 고치고 다시 돌립니다.
✓ pass → 2주차 정답 대조와 영업 화면, AWS 운영으로 넘어갑니다.
✗ fail → 어긋남이 기록 고르기에서 나오면 연동보다 마지막 기록을 고르는 기준을 운영팀과 다시 정합니다.
✓ pass → 3주차 모의 API 연동과 매일 아침 판정, 고객사별 주간 문단으로 넘어갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · vehicle_no + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
정비 시기 전아직 여유주행거리로 정비 시기 지남주행거리 초과기간으로 정비 시기 지남기간 초과주행거리 기록이 끊김기록 끊김정비 이력이 없는 차량이력 없음기준일 하루 치 차량별 정비 시기 판정입니다. 관리 차량마다 한 줄을 내고, 판정과 그 판정을 만든 정비 항목, 마지막 정비 뒤 주행거리와 경과 개월, 주행거리 기록이 묵은 날 수, 이력이 없어 판정하지 못한 항목, 안내 전화 첫마디를 실어 운영 화면과 영업 화면이 같은 행을 읽습니다.
{"type":"object","properties":{"vehicle_no":{"type":"string"},"client_name":{"type":"string"},"model_code":{"type":"string"},"as_of":{"type":"string","description":"판정 기준일, YYYY-MM-DD"},"verdict":{"type":"string","enum":["정비 시기 전","주행거리로 정비 시기 지남","기간으로 정비 시기 지남","주행거리 기록이 끊김","정비 이력이 없는 차량"],"description":"걸린 판정이 여럿이면 정비 이력이 없는 차량, 주행거리로 정비 시기 지남, 기간으로 정비 시기 지남, 주행거리 기록이 끊김 순으로 앞선 하나입니다"},"also_found":{"type":"array","items":{"type":"string","enum":["주행거리로 정비 시기 지남","기간으로 정비 시기 지남","주행거리 기록이 끊김","정비 이력이 없는 차량"]}},"service_type":{"type":["string","null"],"description":"verdict 를 만든 정비 항목입니다. 정비 시기 전이면 주기 대비 가장 많이 찬 항목이고, 정비 이력이 없거나 주행거리 기록만 끊긴 차량이면 null 입니다"},"last_reported_at":{"type":["string","null"],"description":"그 차량의 mileage_reports.reported_at 가운데 가장 늦은 날입니다. 기록이 없으면 null 입니다"},"report_age_days":{"type":["integer","null"],"minimum":0,"description":"as_of 에서 last_reported_at 을 뺀 날 수입니다"},"km_since_service":{"type":["integer","null"],"minimum":0,"description":"정적 계산값입니다. last_reported_at 날의 odometer_km 에서 그 service_type 의 가장 늦은 service_history.odometer_km 를 뺀 값이고, 정비 당시 주행거리가 null 이면 null 입니다"},"interval_km":{"type":["integer","null"]},"months_since_service":{"type":["integer","null"],"minimum":0,"description":"정적 계산값입니다. as_of 와 serviced_at 의 연·월 차이를 개월로 센 뒤 as_of 의 일이 serviced_at 의 일보다 작으면 1을 뺀 값입니다"},"interval_months":{"type":["integer","null"]},"unchecked_service_types":{"type":"array","items":{"type":"string"},"description":"service_intervals 에 그 차종 항목으로 있지만 이 차량의 정비 이력이 한 번도 없어 판정하지 못한 항목입니다"},"evidence":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string","enum":["managed_vehicles","mileage_reports","service_history","service_intervals"]},"field":{"type":"string"},"agg":{"type":["string","null"],"enum":["count","sum","avg","min","max",null]},"value":{}},"required":["table","field","value"]}},"summary":{"type":"string"},"call_script":{"type":["string","null"],"description":"클로드가 판정 행을 받아 쓴 고객 안내 전화 첫마디 초안입니다. 정비 시기 전이면 null 입니다"}},"required":["vehicle_no","client_name","model_code","as_of","verdict","also_found","service_type","last_reported_at","report_age_days","km_since_service","interval_km","months_since_service","interval_months","unchecked_service_types","evidence","summary","call_script"]}[
{
"vehicle_no": "12하3456",
"client_name": "한빛렌터카",
"model_code": "AVANTE-CN7",
"as_of": "2026-10-02",
"verdict": "주행거리로 정비 시기 지남",
"also_found": [],
"service_type": "엔진오일",
"last_reported_at": "2026-09-28",
"report_age_days": 4,
"km_since_service": 11820,
"interval_km": 10000,
"months_since_service": 6,
"interval_months": 12,
"unchecked_service_types": [],
"evidence": [
{
"table": "mileage_reports",
"field": "odometer_km",
"agg": null,
"value": 58420
},
{
"table": "service_history",
"field": "odometer_km",
"agg": null,
"value": 46600
},
{
"table": "service_intervals",
"field": "interval_km",
"agg": null,
"value": 10000
}
],
"summary": "3월 10일 엔진오일 교체 뒤 11,820km 를 달려 아반떼 기준 10,000km 를 넘었습니다. 에어컨 필터는 같은 날 갈아 15,000km 기준 안입니다.",
"call_script": "한빛렌터카 담당자님, 12하3456 아반떼가 엔진오일 교체 뒤 11,820km 를 달려 교체 시기가 지났습니다. 이번 주 반납 일정에 맞춰 협력정비 입고를 잡아도 될지 여쭙고자 연락드렸습니다."
},
{
"vehicle_no": "34나5678",
"client_name": "새움캐피탈",
"model_code": "K5-DL3",
"as_of": "2026-10-02",
"verdict": "기간으로 정비 시기 지남",
"also_found": [],
"service_type": "엔진오일",
"last_reported_at": "2026-09-30",
"report_age_days": 2,
"km_since_service": 7300,
"interval_km": 10000,
"months_since_service": 13,
"interval_months": 12,
"unchecked_service_types": [
"에어컨 필터"
],
"evidence": [
{
"table": "service_history",
"field": "serviced_at",
"agg": null,
"value": "2025-08-14"
},
{
"table": "service_intervals",
"field": "interval_months",
"agg": null,
"value": 12
},
{
"table": "mileage_reports",
"field": "odometer_km",
"agg": null,
"value": 41200
},
{
"table": "service_history",
"field": "odometer_km",
"agg": null,
"value": 33900
}
],
"summary": "주행은 7,300km 로 기준 안이지만 마지막 엔진오일 교체가 2025-08-14 라 13개월이 지나 12개월 기준을 넘었습니다. 에어컨 필터는 이력이 없어 판정하지 못했습니다.",
"call_script": "새움캐피탈 담당자님, 34나5678 K5 가 엔진오일을 간 지 13개월이 지났습니다. 주행은 많지 않지만 기간 기준이 지나 이용 고객께 입고 안내를 드려도 될지 확인 부탁드립니다."
},
{
"vehicle_no": "45허1122",
"client_name": "한빛렌터카",
"model_code": "SORENTO-MQ4",
"as_of": "2026-10-02",
"verdict": "주행거리 기록이 끊김",
"also_found": [],
"service_type": null,
"last_reported_at": "2026-07-20",
"report_age_days": 74,
"km_since_service": 5100,
"interval_km": 7500,
"months_since_service": 5,
"interval_months": 6,
"unchecked_service_types": [
"에어컨 필터"
],
"evidence": [
{
"table": "mileage_reports",
"field": "reported_at",
"agg": null,
"value": "2026-07-20"
},
{
"table": "mileage_reports",
"field": "odometer_km",
"agg": null,
"value": 70100
},
{
"table": "service_history",
"field": "odometer_km",
"agg": null,
"value": 65000
},
{
"table": "service_intervals",
"field": "interval_km",
"agg": null,
"value": 7500
}
],
"summary": "마지막 주행거리가 74일 전 7월 20일 기록이라 그 뒤 얼마나 달렸는지 모릅니다. 그날 기준으로는 엔진오일 교체 뒤 5,100km, 5개월이라 두 기준 모두 안쪽입니다.",
"call_script": "한빛렌터카 담당자님, 45허1122 쏘렌토의 주행거리가 7월 20일 뒤로 들어오지 않았습니다. 디젤 차량이라 교체 주기가 짧아 현재 주행거리를 알려 주시면 정비 시기를 다시 계산해 드리겠습니다."
},
{
"vehicle_no": "77라3030",
"client_name": "개인 고객",
"model_code": "CARNIVAL-KA4",
"as_of": "2026-10-02",
"verdict": "정비 이력이 없는 차량",
"also_found": [],
"service_type": null,
"last_reported_at": null,
"report_age_days": null,
"km_since_service": null,
"interval_km": null,
"months_since_service": null,
"interval_months": null,
"unchecked_service_types": [
"엔진오일",
"에어컨 필터"
],
"evidence": [
{
"table": "managed_vehicles",
"field": "vehicle_no",
"agg": null,
"value": "77라3030"
},
{
"table": "managed_vehicles",
"field": "managed_since",
"agg": null,
"value": "2026-05-02"
},
{
"table": "service_history",
"field": "vehicle_no",
"agg": "count",
"value": 0
}
],
"summary": "5월 2일부터 관리 중인데 정비 이력이 한 건도 없고 주행거리 기록도 없어 어느 항목도 계산하지 못했습니다.",
"call_script": "고객님, 5월부터 라이드에서 관리 중인 카니발의 정비 기록이 아직 없어 연락드렸습니다. 최근 엔진오일을 간 날과 지금 주행거리를 알려 주시면 다음 정비 시기를 안내해 드리겠습니다."
},
{
"vehicle_no": "56호7788",
"client_name": "도담렌터카",
"model_code": "AVANTE-CN7",
"as_of": "2026-10-02",
"verdict": "정비 시기 전",
"also_found": [],
"service_type": "엔진오일",
"last_reported_at": "2026-09-29",
"report_age_days": 3,
"km_since_service": 10000,
"interval_km": 10000,
"months_since_service": 5,
"interval_months": 12,
"unchecked_service_types": [
"에어컨 필터"
],
"evidence": [
{
"table": "mileage_reports",
"field": "odometer_km",
"agg": null,
"value": 31000
},
{
"table": "service_history",
"field": "odometer_km",
"agg": null,
"value": 21000
},
{
"table": "service_intervals",
"field": "interval_km",
"agg": null,
"value": 10000
}
],
"summary": "엔진오일 교체 뒤 정확히 10,000km 를 달려 기준과 같으므로 아직 지나지 않은 것으로 둡니다. 다음 반납 때 바로 넘어갈 차량입니다.",
"call_script": null
},
{
"vehicle_no": "23바9012",
"client_name": "새움캐피탈",
"model_code": "K5-DL3",
"as_of": "2026-10-02",
"verdict": "정비 시기 전",
"also_found": [],
"service_type": "엔진오일",
"last_reported_at": "2026-10-01",
"report_age_days": 1,
"km_since_service": 7500,
"interval_km": 10000,
"months_since_service": 12,
"interval_months": 12,
"unchecked_service_types": [
"에어컨 필터"
],
"evidence": [
{
"table": "service_history",
"field": "serviced_at",
"agg": null,
"value": "2025-10-02"
},
{
"table": "service_intervals",
"field": "interval_months",
"agg": null,
"value": 12
},
{
"table": "mileage_reports",
"field": "odometer_km",
"agg": null,
"value": 52300
},
{
"table": "service_history",
"field": "odometer_km",
"agg": null,
"value": 44800
}
],
"summary": "마지막 엔진오일 교체가 2025-10-02 로 기준일과 날짜가 같아 정확히 12개월이고, 12개월 기준과 같으므로 아직 지나지 않은 것으로 둡니다. 주행은 7,500km 로 기준 안입니다.",
"call_script": null
},
{
"vehicle_no": "89하3344",
"client_name": "한빛렌터카",
"model_code": "IONIQ5-NE",
"as_of": "2026-10-02",
"verdict": "주행거리로 정비 시기 지남",
"also_found": [],
"service_type": "에어컨 필터",
"last_reported_at": "2026-09-27",
"report_age_days": 5,
"km_since_service": 15500,
"interval_km": 15000,
"months_since_service": 10,
"interval_months": 12,
"unchecked_service_types": [
"감속기오일"
],
"evidence": [
{
"table": "mileage_reports",
"field": "odometer_km",
"agg": null,
"value": 39500
},
{
"table": "service_history",
"field": "odometer_km",
"agg": null,
"value": 24000
},
{
"table": "service_intervals",
"field": "interval_km",
"agg": null,
"value": 15000
}
],
"summary": "11월 5일 에어컨 필터 교체 뒤 15,500km 를 달려 아이오닉 5 기준 15,000km 를 넘었습니다. 감속기오일은 이력이 없어 판정하지 못했습니다.",
"call_script": "한빛렌터카 담당자님, 89하3344 아이오닉 5 가 에어컨 필터 교체 뒤 15,500km 를 달려 교체 시기가 지났습니다. 다음 반납 때 필터 교체를 함께 잡아도 될지 여쭙고자 연락드렸습니다."
},
{
"vehicle_no": "67허5566",
"client_name": "도담렌터카",
"model_code": "SORENTO-MQ4",
"as_of": "2026-10-02",
"verdict": "정비 시기 전",
"also_found": [],
"service_type": "엔진오일",
"last_reported_at": "2026-09-30",
"report_age_days": 2,
"km_since_service": null,
"interval_km": 7500,
"months_since_service": 3,
"interval_months": 6,
"unchecked_service_types": [
"에어컨 필터"
],
"evidence": [
{
"table": "service_history",
"field": "odometer_km",
"agg": null,
"value": null
},
{
"table": "service_history",
"field": "serviced_at",
"agg": null,
"value": "2026-06-15"
},
{
"table": "service_intervals",
"field": "interval_months",
"agg": null,
"value": 6
}
],
"summary": "6월 15일 엔진오일 영수증에 주행거리가 비어 있어 주행거리 기준은 계산하지 못했고, 기간은 3개월로 6개월 기준 안입니다.",
"call_script": null
},
{
"vehicle_no": "90호1234",
"client_name": "한빛렌터카",
"model_code": "AVANTE-CN7",
"as_of": "2026-10-02",
"verdict": "정비 시기 전",
"also_found": [],
"service_type": "엔진오일",
"last_reported_at": "2026-09-26",
"report_age_days": 6,
"km_since_service": 8900,
"interval_km": 10000,
"months_since_service": 7,
"interval_months": 12,
"unchecked_service_types": [
"에어컨 필터"
],
"evidence": [
{
"table": "mileage_reports",
"field": "reported_at",
"agg": null,
"value": "2026-09-26"
},
{
"table": "mileage_reports",
"field": "odometer_km",
"agg": null,
"value": 44900
},
{
"table": "service_history",
"field": "odometer_km",
"agg": null,
"value": 36000
},
{
"table": "mileage_reports",
"field": "reported_at",
"agg": "count",
"value": 2
}
],
"summary": "주행거리 기록 두 건 가운데 9월 26일 44,900km 를 써서 엔진오일 교체 뒤 8,900km 이고 기준 10,000km 안입니다.",
"call_script": null
},
{
"vehicle_no": "11더2233",
"client_name": "새움캐피탈",
"model_code": "CARNIVAL-KA4",
"as_of": "2026-10-02",
"verdict": "주행거리로 정비 시기 지남",
"also_found": [
"주행거리 기록이 끊김"
],
"service_type": "엔진오일",
"last_reported_at": "2026-06-10",
"report_age_days": 114,
"km_since_service": 11000,
"interval_km": 10000,
"months_since_service": 9,
"interval_months": 12,
"unchecked_service_types": [
"에어컨 필터"
],
"evidence": [
{
"table": "mileage_reports",
"field": "reported_at",
"agg": null,
"value": "2026-06-10"
},
{
"table": "mileage_reports",
"field": "odometer_km",
"agg": null,
"value": 82000
},
{
"table": "service_history",
"field": "odometer_km",
"agg": null,
"value": 71000
},
{
"table": "service_intervals",
"field": "interval_km",
"agg": null,
"value": 10000
}
],
"summary": "주행거리 기록은 114일 전 것이지만 그날 이미 엔진오일 교체 뒤 11,000km 라 기준 10,000km 를 넘었습니다. 지금은 그보다 더 달렸으므로 끊긴 기록과 상관없이 지남으로 둡니다.",
"call_script": "새움캐피탈 담당자님, 11더2233 카니발은 6월 기록만으로도 엔진오일 교체 뒤 11,000km 를 넘었습니다. 그 뒤 주행거리가 들어오지 않아 이용 고객 연락처를 확인해 입고 안내를 드리고자 합니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 정비 시기 전·주행거리로 정비 시기 지남·기간으로 정비 시기 지남·주행거리 기록이 끊김·정비 이력이 없는 차량 다섯 값 중 하나인지 확인합니다. 2. 필수 필드 vehicle_no·client_name·model_code·as_of·verdict·also_found·service_type·last_reported_at·report_age_days·km_since_service·interval_km·months_since_service·interval_months·unchecked_service_types·evidence·summary·call_script 가 모두 존재하는지 확인합니다. 3. km_since_service 가 last_reported_at 날의 mileage_reports.odometer_km 에서 그 service_type 의 가장 늦은 service_history.odometer_km 를 뺀 값과 같은지 다시 계산합니다. 90호1234 는 기록 두 건 가운데 2026-09-26 의 44,900 을 골라 36,000 을 빼 8,900 입니다. service_history.odometer_km 가 null 이면 km_since_service 도 null 입니다(67허5566). 4. months_since_service 를 다시 계산합니다. 34나5678 은 2025-08-14 에서 2026-10-02 까지 연·월 차이 14개월이고 2일이 14일보다 작아 1을 빼 13입니다. 23바9012 는 2025-10-02 에서 정확히 12이고 interval_months 12 와 같아 정비 시기 전입니다. 5. report_age_days 가 as_of 에서 last_reported_at 을 뺀 날 수와 같은지 다시 계산합니다. 45허1122 는 2026-07-20 에서 74입니다. 6. managed_vehicles.vehicle_no 가 service_history.vehicle_no 에 한 번도 없으면 verdict 는 정비 이력이 없는 차량입니다(77라3030). 7. 어느 항목이든 km_since_service 가 그 model_code·service_type 의 service_intervals.interval_km 보다 크면 verdict 는 주행거리로 정비 시기 지남입니다. 넘은 항목이 여럿이면 주기 대비 가장 많이 넘은 항목을 service_type 에 싣습니다. 89하3344 는 엔진오일이 없는 전기차라 에어컨 필터가 그 항목입니다. 같은 값은 지나지 않은 것으로 둡니다(56호7788 은 10,000 으로 기준과 같아 정비 시기 전). 주행거리 기록이 60일 넘게 묵었어도 그 기록으로 이미 기준을 넘었으면 이 판정을 내리고 주행거리 기록이 끊김은 also_found 에 넣습니다(11더2233). 8. 7에 걸리지 않고 months_since_service 가 interval_months 보다 크면 verdict 는 기간으로 정비 시기 지남입니다. 9. 6~8에 걸리지 않고 report_age_days 가 60보다 크면 verdict 는 주행거리 기록이 끊김입니다. 정비 이력은 있는데 주행거리 기록이 한 건도 없는 차량도 주행거리로 판정할 수 없으므로 같은 판정을 내리고 report_age_days 는 null 입니다. 이 판정에서 service_type 은 null 이지만 km_since_service·months_since_service 와 두 주기 칸에는 마지막 기록 기준으로 주기 대비 가장 많이 찬 항목의 값을 싣습니다(45허1122). 10. 6~9 어디에도 걸리지 않으면 verdict 는 정비 시기 전이고 call_script 는 null 입니다. 11. report_age_days·km_since_service·months_since_service 가 채워졌으면 0 이상인지 범위를 봅니다. 12. evidence 의 table·field 가 managed_vehicles·mileage_reports·service_history·service_intervals 에 실재하는 컬럼인지 대조합니다. 13. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행의 값 원문과 같은지 확인합니다. 14. summary 와 call_script 가 존댓말로 끝나는지 확인합니다. [수동 검증 · 사람이 봅니다] 1. 정비 시기가 지난 차량을 실제로 언제 입고시킬지는 운영 담당자가 고객사·이용 고객과 통화해 정합니다. 2. call_script 가 summary 에 없는 숫자나 약속(무상 정비·할인)을 말하지 않는지 운영 담당자가 읽고 고칩니다. [평가 러너 · 2주차] 1. 운영 담당자가 엑셀로 직접 계산해 둔 차량 200대의 판정과 화면 판정이 일치하는 대수를 셉니다. 2. 어긋난 차량은 엑셀 계산과 화면 계산 가운데 어느 쪽 주행거리·정비일을 썼는지 행 단위로 나란히 남깁니다.