[Project] 여행 기록 앱 만들기 KPT 회고록

오늘은 최종 팀프로젝트가 업데이트를 마무리하고 거의 마무리 되어 KPT 회고를 남겨두려고 한다.

 

Project

Project 설명

여행 기록 기능

 

세부 페이지 기능

 

여행 기록 기능 (My Board)

 

로그인, 회원가입 기능

 

마이페이지 (환경설정)



기술스택

의존성 관리 도구 SPM
형상 관리 도구 GitHub, Git
아키텍처 MVC
디자인 패턴 Singleton, Delegate
인터페이스 UIKit, SwiftUI
레이아웃 구성 SnapKit 5.7.1, Then 3.0.0
내부 저장소 firebase 10.26.0, CoreData, UserDefaults
외부 인증 GoogleSignIn 7.1.0, KakaoOpenSDK 2.22.2
이미지 처리 Kingfisher 7.12.0
코드 스타일 swiftStyleGuide, SwiftAPI
네트워킹 Concurrent , Alamofire

기술적 의사결정

MVC 패턴

  • 효율적인 협업: 각기 다른 부분을 동시에 작업할 수 있어 팀 내 협업이 원활
  • 코드 관리 용이: 각 요소가 독립적으로 기능하여 코드의 가독성과 유지보수성 ⬆️
  • 검증된 패턴 사용: 친숙하고 검증된 패턴을 사용하여 개발 효율성 ⬆️

의존성 관리: SPM(Swift Package Manager)을 사용하여 의존성을 효율적으로 관리

네트워킹: Alamofire로 네트워크 요청 간편 처리, Firebase와의 통합을 통해 실시간 데이터베이스, 인증 기능

UI 구성: SnapKit과 Then을 활용하여 UI 레이아웃을 직관적이고 간편하게 구성

이미지 처리: Kingfisher를 통해 이미지 다운로드 및 캐싱 최적화

외부 인증: GoogleSignIn과 KakaoOpenSDK를 사용하여 다양한 외부 인증 옵션을 제공

보안: 사용자 인증과 데이터 보호를 위해 Firebase와 OAuth를 사용

데이터 저장소: CoreData와 UserDefaults를 활용하여 사용자 데이터를 로컬에 안전하게 저장

반응형 디자인: 다양한 기기에서 최적의 사용자 경험을 제공하기 위해 Auto Layout과 다양한 UI 테스트를 수행 및 수정

여행기록 탐색 / 검색 페이지 발생 이슈

  • 라지 타이틀 이슈 (라지 타이틀에 버튼을 커스텀했는데, 버튼들이 다음 페이지를 따라가는 경우나 라지 타이틀이 한 칸 더 내려오는 이슈. 아주 가끔 발생해서 원인을 파악하지 못함)→ 해결 2 : 로그인 페이지에서 루트뷰컨이 중복 생성되던 문제 → 중복 생성되던 것을 해제해서 해결
  • → 해결 1 : 메인페이지에서 세부페이지 이동 시 present 방식으로 변경
  • 첫 페이지 구성 시 불필요한 모델의 데이터 불러오기로 인해 다량의 메모리 사용
  • → 필요한 데이터만 모아 별도의 모델을 구성하는 모델링 효율화를 통해 메모리 사용량 약 30% 감소

세부 페이지 발생 이슈

  • 프로젝트 진행 중 같은 로직의 구성원 간 다른 구현으로 인해 큰 충돌 발생
    • 회의를 통해 더 효율적인 로직으로 일원화
  • 상세 페이지 내 firebase에 저장된 이미지 호출 시 비동기처리 진행되지 않아 효율성 하락
    • 비동기 처리 진행하여 빠른 데이터 호출 수정
  • 메인 페이지에서 세부페이지 이동 시 메모리가 쌓이는 현상 발생
    • 해당 부분 약한 참조[weak] 사용으로 문제 해결
  • ( 맵 메타데이터 GPS 정보 추출 ) 사용자가 업로드한 사진의 메타데이터 중 gps 데이터를 firebaseStorage에 저장하는 과정에서 gps 데이터가 제거되는 문제
    • firebaseStorage에 저장된 사진이 아닌 이미지 firestore에 이미지 url과 함께 사용자가 이미지 업로 드시 위도/경도 데이터를 별도의 모델을 생성해 저장하고 앱내 맵에서 이미지 확인시 저장된 위도/경도 데이터를 역 지오코딩해서 위치를 보여주는 방식으로 문제 해결

여행 기록 페이지 발생 이슈

  • 지출입력 및 변경 후 UI 업데이트가 되지않거나 혹은 중복되어 보여지는 문제
  • 여러 뷰 컨트롤러 간 데이터 전달 및 UI 업데이트 로직의 복잡성으로 인한 예상치 못한 동작이 발생
  • FirebaseStore에 데이터 업로드 후 뷰 전환없이 즉 데이터 reload 없이 데이터를 삭제하고 새로운 데이터를추가 할 경우 캐싱으로 인해 삭제한 데이터가 다시 살아나는 문제
    • 복잡한 데이터 전달 구조를 순차적으로 확인하고, 적절한 타이밍에 UI 업데이트와 데이터 동기화를 통해 문제 해결

마이페이지 (환경설정)

  • 프로필 이미지 불러오기 실패 이슈
    • 초반에 firebase 다루기가 익숙치 않아 firestore database가 아니라 firebase storage에만 저장되는 로직이여서 로직 변경으로 해결
  • 기본 프로필 이미지 생성 시, 랜덤 배경 색에 닉네임 Label을 추가해서 그 프로필을 캡쳐해서 이미지로 저장하는 방식으로 구현, 설정 순서에 따라서 여러가지 오류 발생
  • 기본 이미지일 경우를 모델로 추가해서 여러가지 오류 해결
  • UI/UX 디자인 시, 사용자 편의성을 많이 고려하지 못하고, 앱의 중점이 불확실한 상태에서 디자인
    • 좋은 의견과 팀원들과의 이야기를 통해 UI를 리뉴얼 (사용자 편의성을 높이고, 앱을 좀 더 생기있게 수정)

로그인, 회원가입 기능

비회원 유저는 앱을 사용하지 못한다는 이유로 리젝 → 비회원 유저도 탐색기능은 사용할 수 있지만 그 외에 기능들은 로그인 할 수 있도록 유도

KPT 회고

Keep

  • 팀원들과 원활하고 치열하게 의사소통을 나눠 프로젝트를 완성해나간 과정
  • 단순 프로젝트가 아닌 비즈니스 모델로 접근했던 과정
  • 예외 상황을 생각해 구현을 완성해 갔던 과정

Problem

  • Massive View Controller로 인한 코드 가독성 저하

Try

  • 지속적인 유지보수
  • 이용자 편의 개선 사항 수정으로 앱 퀄리티 상승
  • 메이트 기능 살려 소셜 네트워크 기능 심화

이 최종프로젝트를 마무리로 모든 과정이 끝이났다. 굉장히 시간이 빠르게 흐른 것 같고 좋은 사람들을 많이 만날 수 있어 너무 행복한 시간이었다.

 

어쩌면 모든걸 내려놓고 내 인생에서 큰 결정을 내려 선택해 들어온 내일배움캠프에서 정말 많은 것을 배우고 치열하게 노력하는 나를 보면서 대견하기도 했다.

 

운이 좋게 모든 과정이 순탄했고 만난 사람마다 나에게 영감을 주고 착하고 앞으로도 계속 보고 싶은 사람들만 만나온 것 같다.

 

같이 해왔던 팀원들 특히 최종프로젝트에서 만난 인연들은 앞으로도 계속 이어나가 각자가 어떻게 살아가는지 지켜보고 얘기를 들어보고 싶다 ㅎㅎ

 

이렇게 힘들었지만 행복했던 모든 과정이 끝이다!!! 이제 시작이다 이제 시작이라는 말이 힘들게 느껴지지 않고 기대로 가득차있는 느낌.. 앞으로 더 힘내서 달려볼 예정이다!