iOS Firebase 연동 테스트 UI 구현 트러블슈팅

호씨·2025년 1월 23일
0

iOS Firebase 연동 테스트 UI 구현 트러블슈팅 🔍

화면 구성 📱

TestPostUploadVC (게시글 작성 화면)

게시글 작성 화면에 다음 기능들을 구현했다:

  • 구인/구직 선택
  • 직무 선택
  • 기술 스택 입력
  • 시급성 선택
  • 아이디어 상황 선택
  • 모집 인원 입력
  • 상황 선택 (온라인/오프라인)
  • 경험 선택 및 설명
  • 제목 및 상세 내용 입력

TestPostVC (게시글 목록 화면)

  • 카드 형태의 게시글 표시
  • 태그, 제목, 내용, 작성자, 날짜 정보 표시
  • 게시글 터치 시 상세화면으로 이동

TestPostDetailVC (게시글 상세 화면)

  • 게시글의 모든 정보 상세 표시
  • 태그들을 시각적으로 구분하여 표시
  • 신고하기 버튼 구현

발생한 문제점들과 해결 방법 💡

Tag 버튼 크기 조절

private func createTagButton(title: String) -> UIButton {
    let button = UIButton()
    button.titleLabel?.font = .systemFont(ofSize: 14) // 폰트 크기 14로 조정
    // ... 나머지 설정
    return button
}

데이터 전달 및 화면 전환 문제

  1. post 데이터는 정상적으로 전달되었으나 화면 전환이 안되는 문제가 발생했다
  2. NavigationController가 nil인 것을 확인했다
  3. 해결방법:
@objc private func testButtonTapped() {
    let testVC = TestPostVC()
    if let navigationController = self.navigationController {
        navigationController.pushViewController(testVC, animated: true)
    } else {
        let navController = UINavigationController(rootViewController: testVC)
        navController.modalPresentationStyle = .fullScreen
        present(navController, animated: true)
    }
}

setupData 타이밍 조정

override func viewDidLoad() {
    super.viewDidLoad()
    setupUI()
    setupNavigationBar()
    if let post = post {
        DispatchQueue.main.async { [weak self] in
            self?.setupData()
        }
    }
}

데이터 모델 구조 📊

struct TestPost: Codable {
    let createdDate: Timestamp?
    let nickName: String
    let positionSearch: String    // "구인" 또는 "구직"
    let position: String          // 직무
    let availableTime: String     // 가능 시간
    let techstack: [String]       // 기술 스택 배열
    let urgencyLevel: String      // 시급성
    let specificity: String       // 아이디어상황
    let recruits: String          // 모집 인원
    let meeting: String           // 협업방식
    let experience: String        // 경험
    let title: String            // 제목
    let detail: String           // 상세 내용
    
    var asDictionary: [String: Any] {
        return [
            "createdDate": FieldValue.serverTimestamp(),
            "nickName": nickName,
            "positionSearch": positionSearch,
            "position": position,
            "availableTime": availableTime,
            "techstack": techstack,
            "urgencyLevel": urgencyLevel,
            "specificity": specificity,
            "recruits": recruits,
            "meeting": meeting,
            "experience": experience,
            "title": title,
            "detail": detail
        ]
    }
}

주요 학습 포인트 📝

  1. NavigationController 설정의 중요성

    • NavigationController가 nil일 때의 대응 방법
    • 화면 전환 시 NavigationController 확인 필요성
  2. 데이터 전달 시점과 UI 업데이트 타이밍 관리

    • DispatchQueue.main.async 사용의 중요성
    • viewDidLoad와 viewWillAppear에서의 데이터 설정 시점
  3. SnapKit을 활용한 레이아웃 구성

    • 스크롤뷰 내부 컨텐츠 레이아웃
    • 동적 크기 조정이 필요한 뷰 처리
  4. Firebase 데이터 모델 설계

    • Codable 프로토콜 활용
    • Timestamp 처리
    • Dictionary 변환
  5. UIStackView를 활용한 태그 버튼 구현

    • 동적 태그 생성
    • 태그 선택 상태 관리
    • 레이아웃 자동 조정

향후 개선사항 🚀

네비게이션 컨트롤러 설정

  • 앱 시작점에서 올바른 NavigationController 설정
  • 화면 전환 로직 통일성 유지

에러 핸들링

  • Firebase 연동 시 발생할 수 있는 에러 처리
  • 네트워크 연결 실패 시 사용자 피드백
  • 데이터 누락 시 기본값 처리

UI/UX 개선

  • 로딩 인디케이터 추가
  • 사용자 피드백 애니메이션
  • 접근성 개선

데이터 관리

  • 캐싱 구현
  • 오프라인 모드 지원
  • 데이터 동기화 개선

성능 최적화

  • 이미지 로딩 최적화
  • 메모리 사용량 관리
  • 배터리 효율성 개선

결론 ✍️

이번 프로젝트를 통해 iOS 앱에서 Firebase를 활용한 데이터 관리와 UI 구현에 대한 실제적인 경험을 얻을 수 있었다. 특히 NavigationController를 통한 화면 전환과 데이터 전달 과정에서 발생할 수 있는 문제점들을 파악하고 해결하는 방법을 학습했다.

향후에는 위에서 언급한 개선사항들을 반영하여 더 안정적이고 사용자 친화적인 앱을 구현할 계획이다. 특히 에러 처리와 성능 최적화에 중점을 두어 개선해 나갈 예정이다.

profile
이것저것 많이 해보고싶은 사람

0개의 댓글

관련 채용 정보