직접 만든 가이드를 오버레이로 설정해, 사진을 더 정확하게 촬영할 수 있는 iOS 앱입니다.
사용자가 직접 만든 가이드를 카메라 화면에 겹쳐서 보여주는 기능입니다.
핀터레스트, 인스타그램 등에서 본 예쁜 구도의 사진을 참고하거나,
이전에 찍은 사진과 같은 구도로 반복 촬영하고 싶을 때 유용합니다.
예를 들어, 체중 감량 과정을 비교 촬영할 때 이전 사진의 구도와 위치를 정확히 맞춰 찍을 수 있어요.
가이드를 오버레이로 띄워 촬영할 때 어떤 위치에 어떻게 서야 할지 명확하게 확인할 수 있습니다.
내가 원하는 촬영 기준을 자유롭게 만들 수 있는 가이드 생성 기능입니다.
손가락이나 Apple Pencil을 사용해 선을 그리거나,
갤러리에서 사진을 불러와 참고 이미지 위에 선을 덧그릴 수 있어요.
예를 들어,
• 특정 포즈나 실루엣을 따라 촬영하고 싶을 때
• 옷 피팅 시 어깨선, 다리 위치 등을 반복적으로 맞추고 싶을 때
• 체형 변화나 자세 교정을 비교 촬영할 때
직접 만든 기준선을 바탕으로 원하는 구도를 정밀하게 맞출 수 있습니다.
그려진 가이드는 배경 없이 투명한 이미지로 저장되며,
나중에 카메라 화면에 오버레이로 불러와 재사용할 수 있습니다.
완성된 가이드는 앱 내에 리스트 형태로 저장되며,
이름과 함께 미리보기 썸네일로 한눈에 관리할 수 있습니다.
가이드를 선택하면 언제든 다시 촬영 화면에 오버레이로 적용할 수 있어요.
또한 각 가이드별로 촬영한 사진들을 자동으로 분류해 함께 보여주기 때문에,
“이 가이드로 어떤 사진을 찍었더라?” 하고 찾을 때도 훨씬 직관적입니다.
예를 들어, • 상체 자세 교정 가이드로 촬영한 사진만 따로 모아 확인하거나, • 의류 피팅용 가이드로 찍은 사진을 한눈에 비교해볼 수 있어요.
가이드와 사진이 함께 정리되기 때문에, 촬영 목적에 맞는 흐름이 끊기지 않고 계속 이어질 수 있는 구조입니다.
Guidro는 모든 가이드와 사진을 기기 내에만 저장하며 개인정보를 서버에 전송하거나 외부로 공유하지 않습니다. 인터넷 없이도 언제든 사용할 수 있으며, 오프라인 환경에서도 모든 기능이 정상 작동합니다.
가이드는 앱 내부의 안전한 저장소를 통해 구조적으로 관리되고, 직접 그린 이미지와 촬영 사진은 파일 형태로 분리 저장되어 성능과 보안, 관리 편의성까지 모두 고려된 구조로 설계되어 있습니다.
민감한 개인 사진을 활용하는 앱인 만큼, Guidro는 **“개인 데이터는 오직 나만 알고, 나만 쓴다”**는 원칙을 지킵니다.
| 항목 | 기술 |
|---|---|
| UI 프레임워크 | UIKit |
| 아키텍처 | MVVM + RxSwift |
| 비동기 처리 | RxSwift, RxCocoa |
| 카메라 기능 | AVFoundation |
| 로컬 데이터 저장 | Realm, FileManager |
| 의존성 주입 | DIContainer, 생성자 주입 방식 |
| 디자인 패턴 | Repository Pattern |
| 기타 | Custom View, BaseViewController 구조화 |
- 전체 앱은 MVVM 아키텍처로 구성되어 ViewController의 역할을 최소화하고,
ViewModel을 통해 UI와 비즈니스 로직을 분리했습니다. - 데이터 계층은 Repository 패턴을 적용하여
Realm 및 FileManager에 대한 직접적인 접근을 차단하고,
ViewModel에서는 추상화된 인터페이스만 사용합니다. - 의존성 주입은 DIContainer를 기반으로 한 생성자 주입 방식을 통해
테스트 용이성과 모듈화 구조를 강화했습니다.
-
Canvas 드로잉 기능
사용자가 직접 촬영 가이드를 만들 수 있도록, 자유롭게 선을 그릴 수 있는
드로잉 캔버스를 구현했습니다. 손가락과 Apple Pencil 입력을 모두 지원하며,
실시간으로 선을 그리거나 사진 위에 덧그려 원하는 촬영 기준을 만들 수 있습니다.초기에는 Apple의 PencilKit 도입도 고려했지만,
전체 UI가 PencilKit 특유의 구조로 고정되고, 선 스타일이나 저장 방식 등
세부 커스터마이징이 제한적이었습니다.
이에 따라CAShapeLayer와UIBezierPath를 이용해 직접 드로잉 엔진을 구성했으며,
투명 배경의 PNG 이미지로 저장해 오버레이로 곧바로 사용할 수 있도록 설계했습니다.이 방식은 구현 난이도는 다소 높지만,
Guidro의 목적에 맞게 드로잉 스타일, 입력 방식, 저장 처리까지
모두 유연하게 제어할 수 있는 점이 강점이었습니다. -
RxSwift
사용자 인터랙션(버튼 클릭, 선택 등)과 UI 업데이트 간의 데이터 흐름을
명확하게 분리하고 바인딩하기 위해 RxSwift를 도입했습니다.
특히, MVVM 아키텍처에서 Input/Output 구조를 통해
View → ViewModel → Model 간의 데이터 흐름을 단방향으로 유지할 수 있었습니다. -
Realm
가이드를 빠르게 로드하고, 앱 재실행 시에도 상태를 보존할 수 있도록
로컬 데이터베이스로 Realm을 채택했습니다.
관계형 구조 없이도 객체 단위로 간단히 저장할 수 있어
사용자 생성 가이드를 저장/관리하는 데 적합했습니다. -
FileManager
사용자 드로잉 이미지나 촬영 이미지는 크기가 커질 수 있어,
Realm 대신 실제 파일로 저장하고 경로만 관리하는 방식을 선택했습니다.
이를 통해 앱의 메모리 사용을 줄이고, Realm DB 용량도 최적화할 수 있었습니다. -
AVFoundation
기본 카메라 구성으로는 지원되지 않는
오버레이, 줌, 타이머, 전/후면 전환, 비율 조정 등의
고급 기능을 구현하기 위해 AVFoundation을 직접 다뤘습니다.
세밀한 카메라 설정과 실시간 미리보기가 가능해
사용자 맞춤형 가이드 촬영 기능을 구현할 수 있었습니다.