refactor: Clean Architecture 적용 및 코드베이스 전면 리팩토링
## 주요 변경사항 ### 아키텍처 개선 - Clean Architecture 패턴 적용 (Domain, Data, Presentation 레이어 분리) - Use Case 패턴 도입으로 비즈니스 로직 캡슐화 - Repository 패턴으로 데이터 접근 추상화 - 의존성 주입 구조 개선 ### 상태 관리 최적화 - 모든 Controller에서 불필요한 상태 관리 로직 제거 - 페이지네이션 로직 통일 및 간소화 - 에러 처리 로직 개선 (에러 메시지 한글화) - 로딩 상태 관리 최적화 ### Mock 서비스 제거 - MockDataService 완전 제거 - 모든 화면을 실제 API 전용으로 전환 - 불필요한 Mock 관련 코드 정리 ### UI/UX 개선 - Overview 화면 대시보드 기능 강화 - 라이선스 만료 알림 위젯 추가 - 사이드바 네비게이션 개선 - 일관된 UI 컴포넌트 사용 ### 코드 품질 - 중복 코드 제거 및 함수 추출 - 파일별 책임 분리 명확화 - 테스트 코드 업데이트 ## 영향 범위 - 모든 화면의 Controller 리팩토링 - API 통신 레이어 구조 개선 - 에러 처리 및 로깅 시스템 개선 ## 향후 계획 - 단위 테스트 커버리지 확대 - 통합 테스트 시나리오 추가 - 성능 모니터링 도구 통합
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'dart:async';
|
||||
import 'package:superport/core/constants/app_constants.dart';
|
||||
import 'package:superport/models/company_model.dart';
|
||||
import 'package:superport/screens/common/theme_shadcn.dart';
|
||||
import 'package:superport/screens/common/components/shadcn_components.dart';
|
||||
@@ -11,7 +12,7 @@ import 'package:superport/screens/common/widgets/standard_data_table.dart'
|
||||
import 'package:superport/screens/common/widgets/standard_action_bar.dart';
|
||||
import 'package:superport/screens/common/widgets/standard_states.dart';
|
||||
import 'package:superport/screens/common/layouts/base_list_screen.dart';
|
||||
import 'package:superport/services/mock_data_service.dart';
|
||||
// import 'package:superport/services/mock_data_service.dart'; // Mock 서비스 제거
|
||||
import 'package:superport/screens/company/widgets/company_branch_dialog.dart';
|
||||
import 'package:superport/screens/company/controllers/company_list_controller.dart';
|
||||
|
||||
@@ -33,7 +34,7 @@ class _CompanyListRedesignState extends State<CompanyListRedesign> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_controller = CompanyListController(dataService: MockDataService());
|
||||
_controller = CompanyListController();
|
||||
_controller.initializeWithPageSize(_pageSize);
|
||||
}
|
||||
|
||||
@@ -48,11 +49,11 @@ class _CompanyListRedesignState extends State<CompanyListRedesign> {
|
||||
/// 검색어 입력 처리 (디바운싱)
|
||||
void _onSearchChanged(String value) {
|
||||
_debounceTimer?.cancel();
|
||||
_debounceTimer = Timer(const Duration(milliseconds: 500), () {
|
||||
_debounceTimer = Timer(AppConstants.searchDebounce, () {
|
||||
setState(() {
|
||||
_currentPage = 1;
|
||||
});
|
||||
_controller.updateSearchKeyword(value);
|
||||
_controller.search(value);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -80,12 +81,13 @@ class _CompanyListRedesignState extends State<CompanyListRedesign> {
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
Navigator.pop(context);
|
||||
final success = await _controller.deleteCompany(id);
|
||||
if (!success) {
|
||||
try {
|
||||
await _controller.deleteCompany(id);
|
||||
} catch (e) {
|
||||
if (mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(_controller.error ?? '삭제에 실패했습니다'),
|
||||
content: Text(e.toString()),
|
||||
backgroundColor: Colors.red,
|
||||
),
|
||||
);
|
||||
@@ -268,7 +270,7 @@ class _CompanyListRedesignState extends State<CompanyListRedesign> {
|
||||
error: controller.error,
|
||||
onRefresh: controller.refresh,
|
||||
emptyMessage:
|
||||
controller.searchKeyword.isNotEmpty
|
||||
controller.searchQuery.isNotEmpty
|
||||
? '검색 결과가 없습니다'
|
||||
: '등록된 회사가 없습니다',
|
||||
emptyIcon: Icons.business_outlined,
|
||||
@@ -279,7 +281,7 @@ class _CompanyListRedesignState extends State<CompanyListRedesign> {
|
||||
placeholder: '회사명, 담당자명, 연락처로 검색',
|
||||
onChanged: _onSearchChanged, // 실시간 검색 (디바운싱)
|
||||
onSearch:
|
||||
() => _controller.updateSearchKeyword(
|
||||
() => _controller.search(
|
||||
_searchController.text,
|
||||
), // 즉시 검색
|
||||
onClear: () {
|
||||
@@ -298,8 +300,8 @@ class _CompanyListRedesignState extends State<CompanyListRedesign> {
|
||||
totalCount: totalCount,
|
||||
onRefresh: controller.refresh,
|
||||
statusMessage:
|
||||
controller.searchKeyword.isNotEmpty
|
||||
? '"${controller.searchKeyword}" 검색 결과'
|
||||
controller.searchQuery.isNotEmpty
|
||||
? '"${controller.searchQuery}" 검색 결과'
|
||||
: null,
|
||||
),
|
||||
|
||||
@@ -319,12 +321,12 @@ class _CompanyListRedesignState extends State<CompanyListRedesign> {
|
||||
displayCompanies.isEmpty
|
||||
? StandardEmptyState(
|
||||
title:
|
||||
controller.searchKeyword.isNotEmpty
|
||||
controller.searchQuery.isNotEmpty
|
||||
? '검색 결과가 없습니다'
|
||||
: '등록된 회사가 없습니다',
|
||||
icon: Icons.business_outlined,
|
||||
action:
|
||||
controller.searchKeyword.isEmpty
|
||||
controller.searchQuery.isEmpty
|
||||
? StandardActionButtons.addButton(
|
||||
text: '첫 회사 추가하기',
|
||||
onPressed: _navigateToAddScreen,
|
||||
|
||||
Reference in New Issue
Block a user