달콤로그는 빵, 케이크 등 빵을 좋아하는 사람들이 후기를 공유하고 소통할 수 있는 베이커리 커뮤니티 앱입니다.
- 개발 인원: iOS 1인 개발
- 개발 기간: 3주 (2024.04.11 ~ 2024.05.05)
- 개발 환경: 최소 버전 iOS 16.0 / 세로 모드 / 아이폰용
- 인증 | 회원가입, 이메일 중복 확인, 로그인, 로그아웃, 탈퇴
- 후기, 판매 게시물 | 작성, 조회, 수정, 삭제, 결제, 좋아요, 댓글 작성
- 태그 조회
- 지도 | 베이커리 탐색, 상세 정보 조회, 리뷰 조회, 전화걸기
- 프로필 | 프로필 조회, 게시물, 좋아요한 게시물 조회, 팔로우, 팔로잉, 결제 내역
- 채팅
- 설정 | 결제 내역 조회
| 이메일 중복 체크 | 유효성 검사 | 회원가입 | 로그인 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 프로필 수정 | 게시물•좋아요 | 팔로우•팔로우취소 | 팔로우•팔로잉 화면 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 커뮤니티(무한스크롤) | 태그 검색 | 결제 | 장소 검색 | 무한 스크롤 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
| 후기 작성 | 새로고침 | 후기 수정 | 후기 삭제 | 좋아요 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
| 댓글 작성 | 댓글 삭제 | 위치 상세 화면 |
|---|---|---|
![]() |
![]() |
![]() |
| 장소 검색 | 현재 지도에서 탐색 | 클러스터링 | 베이커리 상세화면 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 리뷰 | 전화걸기 |
|---|---|
![]() |
![]() |
| 채팅방 리스트 | 채팅 |
|---|---|
![]() |
![]() |
Framework - UIKit
Pattern - Router / Delegate / Singleton / MVVM
Network - Alamofire / Codable / Socket.iO
ReactiveProgramming - RxSwift / RxDataSources
Code-Based UI - SnapKit / CompositionalLayout / MapKit
OpenSource - TabMan, FloatingPanel, Kingfisher, Toast
Etc - iamport-iOS
- MVVM 디자인 패턴을 적용하여 뷰와 비즈니스 로직을 분리
- Input / Output 패턴을 활용해 뷰모델의 입력과 출력을 명확하게 분리
- protocol을 통해 ViewModel에서 사용되는 기본 구현을 제공
- Alamofire에 Router 패턴과 Generic을 통해 네트워크 통신의 구조화 및 확장성 있는 네트워킹 구현
- Alamofire RequestInterceptor를 활용한 accessToken 갱신 구현 JWT
- multipart-form을 활용해 이미지를 서버에 전송
- RxSwift을 활용하여 반응적인 비동기 처리 구현
- 네트워크 요청에 대한 응답을 Single<Result<>> 타입으로 반환함으로써 명시적이고 간결하게 상태 처리
- RxDataSource를 활용하여 유연하고 확장 가능한 데이터 관리 구성
- ClusterAnnotationView를 구현하여 검색된 장소 클러스터링 구현
- CompositionalLayout을 통해 Self-Sizing Cell 구현
- url에 대한 메타데이터를 추출하여 LinkPresentation으로 표현
- 후기 조회, 태그 검색에서 커서 기반 페이지네이션을 적용하여 뷰에 보여지는 만큼의 리소스만 요청
- 공통적인 디자인의 뷰를 재사용하기 위해 커스텀 뷰로 구성
- 이미지 및 컬러 등 반복적으로 사용되는 에셋을 enum을 통해 네임스페이스화하여 관리
- NotificationCenter를 활용해 다른 계층에 있는 뷰에 데이터 갱신
- viewModelType protocol을 구현하여 셀에 공통적으로 사용되는 identifier, ViewModel에 Input-Output 패턴을 를 사용하도록 구성
- NetworkMonitor를 통해 네트워크 단절 상황 대응
- PG 결제 시스템 연동 및 영수증 검증 로직 구현
- 셀 재사용 시 이미지가 다른 포스트의 이미지로 나오는 문제 원인
- prepareForReuse 메서드에서 StackView의 인스턴스를 생성하고 있지만, 이 때 StackView의 하위 뷰들이 제거되지 않고 남아있어 꼬이는 상황 해결
- imageStackView = UIStackView가 아닌 서브뷰를 제거하여 해결
override func prepareForReuse() {
super.prepareForReuse()
imageStackView.arrangedSubviews.forEach {
$0.removeFromSuperview()
}
}
- Sever와 통신하면서 발생하는 공통적인 에러에 대한 처리




























