Skip to content

๐Ÿ“ท ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ์นœ๊ตฌ๋“ค๊ณผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ•จ๊ป˜ ์ฐ๊ณ  ํŽธ์ง‘ํ•˜๋Š” ์‚ฌ์ง„ ์ดฌ์˜ ์•ฑ

Notifications You must be signed in to change notification settings

boostcampwm-2024/iOS04-PhotoGether

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“ท ํฌํ† ๊ฒŒ๋” - For Together


แ„†แ…ฉแ†จแ„‹แ…ฅแ†ธ แ„‡แ…ขแ„‚แ…ฅ





"ํ•จ๊ป˜ํ•˜๋ฉด ๋” ํŠน๋ณ„ํ•ด์ง€๋Š” ์ˆœ๊ฐ„"

"์ง€์ธ๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์ง„์„ ์ฐ๊ณ  ๊พธ๋ฐ€ ์ˆ˜ ์žˆ์–ด์š”"

์‹ค์‹œ๊ฐ„ ์—ฐ๊ฒฐ, ์‚ฌ์ง„ ์ดฌ์˜, ๊พธ๋ฏธ๊ธฐ๊นŒ์ง€ โ€“

PhotoGether์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํŠน๋ณ„ํ•œ ์ˆœ๊ฐ„๋“ค์„ ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•ด๋ณด์„ธ์š”.




โœจ ์•ฑ ํ”Œ๋กœ์šฐ ์†Œ๊ฐœ

๐Ÿ™‹โ€โ™‚๏ธ๐Ÿ™‹ ๋ชจ์—ฌ๋ด์š” ๐Ÿ“ธ ํ•จ๊ป˜ ์ฐ์–ด์š” ๐ŸŒ  ํ•จ๊ป˜ ๊พธ๋ฉฐ์š” ๐Ÿ”— ๊ณต์œ ํ•ด์š”
bye world Image hello world hello world
- ๋ฐฉ์„ ์ƒ์„ฑํ•˜์—ฌ ์นœ๊ตฌ๋ฅผ ์ดˆ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ์นœ๊ตฌ๋กœ๋ถ€ํ„ฐ ๋งํฌ๋ฅผ ๋ฐ›์•„ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ์˜ค๋””์˜ค/๋น„๋””์˜ค ๊ณต์œ ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ์ดฌ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ์ „/ํ›„๋ฉด ์นด๋ฉ”๋ผ ์ „ํ™˜์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ๋งˆ์ดํฌ๋ฅผ On/Off ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ํŽธ์ง‘ ๊ณผ์ •์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค.
- ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™์—ฌ ์‚ฌ์ง„์„ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ํ”„๋ ˆ์ž„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ํŽธ์ง‘ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ์‚ฌ์ง„์„ ๊ณต์œ /์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœจ ํ•ต์‹ฌ ์ฑŒ๋ฆฐ์ง€ ์†Œ๊ฐœ

โœจ WebSocket ์„œ๋ฒ„

โ€ข ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ–ˆ๋˜ ์ด์œ 

์šฐ๋ฆฌ ์•ฑ์€ WebRTC๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๋ช…๊ณผ P2P ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ Signaling ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ–ˆ์œผ๋ฉฐ, Swift Vapor๋ฅผ ์‚ฌ์šฉํ•ด Swift ์ฝ”๋“œ๋กœ ์ง์ ‘ WebSocket ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

โ€ข ์š”์ฒญ/์‘๋‹ต ๊ตฌ์กฐ ์„ค๊ณ„

ํ•˜๋‚˜์˜ ์—”๋“œํฌ์ธํŠธ๋กœ ๋ชจ๋“  ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ๋ณ„๋กœ ์„œ๋ฒ„ ๋กœ์ง๊ณผ ์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ฌ๋ผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

MessageType: ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋กœ์ง์„ ๊ฒฐ์ •ํ•˜๋Š” Enum ์†์„ฑ

Message: ์š”์ฒญ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐ์ดํ„ฐ

์ด๋ ‡๊ฒŒ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

โ€ข [ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…] ์„œ๋ฒ„ ๋‹ค์šด ๋ฌธ์ œ

์„œ๋ฒ„ ๊ฐœ๋ฐœ ์ค‘ ๋™์‹œ ์ ‘๊ทผ์œผ๋กœ ์ธํ•œ Race Condition ๋ฌธ์ œ๋กœ ์„œ๋ฒ„๊ฐ€ ์ž์ฃผ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค. ์›น์†Œ์ผ“ ์š”์ฒญ ๊ด€๋ฆฌ ๊ฐ์ฒด๋ฅผย Actor๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉด์„œ ๋™์‹œ ์ ‘๊ทผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

โœจ WebRTC

โ€ข WebRTC ์ฑ„ํƒ ์ด์œ 

์ตœ๋Œ€ 4๋ช…์˜ ์œ ์ €๊ฐ€ ์‹ค์‹œ๊ฐ„ ์˜์ƒ, ์Œ์„ฑ ๊ณต์œ ์™€ ๋™์‹œ ํŽธ์ง‘์„ ํ•ด์•ผ ํ–ˆ๊ธฐ์— ๋‚ฎ์€ ๋ ˆ์ดํ„ด์‹œ๊ฐ€ ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ๊ฒฝ์œ ํ•˜์ง€ ์•Š๊ณ  P2P ์—ฐ๊ฒฐ์„ ์ง€์›ํ•˜๋Š” WebRTC๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

โ€ข Mesh ๋ฐฉ์‹ ์ฑ„ํƒ ์ด์œ 

Image from Notion

์„œ๋ฒ„ ๊ฐœ๋ฐœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด Mesh ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. Mesh ๋ฐฉ์‹์€ ์ฐธ๊ฐ€์ž๋“ค ๊ฐ„ ์ง์ ‘ ์—ฐ๊ฒฐ์„ ์ง€์›ํ•˜๋ฉฐ, ์ตœ๋Œ€ 4๋ช…๊นŒ์ง€ ์—ฐ๊ฒฐํ•˜๊ธฐ์— ์„ฑ๋Šฅ์ƒ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

โ€ข WebRTC ์—ฐ๊ฒฐ ๊ณผ์ •

  1. ๋ฐฉ ์ƒ์„ฑ์ž๊ฐ€ ์›น์†Œ์ผ“ ์„œ๋ฒ„์—์„œ ๋ฐฉ์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฐฉ ์ •๋ณด๋ฅผ ๋”ฅ๋งํฌ URL๋กœ ์ดˆ๋Œ€ ๋Œ€์ƒ์—๊ฒŒ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ฐธ์—ฌ์ž๊ฐ€ ๋งํฌ๋ฅผ ํ†ตํ•ด ๋ฐฉ์— ์ฐธ๊ฐ€ํ•˜๋ฉด, ์„œ๋ฒ„์— ๋ฐฉ ์ฐธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  3. ๊ธฐ์กด ์ฐธ๊ฐ€์ž๋Š” ์ƒˆ๋กœ์šด ์ฐธ๊ฐ€์ž์˜ ์ •๋ณด๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  4. Signaling์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๊ตํ™˜ ํ›„ P2P ์—ฐ๊ฒฐ์ด ์„ฑ๋ฆฝ๋ฉ๋‹ˆ๋‹ค.

โ€ข [ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…] AVCaptureSession ์นด๋ฉ”๋ผ ์ ‘๊ทผ ๋ฌธ์ œ

WebRTC P2P ์—ฐ๊ฒฐ ์ค‘ ์Œ์„ฑ ์—ฐ๊ฒฐ์€ ๋˜์—ˆ์œผ๋‚˜ ํ™”๋ฉด ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š”ย AVCaptureSession์ด ๋‹จ์ผ ์ ‘๊ทผ๋งŒ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฐ์ฒด๊ฐ€ ์นด๋ฉ”๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์š”์ฒญํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๊ณณ์—์„œ๋งŒ ๊ด€๋ฆฌํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

โœจ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”

แ„‹แ…ตแ„‡แ…ฆแ†ซแ„แ…ณ แ„’แ…ฅแ„‡แ…ณ


  • ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์ฐธ์—ฌ์ž๋Š” ๋™์ผํ•œ ํ™”๋ฉด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐธ์—ฌ์ž๋“ค์˜ ๋™์‹œ ๋‹ค๋ฐœ์  ๋น„๋™๊ธฐ์ ์ธ ํŽธ์ง‘ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ์ƒํƒœ์— ๋”ฐ๋ฅธ ๊ฒฝ์Ÿ ์ƒํ™ฉ์„ ์™„ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘์•™ ์ง‘์ค‘ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์ฐธ์—ฌ์ž๊ฐ€ ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”— ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ์ด๋ฒคํŠธ ํ—ˆ๋ธŒ

โœจ ์•„ํ‚คํ…์ณ ๊ตฌ์กฐ

Image from Notion
  • 3-Layer ๊ธฐ๋ฐ˜ ํด๋ฆฐ ์•„ํ‚คํ…์ณ๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด ์„ค๊ณ„๋ฅผ ํ†ตํ•ด ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์™€ ์œ ์—ฐํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ช…ํ™•ํ•œ ์—ญํ•  ๋ถ„๋ฆฌ๋กœ ์ผ๊ด€๋œ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ํ๋ฆ„ ์ดํ•ด๋ฅผ ๋•๊ณ  ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.

โœจ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ ˆ์ด์–ด ๊ตฌ์กฐ

image

Note

ํ˜„์žฌ ์ €ํฌ์˜ Presentation Layer๋Š” ์œ„์™€ ๊ฐ™์ด ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

View๋Š” ์œ ์ € ์ธํ„ฐ๋ž™์…˜์ด ์ผ์–ด๋‚˜๋Š” ์ง€์ ์œผ๋กœ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ViewModel์—์„œ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ์ตœ์ข…์ ์œผ๋กœ View๋Š” ๊ฐฑ์‹ ๋œ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ, ์‚ฌ์ง„ ํŽธ์ง‘๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์ด ๋นˆ๋ฒˆํ•œ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์—์„œ, ์ด๋ฒคํŠธ์™€ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Input-Output ํŒจํ„ด์„ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

View์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํƒญ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ Input, View์— ์ „๋‹ฌ๋  ๋ฐ์ดํ„ฐ ๋“ฑ์˜ ์ƒํƒœ๋ฅผ Output์œผ๋กœ ์ •์˜ํ•˜์—ฌ ๊ฐ ๊ฐ์ฒด์˜ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ๋‚˜ ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ตฌ์กฐ์ ์œผ๋กœ ์‘์ง‘๋˜์–ด ์žˆ์–ด ์‰ฝ๊ฒŒ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ํŒ€ ๋‚ด PR ์š”์ฒญ์‹œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•„์ˆ˜๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ๋™์ผํ•œ ํŒจํ„ด์„ ํ™œ์šฉํ•จ์œผ๋กœ์จ ๋น ๋ฅธ ๊ตฌ์กฐ ํŒŒ์•…์„ ํ†ตํ•ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋˜์–ด ์ƒ์‚ฐ์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โœจ ๋ชจ๋“ˆ ๊ตฌ์กฐ

Group 1000003128

Note

์ €ํฌ์˜ ๋ชจ๋“ˆ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์ ‘๊ทผ์ œ์–ด์ž ์„ค์ •์„ ํ†ตํ•ด ํŠน์ • ๋ชจ๋“ˆ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ๋•Œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐ Feature๋ณ„ DemoApp์„ ํ†ตํ•ด ๋ณ‘๋ ฌ์ ์ธ ํ™”๋ฉด ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•ด ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ป ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

๐Ÿ‘‹ ํŒ€์› ์†Œ๊ฐœ

About

๐Ÿ“ท ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ์นœ๊ตฌ๋“ค๊ณผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ•จ๊ป˜ ์ฐ๊ณ  ํŽธ์ง‘ํ•˜๋Š” ์‚ฌ์ง„ ์ดฌ์˜ ์•ฑ

Topics

Resources

Stars

Watchers

Forks

Contributors 4

  •  
  •  
  •  
  •  

Languages