# 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. 이슈와 커밋 연동을 통한 변경 사항 추적 개선
