Skip to content

DeveloperAcademy-POSTECH/2025-C4-M13-Visionable

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

2025-C4-M13-Visionable

깃허브리드미

어비전스: 다이버시티 / 비전파서블 / 수수수 수퍼비전 / 어벤져스: The 6th Vision / See Different

  • Apple Developer Acaemy @ POSTECH | Cohort 2025 | Challenge 4
  • Period: 2025.06.28 - 2025.08.01 (30 Days)
  • Development Environment : iOS 26.0+ Xcode 26.0+ Swift 6

👀 Team Visionable:

여니 미모지
Yeony
@youryeony
쪼이 미모지
Joy
@superbigjoy
노우 미모지
Snow
@Jikiim
후랑크 미모지
Frank
@chxhyxn
잼 미모지
Jam
@jaminleee
미니 미모지
Mini
@mini-min

📦 Frameworks

Framework Description
App Intents 시스템 레벨에서 앱 기능을 자동으로 호출하기 위한 방법을 구현하는데 사용
AVFoundation 카메라, 이미지, 비디오, 실시간 프레임 처리 등 앱에서 사용하는 멀티미디어 기능 구현을 위해 사용
Combine SwiftUI 스타일에 적합한 선언적 비동기 데이터 스트림 구현을 위해 사용
Foundation Models 유사성 기반 이미지 검색 기반을 위해 온디바이스 LLM Model을 사용
PhotoKit 하위 모듈인 Photos에 접근하기 위해 사용되는 상위 프레임워크. 사진 라이브러리 접근을 위해 사용
Speech 음성 인식을 통해 음성 검색 기능을 구현하기 위해 사용
SwiftData 로컬 DB, 최근 검색 기록/즐겨찾기 기능을 구현하기 위해 사용
SwiftUI 선언적 UI 프레임워크
Vision 텍스트 인식 (OCR)과 카메라 설정에서 사용하는 Vision Model을 활용하기 위해 사용
WidgetKit 홈 화면에서 앱에 쉽게 접근할 수 있는 위젯 기능 구현을 위해 사용

🌠 Image Processing Flow

1. AsyncStream을 활용한 프레임 분석 주기 설정

실시간 인터랙션 (Camera-Model 간)을 핵심 기능으로 담고 있는 FF!p의 기능 특성 상,
1초의 60 프레임을 모두 Vision 모델에 분석 요청하는 것은 프로세서에 많은 부담을 주는 일이죠. 발열과 hang, shut down 문제로 이어질 수 있습니다.

반면, 이와 동시에 실시간 인터랙션이라는 사용자의 경험을 주기 위해 가능한 많은 프레임을 처리해 실시간성의 사용자 경험을 제공할 필요도 있었습니다. 이에 저희 팀은 비동기 데이터 스트림 처리를 수행할 수 있는 Swift Concurrency의 AsyncStream(AsyncSequence)을 활용한 프레임 분석 주기를 설정했습니다. Screenshot 2025-07-31 at 12 44 05 PM

2. VMMS (View-Mediator-Model-Service) Architecture

각 모듈별 역할을 명확하게 구분하기 위해, 저희 팀은 View, Mediator, Model, Service 구조로 각 역할을 분리했습니다.

  • View : UI 담당, 사용자에게 카메라 요청을 최초 전달하고 / 모델의 분석 결과를 받아 바운딩 박스를 그려주는 역할.
  • Mediator : 카메라와 관련된 CameraModel과 모델과 관련된 VisionModel LangaugeModel 사이의 중재자 역할.
  • Model : 비즈니스 로직 책임. 관찰 가능한 객체 (@Observable) 타입으로 선언되어, View에서 요청하는 데이터와, 메서드를 갖고 있는 데이터 변경에 대응할 수 있도록 책임을 갖고 있는 곳.
  • Service : Apple이 제공해주는 내장 프레임워크와 직접 요청과 응답을 주고받는 역할. 비동기 처리를 담당하므로 actor로 선언되어 있음.
Screenshot 2025-07-31 at 12 44 18 PM Screenshot 2025-07-31 at 12 44 28 PM Screenshot 2025-07-31 at 12 44 35 PM

📂 Foldering

├── .swiftlint
├── 📁 Resources
│   ├── Images
│   ├── Colors
│   ├── Fonts
│   ├── Localizable.xcstrings
├── 📁 Sources
|   ├── 🗂️ App
│   │   ├── FFIP_iOSApp.swift
│   │   ├── 🗂️ Coordinator
│   │   ├── 🗂️ Factory
|   ├── 🗂️ Components
│   ├── 🗂️ Data
│   ├── 🗂️ Extensions
│   ├── 🗂️ Modifers
│   ├── 🗂️ Presentation
│   │   ├── 🗂️ Camera
│   │   │   ├── CameraView.swift
│   │   │   ├── 🗂️ Model
│   │   │   ├── 🗂️ SubViews
│   │   ├── 🗂️ Search
│   │   ├── 🗂️ VoiceSearch
│   ├── 🗂️ Utils

📑 Tech Archives

  • 🍎 Coding Convention : Clean Code Swift
    : 마틴 아저씨의 클린 코드 원칙과 아카데미 컨벤션을 팀 수준에 맞게 적용하고, 그냥 남들이 사용하니까 사용하는 것이 아니라 "왜 사용해야하는지"에 대한 이해를 위한 정리 글

  • 😎 Vision Framework 공부하기
    : 유즈 케이스를 발산하기에 앞서, 팀원들의 Vision Framework 기술에 대한 이해와 싱크를 맞추기 위한 공부 내용

  • 🌠 Image Processing Flow
    : 핵심 기능을 구현하기 위해 필요한 실시간 스캐닝 -> 이미지 변환 -> 탐지 과정의 플로우를 정리하고, 그 과정에서 필요한 기술을 정리