Post

4일차 토이프로젝트 기획(DB+API 설계)

4일차 토이프로젝트 기획(DB+API 설계)

현장에서 MES시스템을 보면서 항상 호기심을 가지고 있었다. 그래서! 이번 토이프로젝트의 주제는 MES시스템으로 결정했다.

이제 실제 업무 흐름과 데이터 연관관계에 기반한 구조를 설계하고 개발하는 단계에 들어섰다.


✅ 오늘 목표

  • 프로젝트 기획
  • DB 설계
  • API 구현(Product, WorkOrder, Equipment, ProductionResult)

💡 설계 고민 과정

1. 어떤 데이터를 중심으로 시스템을 구성할지?

처음엔 단순히 생산 실적을 기록하는 시스템이라고 생각했지만,
실제로 생산이 이루어지기 위해서는 그 전에 반드시 작업지시(WorkOrder) 가 필요하고,
그 작업은 특정 설비(Equipment) 를 통해 수행되며,
작업 대상인 제품(Product) 정보도 필요하다는 걸 명확히 정의했다.


2. 엔티티 간 연관 관계 어떻게 할 것인가?

  • ProductWorkOrder는 1:N 관계
  • EquipmentProductionResultWorkOrder를 각각 1:N 관계

→ 이 구조를 통해 이 설비가 어떤 제품의 생산을 수행했는지 를 추적할 수 있도록 설계


3. API는 어떤 식으로 구성할 것인가?

  • 단순한 흐름: 제품 등록 → 작업지시 → 설비 등록 → 생산실적 기록

ERD 구조

MES 시스템의 테이블 관계

  • 하나의 Product → 여러 WorkOrder
  • 하나의 WorkOrder → 여러 ProductionResult
  • 하나의 Equipment → 여러 ProductionResult


API 구성 및 연동 흐름

각 Entity별로 Repository → Service → Controller 구조를 통해 API를 분리 구현했다.

📦 Product API

  • /products
  • 제품 등록 / 전체 조회
1
2
3
4
5
{
  "name": "스프링너트",
  "code": "P001",
  "spec": "10mm"
}

🧾 WorkOrder API

  • /work-orders
  • 작업지시 등록 시 Product ID 필요
1
2
3
4
5
6
{
  "productId": 1,
  "quantity": 100,
  "dueDate": "2025-05-03T18:00:00",
  "status": "대기"
}

🏭 Equipment API

  • /equipments
  • 설비 등록 및 조회
1
2
3
4
5
{
  "name": "프레스기 A",
  "location": "1공장",
  "status": "가동"
}

📈 ProductionResult API

  • /results
  • 설비 + 작업지시 기준으로 생산실적 기록

Swagger 요청 JSON 예시:

1
2
3
4
5
6
7
8
{
  "equipmentId": 1,
  "workOrderId": 2,
  "producedQty": 80,
  "defectiveQty": 3,
  "startTime": "2025-05-03T09:00:00",
  "endTime": "2025-05-03T11:30:00"
}

🧠 배운 점 & 트러블슈팅 경험

📌 1. Swagger에서 LocalDateTime 파싱 오류

  • "startTime" 같은 필드에서 timestamp 파싱 에러 발생
  • @JsonFormat 어노테이션으로 해결 → DTO 분리하여 처리

📌 2. Entity vs DTO

  • Entity: DB와 직접 매핑되는 객체
  • DTO: API 요청/응답용, 필요한 데이터만 포함
  • 분리함으로써 보안, 유지보수, 유연성 향상

🔚 마무리

오늘은 API 구현뿐만 아니라 실제 업무 흐름을 엔티티 간 연관관계로 연결하고, 그 흐름을 기반으로 API를 설계했다.

Vue.js를 사용해서 프론트 화면을 만들어보자.


Repository : GitHub

This post is licensed under CC BY 4.0 by the author.