Skip to content

yoonwooiOS/DogWalk

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

8 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿถ DogWalk

๊ฒฌ์ฃผ๋“ค์„ ์œ„ํ•œ ์‚ฐ์ฑ… ๊ธฐ๋กยท๊ณต์œ ํ•˜๋Š” ์†Œ์…œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค


ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ : 2024. 10. 28 (์›”) ~ 2024. 11. 25 (์›”)
๊ฐœ๋ฐœ ์ธ์› : iOS 4์ธ + Back-End 2์ธ
์ตœ์†Œ ๋ฒ„์ „ : iOS 17.0+




๊น€์œค์šฐ ๊น€์ค€ํฌ ๋ฐ•์„ฑ๋ฏผ ์†Œ์ •์„ญ
๊น€์ค€ํฌ ๊น€์ค€ํฌ ๊น€์ค€ํฌ ๊น€์ค€ํฌ

์‚ฌ์šฉ ๊ธฐ์ˆ  ๋ฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • iOS : Swift 5, Xcode 15.3, SwiftUI, MapKit
  • Architecture : MVI + Coordinator
  • Reactive : Combine
  • Network : Swift Concurrency + Router Pattern
  • Socket : Socket.IO
  • Local DB : CoreData

์ฃผ์š” ๊ธฐ๋Šฅ

  • ๊ฐ•์•„์ง€์™€ ์‚ฐ์ฑ… ๊ธฐ๋ก ๐Ÿ”ฅ
  • ๋‹ค๋ฅธ ์œ ์ €์™€ ์‹ค์‹œ๊ฐ„ 1:1 ์ฑ„ํŒ… ๐Ÿ’ฌ
  • ์œ„์น˜ ๊ธฐ๋ฐ˜ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ๐Ÿ‘€
  • ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ & ์กฐํšŒ โœ๏ธ

์ฃผ์š” ๊ตฌํ˜„ ์‚ฌํ•ญ

MVI ์•„ํ‚คํ…์ณ ์„ค๊ณ„

  • SRP (Single Responsibility Principle)
    • Container, Intent, Model, Repository์˜ ์—ญํ•  ๋ถ„๋ฆฌ ํ†ตํ•ด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ค€์ˆ˜ํ•œ ์•„ํ‚คํ…์ฒ˜
  • DIP (Depency Inversion Principle)
    • ํ”„๋กœํ† ์ฝœ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์„ ํ†ตํ•ด ์ถ”์ƒํ™”๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ์˜์กด ์—ญ์ „ ์›์น™์„ ์ค€์ˆ˜ํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
  • ๋ฌด๊ฒฐ์„ฑ (Intergrity)
    • Intent์— StateAction Protocol์„ ์ฑ„ํƒํ•˜์—ฌ Model์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์‹œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜์—ฌ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅ
  • Side Effect
    • ContentState๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ž‘์—…๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ์š”์ธ์— ๋”ฐ๋ผ ํ™”๋ฉด ์ „ํ™˜ ํƒ€์ž…์„ ๊ด€๋ฆฌํ•˜์—ฌ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ๋ฐ˜์˜ ์‹œ์˜ ํ๋ฆ„ ์ œ์–ด
  • Container
    • MVI์˜ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ์บก์Šํ™”๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Intent Protocol๊ณผ State Protocol์„ ์ฃผ์ž…๋ฐ›์•„ View์— ๋งคํ•‘ ๋ฐฉ์‹์˜ Container ์„ค๊ณ„

์‚ฐ์ฑ… ๊ธฐ๋ก

MapKit

  • followsUserLocation ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์œ„์น˜์™€ ์นด๋ฉ”๋ผ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ์— ์ƒˆ๋กœ๊ณ ์นจ ๋ฒ„ํŠผ ๋‚˜ํƒ€๋‚˜๋Š” ๋กœ์ง ๊ตฌํ˜„

ํƒ€์ด๋จธ

  • DispatchSourceTimer๋ฅผ ํ™œ์šฉํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ๋„ ๋™์ž‘ ๊ฐ€๋Šฅํ•œ ํƒ€์ด๋จธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ์ด๋ฅผ MapPolyline๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ๊ฒฝ๋กœ ์ถ”์  ๋ฐ ์‹œ๊ฐํ™” ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ

์œ„์น˜๊ธฐ๋ฐ˜ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ

  • ์นด๋ฉ”๋ผ ํฌ์ง€์…˜ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋งˆ๋‹ค map.region.span.latitudeDelta ๊ฐ’์„ ํ™œ์šฉํ•˜์—ฌ, ์ด๋ฅผ ์‹ค์ œ ๋ฏธํ„ฐ ๋‹จ์œ„ ๋ฐ˜๊ฒฝ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋™์  ์œ„์น˜ ์กฐํšŒ ๋ฒ”์œ„ ์กฐ์ •
  • MKCoordinateRegion์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€/์ตœ์†Œ ์œ„๊ฒฝ๋„ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ ์ธ ์ง€๋„ ์ถ•์ฒ™(zoom level)์„ ๊ตฌํ˜„ํ•˜๊ณ , MKMapSnapshotter๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ฒฝ๋กœ๊ฐ€ ํฌํ•จ๋œ ์ง€๋„ ์ด๋ฏธ์ง€๋ฅผ ์บก์ฒ˜

Pagination

  • ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ด€๋ จ ์ƒํƒœ๊ฐ’์€ Repository์—์„œ๋งŒ ๊ด€๋ฆฌ
  • Cursor๊ธฐ๋ฐ˜ Pagination์„ ํ†ตํ•ด ํ™”๋ฉด์— ํ•„์š”ํ•œ ๊ฒŒ์‹œ๊ธ€ ๊ฐœ์ˆ˜๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ•ด ์„œ๋ฒ„์˜ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ž„

multipart/form-data

  • Custom Multipart/form-data ์ฒ˜๋ฆฌ๋กœ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์‹œ ํ•„์š”ํ•œ HTTP ๋ฉ€ํ‹ฐ ํŒŒํŠธ ํ˜•์‹ ๊ตฌํ˜„

์†Œ์…œ ๋กœ๊ทธ์ธ

์• ํ”Œ ๋กœ๊ทธ์ธ

  • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋˜๋Š” iCloud์— ๋”ฐ๋ฅธ ๋กœ๊ทธ์ธ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ์ง„ํ–‰

์ฑ„ํŒ…

1:1 ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ตฌํ˜„

  • Socket.IO์™€ CoreData ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์˜ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜๊ณ , ์ฑ„ํŒ… ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ์— ์ €์žฅ
  • SocketProvider ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” SocketIOManager๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์†Œ์ผ“ ์—ฐ๊ฒฐ, ํ•ด์ œ, ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ์ด๋ฒคํŠธ ๊ด€๋ฆฌ
  • ์ƒ๋Œ€๋ฐฉ์˜ userID๋ฅผ ๋ฐ›์•„ ์ฑ„ํŒ…๋ฐฉ์„ ์ƒ์„ฑ ํ›„, ๋งŒ๋“ค์–ด์ง„ roomID๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ์ฑ„ํŒ…๋ฐฉ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜์—ฌ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ง„ํ–‰
    • ์ฑ„ํŒ…๋ฐฉ์„ ์ฒ˜์Œ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ, ์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ์†Œ์ผ“ ์—ฐ๊ฒฐ
    • ๊ธฐ์กด ์ฑ„ํŒ…๋ฐฉ์ธ ๊ฒฝ์šฐ, CoreData์— ์ €์žฅ๋œ ๊ธฐ์กด ์ฑ„ํŒ… ๋‚ด์—ญ์„ ๋ถˆ๋Ÿฌ์˜จ ํ›„ ์†Œ์ผ“ ์—ฐ๊ฒฐ
  • ๋ฉ”์„ธ์ง€ ์ „์†ก : ์„œ๋ฒ„ ํ†ต์‹ ์„ ํ†ตํ•ด ์ „์†กํ•œ ๋ฉ”์„ธ์ง€๋ฅผ CoreData์— ์ €์žฅํ•˜์—ฌ ํ™”๋ฉด ๊ฐฑ์‹ 
  • ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  : ์†Œ์ผ“ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ๋””์ฝ”๋”ฉ ํ›„ PassthroughSubject๋ฅผ ํ†ตํ•ด CoreData์— ์ €์žฅํ•˜์—ฌ ํ™”๋ฉด ๊ฐฑ์‹ 
  • Background ์ƒํƒœ ์ง„์ž… ์‹œ ์†Œ์ผ“ ์—ฐ๊ฒฐ ํ•ด์ œ

๋ธŒ๋žœ์น˜ ์ „๋žต

GitLab Flow ๋ฐ Branch Protect ๋„์ž…

  • production

    • ์‹ค์ œ ์„œ๋น„์Šค ๋ฐฐํฌ์šฉ ๋ธŒ๋žœ์น˜
    • 3๋ช…์˜ Approve๊ฐ€ ์žˆ์–ด์•ผ Merge ๊ฐ€๋Šฅ
  • pre-production

    • ๋ฐฐํฌ ์ „ ํ…Œ์ŠคํŠธ ์ง„ํ–‰์šฉ ๋ธŒ๋žœ์น˜
    • 3๋ช…์˜ Approve๊ฐ€ ์žˆ์–ด์•ผ Merge ๊ฐ€๋Šฅ
  • main

    • ๊ฐœ๋ฐœ ์ง„ํ–‰์šฉ ๋ธŒ๋žœ์น˜
    • 2๋ช…์˜ Approve๊ฐ€ ์žˆ์–ด์•ผ Merge ๊ฐ€๋Šฅ
  • feat, design, fix...

    • ๊ธฐ๋Šฅ ๋‹จ์œ„ ๋ธŒ๋žœ์น˜ (main ๋ธŒ๋žœ์น˜์—์„œ ๋ถ„๊ธฐ)
    • Issue, Commit ์ปจ๋ฒค์…˜๊ณผ ๋™์ผํ•œ Prefix ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ๊ตฌ๋ถ„
  • ๊ฐ ๋ธŒ๋žœ์น˜๋ณ„ ์ž‘์—… ๋‚ด์šฉ ํ™•์ธ์„ ์œ„ํ•ด ๋ธŒ๋žœ์น˜๋ช… ์ปจ๋ฒค์…˜ ๋„์ž…

    • prefix/์ด์Šˆ๋ฒˆํ˜ธ-์ž‘์—…์„ค๋ช…(PascalCase)
    • Feat/1-ProjectSetting

Prefix Description Prefix Description
Feat ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ปค๋ฐ‹ UI UI ์Šคํƒ€์ผ์— ๊ด€ํ•œ ์ปค๋ฐ‹
Fix ๋ฒ„๊ทธ ์ˆ˜์ •์— ๋Œ€ํ•œ ์ปค๋ฐ‹ Refactor ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์— ๋Œ€ํ•œ ์ปค๋ฐ‹
Build ๋นŒ๋“œ ๊ด€๋ จ ํŒŒ์ผ ์ˆ˜์ •์— ๋Œ€ํ•œ ์ปค๋ฐ‹ Test ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ •์— ๋Œ€ํ•œ ์ปค๋ฐ‹
Chore ๊ทธ ์™ธ ์ž์ž˜ํ•œ ์ˆ˜์ •์— ๋Œ€ํ•œ ์ปค๋ฐ‹ Init ํ”„๋กœ์ ํŠธ ์‹œ์ž‘์— ๋Œ€ํ•œ ์ปค๋ฐ‹
Ci CI ๊ด€๋ จ ์„ค์ • ์ˆ˜์ •์— ๋Œ€ํ•œ ์ปค๋ฐ‹ Release ๋ฆด๋ฆฌ์ฆˆ์— ๋Œ€ํ•œ ์ปค๋ฐ‹
Docs ๋ฌธ์„œ ์ˆ˜์ •์— ๋Œ€ํ•œ ์ปค๋ฐ‹ WIP ๋ฏธ์™„์„ฑ ์ž‘์—…์— ๋Œ€ํ•œ ์ž„์‹œ ์ปค๋ฐ‹

ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

1. CoreData์— ์ €์žฅ๋˜๋Š” ์ฑ„ํŒ… Custom Type ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌ

  • CoreChatRoom ์—”ํ‹ฐํ‹ฐ์— Message ๋ฐ์ดํ„ฐ๋ฅผ CustomType ๋ฐฐ์—ด ([Message]) ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌ
  • CoreData์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š” Custom Type์€ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๊ณผ์ •์ด ํ•„์š”

๋ฌธ์ œ์  ๐Ÿค”

1. ๋น„ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

  • ๋ฐ์ดํ„ฐ ํ•œ ๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•œ ๋’ค, ๋‹ค์‹œ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ €์žฅํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ๋ฐ ์†๋„ ์ €ํ•˜ ๋ฐœ์ƒ

2. ๊ฒ€์ƒ‰/์ˆ˜์ •/์‚ญ์ œ์˜ ๋น„ํšจ์œจ์„ฑ

  • ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •, ์‚ญ์ œํ•˜๋ ค๋ฉด ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•œ ํ›„ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ
  • ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์— ๋น„๋ก€ํ•œ O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

๊ฐœ์„  ์‚ฌํ•ญ ๐Ÿซข

Custom Type ๋ฐฐ์—ด์—์„œ Relationship์œผ๋กœ ์ „ํ™˜

1. Relationship ์„ค์ •

  • 1:N ๊ด€๊ณ„๋กœ ๋ณ€๊ฒฝ: ChatRoom (1) โ†’ Message (N).
  • ChatRoom์˜ roomID๋ฅผ Foreign Key๋กœ ์‚ฌ์šฉํ•˜์—ฌ, Message๊ฐ€ ์†ํ•œ ์ฑ„ํŒ…๋ฐฉ์„ ์ฐธ์กฐํ•˜๋„๋ก ์„ค๊ณ„.

2. ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ฐœ์„ 

  • Custom Type ๋ฐฐ์—ด ๊ด€๋ฆฌ ์‹œ: ์กฐํšŒ, ์ˆ˜์ •, ์‚ฝ์ž…, ์‚ญ์ œ ์ž‘์—… ๋ชจ๋‘ O(n)
  • Relationship ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ ํ›„
    • ์ถ”๊ฐ€: O(1)
    • ๊ฒ€์ƒ‰: O(log n)
    • ์‚ญ์ œ: O(n)
    • ์ˆ˜์ •: O(1)

2. ์œ ์ € ๊ฐค๋Ÿฌ๋ฆฌ ์ ‘๊ทผ ์‹œ ๊ณผ๋„ํ•œ ๋ฆฌ์†Œ์Šค ํ˜ธ์ถœ ๋ฌธ์ œ

๋ฌธ์ œ์  ๐Ÿค”

1. ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ

  • ์‚ฌ์šฉ์ž ๊ฐค๋Ÿฌ๋ฆฌ์— ์ ‘๊ทผ ์‹œ ๋™๊ธฐ์‹์œผ๋กœ ๊ฐ€์ ธ์™€์„œ UI๊ฐ€ ๋Š๊ธฐ๋Š” ๋ฌธ์ œ์  ๋ฐœ์ƒ

๊ฐœ์„  ์‚ฌํ•ญ ๐Ÿซข

  • PHCachingImageManager์— isSynchronous ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์—…๋กœ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐœ์„ 
  • ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ๋ฐ ์ด๋ฏธ์ง€ ์บ์‹ฑ์„ ํ†ตํ•ด ๊ฐœ์„ 

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 100.0%