Skip to content

Studing-Team/Studing-iOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

스튜딩 - 학생회와 함께 만들어가는 대학생활 필수 앱

스튜딩은 학생회 운영을 돕기 위해 만든 서비스입니다.
헌신하고, 봉사하고, 가치로운 일을 하고픈 학생회 여러분들의 꿈을
스튜딩이 함께 이루겠습니다!


🗓️ 프로젝트 일정

  • 2025.01 ~ 2025.03 - 1차 스프린트 기능 추가 (푸쉬 알림, 공지사항 수정 & 삭제, 선착순 이벤트, 이미지 확대 기능 )
  • 2024.09 ~ 2024.12 - UI 설계
  • 2024.08 ~ 2024.09 - 기획, 디자인 및 프로젝트 초기 설정

**Studing UI 및 핵심 플로우**

Studing UI 및 핵심 플로우


1차 스프린트

1. 상속 기반의 모달에서 Composition 패턴을 도입한 모달로 변경


기존 Custom 모달의 경우 상속을 기반으로 BaseSheetViewController 는 공통적인 컨텐츠 레이아웃, Single & DoubleButtonSheetViewController 는 하단 버튼의 개수에 따른 클래스를 구현했습니다. 시간이 지나면서 몇 가지 한계가 눈에 띄었습니다. 버튼 개수나 콘텐츠가 달라질 때마다 새로운 서브클래스를 만들어야 했기 때문에 클래스가 점점 늘어나면서 관리하기가 점점 어려워졌습니다.


공통 레이아웃을 상속으로 처리했지만 버튼 설정이나 스타일 조정 같은 부분이 각 모달마다 반복되다 보니 코드 중복도 피할 수 없었습니다. 상속 구조 자체가 버튼 위치를 바꾸거나 새로운 UI 요구사항이 생겼을 때 빠르게 대응하기 힘들 정도로 유연성이 부족했고 모달의 UI와 동작이 강하게 결합되어 있어 테스트하거나 수정할 때도 복잡함을 느꼈습니다.


이런 문제를 해결하고자 대안을 찾아보던 중, Composition 패턴을 발견하게 되었습니다. 이 패턴은 개별 컴포넌트를 독립적으로 설계한 뒤 이를 조합해서 전체 모달을 구성하는 방식으로 상속보다 훨씬 유연하고 재사용성이 높다는 점이 매력적이었습니다. 그래서 SheetContentConfigurableSheetButtonsConfigurable 프로토콜을 만들어 콘텐츠와 버튼을 분리하고 BaseSheetViewController에서 이들을 동적으로 조합하도록 리팩토링했습니다. 결과적으로 버튼 개수나 콘텐츠 종류에 상관없이 한 클래스로 다양한 모달을 처리할 수 있게 되었고 유지보수성을 개선할 수 있었습니다.


🔗 [Feat] #56 - 1차 스프린트 관련 QA 반영


2. 푸시 알림 딥링크 처리 - Coordinator 기반


활성화된 코디네이터와 대기 중인 딥링크를 일관되게 관리하고 푸시 알림은 앱이 종료된 상태에서도 발생할 수 있어 코디네이터 초기화 타이밍과 관계없이 데이터를 안전하게 처리할 수 있는 전역 인스턴스가 필요했습니다. 이는 코디네이터가 초기화되지 않은 상황에서 호출되면서 지속적으로 에러가 발생되어 데이터가 손실되거나 사용자 경험이 저하되는 문제가 발생하기 때문에 흐름을 보장하기 위해 DeepLinkNavigator 를 싱글톤으로 설계했습니다.


딥링크 처리는 앱 전역에서 발생하는 이벤트이기 때문에 모든 코디네이터와 뷰 컨트롤러가 공유해야 하는 공통 상태를 관리해야합니다. 앱 전체적으로 중앙에서 관리하도록 통합하여 코디네이터 초기화 타이밍과 관계없이 안정적으로 처리할 수 있게 되었습니다. 싱글톤의 단점(테스트 어려움, 메모리 유지)은 있지만 DeepLinkCoordinator 프로토콜과 함께 설계했기 때문에 단위 테스트에서 Mock DeepLinkNavigator를 구현하거나 테스트용 싱글톤 인스턴스를 제공해 테스트를 용이하게 설계 했습니다.


또한 Coordinator 패턴과 자연스럽게 통합하기 위해 DeepLinkCoordinator 프로토콜을 정의해 딥링크 처리를 할 수 있게 구현했습니다. 이 프로토콜은 navigate(to: data:)coordinatorType() 메서드를 포함해 각 코디네이터가 딥링크 목적지(DeepLinkDestination)로 이동할 수 있는 로직을 추상화합니다. 새로운 딥링크 목적지나 화면 전환 로직을 추가할 때, DeepLinkCoordinator 를 구현한 코디네이터를 쉽게 확장하거나 기존 코디네이터를 조정해 적용할 수 있어, 유지보수성과 확장성을 크게 향상시켰습니다.


🔗 [Feat] #50 - 푸시 알람 딥링크 로직 구현


💻 Development Environment

Xcode iOS


📦 Using Libraries

Library Description Dependency
Firebase 실시간 푸시 알림을 구현하여 사용자와의 즉각적인 상호작용을 지원합니다 SPM
Alamofire RESTful API 호출을 간소화하고 Endpoint 구조와 결합해 네트워크 로직을 최적화합니다 SPM
Amplitude-Swift 사용자 행동 분석을 통해 데이터 기반의 앱 개선을 가능하게 합니다 SPM
NMapsMap 네이버 지도 SDK를 활용해 고성능 지도 기능과 위치 기반 서비스를 제공합니다 SPM
SnapKit AutoLayout을 코드 기반으로 간결하게 설정하며 UI 개발 생산성을 높입니다 SPM
Then 클로저 기반 인스턴스 초기화를 지원해 코드 가독성과 간결함을 개선합니다 SPM

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages