Skip to content
Open
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
292 changes: 291 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,291 @@
# 2025-C6-A6-HonestHouse
<div align="center">

![Bracket Banner](https://github.com/user-attachments/assets/4bca99a7-5b37-4c6d-a059-212e9458a096)

**Canon 카메라 원격 μ œμ–΄ 및 AI 사진 κ·Έλ£Ήν™”**

[![Notion](https://img.shields.io/badge/ν”„λ‘œμ νŠΈ_μŠ€ν† λ¦¬-Notion-000000?style=flat-square&logo=notion&logoColor=white)](https://slime-shirt-140.notion.site/Bracket-2a202aff8b528063be0ff432c107e135)

</div>

---

## πŸ“‹ Overview

Bracket은 Canon 미러리슀 카메라λ₯Ό iPhone으둜 μ œμ–΄ν•˜λ©°, 미리 μ„€μ •ν•œ 3κ°€μ§€ 프리셋을 μžλ™μœΌλ‘œ μˆœν™˜ μ μš©ν•˜λŠ” iOS μ•±μž…λ‹ˆλ‹€. μ΄¬μ˜ν•œ 사진은 Vision Frameworkλ₯Ό 톡해 μžλ™ κ·Έλ£Ήν™”λ˜μ–΄ λΉ λ₯Έ 선별이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

```
πŸ“Έ Tri-shot: μ…”ν„° ν•œ λ²ˆμ— 프리셋 μžλ™ μ „ν™˜
πŸ€– AI κ·Έλ£Ήν™”: μœ μ‚¬ 사진 μžλ™ λΆ„λ₯˜ 및 무선 전솑
```
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟑 Minor

μ½”λ“œ 블둝에 μ–Έμ–΄ μ§€μ •μž μΆ”κ°€ ν•„μš”

λ§ˆν¬λ‹€μš΄ 졜적 λ Œλ”λ§μ„ μœ„ν•΄ μ½”λ“œ 블둝에 μ–Έμ–΄λ₯Ό μ§€μ •ν•˜μ„Έμš”.

-```
+```text
 πŸ“Έ Tri-shot: μ…”ν„° ν•œ λ²ˆμ— 프리셋 μžλ™ μ „ν™˜
 πŸ€– AI κ·Έλ£Ήν™”: μœ μ‚¬ 사진 μžλ™ λΆ„λ₯˜ 및 무선 전솑
-```
+```
🧰 Tools
πŸͺ› markdownlint-cli2 (0.18.1)

17-17: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

πŸ€– Prompt for AI Agents
In README.md around lines 17 to 20, the markdown code block lacks a
language/info string; update the opening triple-backtick to include "text"
(i.e., ```text) so the block is fenced as a text code block, leaving the content
and closing backticks unchanged.


---

## ✨ μ£Όμš” κΈ°λŠ₯

<div align="center">

<!-- TODO: GIF둜 이미지 λ³€κ²½ -->

### πŸ“Έ Tri-Shot

| ![Tri-Shot](https://github.com/user-attachments/assets/700a89d7-90f5-4c97-b0c6-472685aee9bd) | ![Preset](https://github.com/user-attachments/assets/fc50ce99-efb0-4c73-b0bf-e941b5583c29) | ![Camera UI](https://github.com/user-attachments/assets/ba00c874-c9cb-4acc-829f-5e6356cd9313) |
|:---:|:---:|:---:|
| **Tri-Shot 메인** | **프리셋 μ œμž‘** | **카메라 UI** |

</div>

미리 μ €μž₯ν•œ 3κ°€μ§€ 프리셋(촬영 λͺ¨λ“œ, 쑰리개, μ…”ν„°, ISO, μƒ‰μ˜¨λ„, ν‹΄νŠΈ, ν”½μ²˜μŠ€νƒ€μΌ)을 μ…”ν„° ν•œ λ²ˆμ— μžλ™ μˆœν™˜ μ μš©ν•©λ‹ˆλ‹€.

**기술 κ΅¬ν˜„**
- [ ] **개발자 μž‘μ„±**: 프리셋 μˆœν™˜ 둜직 및 μƒνƒœ 관리 방식
- [ ] **개발자 μž‘μ„±**: Canon Camera Control API 호좜 ꡬ쑰
- [ ] **개발자 μž‘μ„±**: 비동기 처리 및 동기화 λ©”μ»€λ‹ˆμ¦˜

```swift
// 핡심 μ½”λ“œ μŠ€λ‹ˆνŽ« (개발자 μž‘μ„±)
// 예: PresetCycleManager, CameraService λ“±
```

**차별점**
- κΈ°μ‘΄ λΈŒλΌμΌ€νŒ…: ν•œ κ°€μ§€ μ„€μ •λ§Œ λ³€κ²½ (예: λ…ΈμΆœ -1, 0, +1)
- Bracket Tri-shot: λͺ¨λ“  촬영 섀정을 자유둭게 μ‘°ν•© κ°€λŠ₯

---

<div align="center">

### πŸ€– 아카이빙

<!-- TODO: GIF둜 이미지 λ³€κ²½ -->

![Archiving](https://github.com/user-attachments/assets/4d84fab9-a794-4ebb-9599-5edc4628831b)

</div>

Vision Frameworkλ₯Ό ν™œμš©ν•œ 이미지 μœ μ‚¬λ„ λΆ„μ„μœΌλ‘œ λΉ„μŠ·ν•œ 사진끼리 μžλ™ κ·Έλ£Ήν™”ν•©λ‹ˆλ‹€.

**기술 κ΅¬ν˜„**
- [ ] **개발자 μž‘μ„±**: Vision Framework νŠΉμ§•μ  μΆ”μΆœ 방식
- [ ] **개발자 μž‘μ„±**: μœ μ‚¬λ„ 계산 μ•Œκ³ λ¦¬μ¦˜ (거리 μΈ‘μ • 방법 λ“±)
- [ ] **개발자 μž‘μ„±**: κ·Έλ£Ήν™” κΈ°μ€€ 및 μ„±λŠ₯ μ΅œμ ν™” μ „λž΅

```swift
// 핡심 μ½”λ“œ μŠ€λ‹ˆνŽ« (개발자 μž‘μ„±)
// 예: ArchivingService, VisionAnalyzer λ“±
```

**μ„±λŠ₯ μ§€ν‘œ**
- [ ] **개발자 μž‘μ„±**: 이미지 뢄석 속도 (nμž₯ κΈ°μ€€ 처리 μ‹œκ°„)
- [ ] **개발자 μž‘μ„±**: λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 및 μ΅œμ ν™” κ²°κ³Ό
- [ ] **개발자 μž‘μ„±**: κ·Έλ£Ήν™” 정확도

---

## πŸ›  기술 μŠ€νƒ

<div align="center">

### Core Technologies

<img src="https://img.shields.io/badge/SwiftUI-0D96F6?style=for-the-badge&logo=swift&logoColor=white" alt="SwiftUI" />
<img src="https://img.shields.io/badge/Combine-FA7343?style=for-the-badge&logo=swift&logoColor=white" alt="Combine" />
<img src="https://img.shields.io/badge/MVVM-orange?style=for-the-badge" alt="MVVM" />

### Frameworks & APIs

<img src="https://img.shields.io/badge/Vision-blue?style=for-the-badge&logo=apple&logoColor=white" alt="Vision" />
<img src="https://img.shields.io/badge/Core_Bluetooth-007AFF?style=for-the-badge&logo=bluetooth&logoColor=white" alt="Core Bluetooth" />
<img src="https://img.shields.io/badge/Core_Data-FA7343?style=for-the-badge&logo=apple&logoColor=white" alt="Core Data" />

<img src="https://img.shields.io/badge/Canon_Camera_Control_API-CE0000?style=for-the-badge&logo=canon&logoColor=white" alt="Canon API" />
<img src="https://img.shields.io/badge/RESTful_API-009688?style=for-the-badge" alt="RESTful API" />
<img src="https://img.shields.io/badge/Digest_Auth-4CAF50?style=for-the-badge&logo=lock&logoColor=white" alt="Digest Auth" />

</div>

<br/>

| 기술 | μ‚¬μš© λͺ©μ  | 핡심 κ΅¬ν˜„ |
|------|----------|----------|
| **SwiftUI** | μ„ μ–Έν˜• UI | [개발자 μž‘μ„±: MVVM νŒ¨ν„΄, μƒνƒœ 관리 방식 λ“±] |
| **Combine** | λ°˜μ‘ν˜• ν”„λ‘œκ·Έλž˜λ° | [개발자 μž‘μ„±: Publisher/Subscriber ν™œμš© 사둀] |
| **Vision Framework** | 이미지 뢄석 | [개발자 μž‘μ„±: νŠΉμ§•μ  μΆ”μΆœ, μœ μ‚¬λ„ 계산 방법] |
| **Core Bluetooth** | 무선 톡신 | [개발자 μž‘μ„±: WiFi μ—°κ²° 및 데이터 전솑 κ΅¬ν˜„] |
| **Canon Camera Control API** | 카메라 μ œμ–΄ | [개발자 μž‘μ„±: HTTP 톡신, Digest Auth κ΅¬ν˜„] |
| **Core Data** | 데이터 μ˜μ†μ„± | [개발자 μž‘μ„±: 프리셋 μ €μž₯, 사진 메타데이터 관리] |

---

## πŸ— μ•„ν‚€ν…μ²˜

### System Architecture

```
[개발자 μž‘μ„±: μ•„ν‚€ν…μ²˜ λ‹€μ΄μ–΄κ·Έλž¨]
μ˜ˆμ‹œ ꡬ쑰:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ View (SwiftUI) β”‚
β”‚ - Tri-shot UI β”‚
β”‚ - Preset Management β”‚
β”‚ - Archiving UI β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ @Published
β”‚ @StateObject
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ViewModel (Combine) β”‚
β”‚ - TrishotViewModel β”‚
β”‚ - PresetViewModel β”‚
β”‚ - ArchivingViewModel β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ Protocol
β”‚ Dependency Injection
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Repository (Protocol-oriented) β”‚
β”‚ - CameraRepository β”‚
β”‚ - PresetRepository β”‚
β”‚ - PhotoRepository β”‚
β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Service β”‚ β”‚ Core Data β”‚
β”‚ - Camera β”‚ β”‚ - Preset Entity β”‚
β”‚ - Vision β”‚ β”‚ - Photo Entity β”‚
β”‚ - Bluetooth β”‚ β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
Comment on lines +111 to +144
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟑 Minor

μ•„ν‚€ν…μ²˜ λ‹€μ΄μ–΄κ·Έλž¨ μ½”λ“œ 블둝에 μ–Έμ–΄ μ§€μ • ν•„μš”

ASCII λ‹€μ΄μ–΄κ·Έλž¨μ„ ν¬ν•¨ν•œ μ½”λ“œ 블둝에 μ–Έμ–΄λ₯Ό μ§€μ •ν•˜μ„Έμš”.

 ### System Architecture
 
-```
+```plaintext
 [개발자 μž‘μ„±: μ•„ν‚€ν…μ²˜ λ‹€μ΄μ–΄κ·Έλž¨]
 μ˜ˆμ‹œ ꡬ쑰:
 
 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
-```
+```
🧰 Tools
πŸͺ› markdownlint-cli2 (0.18.1)

124-124: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

πŸ€– Prompt for AI Agents
In README.md around lines 124 to 157, the fenced code block containing the ASCII
architecture diagram lacks a language tag; change the opening fence from ``` to
```plaintext (and keep the closing ``` intact) so the diagram is explicitly
marked as plain text for proper rendering and syntax highlighting.


### 데이터 흐름

- [ ] **개발자 μž‘μ„±**: μ£Όμš” κΈ°λŠ₯별 데이터 흐름 μ„€λͺ…
- [ ] **개발자 μž‘μ„±**: 비동기 처리 및 μ—λŸ¬ 핸듀링 μ „λž΅

```
μ˜ˆμ‹œ:
User Tap Shutter
↓
View.onTapGesture
↓
ViewModel.captureWithTrishotMode()
↓
CameraRepository.applyPreset()
↓
CameraService.sendCommand()
↓
Canon Camera (WiFi)
↓
ViewModel.@Published μ—…λ°μ΄νŠΈ
↓
View μžλ™ λ¦¬λ Œλ”λ§
```
Comment on lines +151 to +168
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟑 Minor

데이터 흐름 μ½”λ“œ 블둝에 μ–Έμ–΄ μ§€μ • ν•„μš”

ν”Œλ‘œμš° 차트λ₯Ό ν¬ν•¨ν•œ μ½”λ“œ 블둝에 μ–Έμ–΄λ₯Ό μ§€μ •ν•˜μ„Έμš”.

 ### 데이터 흐름
 
 - [ ] **개발자 μž‘μ„±**: μ£Όμš” κΈ°λŠ₯별 데이터 흐름 μ„€λͺ…
 - [ ] **개발자 μž‘μ„±**: 비동기 처리 및 μ—λŸ¬ 핸듀링 μ „λž΅
 
-```
+```plaintext
 μ˜ˆμ‹œ:
 User Tap Shutter
-```
+```
🧰 Tools
πŸͺ› markdownlint-cli2 (0.18.1)

164-164: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

πŸ€– Prompt for AI Agents
In README.md around lines 164 to 181, the fenced code block showing the
data-flow example lacks a specified language; update the opening fence to
include a language (e.g., change ``` to ```plaintext) so the block is explicitly
marked as plain text and ensure the closing fence remains a matching ``` to keep
the block valid.


---

## πŸš€ 기술적 도전과 ν•΄κ²°

### 1. [Challenge 제λͺ© - 개발자 μž‘μ„±]

**문제 상황**
- [ ] **개발자 μž‘μ„±**: ꡬ체적인 기술적 문제 μ„€λͺ…
- [ ] **개발자 μž‘μ„±**: μ™œ 이 λ¬Έμ œκ°€ λ°œμƒν–ˆλŠ”μ§€
- [ ] **개발자 μž‘μ„±**: κΈ°μ‘΄ μ ‘κ·Ό λ°©μ‹μ˜ ν•œκ³„

**ν•΄κ²° 방법**
- [ ] **개발자 μž‘μ„±**: μ±„νƒν•œ μ†”λ£¨μ…˜ 및 이유
- [ ] **개발자 μž‘μ„±**: κ΅¬ν˜„ 세뢀사항

```swift
// 핡심 ν•΄κ²° μ½”λ“œ (개발자 μž‘μ„±)
```

**κ²°κ³Ό**
- [ ] **개발자 μž‘μ„±**: μΈ‘μ • κ°€λŠ₯ν•œ κ°œμ„  κ²°κ³Ό (μ„±λŠ₯, μ•ˆμ •μ„± λ“±)

---

### 2. [Challenge 제λͺ© - 개발자 μž‘μ„±]

**문제 상황**
- [ ] **개발자 μž‘μ„±**

**ν•΄κ²° 방법**
- [ ] **개발자 μž‘μ„±**

```swift
// 핡심 ν•΄κ²° μ½”λ“œ
```

**κ²°κ³Ό**
- [ ] **개발자 μž‘μ„±**

---

### 3. [Challenge 제λͺ© - 개발자 μž‘μ„±]

**문제 상황**
- [ ] **개발자 μž‘μ„±**

**ν•΄κ²° 방법**
- [ ] **개발자 μž‘μ„±**

```swift
// 핡심 ν•΄κ²° μ½”λ“œ
```

**κ²°κ³Ό**
- [ ] **개발자 μž‘μ„±**

---

## πŸ“Š μ„±λŠ₯ 및 ν’ˆμ§ˆ μ§€ν‘œ

### μ„±λŠ₯ μΈ‘μ •

| ν•­λͺ© | μΈ‘μ •κ°’ | μΈ‘μ • ν™˜κ²½ |
|------|--------|----------|
| [개발자 μž‘μ„±] | [개발자 μž‘μ„±] | [개발자 μž‘μ„±] |
| 이미지 κ·Έλ£Ήν™” 속도 | [μΈ‘μ • ν•„μš”] | 100μž₯ κΈ°μ€€ |
| 프리셋 μ „ν™˜ 속도 | [μΈ‘μ • ν•„μš”] | 연속 촬영 μ‹œ |
| λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ | [μΈ‘μ • ν•„μš”] | 피크 μ‹œ |
| 배터리 μ†Œλͺ¨ | [μΈ‘μ • ν•„μš”] | 1μ‹œκ°„ μ‚¬μš© κΈ°μ€€ |

### μ½”λ“œ ν’ˆμ§ˆ

- [ ] **개발자 μž‘μ„±**: ν…ŒμŠ€νŠΈ 컀버리지
- [ ] **개발자 μž‘μ„±**: μ£Όμš” ν…ŒμŠ€νŠΈ μ „λž΅ (Unit Test, Integration Test λ“±)
- [ ] **개발자 μž‘μ„±**: μ½”λ“œ 리뷰 ν”„λ‘œμ„ΈμŠ€

---

## πŸ‘₯ νŒ€

<div align="center">

<!-- TODO: 개인 이미지, 링크 λ³€κ²½ -->

| ![Sandeul](https://github.com/user-attachments/assets/7159c61b-af06-4281-84f6-d076b30682fc) | ![Hari](https://github.com/user-attachments/assets/7159c61b-af06-4281-84f6-d076b30682fc) | ![Ivy](https://github.com/user-attachments/assets/7159c61b-af06-4281-84f6-d076b30682fc) | ![Minbol](https://github.com/user-attachments/assets/7159c61b-af06-4281-84f6-d076b30682fc) | ![Rama](https://github.com/user-attachments/assets/7159c61b-af06-4281-84f6-d076b30682fc) | ![Soop](https://github.com/user-attachments/assets/7159c61b-af06-4281-84f6-d076b30682fc) |
|:---:|:---:|:---:|:---:|:---:|:---:|
| **양희쀀** | **μœ€ν•˜μ •** | **μ΄ν˜„μ£Ό** | **이보민** | **λ¬Έν˜•κ·Ό** | **ν•œμˆ˜λΉˆ** |
| **Sandeul** | **Hari** | **Ivy** | **Minbol** | **Rama** | **Soop** |
| 🎯 PM | 🎨 Design | πŸ“± iOS | πŸ“± iOS | πŸ“± iOS | πŸ“± iOS |
Comment on lines +254 to +258
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟑 Minor

νŒ€ μ„Ήμ…˜: 이미지에 alt ν…μŠ€νŠΈ μΆ”κ°€ ν•„μš”

νŒ€ 멀버 ν”„λ‘œν•„ 이미지 6개 λͺ¨λ‘ alt ν…μŠ€νŠΈκ°€ λˆ„λ½λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ ‘κ·Όμ„± κ°œμ„ μ„ μœ„ν•΄ 각 이미지에 μ„€λͺ…적인 alt ν…μŠ€νŠΈλ₯Ό μΆ”κ°€ν•˜μ„Έμš”.

-| ![Sandeul](...) | ![Hari](...) | ![Ivy](...) | ![Minbol](...) | ![Rama](...) | ![Soop](...) |
+| ![Sandeul ν”„λ‘œν•„](...)| ![Hari ν”„λ‘œν•„](...) | ![Ivy ν”„λ‘œν•„](...) | ![Minbol ν”„λ‘œν•„](...) | ![Rama ν”„λ‘œν•„](...) | ![Soop ν”„λ‘œν•„](...) |

각 이미지 λ§ˆν¬λ‹€μš΄μ˜ λŒ€κ΄„ν˜Έ μ•ˆμ— 멀버 이름과 역할을 ν¬ν•¨ν•œ μ„€λͺ…을 μΆ”κ°€ν•˜μ„Έμš”.

πŸ€– Prompt for AI Agents
In README.md around lines 254 to 258 the six team member image markdown tags
lack descriptive alt text; update each image's alt text (the text inside the
square brackets) to include the member's name and role (for example "양희쀀 - PM" /
"Sandeul - PM"), replacing the empty or generic alt with "Name - Role" for all
six images so each <img> markdown reads e.g. ![양희쀀 - PM](url); repeat this for
Hari, Ivy, Minbol, Rama, and Soop using their corresponding Korean and English
names/roles.


**Apple Developer Academy @ POSTECH | Team A6 (HonestHouse)**

</div>

---

## πŸ“ž Contact

πŸ“§ **honesthouse2025@gmail.com**

[![Notion](https://img.shields.io/badge/ν”„λ‘œμ νŠΈ_기획_κ³Όμ •-Notion-000000?style=flat-square&logo=notion&logoColor=white)](https://slime-shirt-140.notion.site/Bracket-2a202aff8b528063be0ff432c107e135)

---

<div align="center">

*Β© 2025 Team A6 (HonestHouse). Apple Developer Academy @ POSTECH*

</div>