Skip to content
Merged
15 changes: 14 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,10 @@ View โ†โ†’ ViewModel(@Observable) โ†’ UseCase(Protocol) โ†’ Repository โ†’ Data
ํƒ€์ž…์€ ์ด์Šˆ ํ…œํ”Œ๋ฆฟ๊ณผ 1:1๋กœ ๋งž์ถ˜๋‹ค: `feat` ยท `bug` ยท `design` ยท `refac` ยท `docs` ยท `chore`.
(์˜ˆ: `docs/1203`, `feat/1195`) ์„ค๋ช…ํ˜• ๋ธŒ๋žœ์น˜๋ช…(`docs/repo-rename-links` ๋“ฑ) ๊ธˆ์ง€.
- ๋Œ€์‘ ์ด์Šˆ๊ฐ€ ์—†์œผ๋ฉด **๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ์ด์Šˆ๋ถ€ํ„ฐ ์ƒ์„ฑ**ํ•œ๋‹ค (์ œ๋ชฉ ์ ‘๋‘์‚ฌยท๋ผ๋ฒจยทTypeยทPriority/Effort๊นŒ์ง€ ์ฑ„์›Œ์„œ โ€” ์ƒ์„ธ: `docs/claude/git-workflow.md`).
- PR ์ œ๋ชฉ ๋์— `(#์ด์Šˆ๋ฒˆํ˜ธ)`, ๋ณธ๋ฌธ์— `Closes #์ด์Šˆ๋ฒˆํ˜ธ`๋ฅผ ๋„ฃ์–ด ์ด์Šˆ์™€ ์—ฐ๊ฒฐํ•œ๋‹ค.
- **PR ์ œ๋ชฉ์€ `{์ด๋ชจ์ง€} [Type] {์ž‘์—… ๋‚ด์šฉ} (#์ด์Šˆ๋ฒˆํ˜ธ)`** โ€” ๋ถ„๋ฅ˜๋Š” ๋ฐ˜๋“œ์‹œ `[๋Œ€๊ด„ํ˜ธ]`, ๋์— ์ด์Šˆ๋ฒˆํ˜ธ.
(์˜ˆ: `โœจ [Feat] ๋ช…ํ•จ ๋„๋ฉ”์ธ ๊ณ„์ธต โ€” MyCard ยท ๋ช…ํ•จ์ฒฉ ยท ๊ตํ™˜ ์„ธ์…˜ UseCase (#1194)`)
**์ด์Šˆ ์ œ๋ชฉ ํ˜•์‹(`๐Ÿ“„ Docs: โ€ฆ` โ€” ์ฝœ๋ก )์„ PR ์ œ๋ชฉ์— ์“ฐ์ง€ ์•Š๋Š”๋‹ค.** `[Docs]:`์ฒ˜๋Ÿผ ๋Œ€๊ด„ํ˜ธ ๋’ค ์ฝœ๋ก ๋„ ๊ธˆ์ง€.
๋ณธ๋ฌธ์—๋Š” `Closes #์ด์Šˆ๋ฒˆํ˜ธ`๋ฅผ ๋„ฃ์–ด ์ด์Šˆ์™€ ์—ฐ๊ฒฐํ•œ๋‹ค. (์ด๋ชจ์ง€ยทType ๋งคํ•‘ํ‘œ: `docs/claude/git-workflow.md`)
- ์ด๋ฏธ ํ‘ธ์‹œํ•œ ๋ธŒ๋žœ์น˜๋ช…์„ ๊ณ ์ณ์•ผ ํ•˜๋ฉด GitHub ๋ธŒ๋žœ์น˜ rename API๋Š” **์—ด๋ ค ์žˆ๋˜ PR์„ ๋‹ซ์•„๋ฒ„๋ฆฌ๋ฏ€๋กœ**, rename ํ›„ ์ƒˆ PR์„ ๋งŒ๋“ค๊ณ  ๋‹ซํžŒ PR์— ํ›„์† PR ๋ฒˆํ˜ธ๋ฅผ ์ฝ”๋ฉ˜ํŠธ๋กœ ๋‚จ๊ธด๋‹ค.
- ๋ฐฐํฌ ๋ธŒ๋žœ์น˜๋Š” ์˜ˆ์™ธ: `testFlight/{๋ฒˆํ˜ธ}` ยท `release/{๋ฒˆํ˜ธ}` (์ˆœ์ฐจ ๋ฒˆํ˜ธ, ์ด์Šˆ๋ฒˆํ˜ธ ์•„๋‹˜).

Expand Down Expand Up @@ -113,3 +116,13 @@ iOS 26 ํ”„๋ ˆ์ž„์›Œํฌ API โ€” ์‹ ๊ทœ Apple API๋ฅผ ๋‹ค๋ฃฐ ๋•Œ:
| ๋ชจ์Œ | ์ธ๋ฑ์Šค | ์–ธ์ œ ์ฝ๋‚˜ |
|------|--------|----------|
| iOS 26 ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ€์ด๋“œ(20์ข…) | `docs/claude/ios26-frameworks/INDEX.md` | Liquid Glass, FoundationModels, SwiftData ์ƒ์†, ์‹ ๊ทœ SwiftUI/Concurrency API ๋“ฑ |

๋ฐฑ์—”๋“œ(์„œ๋ฒ„) โ€” API ์—ฐ๋™ยท์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ์ด ํ•„์š”ํ•  ๋•Œ:

| ๋Œ€์ƒ | ์œ„์น˜ | ์–ธ์ œ ์ฐธ๊ณ ํ•˜๋‚˜ |
|------|------|--------------|
| Cygnus ์„œ๋ฒ„ ๋ ˆํฌ | https://github.com/UMC-PRODUCT/cygnus-server/tree/main | API ์—”๋“œํฌ์ธํŠธยท์š”์ฒญ/์‘๋‹ต ์ŠคํŽ™ ํ™•์ธ, ์„œ๋ฒ„ ๊ตฌํ˜„/๋ฐฐํฌ ์ƒํƒœ ์ ๊ฒ€, iOS DTO์™€ ์‹ค์ œ ์‘๋‹ต์ด ์–ด๊ธ‹๋‚  ๋•Œ ์›์ธ ์ถ”์  |

- ์กฐํšŒ ์ˆ˜๋‹จ: `gh` CLI(`gh api repos/UMC-PRODUCT/cygnus-server/contents/...`, `gh search code --repo UMC-PRODUCT/cygnus-server ...`) ๋˜๋Š” `WebFetch`.
- **์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉ** โ€” ์„œ๋ฒ„ ๋ ˆํฌ์— ์ปค๋ฐ‹ยทPRยท์ด์Šˆ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค(๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์‹œํ•œ ๊ฒฝ์šฐ ์ œ์™ธ).
- ์ŠคํŽ™ ์ถ”์ธก ๊ธˆ์ง€: ํ•„๋“œ๋ช…ยทํƒ€์ž…ยทnullable ์—ฌ๋ถ€๋Š” ์„œ๋ฒ„์˜ ์ปจํŠธ๋กค๋Ÿฌ/DTO ์‹ค์ œ ์ฝ”๋“œ๋กœ ํ™•์ธํ•œ ๋’ค iOS Response DTO์— ๋ฐ˜์˜ํ•œ๋‹ค(์ ˆ๋Œ€ ๊ทœ์น™ #2ยท#3๊ณผ ํ•จ๊ป˜ ์ ์šฉ).
28 changes: 27 additions & 1 deletion docs/claude/git-workflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Git Flow + **์—ฐ์† ๋ธŒ๋žœ์น˜ ํŒŒ์ƒ** ์ง€์›
- **๋ธŒ๋žœ์น˜๋ช…์€ `{ํƒ€์ž…}/{์ด์Šˆ๋ฒˆํ˜ธ}`** โ€” ํƒ€์ž…์€ ์ด์Šˆ ํ…œํ”Œ๋ฆฟ๊ณผ 1:1(`feat`/`bug`/`design`/`refac`/`docs`/`chore`),
baseยทPR ๋Œ€์ƒ์€ `develop`. ์˜ˆ: `docs/1203`, `feat/1195`. ์„ค๋ช…ํ˜• ๋ธŒ๋žœ์น˜๋ช… ๊ธˆ์ง€.
- ๋Œ€์‘ ์ด์Šˆ๊ฐ€ ์—†์œผ๋ฉด **๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ์ด์Šˆ๋ถ€ํ„ฐ ์ƒ์„ฑ**ํ•œ๋‹ค (์•„๋ž˜ "์ด์Šˆ ์ƒ์„ฑ ๊ทœ์น™").
- PR ์ œ๋ชฉ ๋์— `(#์ด์Šˆ๋ฒˆํ˜ธ)`, ๋ณธ๋ฌธ์— `Closes #์ด์Šˆ๋ฒˆํ˜ธ`.
- PR ์ œ๋ชฉ์€ `{์ด๋ชจ์ง€} [Type] {์ž‘์—… ๋‚ด์šฉ} (#์ด์Šˆ๋ฒˆํ˜ธ)` (์•„๋ž˜ "PR ์ œ๋ชฉ ํ˜•์‹"), ๋ณธ๋ฌธ์— `Closes #์ด์Šˆ๋ฒˆํ˜ธ`.
- ํ‘ธ์‹œํ•œ ๋ธŒ๋žœ์น˜๋ช…์„ ๊ณ ์ณ์•ผ ํ•˜๋ฉด GitHub ๋ธŒ๋žœ์น˜ rename API๊ฐ€ **์—ด๋ ค ์žˆ๋˜ PR์„ ๋‹ซ์•„๋ฒ„๋ฆฐ๋‹ค.**
rename ํ›„ ์ƒˆ PR์„ ๋งŒ๋“ค๊ณ , ๋‹ซํžŒ PR์— ํ›„์† PR ๋ฒˆํ˜ธ๋ฅผ ์ฝ”๋ฉ˜ํŠธ๋กœ ๋‚จ๊ธด๋‹ค.
- **์—ฐ์† ๋ธŒ๋žœ์น˜**: feature์—์„œ ๋‹ค์Œ feature ํŒŒ์ƒ ๊ฐ€๋Šฅ (ํ‹ฐ์ผ“ ๋‹จ์œ„ ๋ถ„๋ฆฌ)
Expand Down Expand Up @@ -43,6 +43,32 @@ Git Flow + **์—ฐ์† ๋ธŒ๋žœ์น˜ ํŒŒ์ƒ** ์ง€์›
**์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— `Co-Authored-By` ๋ผ์ธ์„ ์ ˆ๋Œ€ ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์„ธ์š”.**
"Generated with Claude Code" ๋“ฑ AI๊ฐ€ ์ž‘์„ฑํ–ˆ์Œ์„ ๋“œ๋Ÿฌ๋‚ด๋Š” ๋ฌธ๊ตฌ๋„ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

## PR ์ œ๋ชฉ ํ˜•์‹

`{์ด๋ชจ์ง€} [Type] {์ž‘์—… ๋‚ด์šฉ} (#์ด์Šˆ๋ฒˆํ˜ธ)` โ€” **๋ถ„๋ฅ˜๋Š” ๋ฐ˜๋“œ์‹œ `[๋Œ€๊ด„ํ˜ธ]`**, ์ œ๋ชฉ ๋์— ์ด์Šˆ๋ฒˆํ˜ธ.

- โœ… `โœจ [Feat] ๋ช…ํ•จ ๋„๋ฉ”์ธ ๊ณ„์ธต โ€” MyCard ยท ๋ช…ํ•จ์ฒฉ ยท ๊ตํ™˜ ์„ธ์…˜ UseCase (#1194)`
- โœ… `๐Ÿ“„ [Docs] ์ €์žฅ์†Œ rename ์ดํ›„ ๋‚จ์€ ์˜› ๋งํฌ ์ •๋ฆฌ (#1203)`
- โŒ `๐Ÿ“„ Docs: ์ €์žฅ์†Œ rename ์ดํ›„ ๋‚จ์€ ์˜› ๋งํฌ ์ •๋ฆฌ (#1203)` โ€” **์ด์Šˆ ์ œ๋ชฉ ํ˜•์‹**(์ฝœ๋ก )์„ PR์— ์“ด ๊ฒฝ์šฐ
- โŒ `๐Ÿ“„ [Docs]: โ€ฆ` โ€” ๋Œ€๊ด„ํ˜ธ ๋’ค ์ฝœ๋ก  ๊ธˆ์ง€ / โŒ `[Feature]` โ€” Feat๋กœ ํ†ต์ผ / โŒ ์ด์Šˆ๋ฒˆํ˜ธ ๋ˆ„๋ฝ

> **์ด์Šˆ ์ œ๋ชฉ๊ณผ PR ์ œ๋ชฉ์€ ํ˜•์‹์ด ๋‹ค๋ฅด๋‹ค.**
> ์ด์Šˆ = `{์ด๋ชจ์ง€} {Type}: {๋‚ด์šฉ}` (์ฝœ๋ก , ์ด์Šˆ ํ…œํ”Œ๋ฆฟ์˜ title prefix ๊ทธ๋Œ€๋กœ)
> PR = `{์ด๋ชจ์ง€} [{Type}] {๋‚ด์šฉ} (#์ด์Šˆ๋ฒˆํ˜ธ)` (๋Œ€๊ด„ํ˜ธ + ์ด์Šˆ๋ฒˆํ˜ธ)

| PR `[Type]` | ์ด๋ชจ์ง€ | ๋ธŒ๋žœ์น˜ | ์ด์Šˆ ์ œ๋ชฉ ์ ‘๋‘์‚ฌ | ๋ผ๋ฒจ |
|-------------|--------|--------|------------------|------|
| `[Feat]` | โœจ | `feat/{์ด์Šˆ๋ฒˆํ˜ธ}` | `โœจ Feature: ` | `:sparkles: Feature` |
| `[Fix]` | ๐Ÿ› | `bug/{์ด์Šˆ๋ฒˆํ˜ธ}` | `๐Ÿ› Bug: ` | `:bug: Bug` |
| `[Refactor]` | โ™ป๏ธ | `refac/{์ด์Šˆ๋ฒˆํ˜ธ}` | `โ™ป๏ธ Refactor: ` | `:hammer: Refactor` |
| `[Design]` | ๐Ÿ’„ | `design/{์ด์Šˆ๋ฒˆํ˜ธ}` | `๐ŸŽจ Design: ` | `:lipstick: UI` |
| `[Docs]` | ๐Ÿ“„ | `docs/{์ด์Šˆ๋ฒˆํ˜ธ}` | `๐Ÿ“„ Docs: ` | `:page_facing_up: Docs` |
| `[Chore]` | ๐Ÿ”ง | `chore/{์ด์Šˆ๋ฒˆํ˜ธ}` | `๐Ÿ€ ETC: ` | `:wrench: chore` |
| `[Test]` | โœ… | ๊ด€๋ จ ์ด์Šˆ ํƒ€์ž…์„ ๋”ฐ๋ฆ„ | (์ „์šฉ ํ…œํ”Œ๋ฆฟ ์—†์Œ) | (๋ผ๋ฒจ ์—†์Œ) |

- ๋ฐฐํฌ PR์€ ์œ„ ํ˜•์‹ ๋Œ€์‹  ๋ฐฐํฌ ๋ธŒ๋žœ์น˜ ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ  `๐Ÿ›ซ TestFlight` / `๐Ÿš€ Release` ๋ผ๋ฒจ์„ ๋ถ™์ธ๋‹ค.
- ์—ฌ๋Ÿฌ ์„ฑ๊ฒฉ์ด ์„ž์ด๋ฉด ๋ณ€๊ฒฝ ๋น„์ค‘์ด ๊ฐ€์žฅ ํฐ Type์„ ์ œ๋ชฉ์— ์“ฐ๊ณ , ๋ถ€์ˆ˜ ๋ผ๋ฒจ์„ ์ถ”๊ฐ€๋กœ ๋ถ™์ธ๋‹ค.

## PR ๊ทœ์น™

- ์ตœ์†Œ 1์ธ Approve ํ•„์ˆ˜
Expand Down
180 changes: 180 additions & 0 deletions docs/server/2026-08-24-attendance-push-and-watch-api-gaps.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
# ์„œ๋ฒ„ ์š”์ฒญ ์‚ฌํ•ญ โ€” ์ถœ์„ ์ƒํƒœ ํ‘ธ์‹œ ยท Apple Watch ์ง€์› API ๊ฐญ

> ์ž‘์„ฑ์ผ: 2026-08-24 ยท ๋Œ€์ƒ: ์„œ๋ฒ„ํŒ€ ยท ์ž‘์„ฑ ๊ทผ๊ฑฐ: iOS ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์‹ค์ธก
> ๊ด€๋ จ ์ด์Šˆ: [#1242](https://github.com/UMC-PRODUCT/Big-Dipper-iOS/issues/1242) ์™ธ ์›Œ์น˜ ๋ฐฑ๋กœ๊ทธ #1205~#1216

iOS ์›Œ์น˜ ์•ฑ ์ž‘์—…์„ ์ •๋ฆฌํ•˜๋ฉด์„œ **์„œ๋ฒ„ ์ง€์› ์—†์ด๋Š” ํด๋ผ์ด์–ธํŠธ๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ํ•ญ๋ชฉ**์„ ์ถ”๋ ค๋ƒˆ์Šต๋‹ˆ๋‹ค.
๊ฐ ํ•ญ๋ชฉ์€ ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ํ™•์ธํ•œ ์‚ฌ์‹ค๊ณผ ํ•จ๊ป˜ ์ ์—ˆ๊ณ , ์š”์ฒญ์ด ์•„๋‹ˆ๋ผ **ํ™•์ธ๋งŒ ํ•„์š”ํ•œ ๊ฒƒ**์€ ๋”ฐ๋กœ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

## ์š”์•ฝ

| # | ํ•ญ๋ชฉ | ์„œ๋ฒ„ ์ž‘์—… ๊ทœ๋ชจ | ์šฐ์„ ์ˆœ์œ„ |
|---|------|--------------|---------|
| 1 | ์ถœ์„ ์Šน์ธ/๋ฐ˜๋ ค ์‹œ ์ฑŒ๋ฆฐ์ €์—๊ฒŒ ํ‘ธ์‹œ ๋ฐœ์†ก | ์ž‘์Œ (๊ธฐ์กด FCM ์žฌ์‚ฌ์šฉ) | **๋†’์Œ** |
| 2 | ์ถœ์„ ์š”์ฒญ ์‹œ๊ฐ์„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ | ์ž‘์Œ (ํ•„๋“œ 1๊ฐœ ์ถ”๊ฐ€) | ์ค‘๊ฐ„ |
| 3 | ๋‹ค๊ธฐ๊ธฐ ๋™์‹œ ์„ธ์…˜ ํ—ˆ์šฉ ์—ฌ๋ถ€ | ํ™•์ธ๋งŒ | ์ค‘๊ฐ„ |
| 4 | Live Activity ํ‘ธ์‹œ ์ฑ„๋„ (APNs ์ง๊ฒฐ) | ํผ (์‹ ๊ทœ ์ฑ„๋„) | ๋‚ฎ์Œ / ๋ณด๋ฅ˜ |

---

## 1. ์ถœ์„ ์Šน์ธ/๋ฐ˜๋ ค ์‹œ ์ฑŒ๋ฆฐ์ €์—๊ฒŒ ํ‘ธ์‹œ ๋ฐœ์†ก โ€” **๋†’์Œ**

### ํ˜„์žฌ ์ƒํ™ฉ

UMC ์ถœ์„์€ ์ฑŒ๋ฆฐ์ €๊ฐ€ GPS ์ถœ์„ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด `PRESENT_PENDING` ์ƒํƒœ๊ฐ€ ๋˜๊ณ ,
์šด์˜์ง„์ด ์Šน์ธํ•ด์•ผ `PRESENT` ๋กœ ํ™•์ •๋˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค
(`POST /api/v2/schedules/{scheduleId}/attendances/request` โ†’ `POST .../attendances/decide`).

**๋ฌธ์ œ๋Š” ์Šน์ธ ๊ฒฐ๊ณผ๊ฐ€ ์ฑŒ๋ฆฐ์ € ๊ธฐ๊ธฐ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.**

ํ˜„์žฌ ์ฑŒ๋ฆฐ์ €๊ฐ€ ์ž๊ธฐ ์ถœ์„์ด ์Šน์ธ๋๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ **์•ฑ์„ ์—ด์–ด ์ถœ์„ ํƒญ์— ๋‹ค์‹œ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ**์ž…๋‹ˆ๋‹ค.
๊ทธ๋•Œ ๋ชฉ๋ก์„ ๋‹ค์‹œ ์กฐํšŒํ•˜๋ฉด์„œ ์ƒํƒœ๊ฐ€ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ๋‹ซํ˜€ ์žˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํƒญ์— ์žˆ์œผ๋ฉด ์•„๋ฌด ํ†ต์ง€๋„ ๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์Šน์ธ๊นŒ์ง€ ์ˆ˜์‹ญ ๋ถ„์—์„œ ๋ฉฐ์น ์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ๊ฐ์•ˆํ•˜๋ฉด, ์‚ฌ์šฉ์ž๋Š” ์ž๊ธฐ๊ฐ€ ์ถœ์„ ์ฒ˜๋ฆฌ๋๋Š”์ง€ ๊ฒฐ์„ ์ฒ˜๋ฆฌ๋๋Š”์ง€
๋ชจ๋ฅด๋Š” ์ฑ„๋กœ ๋ฐฉ์น˜๋ฉ๋‹ˆ๋‹ค.

### ํ™•์ธ ์š”์ฒญ

**Q1. ์šด์˜์ง„์ด ์ถœ์„์„ ์Šน์ธ/๋ฐ˜๋ คํ•  ๋•Œ, ํ•ด๋‹น ์ฑŒ๋ฆฐ์ €์—๊ฒŒ FCM ํ‘ธ์‹œ๋ฅผ ๋ฐœ์†กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?**

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋งŒ์œผ๋กœ๋Š” ํŒ๋ณ„์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ iOS ํ‘ธ์‹œ ์ˆ˜์‹ ๋ถ€๋Š” `title` / `body` ๋‘ ํ•„๋“œ๋งŒ ์ฝ์–ด
์•Œ๋ฆผ ๋ณด๊ด€ํ•จ์— ์ €์žฅํ•˜๋Š” ๋ฒ”์šฉ ์ฒ˜๋ฆฌ๋ผ, ์Šน์ธ ํ‘ธ์‹œ๊ฐ€ ์‹ค์ œ๋กœ ์˜ค๊ณ  ์žˆ๋”๋ผ๋„ ์•ฑ์€ ๊ทธ๋ƒฅ ๋ฐฐ๋„ˆ๋กœ ํ˜๋ ค๋ณด๋ƒ…๋‹ˆ๋‹ค.

### ์š”์ฒญ ์‚ฌํ•ญ

**๋ฐœ์†กํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด** โ€” ์ถœ์„ ์Šน์ธ/๋ฐ˜๋ ค ์ฒ˜๋ฆฌ ์‹œ ๋Œ€์ƒ ์ฑŒ๋ฆฐ์ €์—๊ฒŒ ํ‘ธ์‹œ ๋ฐœ์†ก์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.
ํšŒ์›๋ณ„ FCM ํ† ํฐ์€ ์ด๋ฏธ ์„œ๋ฒ„๊ฐ€ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (`PUT /api/v1/notification/fcm/token`).
**APNs ์‹ ๊ทœ ์ฑ„๋„์ด๋‚˜ ๋ณ„๋„ ์ธํ”„๋ผ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**

**๋ฐœ์†กํ•˜๊ณ  ์žˆ๋‹ค๋ฉด (๋˜๋Š” ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด)** โ€” payload ์— ์•„๋ž˜ ๋‘ ํ•„๋“œ๋ฅผ ํฌํ•จํ•ด ์ฃผ์„ธ์š”.

```jsonc
{
"notification": { "title": "...", "body": "..." },
"data": {
"type": "ATTENDANCE_STATUS_CHANGED", // ์•Œ๋ฆผ ์ข…๋ฅ˜ ์‹๋ณ„์ž
"scheduleId": "1234", // ๋Œ€์ƒ ์ผ์ • ID (๋ฌธ์ž์—ด)
"status": "PRESENT" // ํ™•์ • ์ƒํƒœ (์„ ํƒ, ์žˆ์œผ๋ฉด ์ฆ‰์‹œ ๋ฐ˜์˜ ๊ฐ€๋Šฅ)
}
}
```

- `type` โ€” ์•ฑ์ด "์ด๊ฑด ์ถœ์„ ์ƒํƒœ ๋ณ€๊ฒฝ ์•Œ๋ฆผ"์ด๋ผ๊ณ  ์‹๋ณ„ํ•ด์•ผ ์ถœ์„ ํ™”๋ฉด์„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ’ ์ด๋ฆ„์€ ์„œ๋ฒ„ ์ปจ๋ฒค์…˜์— ๋งž์ถฐ ์ •ํ•ด ์ฃผ์‹œ๋ฉด ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
- `scheduleId` โ€” ์•Œ๋ฆผ์„ ํƒญํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ผ์ • ํ™”๋ฉด์œผ๋กœ ์ด๋™์‹œํ‚ค๊ณ , ์–ด๋–ค ์ผ์ •์„ ๊ฐฑ์‹ ํ• ์ง€ ํŠน์ •ํ•˜๋Š” ๋ฐ ์”๋‹ˆ๋‹ค.
- ์ •์ˆ˜ ๊ฐ’์€ **๋ฌธ์ž์—ด๋กœ** ๋‚ด๋ ค ์ฃผ์„ธ์š”. ํ”„๋กœ์ ํŠธ ์ „ ๋ ˆ์ด์–ด์—์„œ ์„œ๋ฒ„ ์ •์ˆ˜๋ฅผ `String` ์œผ๋กœ ํ†ต์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

### ํด๋ผ์ด์–ธํŠธ ์ชฝ ๋Œ€์‘

์•ฑ์€ ์ด payload ๋ฅผ ๋ฐ›์•„ ์ถœ์„ ํ™”๋ฉด์„ ์ž๋™ ๊ฐฑ์‹ ํ•˜๊ณ , ์•Œ๋ฆผ ํƒญ ์‹œ ํ•ด๋‹น ์ผ์ •์œผ๋กœ ์ด๋™์‹œํ‚ค๋„๋ก ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.
์ˆ˜์‹  ํ›„ ๊ฐฑ์‹  ๊ฒฝ๋กœ๋Š” ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด, payload ์‹๋ณ„์ž๋งŒ ํ™•๋ณด๋˜๋ฉด ์—ฐ๊ฒฐ ์ž‘์—…์€ ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

---

## 2. ์ถœ์„ ์š”์ฒญ ์‹œ๊ฐ์„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ โ€” **์ค‘๊ฐ„**

### ํ˜„์žฌ ์ƒํ™ฉ

`POST /api/v2/schedules/{scheduleId}/attendances/request` ์˜ ์š”์ฒญ ๋ฐ”๋””๋Š” ํ˜„์žฌ ์„ธ ํ•„๋“œ๋ฟ์ž…๋‹ˆ๋‹ค.

```json
{ "latitude": 37.123456, "longitude": 127.123456, "locationVerified": true }
```

**์ถœ์„ ์‹œ๊ฐ ํ•„๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.** ๋”ฐ๋ผ์„œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ˆ˜์‹ ํ•œ ์‹œ๊ฐ์„ ์ถœ์„ ์‹œ๊ฐ์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

### ๋ฌธ์ œ

Apple Watch ์ถœ์„ ๊ธฐ๋Šฅ์—๋Š” **์˜คํ”„๋ผ์ธ ํ์ž‰**์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
์ง€ํ•˜ ๊ฐ•์˜์‹ค์ฒ˜๋Ÿผ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋Š๊ธด ๊ณณ์—์„œ GPS ์œ„์น˜๋Š” ํ™•๋ณด๋์ง€๋งŒ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ,
์œ„์น˜์™€ ์‹œ๊ฐ์„ ๊ธฐ๊ธฐ์— ์ €์žฅํ•ด ๋’€๋‹ค๊ฐ€ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ณต๊ตฌ๋˜๋ฉด ์ž๋™ ์ „์†กํ•˜๋Š” ํ๋ฆ„์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์„œ๋ฒ„๊ฐ€ ์ˆ˜์‹  ์‹œ๊ฐ์œผ๋กœ ์Šคํƒฌํ”„๋ฅผ ์ฐ์œผ๋ฉด, **19:05 ์— ๊ฐ•์˜์‹ค์—์„œ ์ถœ์„ํ•œ ์‚ฌ์šฉ์ž๊ฐ€
19:45 ์— ๊ฑด๋ฌผ์„ ๋‚˜์™€ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ถ™๋Š” ์ˆœ๊ฐ„ ์ „์†ก๋˜์–ด ๊ฒฐ์„ ์ฒ˜๋ฆฌ**๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

### ์š”์ฒญ ์‚ฌํ•ญ

์š”์ฒญ ๋ฐ”๋””์— ํด๋ผ์ด์–ธํŠธ ์ธก์ • ์‹œ๊ฐ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.

```jsonc
{
"latitude": 37.123456,
"longitude": 127.123456,
"locationVerified": true,
"measuredAt": "2026-08-24T19:05:32+09:00" // ์‹ ๊ทœ: ๊ธฐ๊ธฐ์—์„œ ์œ„์น˜๋ฅผ ์ธก์ •ํ•œ ์‹œ๊ฐ (ISO 8601)
}
```

**์„œ๋ฒ„ ํŒ์ • ์ •์ฑ…๋„ ํ•จ๊ป˜ ์ •ํ•ด ์ฃผ์„ธ์š”:**

- `measuredAt` ์„ ์ถœ์„ ์‹œ๊ฐ์œผ๋กœ ๊ทธ๋Œ€๋กœ ์ธ์ •ํ• ์ง€, ์•„๋‹ˆ๋ฉด ์ˆ˜์‹  ์‹œ๊ฐ๊ณผ์˜ ์ฐจ์ด๊ฐ€ ์ผ์ • ๋ฒ”์œ„(์˜ˆ: 30๋ถ„) ์ด๋‚ด์ผ ๋•Œ๋งŒ ์ธ์ •ํ• ์ง€
- ๊ธฐ๊ธฐ ์‹œ๊ณ„ ์กฐ์ž‘์œผ๋กœ ์ง€๊ฐ์„ ์ •์‹œ๋กœ ์œ„์กฐํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•œ์ง€ โ€” ํ•„์š”ํ•˜๋‹ค๋ฉด ํ—ˆ์šฉ ์˜ค์ฐจ ๋ฒ”์œ„๋ฅผ ์„œ๋ฒ„๊ฐ€ ์ •ํ•˜๋Š” ์ชฝ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค
- ํ•˜์œ„ ํ˜ธํ™˜: `measuredAt` ์ด ์—†์œผ๋ฉด ๊ธฐ์กด๋Œ€๋กœ ์ˆ˜์‹  ์‹œ๊ฐ ์‚ฌ์šฉ

์ด ํ•„๋“œ๊ฐ€ ์—†์œผ๋ฉด ์›Œ์น˜ ์˜คํ”„๋ผ์ธ ํ์ž‰ ๊ธฐ๋Šฅ์€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ๋ณด๋ฅ˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

---

## 3. ๋‹ค๊ธฐ๊ธฐ ๋™์‹œ ์„ธ์…˜ ํ—ˆ์šฉ ์—ฌ๋ถ€ โ€” **ํ™•์ธ๋งŒ**

### ๋ฐฐ๊ฒฝ

Apple Watch ์•ฑ์ด iPhone ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ง์ ‘ API ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด iPhone ๊ณผ ์ธ์ฆ ํ† ํฐ์„ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ๋Š” iOS/watchOS ๊ฐ„ ๊ณต์œ  ์ €์žฅ์†Œ๋กœ ํ† ํฐ์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค (ํด๋ผ์ด์–ธํŠธ ์ž‘์—…).

### ํ™•์ธ ์š”์ฒญ

**Q2. ๊ฐ™์€ ๊ณ„์ •์ด ๋‘ ๊ธฐ๊ธฐ์—์„œ ๋™์‹œ์— API ๋ฅผ ํ˜ธ์ถœํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ?**

ํŠนํžˆ ํ† ํฐ ๊ฐฑ์‹ (`POST /api/v1/auth/token/renew`)์ด ๊ฑฑ์ •์ž…๋‹ˆ๋‹ค.
์ด ์—”๋“œํฌ์ธํŠธ๊ฐ€ **๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ํšŒ์ „(rotate)์‹œ์ผœ ์ƒˆ ํ† ํฐ ์Œ์„ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐฉ์‹**์ด๋ผ๋ฉด,
iPhone ๊ณผ Watch ๊ฐ€ ๊ฐ™์€ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๋“ค๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•œ์ชฝ์ด ๋จผ์ € ๊ฐฑ์‹ ํ•˜๋Š” ์ˆœ๊ฐ„
**๋‹ค๋ฅธ ์ชฝ ํ† ํฐ์ด ๋ฌดํšจํ™”๋˜์–ด ๋กœ๊ทธ์•„์›ƒ**๋ฉ๋‹ˆ๋‹ค.

- ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ํšŒ์ „ ๋ฐฉ์‹์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋งŒ๋ฃŒ ์ „๊นŒ์ง€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?
- ์ด์ „ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์— ์œ ์˜ˆ ์‹œ๊ฐ„(grace period)์ด ์žˆ์Šต๋‹ˆ๊นŒ?
- ๊ณ„์ •๋‹น ํ™œ์„ฑ ์„ธ์…˜ ์ˆ˜์— ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํšŒ์ „ ๋ฐฉ์‹์ด๊ณ  ์œ ์˜ˆ๊ฐ€ ์—†๋‹ค๋ฉด, ํด๋ผ์ด์–ธํŠธ์—์„œ ์›Œ์น˜์˜ ๋…๋ฆฝ API ํ˜ธ์ถœ์„ ํฌ๊ธฐํ•˜๊ณ 
**๋ชจ๋“  ํ†ต์‹ ์„ iPhone ๊ฒฝ์œ ๋กœ ์ค‘๊ณ„**ํ•˜๋Š” ์„ค๊ณ„๋กœ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ค๊ณ„ ๊ฒฐ์ •์— ์˜ํ–ฅ์ด ํฌ๋ฏ€๋กœ
์ด ๋‹ต๋ณ€์„ ๋จผ์ € ๋ฐ›๊ณ  ์›Œ์น˜ ํ†ต์‹  ๊ตฌ์กฐ๋ฅผ ํ™•์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

---

## 4. Live Activity ํ‘ธ์‹œ ์ฑ„๋„ โ€” **๋‚ฎ์Œ / ๋ณด๋ฅ˜**

### ๋ฐฐ๊ฒฝ

Live Activity ๋Š” iPhone ์ž ๊ธˆํ™”๋ฉด๊ณผ Apple Watch Smart Stack ์— "์ง„ํ–‰ ์ค‘์ธ ์ถœ์„ ์„ธ์…˜" ์นด๋“œ๋ฅผ ๋„์šฐ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
์ถœ์„ ์ฐฝ ์นด์šดํŠธ๋‹ค์šด(์ •์‹œ ๋งˆ๊ฐ๊นŒ์ง€ N๋ถ„, ์ง€๊ฐ ๋งˆ๊ฐ๊นŒ์ง€ N๋ถ„)์„ ์•ฑ์„ ์—ด์ง€ ์•Š๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

**์นด์šดํŠธ๋‹ค์šด ์ž์ฒด๋Š” ์„œ๋ฒ„ ์ž‘์—…์ด ์ „ํ˜€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.** ์ผ์ • ์‘๋‹ต์— ์ด๋ฏธ ๋“ค์–ด ์žˆ๋Š”
์ถœ์„ ์‹œ์ž‘/์ •์‹œ ์ข…๋ฃŒ/์ง€๊ฐ ์ข…๋ฃŒ ์‹œ๊ฐ ์„ธ ๊ฐœ๋ฉด ์‹œ์Šคํ…œ์ด ์•Œ์•„์„œ ์ดˆ๋ฅผ ๊นŽ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฑด **์นด๋“œ๊ฐ€ ๋–  ์žˆ๋Š” ๋„์ค‘์— ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ**(์Šน์ธ๋˜๋ฉด ์นด๋“œ๊ฐ€ ๊ทธ ์ž๋ฆฌ์—์„œ
"์ถœ์„ ํ™•์ •"์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ)๋ฟ์ž…๋‹ˆ๋‹ค.

### ์š”์ฒญํ•˜์ง€ ์•Š๋Š” ์ด์œ 

์ด๊ฑด **๊ธฐ์กด FCM ์œผ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅ**ํ•ฉ๋‹ˆ๋‹ค. Live Activity ์—…๋ฐ์ดํŠธ๋Š” ActivityKit ์ด ๋ฐœ๊ธ‰ํ•˜๋Š” ๋ณ„๋„ ํ† ํฐ์„ ๋Œ€์ƒ์œผ๋กœ
APNs ์— ์ง์ ‘ ์ „์†กํ•ด์•ผ ํ•˜๊ณ (`apns-push-type: liveactivity`), ๊ทธ ํ† ํฐ์€ ์•กํ‹ฐ๋น„ํ‹ฐ๋งˆ๋‹ค ์ƒˆ๋กœ ๋ฐœ๊ธ‰๋˜๊ณ  ์ข…๋ฃŒ ์‹œ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.
์ฆ‰ **APNs ์ง๊ฒฐ ๋ฐœ์†ก ์ฑ„๋„ + ์•กํ‹ฐ๋น„ํ‹ฐ ๋‹จ์œ„ ํ† ํฐ ๋“ฑ๋ก/ํ๊ธฐ ์—”๋“œํฌ์ธํŠธ**๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด ์–ป๋Š” ๊ฒƒ์€ "๋ฐฐ๋„ˆ ์•Œ๋ฆผ์ด ๋œฌ๋‹ค" ๋Œ€์‹  "์ž ๊ธˆํ™”๋ฉด ์นด๋“œ๊ฐ€ ์ œ์ž๋ฆฌ์—์„œ ๋ฐ”๋€๋‹ค" ์ •๋„์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์ฒด๊ฐ์˜ ๋Œ€๋ถ€๋ถ„์€ **1๋ฒˆ(์ผ๋ฐ˜ ํ‘ธ์‹œ)** ์œผ๋กœ ์ด๋ฏธ ํ™•๋ณด๋ฉ๋‹ˆ๋‹ค.

**๋”ฐ๋ผ์„œ ์ง€๊ธˆ์€ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** 1๋ฒˆ์ด ์ ์šฉ๋œ ๋’ค ์‹ค์ œ ์‚ฌ์šฉ ๋ฐ˜์‘์„ ๋ณด๊ณ  ๋‹ค์‹œ ํŒ๋‹จํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
Live Activity ๋Š” ์šฐ์„  ์„œ๋ฒ„ ์ž‘์—…์ด 0์ธ ๋กœ์ปฌ ์นด์šดํŠธ๋‹ค์šด ๋ฒ„์ „์œผ๋กœ๋งŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

---

## ์ •๋ฆฌ โ€” ๋‹ต๋ณ€์ด ํ•„์š”ํ•œ ๊ฒƒ

| | ์งˆ๋ฌธ | ์˜ํ–ฅ |
|---|------|------|
| Q1 | ์ถœ์„ ์Šน์ธ/๋ฐ˜๋ ค ์‹œ ์ฑŒ๋ฆฐ์ €์—๊ฒŒ ํ‘ธ์‹œ๋ฅผ ๋ณด๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? | ์—†์œผ๋ฉด ๋ฐœ์†ก ํŠธ๋ฆฌ๊ฑฐ ์ถ”๊ฐ€ ํ•„์š” |
| Q2 | payload ์— `type` / `scheduleId` ๋ฅผ ๋„ฃ์–ด ์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? | ์•ฑ์˜ ์ถœ์„ ํ™”๋ฉด ์ž๋™ ๊ฐฑ์‹  ๊ฐ€๋Šฅ ์—ฌ๋ถ€ |
| Q3 | ์ถœ์„ ์š”์ฒญ ๋ฐ”๋””์— `measuredAt` ์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? | ์›Œ์น˜ ์˜คํ”„๋ผ์ธ ํ์ž‰ ๊ตฌํ˜„ ์—ฌ๋ถ€ |
| Q4 | ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ํšŒ์ „ ๋ฐฉ์‹์ž…๋‹ˆ๊นŒ? ๋‹ค๊ธฐ๊ธฐ ๋™์‹œ ์„ธ์…˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? | ์›Œ์น˜ ํ†ต์‹  ๊ตฌ์กฐ(๋…๋ฆฝ ํ˜ธ์ถœ vs iPhone ์ค‘๊ณ„) ๊ฒฐ์ • |

Q1ยทQ2 ๊ฐ€ ๊ฐ€์žฅ ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ์›Œ์น˜ ๊ตฌํ˜„ ์ผ์ •์— ๋งž์ถฐ ๋‹ต๋ณ€ ์ฃผ์…”๋„ ๋ฉ๋‹ˆ๋‹ค.
Loading