Skip to content

KNUTICE/KNUTICE-iOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

1,023 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Download_on_the_App_Store_Badge_US-UK_RGB_blk_092917


๐Ÿ’โ€โ™‚๏ธ Service Introduction

  • ์ƒˆ๋กœ์šด ๊ณต์ง€ ์‚ฌํ•ญ์„ ์•ฑ ํ‘ธ์‹œ ์•Œ๋ฆผ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ณต์ง€ ์‚ฌํ•ญ ์•Œ๋ฆฌ๋ฏธ์™€ ๋Œ€ํ•™ ์ƒํ™œ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์บ ํผ์Šค ์ƒํ™œ ์œ ํ‹ธ๋ฆฌํ‹ฐ

๐Ÿ™‹โ€โ™‚๏ธ Part

  • KNUTICE iOS ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐํš, ์„ค๊ณ„, ๊ฐœ๋ฐœ, ๋””์ž์ธ

โš’๏ธ Tech Stack

  • Swift, iOS, UIKit, SwiftUI, MVVM, Clean Architecture, TCA, RxSwift, Combine, Swift Concurrency, Tuist, Alamofire, CoreData, Firebase, Xcode Cloud, XCTest

โš™๏ธ Architecture

  • MVVM + Clean Architecture

๐Ÿ’ก Trouble Shooting

  1. Tuist ๋„์ž…์„ ํ†ตํ•œ ๋ชจ๋“ˆํ™” ๋ฐ ๋นŒ๋“œ ์„ฑ๋Šฅ ๊ฐœ์„ 
  • ์œ„์ ฏ ์ต์Šคํ…์…˜ ๋“ฑ์—์„œ ์•ฑ ๋ชจ๋“ˆ์˜ ๊ณต์ง€ ์กฐํšŒ์™€ ๊ฐ™์€ ๋กœ์ง์„ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ์œผ๋ฉฐ, ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ ์‹œ ์ˆ˜์ • ๋ฒ”์œ„๊ฐ€ ์—ฌ๋Ÿฌ ํƒ€๊นƒ์œผ๋กœ ํ™•์‚ฐ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • Swift ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ ์„ค์ •์œผ๋กœ ๋ฐ˜๋ณต์ ์ธ ์„ธํŒ… ๊ฐ’ ์žฌ์‚ฌ์šฉ, ๋ชจ๋“ˆ ๋‹จ์œ„ ์บ์‹ฑ์„ ํ†ตํ•ด ๋นŒ๋“œ ์‹œ๊ฐ„์„ ๋‹จ์ถ•, git์— xcodeproj ํŒŒ์ผ์„ ํฌํ•จํ•˜์ง€ ์•Š์•„ Git ์ถฉ๋Œ ์ด์Šˆ๋ฅผ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด Tuist๋ฅผ ๋„์ž…ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€์‹ฌ์‚ฌ๋ณ„๋กœ ๋ชจ๋“ˆํ™”ํ•˜๊ณ , Swift๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ ์„ธํŒ…์œผ๋กœ ๋ฐ˜๋ณต์ ์ธ ์„ธํŒ… ๊ฐ’์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ๊ฐœ์„ 
  • ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํ™•๋ณดํ•˜๊ณ , ํด๋ฆฐ ๋นŒ๋“œ ์‹œ๊ฐ„์„ 50์ดˆ์—์„œ 15์ดˆ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Œ
  1. Feature ๋ชจ๋“ˆ ๊ฐ„ ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์˜์กด์„ฑ ๋ถ„๋ฆฌ
  • Notice ๋ชจ๋“ˆ์—์„œ ๋ถ๋งˆํฌ ์ €์žฅ์„ ์œ„ํ•ด Bookmark ๋ชจ๋“ˆ์„ ์ฐธ์กฐํ•ด์•ผ ํ–ˆ๊ณ , Bookmark ๋ชจ๋“ˆ์—์„œ๋„ ๊ณต์ง€ ์กฐํšŒ๋ฅผ ์œ„ํ•ด Notice ๋ชจ๋“ˆ์„ ์ฐธ์กฐํ•˜๋ฉด์„œ ์ˆœํ™˜ ์˜์กด์„ฑ์œผ๋กœ ๋นŒ๋“œ ์—๋Ÿฌ ๋ฐœ์ƒ
  • Feature ๋ชจ๋“ˆ์—์„œ ๋ชจ๋“ˆ ๊ฐ„ ์ง์ ‘์ ์ธ ์˜์กด์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•˜๊ณ , ์‹ค์ œ ์˜์กด์„ฑ์€ App ๋ชจ๋“ˆ์—์„œ ์ฃผ์ž…ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ ์ด์Šˆ ํ•ด๊ฒฐ
  1. ์•ฑ ์žฌ๋ฐฉ๋ฌธ ๋นˆ๋„์™€ ์ฝ˜ํ…์ธ  ์ ‘๊ทผ ๋น„์œจ์ด ๋‚ฎ์€ ๋ฌธ์ œ๋ฅผ UI ์žฌ๋ฐฐ์น˜๋ฅผ ํ†ตํ•œ ์ฝ˜ํ…์ธ  ์†Œ๋น„์œจ ๊ฐœ์„ 
  • ์‚ฌ์šฉ์ž๊ฐ€ ๊ณต์ง€ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๋Š” ๋ชฉ์  ์™ธ์—๋Š” ์žฌ๋ฐฉ๋ฌธ ๋นˆ๋„๊ฐ€ ๋‚ฎ์•˜๊ณ , ์•ฑ ์ง„์ž… ํ›„ ์ฝ˜ํ…์ธ  ์กฐํšŒ ๋น„์œจ ๋˜ํ•œ ์•ฝ 38%์— ๋จธ๋ฌด๋ฅด๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • ์‚ฌ์šฉ์ž๋“ค์˜ ์ด์šฉ ํŒจํ„ด์„ ๋ถ„์„ํ•˜๊ณ  'ํ•™์‹ ๋ฉ”๋‰ด ์กฐํšŒ'์™€ '์—ด๋žŒ์‹ค ์ขŒ์„ ์กฐํšŒโ€™ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ทผ๊ฑฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํŒ€์— ๋‘ ๊ธฐ๋Šฅ์„ ๋ฉ”์ธ ํ™”๋ฉด ์ตœ์ƒ๋‹จ์— ๋ฐฐ์น˜ ์ œ์•ˆ
  • ์•ฑ ์žฌ๋ฐฉ๋ฌธ ํšŸ์ˆ˜๋Š” ์•ฝ 280% ์ฆ๊ฐ€ํ–ˆ์œผ๋ฉฐ, ์ง„์ž…ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ณต์ง€๊นŒ์ง€ ํ™•์ธํ•˜๋Š” ์„ ์ˆœํ™˜ ๊ตฌ์กฐ๊ฐ€ ํ˜•์„ฑ๋˜์–ด ์ฝ˜ํ…์ธ  ์กฐํšŒ ๋น„์œจ์ด 58%๋กœ ์ฆ๊ฐ€
  1. Clean Architecture ๊ธฐ๋ฐ˜ ๊ณ„์ธต ๊ตฌ์กฐ ๊ฐœํŽธ
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ViewModel์— ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉด ํ…Œ์ŠคํŠธ ์‹œ UI ๊ณ„์ธต๊นŒ์ง€ ํ•จ๊ป˜ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ–ˆ๊ณ , ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ ๋ฐœ์ƒ
  • ๊ธฐ๋ณธ์ ์ธ MVVM + Repository ํŒจํ„ด์˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ์—์„œ Clean Architecture ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ๊ณ„์ธต ๊ฐ„ ์ฑ…์ž„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ์˜์กด์„ฑ์„ ๋„๋ฉ”์ธ์œผ๋กœ ํ–ฅํ•˜๋„๋ก ๊ตฌ์กฐ ๊ฐœ์„ 
  • ๊ณ„์ธต๋ณ„ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ ๊ณ„์ธต์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์ด ์ฆ๊ฐ€ํ•˜๊ณ , UIKit์—์„œ SwiftUI๋กœ ๋ณ€๊ฒฝ ํ˜น์€ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์˜ ์ฝ”๋“œ ์ˆ˜์ •์ด ๋„๋ฉ”์ธ ๊ณ„์ธต์˜ ์ˆ˜์ •์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ์Œ
  1. ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์œผ๋กœ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ๊ฐœ์„ 
  • ViewModel์—์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ, ๋กœ๋”ฉ ์ฒ˜๋ฆฌ, Alert ํ‘œ์‹œ ๋“ฑ ์„œ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์—์„œ ์ƒํƒœ ๊ฐ’์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„๋˜์–ด ํŠน์ • ์ƒํƒœ๊ฐ€ ์–ด๋–ค ์ด๋ฒคํŠธ์— ์˜ํ•ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์˜คใ…์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ™”๋ฉด ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ ์กด์žฌ
  • ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„, State์™€ Effect์˜ ๋…๋ฆฝ์ ์ธ ๊ด€๋ฆฌ, ํ…Œ์ŠคํŠธ์—์„œ ์•ก์…˜ -> ์ƒํƒœ ๋ณ€ํ™” ํ๋ฆ„์„ ๋‹จ๊ณ„์ ์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด TCA ์„ ํƒ
  • TCA ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ์ƒํƒœ ๋ณ€๊ฒฝ์€ Reducer ๋‚ด๋ถ€์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ฐœ์„ ํ•˜์—ฌ ์ƒํƒœ ์ถ”์ ์˜ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ๋””๋ฒ„๊น…์ด ์šฉ์ดํ•ด์กŒ์œผ๋ฉฐ, ํ…Œ์ŠคํŠธ ์šฉ์ดํ•œ ๊ตฌ์กฐ๋กœ ์ „ํ™˜๋˜์–ด ์•ˆ์ •์„ฑ ํ–ฅ์ƒ

๐Ÿง What I learned

ํ”„๋กœ์ ํŠธ ๊ธฐํš๋ถ€ํ„ฐ ๊ฐœ๋ฐœ, ์‹ค์ œ ์•ฑ์Šคํ† ์–ด ๋ฐฐํฌ์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์„œ๋น„์Šค ๋Ÿฐ์นญ๊ณผ ์šด์˜ ์ „ ๊ณผ์ •์„ ์ง์ ‘ ์ฃผ๋„์ ์œผ๋กœ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์—ˆ์Œ

  • UIKit, SwiftUI
    • AutoLayout์„ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์™€ ๋ฐฉํ–ฅ์—์„œ View๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ , ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” UI ์š”์†Œ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Œ
    • SwiftUI์˜ ๋ฐ์ดํ„ฐ ์ƒํƒœ์— ๋”ฐ๋ฅธ View ๊ฐฑ์‹  ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์„ ๋ถ„๋ฆฌํ•˜์—ฌ SwiftUI์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Œ
  • TCA
    • TCA์˜ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํ†ตํ•ด ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ , ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์„ ์–ธํ˜• UI์˜ ์ด์ ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ์‹์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Œ
  • Tuist
    • Tuist๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋“ˆํ™” ๊ตฌ์กฐ ์„ค๊ณ„๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์˜์กด์„ฑ์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•๊ณผ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ ๋ฐฉ์‹์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Œ
  • Combine, RxSwift
    • ๋น„๋™๊ธฐ ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Publisher์™€ Subscriber ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ์Œ
    • Combine์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž(map, flatMap, merge, debounce ๋“ฑ)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜, ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ์Œ
  • Swift Concurrency
    • GCD ๋Œ€๋น„ Swift Concurrency๊ฐ€ ๊ฐ€์ง€๋Š” ์„ฑ๋Šฅ์  ์žฅ์ ์„ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    • async/await, async-let, Task Tree, Actor ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฝ”๋“œ์—์„œ ๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Œ
  • Core Data
    • Persistent Storage์— ๋ฐ์ดํ„ฐ CRUD(์ €์žฅ, ์กฐํšŒ, ๊ฐฑ์‹ , ์‚ญ์ œ) ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ์Œ
  • CI/CD
    • Xcode Cloud๋ฅผ ์ด์šฉํ•œ CI/CD ํ™˜๊ฒฝ ๊ตฌ์ถ• ๋ฐ ๋นŒ๋“œ ์ž๋™ํ™”, ํ…Œ์ŠคํŠธ ์ž๋™ํ™”, ๋ฐฐํฌ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ์Œ

๐Ÿ“ฑ Preview

About

๐Ÿ“ข ํ•‘ํ”„๋“ค์„ ์œ„ํ•œ ๊ณต์ง€์‚ฌํ•ญ ์•Œ๋ฆผ ์„œ๋น„์Šค

Topics

Resources

Stars

Watchers

Forks

Contributors