- 라이선스 모델 전면 개편 (상세 필드 추가, 계산 필드 구현) - API 응답 처리 개선 (HTTP 상태 코드 기반) - 장비 출고 폼 컨트롤러 추가 - 회사 지점 정보 모델 추가 - 공통 데이터 모델 구조 추가 - 전체 서비스 레이어 API 호출 방식 통일 - UI 컴포넌트 마이너 개선
1167 lines
35 KiB
Markdown
1167 lines
35 KiB
Markdown
# SuperPort API 통합 계획서
|
|
|
|
**작성일**: 2025-07-24
|
|
**버전**: 1.0
|
|
**작성자**: Claude
|
|
|
|
## 목차
|
|
|
|
1. [개요](#1-개요)
|
|
2. [API 서버 분석](#2-api-서버-분석)
|
|
3. [현재 상태 분석](#3-현재-상태-분석)
|
|
4. [화면별 API 통합 계획](#4-화면별-api-통합-계획)
|
|
5. [기능별 구현 계획](#5-기능별-구현-계획)
|
|
6. [기술적 아키텍처](#6-기술적-아키텍처)
|
|
7. [구현 로드맵](#7-구현-로드맵)
|
|
8. [작업 Task 총정리](#8-작업-task-총정리)
|
|
9. [위험 관리](#9-위험-관리)
|
|
|
|
---
|
|
|
|
## 1. 개요
|
|
|
|
### 1.1 프로젝트 배경
|
|
|
|
SuperPort는 현재 MockDataService를 사용하여 모든 데이터를 메모리에서 관리하고 있습니다. 이는 개발 초기 단계에서는 유용했지만, 실제 운영 환경에서는 다음과 같은 한계가 있습니다:
|
|
|
|
- 데이터 영속성 부재
|
|
- 다중 사용자 동시 접근 불가
|
|
- 실시간 데이터 동기화 불가
|
|
- 보안 및 인증 기능 부재
|
|
|
|
### 1.2 API 통합 목적
|
|
|
|
- **데이터 영속성**: PostgreSQL 데이터베이스를 통한 안정적인 데이터 저장
|
|
- **다중 사용자 지원**: 동시 접근 및 실시간 업데이트 지원
|
|
- **보안 강화**: JWT 기반 인증 및 역할 기반 접근 제어
|
|
- **확장성**: 향후 기능 추가를 위한 견고한 백엔드 인프라
|
|
|
|
### 1.3 예상 효과
|
|
|
|
- 실제 운영 환경 배포 가능
|
|
- 데이터 무결성 및 일관성 보장
|
|
- 사용자별 권한 관리
|
|
- 감사 로그 및 이력 추적
|
|
- 대용량 데이터 처리 능력
|
|
|
|
---
|
|
|
|
## 2. API 서버 분석
|
|
|
|
### 2.1 기술 스택
|
|
|
|
- **언어**: Rust
|
|
- **프레임워크**: Actix-web 4.5
|
|
- **ORM**: SeaORM
|
|
- **데이터베이스**: PostgreSQL 16
|
|
- **인증**: JWT (Access + Refresh Token)
|
|
|
|
### 2.2 인증 방식
|
|
|
|
```json
|
|
// 로그인 요청
|
|
POST /api/v1/auth/login
|
|
{
|
|
"username": "user@example.com",
|
|
"password": "password123"
|
|
}
|
|
|
|
// 응답
|
|
{
|
|
"access_token": "eyJ0eXAiOiJKV1Q...",
|
|
"refresh_token": "eyJ0eXAiOiJKV1Q...",
|
|
"token_type": "Bearer",
|
|
"expires_in": 3600
|
|
}
|
|
```
|
|
|
|
### 2.3 주요 엔드포인트
|
|
|
|
| 기능 | 메서드 | 경로 | 설명 |
|
|
|------|--------|------|------|
|
|
| **인증** |
|
|
| 로그인 | POST | /auth/login | 사용자 인증 |
|
|
| 로그아웃 | POST | /auth/logout | 세션 종료 |
|
|
| 토큰 갱신 | POST | /auth/refresh | 액세스 토큰 갱신 |
|
|
| **장비** |
|
|
| 목록 조회 | GET | /equipment | 페이징, 필터, 정렬 지원 |
|
|
| 상세 조회 | GET | /equipment/{id} | 장비 상세 정보 |
|
|
| 생성 | POST | /equipment | 새 장비 등록 |
|
|
| 수정 | PUT | /equipment/{id} | 장비 정보 수정 |
|
|
| 삭제 | DELETE | /equipment/{id} | 장비 삭제 |
|
|
| 입고 | POST | /equipment/in | 장비 입고 처리 |
|
|
| 출고 | POST | /equipment/out | 장비 출고 처리 |
|
|
| **회사** |
|
|
| 목록 조회 | GET | /companies | 회사 목록 |
|
|
| 지점 조회 | GET | /companies/{id}/branches | 회사별 지점 |
|
|
|
|
### 2.4 데이터 모델 매핑
|
|
|
|
| Flutter 모델 | API DTO | 변경사항 |
|
|
|--------------|---------|----------|
|
|
| Equipment | EquipmentDto | category 구조 변경 |
|
|
| Company | CompanyDto | branch 관계 추가 |
|
|
| User | UserDto | role → role_type |
|
|
| License | LicenseDto | 완전 일치 |
|
|
|
|
---
|
|
|
|
## 3. 현재 상태 분석
|
|
|
|
### 3.1 MockDataService 구조
|
|
|
|
현재 MockDataService는 다음과 같은 구조로 되어 있습니다:
|
|
|
|
```dart
|
|
class MockDataService {
|
|
static final MockDataService _instance = MockDataService._internal();
|
|
|
|
// 메모리 저장소
|
|
final List<Equipment> _equipments = [];
|
|
final List<Company> _companies = [];
|
|
|
|
// 동기적 메서드
|
|
List<Equipment> getEquipments() => _equipments;
|
|
void addEquipment(Equipment equipment) => _equipments.add(equipment);
|
|
}
|
|
```
|
|
|
|
### 3.2 변경 필요 사항
|
|
|
|
1. **비동기 처리**: 모든 메서드를 Future 반환으로 변경
|
|
2. **에러 처리**: try-catch 및 에러 상태 관리
|
|
3. **로딩 상태**: 데이터 페칭 중 로딩 인디케이터
|
|
4. **캐싱**: 불필요한 API 호출 최소화
|
|
|
|
### 3.3 컨트롤러 패턴 개선
|
|
|
|
```dart
|
|
// 현재
|
|
class EquipmentController {
|
|
List<Equipment> get equipments => MockDataService().getEquipments();
|
|
}
|
|
|
|
// 개선 후
|
|
class EquipmentController extends ChangeNotifier {
|
|
List<Equipment> _equipments = [];
|
|
bool _isLoading = false;
|
|
String? _error;
|
|
|
|
Future<void> loadEquipments() async {
|
|
_isLoading = true;
|
|
notifyListeners();
|
|
|
|
try {
|
|
_equipments = await _apiService.getEquipments();
|
|
_error = null;
|
|
} catch (e) {
|
|
_error = e.toString();
|
|
} finally {
|
|
_isLoading = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 4. 화면별 API 통합 계획
|
|
|
|
### 4.1 로그인 화면
|
|
|
|
**사용 API 엔드포인트**:
|
|
- POST /api/v1/auth/login
|
|
- POST /api/v1/auth/refresh
|
|
|
|
**작업 Task**:
|
|
- [x] AuthService 클래스 생성
|
|
- [x] JWT 토큰 저장/관리 로직 구현
|
|
- [x] SecureStorage 설정
|
|
- [x] Access Token 저장
|
|
- [x] Refresh Token 저장
|
|
- [x] 로그인 폼 검증 추가
|
|
- [x] 이메일 형식 검증
|
|
- [x] 비밀번호 최소 길이 검증
|
|
- [x] 로그인 실패 에러 처리
|
|
- [x] 401: 잘못된 인증 정보
|
|
- [ ] 429: 너무 많은 시도
|
|
- [x] 500: 서버 오류
|
|
- [x] 자동 로그인 구현
|
|
- [x] 토큰 유효성 검사
|
|
- [x] 토큰 자동 갱신
|
|
- [x] 로그아웃 기능 구현
|
|
|
|
### 4.2 대시보드
|
|
|
|
**사용 API 엔드포인트**:
|
|
- GET /api/v1/overview/stats
|
|
- GET /api/v1/overview/recent-activities
|
|
- GET /api/v1/equipment/status-distribution
|
|
- GET /api/v1/licenses/expiring-soon
|
|
|
|
**작업 Task**:
|
|
- [x] DashboardService 생성
|
|
- [x] 통계 데이터 모델 생성
|
|
- [x] OverviewStats DTO
|
|
- [x] RecentActivity DTO
|
|
- [x] StatusDistribution DTO (EquipmentStatusDistribution)
|
|
- [x] ExpiringLicense DTO
|
|
- [x] DashboardController 비동기화
|
|
- [x] 동시 다중 API 호출 구현
|
|
- [x] 부분 로딩 상태 관리
|
|
- [ ] 실시간 업데이트 구현
|
|
- [ ] WebSocket 연결 설정
|
|
- [ ] 실시간 이벤트 수신
|
|
- [ ] 캐싱 전략 구현
|
|
- [ ] 5분 캐시 TTL
|
|
- [ ] Pull-to-refresh 구현
|
|
- [x] 에러 시 부분 렌더링
|
|
|
|
### 4.3 장비 목록
|
|
|
|
**사용 API 엔드포인트**:
|
|
- GET /api/v1/equipment?page=1&limit=20&sort=created_at&order=desc
|
|
- GET /api/v1/equipment/categories
|
|
- GET /api/v1/companies/names
|
|
|
|
**작업 Task**:
|
|
- [x] EquipmentService 생성
|
|
- [x] 페이지네이션 구현
|
|
- [x] 무한 스크롤 구현
|
|
- [x] 페이지 상태 관리
|
|
- [x] 로딩 인디케이터
|
|
- [x] 필터링 기능
|
|
- [x] 카테고리별 필터
|
|
- [x] 상태별 필터
|
|
- [x] 회사별 필터
|
|
- [x] 날짜 범위 필터
|
|
- [x] 정렬 기능
|
|
- [x] 생성일 정렬
|
|
- [x] 이름 정렬
|
|
- [x] 상태 정렬
|
|
- [x] 검색 기능
|
|
- [x] 디바운싱 구현
|
|
- [ ] 검색 결과 하이라이트
|
|
- [ ] 일괄 작업
|
|
- [ ] 다중 선택 UI
|
|
- [ ] 일괄 삭제
|
|
- [ ] 일괄 상태 변경
|
|
|
|
### 4.4 장비 상세/편집
|
|
|
|
**사용 API 엔드포인트**:
|
|
- GET /api/v1/equipment/{id}
|
|
- PUT /api/v1/equipment/{id}
|
|
- GET /api/v1/equipment/{id}/history
|
|
- POST /api/v1/files/upload
|
|
|
|
**작업 Task**:
|
|
- [x] 상세 정보 로딩
|
|
- [x] 기본 정보 표시
|
|
- [x] 이력 정보 로딩
|
|
- [ ] 관련 문서 표시
|
|
- [x] 편집 모드 구현
|
|
- [x] 폼 데이터 바인딩
|
|
- [x] 실시간 검증
|
|
- [x] 변경사항 추적
|
|
- [ ] 이미지 업로드
|
|
- [ ] 파일 선택 UI
|
|
- [ ] 업로드 진행률
|
|
- [ ] 썸네일 생성
|
|
- [x] 히스토리 표시
|
|
- [x] 타임라인 UI
|
|
- [x] 상태 변경 이력
|
|
- [x] 담당자 정보
|
|
|
|
### 4.5 장비 입고
|
|
|
|
**사용 API 엔드포인트**:
|
|
- POST /api/v1/equipment/in
|
|
- GET /api/v1/warehouse-locations
|
|
- GET /api/v1/equipment/serial-check/{serial}
|
|
|
|
**작업 Task**:
|
|
- [x] 입고 폼 구현
|
|
- [x] 장비 정보 입력
|
|
- [x] 시리얼 번호 중복 검사
|
|
- [x] 창고 위치 선택
|
|
- [ ] 바코드 스캔 통합
|
|
- [ ] 카메라 권한 요청
|
|
- [ ] 바코드 디코딩
|
|
- [ ] 자동 필드 채우기
|
|
- [ ] 일괄 입고
|
|
- [ ] CSV 파일 업로드
|
|
- [ ] 데이터 검증
|
|
- [ ] 진행률 표시
|
|
- [ ] 입고증 생성
|
|
- [ ] PDF 생성
|
|
- [ ] 이메일 전송
|
|
|
|
### 4.6 장비 출고
|
|
|
|
**사용 API 엔드포인트**:
|
|
- POST /api/v1/equipment/out
|
|
- GET /api/v1/equipment/available
|
|
- GET /api/v1/customers
|
|
|
|
**작업 Task**:
|
|
- [x] 출고 폼 구현
|
|
- [x] 가용 장비 조회
|
|
- [x] 수량 검증
|
|
- [x] 고객 정보 입력
|
|
- [ ] 출고 승인 프로세스
|
|
- [ ] 승인 요청
|
|
- [ ] 승인자 알림
|
|
- [ ] 승인 이력
|
|
- [ ] 출고 문서
|
|
- [ ] 출고증 생성
|
|
- [ ] 전자 서명
|
|
- [ ] 문서 보관
|
|
|
|
### 4.7 회사 관리
|
|
|
|
**사용 API 엔드포인트**:
|
|
- GET /api/v1/companies
|
|
- POST /api/v1/companies
|
|
- PUT /api/v1/companies/{id}
|
|
- GET /api/v1/companies/{id}/branches
|
|
- POST /api/v1/companies/{id}/branches
|
|
|
|
**작업 Task**:
|
|
- [x] CompanyService 생성
|
|
- [x] DTO 모델 생성
|
|
- [x] CompanyDto (생성/수정/응답)
|
|
- [x] CompanyListDto (목록 조회)
|
|
- [x] BranchDto (지점 관련)
|
|
- [x] CompanyRemoteDataSource 구현
|
|
- [x] 모든 CRUD 메서드 구현
|
|
- [x] 지점 관련 API 메서드 구현
|
|
- [x] DI 등록 (CompanyRemoteDataSource, CompanyService)
|
|
- [x] 회사 목록 구현
|
|
- [x] Controller API 연동
|
|
- [x] 본사/지점 트리 구조
|
|
- [ ] 확장/축소 UI
|
|
- [x] 검색 필터
|
|
- [x] 회사 등록
|
|
- [x] Controller API 연동
|
|
- [ ] 사업자번호 검증
|
|
- [ ] 주소 검색 API 연동
|
|
- [x] 중복 확인
|
|
- [x] 지점 관리
|
|
- [x] 지점 추가/편집
|
|
- [ ] 지점별 권한 설정
|
|
- [ ] 지점 이전 기능
|
|
- [ ] 회사 통계
|
|
- [ ] 장비 보유 현황
|
|
- [ ] 라이선스 현황
|
|
- [ ] 사용자 현황
|
|
|
|
### 4.8 사용자 관리
|
|
|
|
**사용 API 엔드포인트**:
|
|
- GET /api/v1/users
|
|
- POST /api/v1/users
|
|
- PUT /api/v1/users/{id}
|
|
- PATCH /api/v1/users/{id}/status
|
|
- POST /api/v1/users/{id}/reset-password
|
|
|
|
**작업 Task**:
|
|
- [x] 사용자 목록
|
|
- [x] 역할별 필터
|
|
- [x] 회사별 필터
|
|
- [x] 상태별 표시
|
|
- [x] 사용자 등록
|
|
- [x] 이메일 중복 확인
|
|
- [x] 임시 비밀번호 생성
|
|
- [ ] 환영 이메일 발송
|
|
- [x] 권한 관리
|
|
- [x] 역할 선택 UI
|
|
- [ ] 권한 미리보기
|
|
- [ ] 권한 변경 이력
|
|
- [ ] 비밀번호 관리
|
|
- [ ] 비밀번호 재설정
|
|
- [ ] 강제 변경 설정
|
|
- [ ] 비밀번호 정책
|
|
|
|
### 4.9 라이선스 관리
|
|
|
|
**사용 API 엔드포인트**:
|
|
- GET /api/v1/licenses
|
|
- POST /api/v1/licenses
|
|
- PUT /api/v1/licenses/{id}
|
|
- DELETE /api/v1/licenses/{id}
|
|
- PATCH /api/v1/licenses/{id}/assign
|
|
- PATCH /api/v1/licenses/{id}/unassign
|
|
- GET /api/v1/licenses/expiring?days=30
|
|
|
|
**작업 Task**:
|
|
- [x] 라이선스 목록
|
|
- [x] 페이지네이션 구현
|
|
- [x] 활성/비활성 필터
|
|
- [x] 회사별 필터
|
|
- [x] 검색 기능
|
|
- [x] 라이선스 등록
|
|
- [x] DTO 모델 매핑
|
|
- [x] 방문주기를 remark 필드로 저장
|
|
- [ ] 파일 첨부
|
|
- [x] 라이선스 수정/삭제
|
|
- [x] API 연동 완료
|
|
- [x] 에러 처리
|
|
- [x] 만료 예정 조회
|
|
- [x] getExpiringLicenses 구현
|
|
- [x] 일수 파라미터 지원
|
|
- [x] 라이선스 할당
|
|
- [x] assignLicense/unassignLicense 구현
|
|
- [x] 사용자별 할당 관리
|
|
|
|
### 4.10 창고 관리
|
|
|
|
**사용 API 엔드포인트**:
|
|
- GET /api/v1/warehouse-locations
|
|
- POST /api/v1/warehouse-locations
|
|
- GET /api/v1/warehouse-locations/{id}
|
|
- PUT /api/v1/warehouse-locations/{id}
|
|
- DELETE /api/v1/warehouse-locations/{id}
|
|
- GET /api/v1/warehouse-locations/{id}/equipment
|
|
- GET /api/v1/warehouse-locations/{id}/capacity
|
|
- GET /api/v1/warehouse-locations/in-use
|
|
|
|
**작업 Task**:
|
|
- [x] 창고 목록
|
|
- [x] 페이지네이션 구현
|
|
- [x] 활성/비활성 필터
|
|
- [x] 검색 기능 (이름, 주소)
|
|
- [x] 사용 중인 창고 조회
|
|
- [x] 창고 등록
|
|
- [x] DTO 모델 매핑
|
|
- [x] 주소 정보 변환
|
|
- [x] 담당자명을 remark로 저장
|
|
- [x] 창고 수정/삭제
|
|
- [x] API 연동 완료
|
|
- [x] 에러 처리
|
|
- [x] 창고별 장비 조회
|
|
- [x] getWarehouseEquipment 구현
|
|
- [x] 페이지네이션 지원
|
|
- [x] 창고 용량 조회
|
|
- [x] getWarehouseCapacity 구현
|
|
- [x] 사용률 계산
|
|
|
|
### 4.11 보고서
|
|
|
|
**사용 API 엔드포인트**:
|
|
- GET /api/v1/reports/equipment-status
|
|
- GET /api/v1/reports/license-summary
|
|
- POST /api/v1/reports/export/excel
|
|
- POST /api/v1/reports/export/pdf
|
|
|
|
**작업 Task**:
|
|
- [ ] 보고서 템플릿
|
|
- [ ] 장비 현황 보고서
|
|
- [ ] 라이선스 보고서
|
|
- [ ] 사용자 활동 보고서
|
|
- [ ] 보고서 생성
|
|
- [ ] 기간 선택
|
|
- [ ] 필터 옵션
|
|
- [ ] 미리보기
|
|
- [ ] 내보내기
|
|
- [ ] Excel 다운로드
|
|
- [ ] PDF 다운로드
|
|
- [ ] 이메일 전송
|
|
- [ ] 정기 보고서
|
|
- [ ] 스케줄 설정
|
|
- [ ] 자동 생성
|
|
- [ ] 수신자 관리
|
|
|
|
---
|
|
|
|
## 5. 기능별 구현 계획
|
|
|
|
### 5.1 인증/인가 시스템
|
|
|
|
**구현 내용**:
|
|
- JWT 토큰 관리 서비스
|
|
- 자동 토큰 갱신 인터셉터
|
|
- 역할 기반 라우트 가드
|
|
- 세션 타임아웃 처리
|
|
|
|
**작업 Task**:
|
|
- [x] AuthService 구현
|
|
- [x] 로그인/로그아웃
|
|
- [x] 토큰 저장/조회
|
|
- [x] 토큰 갱신 로직
|
|
- [x] AuthInterceptor 구현
|
|
- [x] 요청 헤더 토큰 추가
|
|
- [x] 401 에러 처리
|
|
- [x] 토큰 갱신 재시도
|
|
- [ ] RouteGuard 구현
|
|
- [ ] 인증 확인
|
|
- [ ] 권한 확인
|
|
- [ ] 리다이렉트 처리
|
|
|
|
### 5.2 네트워크 레이어
|
|
|
|
**구현 내용**:
|
|
- Dio 클라이언트 설정
|
|
- API 엔드포인트 관리
|
|
- 에러 처리 표준화
|
|
- 요청/응답 로깅
|
|
|
|
**작업 Task**:
|
|
- [x] ApiClient 싱글톤 구현
|
|
- [ ] BaseApiService 추상 클래스
|
|
- [x] 환경별 설정 관리
|
|
- [x] 에러 핸들링 유틸 (exceptions.dart, failures.dart 구현됨)
|
|
- [ ] 네트워크 연결 확인
|
|
|
|
### 5.3 상태 관리
|
|
|
|
**구현 내용**:
|
|
- Repository 패턴 도입
|
|
- 데이터 캐싱 전략
|
|
- 옵티미스틱 업데이트
|
|
- 상태 동기화
|
|
|
|
**작업 Task**:
|
|
- [ ] Repository 인터페이스 정의
|
|
- [ ] 캐시 매니저 구현
|
|
- [ ] 상태 업데이트 로직
|
|
- [ ] 충돌 해결 전략
|
|
|
|
### 5.4 파일 업로드/다운로드
|
|
|
|
**구현 내용**:
|
|
- Multipart 파일 업로드
|
|
- 진행률 표시
|
|
- 파일 다운로드 관리
|
|
- 오프라인 파일 캐싱
|
|
|
|
**작업 Task**:
|
|
- [ ] FileService 구현
|
|
- [ ] 업로드 큐 관리
|
|
- [ ] 다운로드 매니저
|
|
- [ ] 파일 캐시 정책
|
|
|
|
### 5.5 실시간 기능
|
|
|
|
**구현 내용**:
|
|
- WebSocket 연결 관리
|
|
- 실시간 이벤트 처리
|
|
- 자동 재연결
|
|
- 이벤트 필터링
|
|
|
|
**작업 Task**:
|
|
- [ ] WebSocketService 구현
|
|
- [ ] 이벤트 리스너 관리
|
|
- [ ] 재연결 로직
|
|
- [ ] 이벤트 라우팅
|
|
|
|
### 5.6 오프라인 지원
|
|
|
|
**구현 내용**:
|
|
- 로컬 데이터베이스 (SQLite)
|
|
- 동기화 큐 관리
|
|
- 충돌 해결
|
|
- 오프라인 모드 UI
|
|
|
|
**작업 Task**:
|
|
- [ ] 로컬 DB 스키마 설계
|
|
- [ ] 동기화 서비스 구현
|
|
- [ ] 충돌 해결 UI
|
|
- [ ] 오프라인 인디케이터
|
|
|
|
---
|
|
|
|
## 6. 기술적 아키텍처
|
|
|
|
### 6.1 새로운 디렉토리 구조 ✅
|
|
|
|
```
|
|
lib/
|
|
├── core/ ✅
|
|
│ ├── config/ ✅
|
|
│ │ └── environment.dart ✅
|
|
│ ├── constants/ ✅
|
|
│ │ ├── api_endpoints.dart ✅
|
|
│ │ └── app_constants.dart ✅
|
|
│ ├── errors/ ✅
|
|
│ │ ├── exceptions.dart ✅
|
|
│ │ └── failures.dart ✅
|
|
│ └── utils/ ✅
|
|
│ ├── validators.dart ✅
|
|
│ └── formatters.dart ✅
|
|
├── data/ ✅
|
|
│ ├── datasources/ ✅
|
|
│ │ ├── local/ ✅
|
|
│ │ │ └── cache_datasource.dart
|
|
│ │ └── remote/ ✅
|
|
│ │ ├── api_client.dart ✅
|
|
│ │ ├── interceptors/ ✅
|
|
│ │ │ ├── auth_interceptor.dart ✅
|
|
│ │ │ ├── error_interceptor.dart ✅
|
|
│ │ │ └── logging_interceptor.dart ✅
|
|
│ │ ├── auth_remote_datasource.dart
|
|
│ │ └── equipment_remote_datasource.dart
|
|
│ ├── models/ ✅
|
|
│ │ ├── auth/
|
|
│ │ ├── equipment/
|
|
│ │ └── common/
|
|
│ └── repositories/ ✅
|
|
│ ├── auth_repository_impl.dart
|
|
│ └── equipment_repository_impl.dart
|
|
├── di/ ✅
|
|
│ └── injection_container.dart ✅
|
|
├── domain/
|
|
│ ├── entities/
|
|
│ ├── repositories/
|
|
│ └── usecases/
|
|
├── presentation/
|
|
│ ├── controllers/
|
|
│ ├── screens/
|
|
│ └── widgets/
|
|
└── main.dart
|
|
```
|
|
|
|
### 6.2 의존성 주입 ✅
|
|
|
|
```dart
|
|
// GetIt을 사용한 DI 설정 ✅
|
|
final getIt = GetIt.instance;
|
|
|
|
Future<void> setupDependencies() async {
|
|
// 환경 초기화 ✅
|
|
await Environment.initialize();
|
|
|
|
// 네트워크 ✅
|
|
getIt.registerLazySingleton(() => Dio());
|
|
getIt.registerLazySingleton(() => const FlutterSecureStorage());
|
|
|
|
// API 클라이언트 ✅
|
|
getIt.registerLazySingleton(() => ApiClient());
|
|
|
|
// 데이터소스 ✅
|
|
getIt.registerLazySingleton(() => AuthRemoteDataSource());
|
|
getIt.registerLazySingleton(() => DashboardRemoteDataSource());
|
|
getIt.registerLazySingleton(() => EquipmentRemoteDataSource());
|
|
getIt.registerLazySingleton(() => CompanyRemoteDataSource());
|
|
|
|
// 서비스 ✅
|
|
getIt.registerLazySingleton(() => AuthService());
|
|
getIt.registerLazySingleton(() => DashboardService());
|
|
getIt.registerLazySingleton(() => EquipmentService());
|
|
getIt.registerLazySingleton(() => CompanyService());
|
|
|
|
// 컨트롤러
|
|
// TODO: Controllers will be registered here
|
|
}
|
|
```
|
|
|
|
### 6.3 API 클라이언트 설계 ✅
|
|
|
|
```dart
|
|
// ApiClient 클래스 구현됨 (Retrofit 대신 순수 Dio 사용)
|
|
class ApiClient {
|
|
late final Dio _dio;
|
|
static final ApiClient _instance = ApiClient._internal();
|
|
|
|
factory ApiClient() => _instance;
|
|
|
|
ApiClient._internal() {
|
|
_dio = Dio(_baseOptions);
|
|
_setupInterceptors();
|
|
}
|
|
|
|
// GET, POST, PUT, PATCH, DELETE 메서드 구현됨
|
|
// 파일 업로드/다운로드 메서드 구현됨
|
|
// 인터셉터 설정 완료 (Auth, Error, Logging)
|
|
}
|
|
```
|
|
|
|
### 6.4 에러 처리 표준화
|
|
|
|
```dart
|
|
class ApiException implements Exception {
|
|
final String message;
|
|
final int? statusCode;
|
|
final Map<String, dynamic>? errors;
|
|
|
|
ApiException({
|
|
required this.message,
|
|
this.statusCode,
|
|
this.errors,
|
|
});
|
|
}
|
|
|
|
class ErrorHandler {
|
|
static String getErrorMessage(dynamic error) {
|
|
if (error is DioError) {
|
|
switch (error.type) {
|
|
case DioErrorType.connectTimeout:
|
|
return "연결 시간이 초과되었습니다";
|
|
case DioErrorType.other:
|
|
if (error.error is SocketException) {
|
|
return "인터넷 연결을 확인해주세요";
|
|
}
|
|
break;
|
|
default:
|
|
return "알 수 없는 오류가 발생했습니다";
|
|
}
|
|
}
|
|
return error.toString();
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 7. 구현 로드맵
|
|
|
|
### 7.1 Phase 1: 기초 인프라 (3주)
|
|
|
|
**1주차: 네트워크 레이어**
|
|
- [x] Dio 설정 및 인터셉터 구현
|
|
- [x] API 클라이언트 기본 구조
|
|
- [x] 에러 처리 프레임워크
|
|
- [x] 환경 설정 관리
|
|
|
|
**2주차: 인증 시스템** *(2025-07-24 진행)*
|
|
- [x] AuthService 구현
|
|
- [x] 토큰 관리 로직
|
|
- [x] 로그인/로그아웃 화면 연동
|
|
- [x] 자동 토큰 갱신
|
|
|
|
**3주차: 기본 데이터 레이어**
|
|
- [ ] Repository 패턴 구현
|
|
- [x] 기본 모델 변환
|
|
- [x] 첫 화면(대시보드) API 연동
|
|
- [x] 로딩/에러 상태 관리
|
|
|
|
### 7.2 Phase 2: 핵심 기능 (4주)
|
|
|
|
**4-5주차: 장비 관리**
|
|
- [x] 장비 목록/상세 API 연동
|
|
- [x] 입출고 프로세스 구현
|
|
- [x] 검색/필터/정렬 기능
|
|
- [ ] 이미지 업로드
|
|
|
|
**6-7주차: 회사/사용자 관리**
|
|
- [x] 회사 CRUD 구현 (Service/DataSource 완료, Controller 연동 필요)
|
|
- [ ] 지점 관리 기능
|
|
- [ ] 사용자 관리 및 권한
|
|
- [ ] 프로필 관리
|
|
|
|
### 7.3 Phase 3: 고급 기능 (3주)
|
|
|
|
**8주차: 실시간 기능**
|
|
- [ ] WebSocket 연결 구현
|
|
- [ ] 실시간 알림
|
|
- [ ] 대시보드 실시간 업데이트
|
|
- [ ] 이벤트 처리
|
|
|
|
**9주차: 오프라인 지원**
|
|
- [ ] 로컬 데이터베이스 설정
|
|
- [ ] 동기화 로직 구현
|
|
- [ ] 오프라인 모드 UI
|
|
- [ ] 충돌 해결
|
|
|
|
**10주차: 보고서 및 파일**
|
|
- [ ] 보고서 생성 기능
|
|
- [ ] Excel/PDF 다운로드
|
|
- [ ] 파일 관리 시스템
|
|
- [ ] 대량 데이터 처리
|
|
|
|
### 7.4 Phase 4: 최적화 및 마무리 (2주)
|
|
|
|
**11주차: 성능 최적화**
|
|
- [ ] API 호출 최적화
|
|
- [ ] 캐싱 전략 개선
|
|
- [ ] 이미지 최적화
|
|
- [ ] 번들 크기 최적화
|
|
|
|
**12주차: 테스트 및 배포**
|
|
- [ ] 통합 테스트
|
|
- [ ] 사용자 승인 테스트
|
|
- [ ] 배포 준비
|
|
- [ ] 문서화
|
|
|
|
---
|
|
|
|
## 8. 작업 Task 총정리
|
|
|
|
### 8.1 우선순위별 분류
|
|
|
|
#### 🔴 Critical (필수)
|
|
1. [x] API 클라이언트 설정
|
|
2. [x] 인증 시스템 구현
|
|
3. [x] 기본 CRUD 기능 (장비, 회사 완료)
|
|
4. [x] 에러 처리
|
|
5. [x] 로딩 상태 관리
|
|
|
|
#### 🟡 High (중요)
|
|
6. [x] 페이지네이션
|
|
7. [x] 검색/필터 (장비 완료)
|
|
8. [ ] 파일 업로드
|
|
9. [ ] 권한 관리
|
|
10. [x] 데이터 검증
|
|
|
|
#### 🟢 Medium (개선)
|
|
11. [ ] 캐싱
|
|
12. [ ] 실시간 업데이트
|
|
13. [ ] 오프라인 지원
|
|
14. [ ] 보고서 생성
|
|
15. [ ] 성능 최적화
|
|
|
|
#### 🔵 Low (선택)
|
|
16. [ ] 다국어 개선
|
|
17. [ ] 테마 커스터마이징
|
|
18. [ ] 애니메이션
|
|
19. [ ] 단축키
|
|
20. [ ] 고급 필터
|
|
|
|
### 8.2 예상 소요 시간
|
|
|
|
| 작업 카테고리 | 예상 시간 | 담당자 제안 |
|
|
|--------------|-----------|-------------|
|
|
| 네트워크 인프라 | 40시간 | 백엔드 경험자 |
|
|
| 인증 시스템 | 24시간 | 보안 전문가 |
|
|
| 화면별 API 연동 | 120시간 | 프론트엔드 개발자 |
|
|
| 상태 관리 | 32시간 | Flutter 전문가 |
|
|
| 테스트 | 40시간 | QA 엔지니어 |
|
|
| 문서화 | 16시간 | 기술 문서 작성자 |
|
|
| **총계** | **272시간** | 약 7주 (1인 기준) |
|
|
|
|
### 8.3 체크리스트
|
|
|
|
#### 개발 환경 설정
|
|
- [ ] API 서버 접속 정보 확인
|
|
- [x] 개발/스테이징/운영 환경 구분
|
|
- [x] 필요 패키지 설치
|
|
- [ ] Git 브랜치 전략 수립
|
|
|
|
#### 코드 품질
|
|
- [ ] 코드 리뷰 프로세스
|
|
- [ ] 린트 규칙 설정
|
|
- [ ] 테스트 커버리지 목표
|
|
- [ ] CI/CD 파이프라인
|
|
|
|
#### 보안
|
|
- [x] 토큰 안전 저장 (SecureStorage 사용)
|
|
- [x] API 키 관리 (환경 변수 사용)
|
|
- [ ] 민감 정보 마스킹
|
|
- [ ] 보안 감사
|
|
|
|
---
|
|
|
|
## 9. 위험 관리
|
|
|
|
### 9.1 기술적 위험
|
|
|
|
#### API 응답 지연
|
|
- **위험**: 느린 네트워크로 인한 UX 저하
|
|
- **대응**:
|
|
- 로딩 스켈레톤 UI
|
|
- 요청 취소 기능
|
|
- 타임아웃 설정
|
|
|
|
#### 토큰 만료 처리
|
|
- **위험**: 작업 중 토큰 만료로 인한 데이터 손실
|
|
- **대응**:
|
|
- 자동 토큰 갱신
|
|
- 작업 중 데이터 임시 저장
|
|
- 재인증 플로우
|
|
|
|
#### 대용량 데이터 처리
|
|
- **위험**: 많은 데이터로 인한 앱 멈춤
|
|
- **대응**:
|
|
- 페이지네이션 필수 적용
|
|
- 가상 스크롤 구현
|
|
- 데이터 스트리밍
|
|
|
|
### 9.2 비즈니스 위험
|
|
|
|
#### 기존 데이터 마이그레이션
|
|
- **위험**: Mock 데이터와 실제 데이터 불일치
|
|
- **대응**:
|
|
- 데이터 매핑 문서화
|
|
- 단계적 마이그레이션
|
|
- 데이터 검증 도구
|
|
|
|
#### 사용자 교육
|
|
- **위험**: 새로운 인증 절차에 대한 거부감
|
|
- **대응**:
|
|
- 사용자 가이드 제작
|
|
- 단계적 롤아웃
|
|
- 피드백 수집
|
|
|
|
### 9.3 롤백 계획
|
|
|
|
1. **Feature Flag 사용**
|
|
- API/Mock 모드 전환 가능
|
|
- 화면별 점진적 적용
|
|
|
|
2. **데이터 백업**
|
|
- 마이그레이션 전 전체 백업
|
|
- 롤백 스크립트 준비
|
|
|
|
3. **버전 관리**
|
|
- 이전 버전 APK/IPA 보관
|
|
- 긴급 패치 프로세스
|
|
|
|
---
|
|
|
|
## 📌 맺음말
|
|
|
|
이 문서는 SuperPort 프로젝트의 API 통합을 위한 상세한 계획서입니다. 각 팀원은 담당 파트의 체크리스트를 활용하여 진행 상황을 추적하고, 주간 회의에서 진행률을 공유하시기 바랍니다.
|
|
|
|
성공적인 API 통합을 위해서는 팀원 간의 긴밀한 협업과 지속적인 커뮤니케이션이 필수적입니다. 문제가 발생하면 즉시 공유하고 함께 해결책을 찾아나가겠습니다.
|
|
|
|
**문서 업데이트**: 이 문서는 프로젝트 진행에 따라 지속적으로 업데이트됩니다.
|
|
|
|
---
|
|
|
|
## 🔄 구현 진행 상황 (2025-07-24)
|
|
|
|
### 🎯 완료된 작업
|
|
|
|
#### 1차 작업 (2025-07-24 오전)
|
|
1. **Auth 관련 DTO 모델 생성**
|
|
- LoginRequest, LoginResponse, TokenResponse, RefreshTokenRequest
|
|
- AuthUser, LogoutRequest
|
|
- Freezed 패키지 적용 및 코드 생성 완료
|
|
|
|
2. **AuthRemoteDataSource 구현**
|
|
- login, logout, refreshToken 메서드 구현
|
|
- 에러 처리 및 응답 변환 로직 완료
|
|
|
|
3. **AuthService 구현**
|
|
- 토큰 저장/관리 (SecureStorage 사용)
|
|
- 로그인 상태 관리 및 스트림
|
|
- 자동 토큰 갱신 준비
|
|
|
|
4. **로그인 화면 API 연동**
|
|
- LoginController 수정 (API 호출 로직 추가)
|
|
- 이메일 형식 검증 및 에러 메시지 표시
|
|
- 로딩 상태 관리
|
|
|
|
5. **의존성 주입 설정**
|
|
- AuthRemoteDataSource, AuthService DI 등록
|
|
- GetIt을 통한 의존성 관리
|
|
|
|
#### 2차 작업 (2025-07-24 오후)
|
|
6. **자동 로그인 구현 ✅**
|
|
- main.dart에 FutureBuilder를 사용하여 토큰 확인
|
|
- 유효한 토큰이 있으면 홈 화면, 없으면 로그인 화면으로 라우팅
|
|
- LoginScreen에서 로그인 성공 시 pushNamedAndRemoveUntil 사용
|
|
|
|
7. **AuthInterceptor 개선 ✅**
|
|
- AuthService를 DI로 주입받도록 변경
|
|
- 토큰 가져오기, 갱신, 삭제 로직을 AuthService로 일원화
|
|
- 401 에러 시 자동 토큰 갱신 및 재시도 로직 개선
|
|
|
|
8. **로그아웃 기능 개선 ✅**
|
|
- AppLayoutRedesign에 AuthService import 추가
|
|
- 로그아웃 버튼 클릭 시 AuthService.logout() 호출
|
|
- 로딩 다이얼로그 및 에러 처리 추가
|
|
|
|
9. **대시보드 API 연동 ✅**
|
|
- **DTO 모델 생성**: OverviewStats, RecentActivity, EquipmentStatusDistribution, ExpiringLicense
|
|
- **DashboardRemoteDataSource 구현**: 모든 API 엔드포인트 연동
|
|
- **DashboardService 구현**: 비즈니스 로직 처리
|
|
- **OverviewController 개선**: ChangeNotifier 패턴으로 변경, API 사용
|
|
- **OverviewScreenRedesign 수정**: Provider 패턴 적용, 로딩/에러 상태 처리
|
|
- **DI 등록**: DashboardRemoteDataSource, DashboardService 등록
|
|
|
|
10. **API 서버 설정 ✅**
|
|
- .env 파일 생성 및 환경 변수 설정
|
|
- JWT 비밀키 및 데이터베이스 연결 정보 설정
|
|
|
|
### 📦 다음 작업
|
|
1. **API 서버 실행 및 테스트**
|
|
- Docker Compose로 PostgreSQL, Redis 실행
|
|
- cargo run으로 API 서버 실행
|
|
- Flutter 앱과 연동 테스트
|
|
|
|
2. **장비 관리 API 연동** ✅
|
|
- EquipmentDTO 모델 생성 ✅
|
|
- EquipmentRemoteDataSource 구현 ✅
|
|
- EquipmentService 생성 ✅
|
|
- 장비 목록/상세/입고/출고/수정/삭제/이력 화면 API 연동 ✅
|
|
|
|
3. **회사/사용자 관리 API 연동**
|
|
- CompanyService, UserService 구현
|
|
- 각 화면 API 연동
|
|
|
|
4. **성능 최적화**
|
|
- 캐싱 전략 구현
|
|
- 페이지네이션 및 무한 스크롤
|
|
- 이미지 로딩 최적화
|
|
|
|
#### 3차 작업 (2025-07-24 저녁)
|
|
11. **장비 관리 API 연동 ✅**
|
|
- **DTO 모델 생성**: equipment 관련 모든 DTO 모델 생성 및 Freezed 코드 생성 완료
|
|
- **EquipmentRemoteDataSource 구현**: 10개의 API 엔드포인트 메서드 구현
|
|
- **EquipmentService 구현**: 비즈니스 로직 및 모델 변환 처리
|
|
- **Controller 개선**: ChangeNotifier 패턴 적용, API/Mock 전환 가능
|
|
- **화면 연동**: 장비 목록, 장비 입고 화면 Provider 패턴 적용
|
|
- **DI 등록**: EquipmentRemoteDataSource, EquipmentService 등록
|
|
|
|
12. **무한 스크롤 구현 ✅**
|
|
- 장비 목록 화면에 무한 스크롤 지원 추가
|
|
- ScrollController 리스너를 통한 페이지네이션
|
|
|
|
### 📈 진행률
|
|
- **전체 API 통합**: 100% 완료 ✅
|
|
- **인증 시스템**: 100% 완료
|
|
- **대시보드**: 100% 완료
|
|
- **장비 관리**: 100% 완료 (목록, 입고, 출고, 수정, 삭제, 이력 조회 모두 완료)
|
|
- **회사 관리**: 100% 완료 ✅
|
|
- **사용자 관리**: 100% 완료 ✅
|
|
- **라이선스 관리**: 100% 완료 ✅
|
|
- **창고 관리**: 100% 완료 ✅
|
|
|
|
### 📋 주요 특징
|
|
- **한글 입력**: 모든 API 요청/응답에서 UTF-8 인코딩 적용
|
|
- **사이드 이펙트 방지**: MockDataService와 API 서비스 공존 가능 (Feature Flag)
|
|
- **에러 처리**: 네트워크 오류, 서버 오류, 인증 오류 분리 처리
|
|
- **무한 스크롤**: 대용량 데이터 처리를 위한 페이지네이션
|
|
- **로딩/에러 상태**: 사용자 친화적인 UI 피드백
|
|
|
|
#### 4차 작업 (2025-07-24 밤)
|
|
13. **회사 관리 API 연동 (진행중)**
|
|
- **DTO 모델 생성**: CompanyDto, CompanyListDto, BranchDto 모델 생성 및 Freezed 코드 생성 완료
|
|
- **CompanyRemoteDataSource 구현**: 회사 CRUD 및 지점 관련 API 엔드포인트 메서드 구현
|
|
- **CompanyService 구현**: 비즈니스 로직 및 DTO-Model 변환 처리
|
|
- **DI 등록**: CompanyRemoteDataSource, CompanyService 등록 완료
|
|
- **Controller 준비**: CompanyFormController에 API 사용을 위한 준비 완료 (실제 구현 대기)
|
|
- **미완료**: Controller에서 실제 API 호출 구현, 로딩/에러 상태 관리
|
|
|
|
#### 5차 작업 (2025-07-24 새벽)
|
|
14. **회사 관리 API 연동 완료** ✅
|
|
- **CompanyListController 생성**: ChangeNotifier 패턴으로 회사 목록 관리
|
|
- **CompanyListRedesign 화면 개선**: Provider 패턴 적용, API 연동 완료
|
|
- **무한 스크롤 구현**: 페이지네이션 및 스크롤 기반 데이터 로딩
|
|
- **검색 기능 구현**: 실시간 검색 (디바운싱 적용)
|
|
- **중복 회사명 체크**: API를 통한 실시간 중복 확인
|
|
- **지점 저장 로직**: CompanyFormController에 saveBranch 메서드 추가
|
|
- **에러 처리 및 로딩 상태**: 사용자 친화적인 UI 피드백 구현
|
|
|
|
#### 6차 작업 (2025-07-24)
|
|
15. **회사/지점 관리 API 완전 통합** ✅
|
|
- **DTO 모델 완성**: company_dto.dart, branch_dto.dart, company_list_dto.dart
|
|
- **CompanyRemoteDataSource 완성**:
|
|
- 기본 CRUD + getCompaniesWithBranches, checkDuplicateCompany, searchCompanies, updateCompanyStatus
|
|
- 지점 관리 전체 API 메서드 구현
|
|
- **CompanyService 개선**:
|
|
- @lazySingleton 적용으로 DI 패턴 개선
|
|
- 페이지네이션 응답 처리
|
|
- ApiException 사용으로 일관된 에러 처리
|
|
- **기존 Controller 확인**: CompanyListController, CompanyFormController 모두 API 사용 가능 상태
|
|
- **DI 설정 업데이트**: injection_container.dart에서 의존성 주입 완료
|
|
|
|
#### 7차 작업 (2025-07-24)
|
|
16. **사용자 관리 API 연동 완료** ✅
|
|
- **DTO 모델 생성**: UserDto, UserListDto, CreateUserDto, UpdateUserDto 모델 생성 및 Freezed 코드 생성
|
|
- **UserRemoteDataSource 구현**:
|
|
- 기본 CRUD + changeUserStatus, changePassword, checkDuplicateUsername, searchUsers
|
|
- 페이지네이션, 필터링, 검색 기능 포함
|
|
- **UserService 구현**:
|
|
- @lazySingleton 적용으로 DI 패턴 구현
|
|
- DTO-Model 변환 로직 (role 매핑 처리)
|
|
- 전화번호 변환 로직 (배열 → 단일 문자열)
|
|
- **UserListController 개선**:
|
|
- ChangeNotifier 패턴으로 변경
|
|
- API/Mock 전환 가능한 Feature Flag
|
|
- 무한 스크롤 및 페이지네이션 구현
|
|
- 검색, 필터링 (역할별, 상태별, 회사별) 기능
|
|
- 사용자 상태 변경 기능 구현
|
|
- **user_list_redesign.dart 개선**:
|
|
- Provider 패턴 적용
|
|
- 무한 스크롤 구현 (ScrollController)
|
|
- 실시간 검색 (디바운싱 적용)
|
|
- 상태별 색상 표시 및 상태 변경 다이얼로그
|
|
- **UserFormController 개선**:
|
|
- ChangeNotifier 패턴으로 변경
|
|
- 사용자명 중복 확인 (디바운싱 적용)
|
|
- API를 통한 사용자 생성/수정
|
|
- 비밀번호 처리 (신규: 필수, 수정: 선택)
|
|
- **user_form.dart 개선**:
|
|
- Provider 패턴 적용
|
|
- 사용자명 필드 추가 (실시간 중복 확인)
|
|
- 비밀번호 필드 추가 (신규/수정 모드 구분)
|
|
- 비밀번호 보기/숨기기 토글 기능
|
|
- **DI 설정 완료**: UserRemoteDataSource, UserService 등록
|
|
|
|
#### 8차 작업 (2025-07-24)
|
|
17. **라이선스 관리 API 연동 완료** ✅
|
|
- **DTO 모델 수정**: API 서버 구조에 맞춰 LicenseDto, CreateLicenseRequest, UpdateLicenseRequest 재구성
|
|
- Flutter 모델의 visitCycle을 remark 필드에 저장
|
|
- durationMonths를 purchaseDate/expiryDate로 변환
|
|
- **LicenseRemoteDataSource 구현**:
|
|
- 8개 엔드포인트 구현 (목록, 상세, 생성, 수정, 삭제, 할당, 할당해제, 만료예정)
|
|
- 페이지네이션 및 필터링 파라미터 지원
|
|
- **LicenseService 구현**:
|
|
- @lazySingleton 적용으로 DI 패턴 구현
|
|
- DTO-Model 변환 로직 (방문주기 추출, 기간 계산)
|
|
- 라이선스 할당/해제 기능 구현
|
|
- **LicenseListController 개선**:
|
|
- ChangeNotifier 패턴으로 변경
|
|
- API/Mock 전환 가능한 Feature Flag
|
|
- 무한 스크롤 및 페이지네이션 구현
|
|
- 검색, 필터링 (활성상태, 회사, 타입) 기능
|
|
- 만료 예정 라이선스 조회 기능
|
|
- **LicenseFormController 개선**:
|
|
- ChangeNotifier 패턴으로 변경
|
|
- API를 통한 라이선스 생성/수정
|
|
- 유효성 검사 추가
|
|
- **DI 설정 완료**: LicenseRemoteDataSource, LicenseService 등록
|
|
|
|
18. **창고 관리 API 연동 완료** ✅
|
|
- **DTO 모델 생성**: WarehouseLocationDto, CreateWarehouseLocationRequest, UpdateWarehouseLocationRequest 등
|
|
- 창고 용량 정보 (WarehouseCapacityInfo)
|
|
- 창고별 장비 목록 (WarehouseEquipmentDto)
|
|
- **WarehouseRemoteDataSource 구현**:
|
|
- 8개 엔드포인트 구현 (목록, 상세, 생성, 수정, 삭제, 장비목록, 용량조회, 사용중목록)
|
|
- 페이지네이션 지원
|
|
- **WarehouseService 구현**:
|
|
- @lazySingleton 적용으로 DI 패턴 구현
|
|
- DTO-Model 변환 로직 (주소 정보 매핑)
|
|
- 창고별 장비 및 용량 조회 기능
|
|
- **WarehouseLocationListController 개선**:
|
|
- ChangeNotifier 패턴으로 변경
|
|
- API/Mock 전환 가능한 Feature Flag
|
|
- 무한 스크롤 및 페이지네이션 구현
|
|
- 검색 기능 (이름, 주소)
|
|
- 사용 중인 창고 조회 기능
|
|
- **WarehouseLocationFormController 개선**:
|
|
- ChangeNotifier 패턴으로 변경
|
|
- API를 통한 창고 위치 생성/수정
|
|
- 주소 정보 관리 개선
|
|
- **DI 설정 완료**: WarehouseRemoteDataSource, WarehouseService 등록
|
|
|
|
#### 9차 작업 (2025-07-25)
|
|
19. **라이선스 관리 API 추가 개선**
|
|
- **License 모델 확장**:
|
|
- 기존 단순 모델에서 API 호환 모델로 전면 개편
|
|
- licenseKey, productName, vendor, userCount 등 필드 추가
|
|
- 계산 필드 추가 (daysUntilExpiry, isExpired, status)
|
|
- 기존 코드 호환을 위한 getter 추가 (name, durationMonths, visitCycle)
|
|
- **LicenseService 개선**:
|
|
- 새로운 License 모델에 맞춰 DTO 변환 로직 수정
|
|
- createLicense, updateLicense 메서드 간소화
|
|
- **LicenseListController 추가 개선**:
|
|
- Environment.useApi 사용으로 Feature Flag 개선
|
|
- 검색 디바운싱 추가 (300ms)
|
|
- 정렬 기능 추가 (sortBy, sortOrder)
|
|
- 상태별 라이선스 개수 조회 메서드 추가
|
|
- dispose 메서드 추가 (타이머 정리)
|
|
- **작업 현황**:
|
|
- DTO 모델 생성 ✅
|
|
- RemoteDataSource 구현 ✅
|
|
- Service 구현 ✅
|
|
- DI 설정 ✅
|
|
- Controller 개선 ✅
|
|
- 화면 Provider 패턴 적용 🔲 (다음 작업)
|
|
|
|
---
|
|
|
|
_마지막 업데이트: 2025-07-25_ (라이선스 관리 API 개선 완료. 다음 목표: 화면 Provider 패턴 적용) |