0Hooni DevLog

[SwiftUI] PhotosPicker로 사진 추가 기능을 구현하자 - Transferable 프로토콜 이해하기

후배와 함께 진행하는 프로젝트 중 사용자 프로필 설정 화면을 만들면서 사진을 추가하거나 제거하는 기능을 구현해야 하는 일이 있었습니다. SwiftUI를 최대한 활용하는 것이 목적이었기에, 대다수의 레퍼런스에서 사용되는 ImagePicker를 래핑하는 방식을 지양하고자 했습니다. 그래서 이를 대체하기 위해 iOS 16부터 지원되는 PhotosPick...

[Swift] 모듈화를 통해 물리적으로 3-Layer 분리하기

팝풀 프로젝트에서는 MVVM 기반으로 시작했지만, ViewModel이 점점 복잡해지고 로직이 뭉치면서 유지보수가 어려워지고 있었다. 이를 개선하기 위해 클린 아키텍처의 개념을 도입했지만, 실제로는 논리적으로만 레이어를 구분했을 뿐, 물리적인 분리 없이 코드가 뒤엉켜 있었다. 이로 인해 팀원들이 의존성 방향을 인지하지 못하고 코드를 작성하면서 결합도...

[Swift] PropertyWrapper를 이용한 DIContainer 만들기 - Layer간 의존성 흐름 개선하기

지금 참여하고 있는 프로젝트에서 3-layer 클린 아키텍처를 도입하고 있었다.   하지만 논리적으로만 분리되어 있다 보니, 실제 구현에서는 ViewModel이 UseCase나 Repository 같은 구체 타입을 직접 의존하는 구조가 많았다. ViewModel에서 구체 구현체를 직접 생성하거나 의존하다 보니 Presentation → Domain...

[Swift] GitHub Actions를 이용한 TestFlight 배포 자동화 - 팀 개발자의 CD 구축

팝풀 프로젝트에서 첫 배포를 마친 뒤, 본격적으로 차기 버전을 준비하면서 배포 과정을 자동화하고 싶다는 생각이 들었다. 생각의 시작은 단순했다. 빌드하고, 추출하고, 올리고… 배포까지는 수작업이 너무 많았다. 특히 애자일하게 자주 빌드하고 테스트해야 하는 상황에서는 이런 반복 작업이 흐름을 끊기게 만들고, 팀의 개발 시간도 계속 뺏길 수 있다 생각...

[Xcode] SPM Package Resolution Failed 에러 해결하기

최근에 패키지를 설치하거나 제거하는 일이 몇번 있었는데 그럴때마다 Package Resolution Failed에러가 지속적으로 발생했다. 나한테 왜그래~~ 저기서 Add Anyway를 선택하면 어떻게든 설치는 된다 문제는 몇몇 패키지의 경우 선택해서 설치할 수 있는데 그걸 못한다는 것이다. 이번 포스팅을 통해 해당 문제를 해결했던 과정을 ...

[SwiftUI] TCA 아키텍처를 ALABOZA

예전에 SwiftUI 아키텍처에 대한 학습을 하다가 우연히 TCA를 알게 된 일이 있었다. 간단하게 설명하자면 SwiftUI는 이미 MVVM 구조로 구성이 되어있기에, 여기에 MVVM을 적용하는 것은 날 수 있는 스케이트보드에 바퀴를 달아준 모양이라나. 어느정도 공감이 되긴 했는데… 지금 생각해보면 사실 아키텍처 패턴이란 단순 코드의 흐름을 잡아...

[Swift] Swiftlint 자동 수정 자동화 - 팝풀 CI 적용기

처음 팀에 들어오고 가장 먼저 맡았던 일은 코드 리뷰였다. 당시 팀은 전반적인 리팩토링을 원하고 있었기에, 프로젝트가 어떤 구조로 되어 있는지, 어떤 부분을 개선해야 할지 꼼꼼히 살펴보려 노력했다. 그런데… 후… 코드 스타일이 이렇게 중요하다는 걸 실감한 건 그 리뷰 과정을 거치면서였다. 클래스는 잘 나눠져 있고 기능도 나쁘지 않았지만, 들여쓰...

[UIKit] Bundle을 이용한 이미지 로딩 문제 해결하기

Bundle을 이용해 앱 내부 리소스에서 이미지를 로드하는 과정에서 UIImage(data: )를 이용했을 때 이미지가 정상적으로 표시되지 않는 문제가 발생했다. 해당 문제를 해결하기 위한 트러블 슈팅 과정에서 Bundle에 대한 이해가 필요했고, 최종적으로 문제의 원인이 SVG와 PNG의 차이점에서 비롯된 것임을 알 수 있었다. 이 글에서는 문제...