203 lines
7.0 KiB
Markdown
203 lines
7.0 KiB
Markdown
# Git 이슈 트래킹 시스템 설정
|
|
|
|
## 개요
|
|
|
|
Zellyy Finance 모바일 앱 개발 과정에서 발생하는 다양한 이슈를 체계적으로 관리하기 위해 Gitea 기반의 이슈 트래킹 시스템을 설정했습니다. 이 문서는 이슈 트래킹 시스템의 설정 과정과 사용 방법을 설명합니다.
|
|
|
|
## 설정 과정
|
|
|
|
### 1. Gitea 저장소 연결
|
|
|
|
- 저장소 URL: https://gitea.ism.kr/ZELLYY/Zellyy_Finance.git
|
|
- 저장소 상태: 정상 연결됨
|
|
|
|
### 2. API 토큰 생성
|
|
|
|
Gitea API를 사용하여 이슈를 관리하기 위해 API 토큰을 생성했습니다.
|
|
|
|
1. Gitea 웹사이트(https://gitea.ism.kr)에 로그인
|
|
2. 사용자 설정 > 애플리케이션 > 액세스 토큰 생성
|
|
3. 토큰 이름 입력 및 권한 설정:
|
|
- repo: 저장소에 대한 전체 접근 권한
|
|
- issue: 이슈 관리 권한
|
|
- write:repository: 저장소 쓰기 권한
|
|
4. 토큰 생성 및 안전한 장소에 저장
|
|
|
|
### 3. 이슈 등록
|
|
|
|
API를 통해 다음과 같은 이슈들을 등록했습니다:
|
|
|
|
1. ConnectivityProvider 클래스의 getter 이름 불일치
|
|
2. SyncOperationType enum의 switch 문 불완전 처리
|
|
3. UserModel 생성 시 타입 불일치
|
|
4. 오프라인 모드 및 테스트 모드 안정화
|
|
|
|
## 이슈 목록
|
|
|
|
### 이슈 1: ConnectivityProvider 클래스의 getter 이름 불일치
|
|
|
|
#### 문제 설명
|
|
앱 실행 시 `ConnectivityProvider` 클래스의 `isConnected` getter를 찾을 수 없다는 오류가 발생했습니다.
|
|
|
|
#### 오류 메시지
|
|
```
|
|
Error (Xcode): lib/screens/home_screen.dart:178:50: Error: The getter 'isConnected' isn't defined for the class 'ConnectivityProvider'.
|
|
```
|
|
|
|
#### 원인 분석
|
|
`ConnectivityProvider` 클래스에는 `isConnected` getter가 없고 대신 `isOnline` getter가 정의되어 있었습니다.
|
|
|
|
#### 해결 방법
|
|
`home_screen.dart`와 `settings_screen.dart` 파일에서 `isConnected` 대신 `isOnline`을 사용하도록 수정했습니다.
|
|
|
|
#### 코드 변경
|
|
```dart
|
|
// 변경 전
|
|
final bool isOffline = !connectivityProvider.isConnected;
|
|
|
|
// 변경 후
|
|
final bool isOffline = !connectivityProvider.isOnline;
|
|
```
|
|
|
|
### 이슈 2: SyncOperationType enum의 switch 문 불완전 처리
|
|
|
|
#### 문제 설명
|
|
앱 빌드 시 `SyncOperationType` enum의 모든 케이스를 처리하지 않는다는 오류가 발생했습니다.
|
|
|
|
#### 오류 메시지
|
|
```
|
|
Error (Xcode): lib/screens/sync_status_screen.dart:294:23: Error: The type 'SyncOperationType' is not exhaustively matched by the switch cases since it doesn't match 'SyncOperationType.register'.
|
|
```
|
|
|
|
#### 원인 분석
|
|
`SyncOperationType` enum에 `register`와 `login` 타입이 추가되었지만, 여러 파일의 switch 문에서 이 케이스들을 처리하지 않고 있었습니다.
|
|
|
|
#### 해결 방법
|
|
다음 파일들의 switch 문에 `register`와 `login` 케이스를 추가했습니다:
|
|
- `sync_status_screen.dart`
|
|
- `api_service.dart`
|
|
- `sync_status_widget.dart`
|
|
|
|
#### 코드 변경
|
|
```dart
|
|
// 추가된 케이스
|
|
case SyncOperationType.register:
|
|
operationType = '회원가입';
|
|
break;
|
|
case SyncOperationType.login:
|
|
operationType = '로그인';
|
|
break;
|
|
```
|
|
|
|
### 이슈 3: UserModel 생성 시 타입 불일치
|
|
|
|
#### 문제 설명
|
|
앱 빌드 시 String 타입의 값을 DateTime 타입의 매개변수에 할당하려고 시도하는 오류가 발생했습니다.
|
|
|
|
#### 오류 메시지
|
|
```
|
|
Error (Xcode): lib/services/auth_service.dart:73:37: Error: The argument type 'String' can't be assigned to the parameter type 'DateTime'.
|
|
```
|
|
|
|
#### 원인 분석
|
|
`auth_service.dart` 파일에서 `UserModel`을 생성할 때 `createdAt`과 `updatedAt` 필드에 String 타입의 값(`DateTime.now().toIso8601String()`)을 전달하고 있었지만, `UserModel` 클래스에서는 이 필드들이 DateTime 타입으로 정의되어 있었습니다.
|
|
|
|
#### 해결 방법
|
|
`auth_service.dart` 파일에서 `createdAt`과 `updatedAt` 필드를 String 대신 DateTime 객체로 전달하도록 수정했습니다.
|
|
|
|
#### 코드 변경
|
|
```dart
|
|
// 변경 전
|
|
createdAt: DateTime.now().toIso8601String(),
|
|
updatedAt: DateTime.now().toIso8601String(),
|
|
|
|
// 변경 후
|
|
createdAt: DateTime.now(),
|
|
updatedAt: DateTime.now(),
|
|
```
|
|
|
|
### 이슈 4: 오프라인 모드 및 테스트 모드 안정화
|
|
|
|
#### 기능 설명
|
|
앱의 오프라인 모드와 테스트 모드 기능을 안정화하여 네트워크 연결 없이도 앱을 사용할 수 있도록 했습니다.
|
|
|
|
#### 구현 내용
|
|
1. 인증 관련 개선:
|
|
- 회원가입 및 로그인 메서드에 테스트 모드 추가
|
|
- 오프라인 상태에서도 로그인/회원가입 가능하도록 구현
|
|
- 서버 오류 발생 시 자동으로 테스트 모드로 전환되는 기능 추가
|
|
|
|
2. 로컬 데이터베이스 개선:
|
|
- 사용자 정보 저장 및 조회 기능 추가
|
|
- 이메일 기반 사용자 검색 기능 구현
|
|
- Hive 초기화 과정에 users 박스 등록
|
|
|
|
3. 동기화 큐 서비스 개선:
|
|
- 회원가입 및 로그인 작업을 동기화 큐에 추가하는 기능 구현
|
|
- 온라인 상태가 되면 자동으로 동기화되는 메커니즘 구현
|
|
|
|
4. 모델 클래스 수정:
|
|
- UserModel의 id 필드 타입을 int에서 String으로 변경하여 테스트 모드 지원
|
|
- Hive 어댑터 추가 및 등록
|
|
|
|
#### 주요 수정 파일
|
|
- `/mobile/lib/services/api_service.dart`
|
|
- `/mobile/lib/services/auth_service.dart`
|
|
- `/mobile/lib/services/local_database_service.dart`
|
|
- `/mobile/lib/services/sync_queue_service.dart`
|
|
- `/mobile/lib/models/user_model.dart`
|
|
- `/mobile/lib/main.dart`
|
|
|
|
## API를 통한 이슈 관리 방법
|
|
|
|
### 이슈 조회
|
|
|
|
```bash
|
|
curl -X GET "https://gitea.ism.kr/api/v1/repos/ZELLYY/Zellyy_Finance/issues" \
|
|
-H "Authorization: token YOUR_ACCESS_TOKEN"
|
|
```
|
|
|
|
### 이슈 생성
|
|
|
|
```bash
|
|
curl -X POST "https://gitea.ism.kr/api/v1/repos/ZELLYY/Zellyy_Finance/issues" \
|
|
-H "Authorization: token YOUR_ACCESS_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"title": "이슈 제목", "body": "이슈 내용"}'
|
|
```
|
|
|
|
### 이슈 수정
|
|
|
|
```bash
|
|
curl -X PATCH "https://gitea.ism.kr/api/v1/repos/ZELLYY/Zellyy_Finance/issues/{issue_id}" \
|
|
-H "Authorization: token YOUR_ACCESS_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"title": "수정된 이슈 제목", "body": "수정된 이슈 내용", "state": "closed"}'
|
|
```
|
|
|
|
### 이슈 댓글 추가
|
|
|
|
```bash
|
|
curl -X POST "https://gitea.ism.kr/api/v1/repos/ZELLYY/Zellyy_Finance/issues/{issue_id}/comments" \
|
|
-H "Authorization: token YOUR_ACCESS_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"body": "댓글 내용"}'
|
|
```
|
|
|
|
## 웹 인터페이스를 통한 이슈 관리
|
|
|
|
Gitea 웹 인터페이스를 통해 이슈를 관리할 수도 있습니다:
|
|
|
|
1. 웹 브라우저에서 https://gitea.ism.kr/ZELLYY/Zellyy_Finance/issues 접속
|
|
2. 이슈 목록 확인 및 관리
|
|
3. 이슈에 라벨, 담당자, 마일스톤 설정
|
|
4. 이슈 상태 변경 (열림/닫힘)
|
|
5. 이슈에 댓글 추가
|
|
|
|
## 향후 계획
|
|
|
|
1. 이슈 라벨 체계 구축 (버그, 기능 요청, 개선 등)
|
|
2. 마일스톤 설정을 통한 릴리스 계획 관리
|
|
3. 자동화된 이슈 보고 시스템 구축
|
|
4. 이슈와 커밋 연동을 통한 변경 사항 추적 개선
|