![]() |
![]() |
![]() |
![]() |
|---|
| ๊ตฌ๋ถ | ๋ด์ฉ |
|---|---|
| ํ ๊ตฌ์ฑ | iOS ๊ฐ๋ฐ 1๋ช , ๋ฐฑ์๋ 1๋ช , Design 1๋ช |
| ๊ฐ๋ฐ ๊ธฐ๊ฐ | 2025.12 ~ 2026.01 |
| ์ต์ ๋ฒ์ | iOS 16.0+ |
- ์์น ๊ธฐ๋ฐ ๋งค๋ฌผ ํด๋ฌ์คํฐ๋ง
- ๋งค๋ฌผ ์ค์๊ฐ ํ์ธ ๋ฐ ํํฐ๋ง
- ์ค์๊ฐ 1:1 ์ฑํ ๋ฐ ํ์ผ ์ ๋ก๋ (Multipart/form-data)
- ์นด๋ ๊ฒฐ์ (PG๊ฒฐ์ ) ๋ฐ ์์์ฆ ๊ฒ์ฆ
- HLS ์คํธ๋ฆฌ๋ฐ ๊ธฐ๋ฐ ์ํผ ๋น๋์ค
- WebView Bridge๋ฅผ ํตํ ์ถ์ ์ธ์ฆ
- ์นด์นด์ค / ์ ํ ์์ ๋ก๊ทธ์ธ
- ๋ถ๋์ฐ ์ปค๋ฎค๋ํฐ (๊ฒ์๊ธ ์์ฑ/ ๋๊ธ / ๋ต๊ธ / ์ข์์)
| ๋ถ๋ฅ | ๊ธฐ์ |
|---|---|
| UI | UIKit, PinLayout, FlexLayout, Then |
| ๋ฐ์ํ | RxSwift, RxCocoa |
| ๋ฐ์ดํฐ๋ฒ ์ด์ค | Realm |
| ๋คํธ์ํฌ | Alamofire, Kingfisher, Socket.IO |
| ์ํคํ ์ฒ | MVP + Input/Output, Repository Pattern |
| ์ธ์ฆ | KakaoSDK, AuthenticationService |
| Firebase | Firebase Cloud Messaging |
| ํ๋ ์์ํฌ | MapKit, CoreLocation, PhotosUI, WebKit |
View์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ถ๋ฆฌํ๊ณ , ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ์งํ๋ ๊ตฌ์กฐ๋ฅผ ์ฑํํ์ต๋๋ค.
![]() |
|---|
MVP + Input/Output ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด ํ๋ฉด๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ๋ถ๋ฆฌํ์ต๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก ๋ชจ๋ ๋ถ๋ฆฌ๋ฅผ ์ผ๋์ ๋ ๊ตฌ์กฐ๋ฅผ ์งํฅํ๊ธฐ ๋๋ฌธ์, View์ ๋ก์ง ๊ฐ ์์กด์ฑ์ ์ต์ํํ๊ณ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ์งํ๋ ์ํคํ ์ฒ๊ฐ ํ์ํ์ต๋๋ค.
Presenter๋ View๋ฅผ ์ง์ ์ฐธ์กฐํ์ง ์๊ณ Input์ ๋ฐ์ Output์ผ๋ก ๋ณํํ๋ ์ญํ ๋ง ์ํํ๋๋ก ์ค๊ณํ์ผ๋ฉฐ, ์์กด์ฑ์ ํ๋กํ ์ฝ ๊ธฐ๋ฐ์ผ๋ก ์ ์ํ๊ณ ์์ฑ ์์ ์ ์ฃผ์ ํ๋ ๋ฐฉ์(DI)์ ์ฌ์ฉํด ๊ตฌํ์ฒด์ ๋ํ ๊ฒฐํฉ์ ์ต์ํํ์ต๋๋ค.
![]() |
|---|
์์กด์ฑ ๊ด๋ฆฌ๋ Container + Factory ํจํด์ ์ฌ์ฉํด ๊ตฌ์ฑํ์ต๋๋ค. ๋คํธ์ํฌ, ์ธ์ฆ, ๋ ํฌ์งํ ๋ฆฌ ๋ฑ ๊ณตํต ์ธํ๋ผ๋ Protocol๋ก ์ถ์ํํ ๋ค, AppContainer์์ ์ค์ ๊ตฌํ์ฒด๋ฅผ ์์ฑยท๊ด๋ฆฌํ๋๋ก ์ค๊ณํ์ต๋๋ค.
๊ฐ ํ๋ฉด์ Factory๋ฅผ ํตํด ์์ ์๊ฒ ํ์ํ ์์กด์ฑ๋ง ์ฃผ์ ๋ฐ์ผ๋ฉฐ, ViewController๋ ๊ตฌ์ฒด ๊ตฌํ์ด ์๋ ์ถ์ํ๋ ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
![]() |
|---|
๋ถ๋์ฐ ๋งค๋ฌผ์ ํน์ ์ง์ญ์ ๋ฐ์ง๋๋ ํน์ฑ์ด ์์ด, ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์๊ฐํํ๊ธฐ ์ํด ํด๋ฌ์คํฐ๋ง์ ์ค๊ณํ์ต๋๋ค.
๋ฌธ์ ์ ์
- ๋งค๋ฌผ์ ๋ฐ์ง๋๋ฅผ ์ง๊ด์ ์ผ๋ก ์ธ์งํ ์ ์์ ๊ฒ
- Zoom In/Out ์ UI Freezing์ด ์์ ๊ฒ
๋ฐฉ์ ํ์
![]() |
|---|
| ๋ฐฉ์ | ์๊ฐ ๋ณต์ก๋ | ํน์ง |
|---|---|---|
| ๊ทธ๋ฆฌ๋ | O(n) | ๋ฐ๋ํ์ฒ๋ผ ์ธ์์ ์ผ๋ก ๋ณด์ |
| DBSCAN | O(nยฒ) | ์ค์๊ฐ ์ธํฐ๋์ ์ ๋ถ์ ํฉ |
| ๊ณ์ธต์ ๊ทธ๋ฆฌ๋ + KD-Tree | O(โn+k) | ์ํ ๋จ์๋ก ์์ฐ์ค๋ฌ์ด ๊ตฐ์ง |
์ต์ข ๊ตฌ์กฐ: ์ค ๋ ๋ฒจ ๊ตฌ๊ฐ๋ณ ํด๋ฌ์คํฐ๋ง ๋ชจ๋ธ ์ ํ
- ์ ์ค ๊ตฌ๊ฐ (Zoom 7~10): GeoJSON ํ์ ๊ตฌ์ญ(๋) ํด๋ฆฌ๊ณค ๊ธฐ์ค์ผ๋ก ๋งค๋ฌผ ์ ์ง๊ณ โ O(n) ์ค์บ
- ๊ณ ์ค ๊ตฌ๊ฐ (Zoom 11~16): ๊ณ์ธต์ ๊ทธ๋ฆฌ๋ ํด๋ฌ์คํฐ๋ง + KD-Tree ๊ธฐ๋ฐ ๊ณต๊ฐ ์ธ๋ฑ์ฑ
![]() |
|---|
์ฑ๋ฅ
- n=5,000 ๊ธฐ์ค ์ ์ฒด ํธ๋ฆฌ ๋น๋ ์ฝ 0.1์ด (์์ธ ๋ฐ์ง ๋ถํฌ)
- ๊ท ๋ฑ ๋ถํฌ ์ Lazy Build fallback์ผ๋ก ์ต๋ ๋๊ธฐ ์๊ฐ ์ฝ 2.8์ด
![]() |
|---|
Socket.IO ์ ํ ์ด์
- ์๋ ์ฌ์ฐ๊ฒฐ, ์ง์ ๋ฐฑ์คํ ๊ธฐ๋ฐ ์ฌ์๋, ๋คํธ์ํฌ ๋ณํ ๊ฐ์ง, ์ ์ก ๋ฐฉ์ ํด๋ฐฑ์ ๊ธฐ๋ณธ ์ ๊ณต
- ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ ๋น๋ฒํ ๋คํธ์ํฌ ์ ํ์ ์์ ์ ์ผ๋ก ๋์
์ฑ ์๋ช ์ฃผ๊ธฐ ๋์
![]() |
|---|
- iOS๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ผ ์ฐ๊ฒฐ ์ ์ง๋ฅผ ๋ณด์ฅํ์ง ์์
- ์ฑ ์ํ ์ ํ ์ ๋ช ์์ ์ผ๋ก ์ฐ๊ฒฐ ํด์ /์ฌ์ฐ๊ฒฐ ์ฒ๋ฆฌ
- ์๋ฒ ์ธก CLOSE_WAIT ์ธ์ ๋ฐฉ์ง
์ฑํ ๋ฐฉ ๋ก๋ฉ ์์
![]() |
|---|
- ์์ผ ์ฐ๊ฒฐ (์ค์๊ฐ ์์ ์ฑ๋ ํ๋ณด)
- ๋ก์ปฌ ์ ์ฅ์ ๋ฉ์์ง ์ฆ์ ํ์
- ์๋ฒ ๋๊ธฐํ (๋๋ฝ ๋ฉ์์ง ๋ณด์)
- ์ค๋ณต ๋ฉ์์ง ID ๊ธฐ์ค ํํฐ๋ง
๋ก์ปฌ ์ ์ฅ์: Realm ์ ํ
- ์ฑํ ์์ ๋น๋ฒํ ์กฐํยท๊ฐฑ์ ยท์ญ์ ์์ ์ ์ต์ ํ
- Results ํ์ ์ Lazy Loading ํ์ฉ์ผ๋ก ์ฑ๋ฅ ์ด์ ๊ทน๋ํ
- Thread-confined ํน์ฑ์ ๊ฐ ํ์ ๋๋ฉ์ธ ๋ชจ๋ธ ๋ณํ์ผ๋ก ํด๊ฒฐ
์ฝ์ง ์์ ๋ฉ์์ง ๊ด๋ฆฌ
![]() |
|---|
- Push ์์ : ๋ค๋ฅธ ๋ฐฉ ๋ฉ์์ง๋ฉด unreadCount += 1
- ์ฑํ ๋ฐฉ ์ ์ฅ: ์ ์ฒด ์ฝ์ ์ฒ๋ฆฌ + ๋ง์ง๋ง ์ฝ์ ์๊ฐ ๊ฐฑ์
- ํฌ๊ทธ๋ผ์ด๋ ์ง์ : ์๋ฒ ์ ๋ฐ์ดํธ ์๊ฐ ๋น๊ต ํ ๋๊ธฐํ
์นด๋ ๊ฒฐ์
![]() |
|---|
- ํด๋ผ์ด์ธํธ ๊ฒฐ์ ์ฑ๊ณต ์๋ต๋ง์ผ๋ก ์ ๋ขฐํ์ง ์์
- ์๋ฒ๊ฐ PG์ฌ์ ์ง์ ์์์ฆ ๊ฒ์ฆ ํ ๊ฒฐ์ ์๋ฃ ํ๋จ
ํ ํฐ ๊ด๋ฆฌ
- Alamofire AuthenticationInterceptor๋ก Access Token ์๋ ์ฃผ์
- 401/419 ์๋ต ์ Refresh Token์ผ๋ก ์๋ ๊ฐฑ์ ๋ฐ ์์ฒญ ์ฌ์๋
- ๊ฐฑ์ ์คํจ ์ Keychain ์ ๋ฆฌ ํ ๋ก๊ทธ์ธ ํ๋ฉด ์ ํ
์ํผ ๋น๋์ค
- HLS(m3u8) ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ ์ต์ํ
- WebVTT ๊ธฐ๋ฐ ์๋ง ํ์ฑ ๋ฐ ์ฌ์ ์๊ฐ ๋๊ธฐํ
- ํ์ง ๋ณ๊ฒฝ ์ ์ฌ์ ์์น์ ์ํ ์ ์ง













