1. 사용자 입력 관련 예외
- 입력값 유효성 검증 실패
- 텍스트 필드가 비어 있을 때.
- 단어장 이름, 단어, 뜻 등 필수 입력값이 빠졌을 때.
- 너무 긴 문자열을 입력했을 때 (제한 필요).
- 잘못된 형식의 입력
- 특수문자나 숫자가 포함된 단어 입력.
- 유효하지 않은 언어 선택.
해결 방법
- 입력값을 검증하고, 유효하지 않을 경우 알림창을 표시하거나 저장/확인 버튼 비활성화.
- 예를 들어, 단어장이름 텍스트 필드가 비어있으면 저장 버튼을 막는다.
2. UI 관련 예외
- 뷰 레이아웃 문제
SnapKit
제약 조건이 제대로 설정되지 않아서 UI가 깨질 경우.
- 버튼이나 제스처가 비정상적으로 동작
UIButton
에 잘못된 태그가 할당되어 의도하지 않은 언어가 선택되는 경우.
- 제스처가 잘못 연결되거나 동일한 이벤트가 여러 번 발생하는 경우.
해결 방법
UIButton
이나 제스처에 잘못된 데이터를 처리하지 않도록 방어 코드를 작성.
- UI를 테스트하며 레이아웃 충돌을 방지.
3. 네트워크 또는 데이터 작업 관련 예외
- 네트워크 요청 실패
- 단어 번역 검색(
fetchTranslation
)이 실패할 때.
- 서버 응답 지연, 인터넷 연결 끊김 등의 상황.
- 데이터베이스 오류
- CoreData에서 데이터를 저장하거나 가져오는 중 실패.
- 저장 시 중복 데이터가 발생하거나 불완전한 데이터가 저장됨.
해결 방법
- 네트워크 요청 실패 시 사용자에게 알림을 띄우고, 재시도 버튼을 제공.
- CoreData 작업 중 오류가 발생하면 기본 오류 메시지를 출력하고 로그를 남김.
4. RxSwift 관련 예외
- Observable 에러
Observable
체인에서 에러가 발생했을 때 적절히 처리하지 않음.
disposeBag
누락으로 메모리 누수가 발생.
- binding 에러
bind
나 subscribe
시 nil 값으로 인한 크래시.
해결 방법
- Rx 체인에서
.catch
또는 .catchAndReturn
을 추가해 에러를 캐치.
disposed(by: disposeBag)
를 빠뜨리지 않고 항상 추가.
5. 모달 동작 관련 예외
- 초기화되지 않은 상태에서 모달 작동
- 모달이 열리기 전에 뷰모델 데이터가 설정되지 않은 경우.
- 모달 닫기 실패
- 모달 뷰가 화면에 남아있거나 dismiss가 제대로 호출되지 않음.
해결 방법
- 모달이 열리기 전에 필요한 데이터를 준비하고 초기화.
- 모달 닫기 액션(
dismiss
)이 항상 호출되도록 방어 로직 추가.
6. 기타 논리적 예외
- 잘못된 상태에서 액션 수행
- 선택되지 않은 단어장 상태에서 단어 저장을 시도.
- 이미 선택된 언어를 다시 선택할 때 중복 처리.
- 메모리 누수
RxSwift
를 사용하는 경우 weak self
를 사용하지 않아 순환 참조가 발생.
해결 방법
- 모든 상태를 검증하여 의도하지 않은 동작을 방지.
- 클로저에서
weak self
를 사용해 메모리 관리.
7. 예외 처리 전략
예외 상황별로 처리 방안을 통합적으로 관리하기 위해 다음을 활용할 수 있다:
- Alert 표시
- 문제가 발생하면 사용자에게 명확한 메시지와 함께 알림을 표시.
- 로깅
- 개발 중에는
print
나 로깅 라이브러리(Sentry 등)를 사용해 예외를 추적.
- 기본값 사용
- UI 비활성화
- 입력값이 부족하거나 잘못된 경우 버튼을 비활성화.