Skip to content

Boletto/FE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

390 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Boletto-iOS

SwiftUI + TCA๋ฅผ ํ™œ์šฉํ•œ iOS ์—ฌํ–‰ ๊ธฐ๋ก ๋ฐ ๊ณต์œ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.


โœˆ๏ธ Boletto ์†Œ๊ฐœ

Boleto๋Š” ์—ฌํ–‰์˜ ๋ชจ๋“  ์ˆœ๊ฐ„์„ ๊ธฐ๋กํ•˜๊ณ , ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋Š” ์—ฌํ–‰ ๊ธฐ๋ก ๋ฐ ๊ณต์œ  ์•ฑ์ž…๋‹ˆ๋‹ค. ์Šฌ๋กœ๊ฑด ๊ทธ๋ž˜ํ”ฝ

Download on the App Store

๐Ÿ†• ์ตœ์‹  ์—…๋ฐ์ดํŠธ

  • 1.1 ๋ฒ„์ „: ํฌ๋ฆฌ์Šค๋งˆ์Šค ํ‹ฐ์ผ“, ์ธ์Šคํƒ€๊ทธ๋žจ ์Šคํ† ๋ฆฌ ๊ณต์œ  ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • 1.2 ๋ฒ„์ „: ์„ค๋‚  ํ‹ฐ์ผ“ ๋ฐ ์‚ฌ์ง„ ํŽธ์ง‘ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • 1.3 ๋ฒ„์ „: ์ด๋ฏธ์ง€ ํŽธ์ง‘ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

๐Ÿ“‹ ์š”๊ตฌ์‚ฌํ•ญ

  • iOS: 17.0+
  • Xcode: 15.0+
  • Swift: 5.9+

โš’๏ธ ์ฃผ์š” ๊ธฐ๋Šฅ

๐Ÿ—บ๏ธ ์œ„์น˜ ๊ธฐ๋ฐ˜ ๋ฆฌ์›Œ๋“œ ์‹œ์Šคํ…œ

  • CLMonitor ๋ฐ CLServiceSession์„ ํ™œ์šฉํ•˜์—ฌ ํŠน์ • ๋ช…์†Œ ๋„์ฐฉ ์‹œ ์Šคํ‹ฐ์ปค์™€ ์‚ฌ์šฉ์ž ๋งž์ถค ํ”„๋ ˆ์ž„ ํš๋“
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ๋„ ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ ๋ฐ ๋กœ์ปฌ ์•Œ๋ฆผ ์ง€์›

๐ŸŽจ ํ‹ฐ์ผ“ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ

  • ํš๋“ํ•œ ์Šคํ‹ฐ์ปค์™€ ํ”„๋ ˆ์ž„์„ ์ด์šฉํ•ด ๋„ค์ปท ๋˜๋Š” ํด๋ผ๋กœ์ด๋“œ ํ‹ฐ์ผ“ ๊พธ๋ฏธ๊ธฐ
  • ์ œ์Šค์ฒ˜๋ฅผ ํ†ตํ•ด ์Šคํ‹ฐ์ปค ํ™•๋Œ€, ์ถ•์†Œ, ํšŒ์ „ ๋“ฑ ์ž์œ ๋กœ์šด ํŽธ์ง‘
  • ๋‹ค์–‘ํ•œ ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ์‚ฌ์ง„์„ ์ปค์Šคํ…€ํ™”ํ•˜๊ธฐ

๐Ÿ‘ฅ ์นœ๊ตฌ์™€ ํ•จ๊ป˜ํ•˜๋Š” ์—ฌํ–‰ ๊ธฐ๋ก

  • ์—ฌํ–‰ ์ผ์ •, ์žฅ์†Œ, ๋™ํ–‰์ž๋ฅผ ๊ธฐ๋กํ•œ ๋””์ง€ํ„ธ ํ‹ฐ์ผ“ ์ƒ์„ฑ
  • ์‹ค์‹œ๊ฐ„ ํ‹ฐ์ผ“ ๊ณต๋™ ํŽธ์ง‘ ๋ฐ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ Lock/Unlock ๊ด€๋ฆฌ
  • ์œ ๋‹ˆ๋ฒ„์„ค ๋งํฌ๋ฅผ ํ†ตํ•ด ์นœ๊ตฌ ์ดˆ๋Œ€ ๋ฐ ์—ฌํ–‰ ๊ธฐ๋ก ๊ณต์œ 
  • ์ธ์Šคํƒ€๊ทธ๋žจ ์Šคํ† ๋ฆฌ ๊ณต์œ  ๊ธฐ๋Šฅ ์ง€์›

๐ŸŽž๏ธMetal ๊ธฐ๋ฐ˜ ๊ณ ๊ธ‰ ์ด๋ฏธ์ง€ ํ•„ํ„ฐ ์‹œ์Šคํ…œ

  • Metal Shading Language(MSL)๋ฅผ ํ™œ์šฉํ•œ ์ปค์Šคํ…€ ์ด๋ฏธ์ง€ ํ•„ํ„ฐ ๊ตฌํ˜„
  • GPU ๊ฐ€์†์„ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ์ด๋ฏธ์ง€ ํ”„๋กœ์„ธ์‹ฑ์œผ๋กœ ๋ถ€๋“œ๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ œ๊ณต
  • ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ์˜ ํ•„ํ„ฐ ์ œ๊ณต

๐Ÿ’ป ๊ธฐ์ˆ  ์Šคํƒ

Frameworks & Libraries

  • SwiftUI: ์ „์ฒด UI ๊ตฌ์„ฑ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„
  • UIKit: ShareLink ๊ด€๋ จ ๊ธฐ๋Šฅ UIViewRepresentable๋กœ ๋ณด์™„
  • CoreLocation: ์œ„์น˜ ์ด๋ฒคํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์Šคํ‹ฐ์ปค ์ œ๊ณต
  • SwiftData: ์Šคํ‹ฐ์ปค ๋ฐ ํ”„๋ ˆ์ž„ ๋กœ์ปฌ ์บ์‹ฑ
  • Alamofire: RequestInterceptor๋ฅผ ํ†ตํ•œ ์ธ์ฆ ํ† ํฐ ์ž๋™ ๊ฐฑ์‹  ๋ฐ API ํ†ต์‹ 
  • Metal Framework: GPU ๊ฐ€์† ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฐ ์ปค์Šคํ…€ ํ•„ํ„ฐ ๊ตฌํ˜„

Architecture

  • Composable Architecture (TCA):
  • ์ด ํ”„๋กœ์ ํŠธ๋Š” Composable Architecture (TCA) ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ์ฃผ์š” ๋ชฉํ‘œ๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„, ๋ช…ํ™•ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ, ๋ชจ๋“ˆํ™” ํ†ตํ•ด ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ”„ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„

๋ชจ๋“  ์ƒํƒœ ๋ณ€ํ™”๋Š” Action โ†’ Reducer โ†’ State์˜ ํ๋ฆ„์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋””๋ฒ„๊น…์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ชจ๋“ˆํ™”๋œ Reducer ์„ค๊ณ„

๊ฐ ํ™”๋ฉด์ด๋‚˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ Reducer๋กœ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ๋ชจ๋“ˆํ™”๋ฅผ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. image

๐Ÿ›  Reducer ๊ตฌ์„ฑ ์˜ˆ์‹œ:

  • AppFeature: ์•ฑ ์ „์ฒด์˜ ์ƒํƒœ ๊ด€๋ฆฌ
  • NavigationFeature: ํ™”๋ฉด์ „ํ™˜ ๊ด€๋ฆฌ
  • MonitoringFeature: ์œ„์น˜ ์ถ”์  ๋กœ์ง ์ž‘์—… ๊ด€๋ฆฌ
  • LoginFeature: ์นด์นด์˜ค ๋ฐ ์• ํ”Œ ๋กœ๊ทธ์ธ ํ”Œ๋กœ์šฐ ์ฒ˜๋ฆฌ
  • AuthFeature: ๋กœ๊ทธ์ธ ์‹œ ํ•ด์•ผํ•˜๋Š” ์ž‘์—…๋“ค ๊ด€๋ฆฌ. ex) ์ตœ์ดˆ ๋กœ๊ทธ์ธ ๊ฒฝ์šฐ ์Šคํ‹ฐ์ปค, ํ”„๋ ˆ์ž„ ์ •๋ณด SwiftData์ €์žฅ ๋ฐ ๊ธฐ๊ธฐ ํ† ํฐ ์ €์žฅ

๐Ÿ— Dependency Injection

๋„คํŠธ์›Œํฌ ์š”์ฒญ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™, ๋กœ์ปฌ ์ €์žฅ์†Œ ๋“ฑ ์™ธ๋ถ€ ์˜์กด์„ฑ์„ Dependency๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๋†’์ด๊ณ , ์™ธ๋ถ€ ์˜์กด์„ฑ์„ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์˜์กด์„ฑ ์ฃผ์ž… ์˜ˆ์‹œ:

@Dependency(\.userClient) var userClient๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ด€๋ จ API ํ˜ธ์ถœ์„ ๊ด€๋ฆฌ.
์˜์กด์„ฑ ์ฃผ์ž… ์‚ฌ์šฉ ์‚ฌ๋ก€:
userClient: ์‚ฌ์šฉ์ž ์ •๋ณด ๋ฐ ํ”„๋กœํ•„ ๋ณ€๊ฒฝ.
travelClient: ์—ฌํ–‰ ํ‹ฐ์ผ“ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ.
locationClient: ์œ„์น˜ ๊ธฐ๋ฐ˜ ๋ชจ๋‹ˆํ„ฐ๋ง.
databaseClient: ์Šคํ‹ฐ์ปค ๋ฐ ํ”„๋ ˆ์ž„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ.

๐Ÿ”„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„

TCA์˜ ๋ชจ๋“ˆํ™”๋œ ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์˜ˆ์‹œ:

  • ์Šคํ‹ฐ์ปค ๊ด€๋ฆฌ, ์‚ฌ์ง„ ํŽธ์ง‘, ์•Œ๋žŒ ๊ธฐ๋Šฅ ๋“ฑ์€ ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅ
  • ๊ณตํ†ต ๊ธฐ๋Šฅ์œผ๋กœ ๋ถ„๋ฆฌ๋œ Feature:
    • StickerManagementFeature
    • PhotoGridFeature

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


๐Ÿงช ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ ๊ฐ•ํ™”

TCA๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์— ์šฉ์ดํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๊ฐ Reducer์™€ ์˜์กด์„ฑ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โœ… ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ ๊ตฌ์กฐ:

  • ๊ฐ Reducer์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
  • Mock Dependency ์ฃผ์ž…์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ฒ€์ฆ ๊ฐ€๋Šฅ

์ด๋Ÿฌํ•œ ์„ค๊ณ„๋ฅผ ํ†ตํ•ด ์•ˆ์ •์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Location Monitoring Flow
image
  1. ์‚ฌ์ผ๋ŸฐํŠธ ํ‘ธ์‰ฌ๋‚˜ AllticketOverViewFeature์—์„œ ํ‹ฐ์ผ“๋“ค์„ get์š”์ฒญ ํ›„ ํ•ด๋‹น๋‚ ์งœ์˜ ํ‹ฐ์ผ“์ด ์žˆ์œผ๋ฉด Appfeature์—์„œ .startMonitoring(Spot)๋ฐœ์ƒ.

  2. LocationClient ๋‚ด๋ถ€์˜ LocationActor์—์„œ CLMonitor์ƒ์„ฑ ํ›„ AsyncStream๋ฐ˜ํ™˜

  3. ํŠน์ • ์ง€์—ญ ์ง„์ž… ๋“ฑ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ CLMonitor.events -> LocationAcotr -> LocationClient -> LocationMonitoringFeature๋กœ ์ „๋‹ฌ

  4. LocationMonitoringFeature์—์„œ ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋”ฐ๋ฅธ ์•Œ๋ฆผ, ์„œ๋ฒ„ ํ‘ธ์‰ฌ, SwiftData์— ์ €์žฅ ๋“ฑ ์ถ”๊ฐ€ ์•ก์…˜.

Metal์„ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ํ•„ํ„ฐ ์‹œ์Šคํ…œ

Boleto๋Š” Metal Framework๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ณ ์„ฑ๋Šฅ ์ด๋ฏธ์ง€ ํ•„ํ„ฐ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ์—ฌํ–‰ ์‚ฌ์ง„์— ๋‹ค์–‘ํ•œ ์˜ˆ์ˆ ์  ํšจ๊ณผ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•:

GPU ๊ฐ€์† ์ฒ˜๋ฆฌ: Metal ์‰์ด๋”๋ฅผ ํ†ตํ•ด CPU ๋Œ€์‹  GPU์—์„œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋น ๋ฅธ ์„ฑ๋Šฅ ์ œ๊ณต

์‹ค์‹œ๊ฐ„ ๋ Œ๋”๋ง: ํ•„ํ„ฐ ์ธํ…์‹œํ‹ฐ๋ฅผ ์กฐ์ ˆํ•˜๋ฉฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฒฐ๊ณผ ํ™•์ธ ๊ฐ€๋Šฅ

๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ: ์ตœ์ ํ™”๋œ ๊ทธ๋ž˜ํ”ฝ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์†Œํ™”

์†๋„ ์ตœ์ ํ™”: ํ•œ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์ธ๋„ค์ผ์„ ์ƒ์„ฑํ•ด์•ผํ•˜๊ธฐ์— ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ์™€ ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง•์„ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑ

ํ•„ํ„ฐ ๊ตฌํ˜„ ๊ธฐ์ˆ :

์†Œ๋ฒจ ์—ฃ์ง€ ๊ฐ์ง€(Sobel Edge Detection): ์ด๋ฏธ์ง€์˜ ์—ฃ์ง€๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์Šค์ผ€์น˜, ๋งŒํ™” ํšจ๊ณผ ๊ตฌํ˜„

๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ(Gaussian Blur): ๋ถ€๋“œ๋Ÿฌ์šด ๋ธ”๋Ÿฌ ํšจ๊ณผ ์ œ๊ณต

๋ฏธ๋””์–ธ ํ•„ํ„ฐ(Median Filter): ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ ๋ฐ ์ด๋ฏธ์ง€ ์Šค๋ฌด๋”ฉ

์ปฌ๋Ÿฌ ์–‘์žํ™”(Color Quantization): ์ƒ‰์ƒ ํŒ”๋ ˆํŠธ ๋‹จ์ˆœํ™”๋ฅผ ํ†ตํ•œ ์Šคํƒ€์ผ๋ฆฌ์‹œํ•œ ํšจ๊ณผ

๋…ธ์ด์ฆˆ ์ƒ์„ฑ๊ธฐ(Noise Generator): ํ•„๋ฆ„ ๊ทธ๋ ˆ์ธ, ๋นˆํ‹ฐ์ง€ ํšจ๊ณผ ๋“ฑ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋…ธ์ด์ฆˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋น„๋„คํŒ…(Vignetting): ์‚ฌ์ง„ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ์–ด๋‘ก๊ฒŒ ํ•˜์—ฌ ์ค‘์•™์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ํšจ๊ณผ


๐Ÿ“– ๊ด€๋ จ ๋ธ”๋กœ๊ทธ ๋‚ด์šฉ ์ •๋ฆฌ


About

Boletto FrontEnd Repository

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors