2022.04 ~ 2022.09 (6개월) | 국비지원 교육 수료 (JAVA, Spring & Kotlin 기초 프로젝트 진행) |
---|---|
2022.09 ~ 2024.04 (1년 6개월) | ㈜리안 개발자 (React Native + Node.js 기반 서비스 개발 및 유지보수) |
2024.04 ~ 현재 (2년차) | iOS 앱 개발 및 배포, 업데이트 (총 5개 앱 App Store 등록) |
SwiftUI
,UIKit
,RxSwift
, RestfulAPI
, Swift Concurrency
, Web Socket
노드 겹침 문제
서버에서 수신한 노드를 랜덤 배치하는 과정에서 기존 노드와 겹치는 문제 발생.
→ CGRect
배열로 배치 후보 영역 추적 후, intersects
및 contains(where:)
로 충돌 여부를 판별하여 안전한 위치에 배치.
'Cannot find 'present' in scope'
오류
U특정 노드를 탭했을 때 UIView
인 상세 화면을 present
로 나타내는 과정에서 오류 발생.
→ ViewController
인스턴스를 UIView
참조로 전달 후 viewController?.present()
형태로 호출.
서버 응답 JSON 제네릭 타입 디코딩 문제
서버 응답을 제네릭 타입으로 디코딩하는 과정에서 Swift의 Decodable
제약으로 인해 타입 추론 오류 발생.
→ 데이터 모델을 명시적으로 작성하여 디코딩이 가능하도록 수정하였고 서버에서도 데이터 모델 구조에 맞추어 재구조화하여 응답.
테스트 불가능한 구조 문제
ViewModel 내부에서 API 호출과 로컬 데이터 접근을 모두 처리하며 단위 테스트 불가능한 구조였음.
→ 클린 아키텍처 기반으로 UseCase
, Repository
, DataSource
계층을 분리하여 책임을 명확히 나누고 모든 계층이 의존성 주입 기반으로 설계되도록 구조를 리팩토링함.
MVVM + 클린 아키텍처 도입을 통한 코드 리팩토링
View와 로직 간 결합도가 높아 테스트가 어려웠고, 재사용성 확보를 위해 MVVM 구조로 리팩토링.
이후 UseCase
를 도입해 도메인 로직을 명확히 분리했고, Repository
프로토콜을 통해 의존성도 제거함.
RepositoryImpl
에서 Local/RemoteDataSource
를 조합하고, 각각은 테스트 가능한 인터페이스로 분리
→ 구조 분리로 인해 API 로직 테스트, 캐싱 로직 교체 등 모든 기능 단위 테스트가 가능해짐
Divider 커스텀뷰를 자체 라이브러리 제작.
→ Divider 커스텀 뷰를 자체 라이브러리로 제작하여 GitHub에 공개하고, 이를 SwifterSwift 오픈소스에도 기여함.
초기에는 앱 실행 시마다 서버에 데이터를 요청하는 구조로 인해 과도한 API 호출과 느린 초기 로딩 문제가 발생함.
→ 응답된 데이터를 JSONEncoder + FileManager
로 캐싱, 변경 여부가 있을 때만 서버에서 다시 요청하는 로직으로 개선.
API 호출량을 60% 감소시키고 UX 품질을 향상시킴. (Xcode Instruments 기준 2.3초 → 1.2초)
View 진입 시 체감 속도 개선
→ Core Animation
을 적용하여 화면 전환 체감 속도 30% 향상.
시각적 복잡성 부정적 피드백 대응
앱 소개글에 68%의 유저가 시각적으로 복잡하다는 피드백.
→ 관계선의 색상과 굵기를 조절하여 시각적 부담을 줄이고 가독성 개선.
UIKit
, RxSwfit
, Core Animation
, SnapKit
, URLSession
MVVM
, 클린 아키텍처
Notion API
Node.js + Express