Skip to content
This repository has been archived by the owner on Oct 3, 2021. It is now read-only.

cskime/iOS_DaangnMarket

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

DaangnMarket Clone

ํŒจ์ŠคํŠธ์บ ํผ์Šค iOS School์—์„œ ์ง„ํ–‰ํ–ˆ๋˜ Backend School๊ณผ์˜ ํ˜‘์—… ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

Description

  • ๊ธฐ๊ฐ„ : 2020.03.20 ~ 2020.04.29
  • ์‚ฌ์šฉ ๊ธฐ์ˆ 
    • Language : Swift
    • Framework : UIKit, CoreLocation
    • Library : Then, Alamofire, SnapKit, KingFisher, SwiftLint
    • Service : FCM, APNs, Firebase Authorization(Phone)
  • ํŒ€์› : 4๋ช…
  • ๋งก์€ ์—ญํ•  (LoC1 40%)
    • Firebase Phone Authorization ์„œ๋น„์Šค๋ฅผ ํ™œ์šฉํ•œ ๋ฌธ์ž ์ธ์ฆ ๊ตฌํ˜„
    • FCM์„ ํ™œ์šฉํ•œ ํ‘ธ์‹œ ์•Œ๋ฆผ ๊ตฌํ˜„
    • ๋™๋„ค ์„ค์ • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    • ์ƒ๋‹จ ์•Œ๋ฆผ, toast ์•Œ๋ฆผ, custom navigation bar ๋“ฑ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” view๋ฅผ ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณต(DGUpperAlert, DGToastAlert, DGNavigationBar ๋“ฑ)
    • ์ฑ„ํŒ… UI ๊ตฌํ˜„(RabbitMQ๋ฅผ ์‚ฌ์šฉํ•œ ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด Backend์™€ ํ•จ๊ป˜ ์ด์–ด์„œ ๊ฐœ๋ฐœ์ค‘)
    • REST API ์š”์ฒญ ์ž‘์—…์„ API class๋กœ ์ถ”์ƒํ™” ๋ฐ ๋ชจ๋“ˆํ™”
    • iOSํŒ€ ํŒ€์žฅ์œผ๋กœ์„œ ํ”„๋กœ์ ํŠธ ๊ธฐํš, ์ผ์ • ๊ด€๋ฆฌ, ์—…๋ฌด ๋ถ„๋ฐฐ, ์›ํ™œํ•œ ํ˜‘์—…์„ ์œ„ํ•œ ํŒ€ ๋‚ด Git ๊ฐ•์˜ ๋ฐ tech lead, trouble shooting ๋“ฑ์˜ ์—ญํ•  ์ˆ˜ํ–‰ํ•˜๊ณ  Backend์™€์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์ฃผ๋„
  • ์„ฑ๊ณผ
    • Then, Alamofire, SnapKit, KingFisher ๋“ฑ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ
    • SwiftLint ๋ฐ ์ž์ฒด์ ์œผ๋กœ ์ •ํ•œ ์„ธ๋ถ€ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ๊ฐ€๋…์„ฑ์„ ๋†’์ž„
    • iOSํŒ€ ํŒ€์žฅ์œผ๋กœ์„œ ํ”„๋กœ์ ํŠธ ๊ธฐํš, ์ผ์ • ๊ด€๋ฆฌ, ์—…๋ฌด ๋ถ„๋ฐฐ, tech lead ์—ญํ• ์„ ํ•œ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์Šค์Šค๋กœ ๋ถ€์กฑํ•œ ์ ์„ ํŒŒ์•…ํ•˜๊ณ  ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋จ
    • ํŒ€ ๋‹จ์œ„๋กœ ํ˜‘์—…ํ•˜๋Š” ๊ฒฝํ—˜์€ ์›๋งŒํ•œ ํ˜‘์—…๊ณผ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด ๋ณด๋Š” ๊ธฐํšŒ๊ฐ€ ๋จ
  • ์•„์‰ฌ์šด ์ 
    • ์ฑ„ํŒ… ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ RabbitMQ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ์กฐ์–ธ์„ ์ถฉ๋ถ„ํ•œ ๊ณต๋ถ€์™€ ๊ฒ€์ฆ ์—†์ด ๋ฐ›์•„๋“ค์˜€๊ณ , ์‹œ๊ฐ„ ๋ถ€์กฑ๊ณผ ๊ธฐ์ˆ ์ ์ธ ํ•œ๊ณ„์— ๋ถ€๋”ชํ˜€ ์ผ์ • ๋‚ด์— ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•จ. ๋‹น์‹œ ์ƒํ™ฉ์—์„œ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ธฐ์ˆ ์ธ์ง€ ๊ฒ€์ฆํ•œ ๋’ค, ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„ ์•ˆ์—์„œ ์ดˆ๊ธฐ ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์ดํ›„ ๋ณด์™„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค๋ฉด ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค.
    • Agile ๋ฐฉ๋ฒ•์„ ์ ์šฉํ–ˆ์œผ๋‚˜ ์‹คํŒจํ•จ. ์ตœ์ดˆ ๊ธฐํš ๋‹จ๊ณ„์—์„œ ํ•„์š”ํ•œ ์‹œ๊ฐ„ ์‚ฐ์ •์„ ์ž˜๋ชปํ–ˆ๊ณ , ํŒ€์›์˜ ๋Šฅ๋ ฅ์— ๋งž์ง€ ์•Š๋Š” ์—…๋ฌด ๋ถ„๋ฐฐ๋กœ ์ธํ•ด ์ผ์ •์ด ์ง€์—ฐ๋œ ๊ฒƒ์œผ๋กœ ๋ถ„์„. Daily scrum์„ ํ†ตํ•ด ์ง„ํ–‰ ์ƒํ™ฉ์„ ํŒŒ์•…ํ•˜์—ฌ ์ผ์ •์„ ์œ ๋™์ ์œผ๋กœ ์กฐ์ •ํ–ˆ๋‹ค๋ฉด ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค.

Design

  • Flow chart : ์ดˆ๊ธฐ ๊ธฐํš ๋‹จ๊ณ„์—์„œ ์•ฑ์˜ ์ „์ฒด ํ๋ฆ„๊ณผ ๊ตฌํ˜„์—์„œ ์ œ์™ธํ•  ๋ถ€๋ถ„์„ ํŒŒ์•…ํ•จ

  • Wire frame : ์•ฑ UI๋ฅผ ๋ถ„์„ํ•˜๊ณ  flow chart๋ฅผ ๊ตฌ์ฒดํ™”ํ•จ

Implementation

Feature

  • ๋™๋„ค ์„ค์ • ๋ฐ ๋ฌธ์ž ์ธ์ฆ ๊ธฐ๋Šฅ ๊ตฌํ˜„

  • ํ‘ธ์‹œ์•Œ๋ฆผ

  • ์ฑ„ํŒ…

    ์ฑ„ํŒ…์€ UI ์™„์„ฑ ํ›„ backend์™€ ์ž‘์—…์ค‘์ž…๋‹ˆ๋‹ค.

UI

  • Custom alert : Toast ์•Œ๋ฆผ(DGToastAlert) ๋ฐ ์ƒ๋‹จ์—์„œ ๋‚ด๋ ค์˜ค๋Š” ์•Œ๋ฆผ(DGUpperAlert)์„ ์ง์ ‘ ๊ตฌํ˜„

ํ˜‘์—…

  • Github : ํ•ด์•ผ ํ•  ์ž‘์—… ๋‹จ์œ„๋กœ issue๋ฅผ ๋“ฑ๋กํ•˜๊ณ  project board์—์„œ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํŒŒ์•…ํ•˜์—ฌ ์ผ์ • ๊ด€๋ฆฌ

  • Notion : ํšŒ์˜ ๋ฐ trouble shooting ๊ด€๋ฆฌ

  • Slack : Web hook ๊ธฐ๋Šฅ์„ ํ†ตํ•ด Github์˜ commit, issue, pull request ๋“ฑ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋ฆผ๋ฐ›๊ณ  ๋Œ€์‘

Trouble Shooting

  • ํšจ์œจ์ ์œผ๋กœ ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ ๊ตฌ์ถ•
    • miro๋ฅผ ์‚ฌ์šฉํ•ด flowchart ์ œ์ž‘ : ์›น ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํ–‰๋˜์–ด ์ ‘๊ทผ์„ฑ์ด ์ข‹๊ณ  ๋™์‹œ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•จ
    • Adobe XD๋ฅผ ์‚ฌ์šฉํ•ด wireframe ์ œ์ž‘ : ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ๋‹ค๋ฅธ ํŒ€์›์˜ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋˜์–ด ๊ณต์œ  ์ž‘์—…ํ•˜๊ธฐ ์ข‹์Œ
    • Github Organization์— backend์™€ iOS ํŒ€์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•˜์—ฌ ์ „์ฒด ์ง„ํ–‰ ์ƒํ™ฉ์„ ๊ณต์œ ํ•จ
    • ํšจ์œจ์ ์ธ ์ผ์ • ๊ด€๋ฆฌ ๋ฐ ์—…๋ฌด ๋ถ„๋ฐฐ๋ฅผ ์œ„ํ•ด ๋งก์€ ๊ธฐ๋Šฅ์„ issue๋กœ ๋“ฑ๋กํ•˜๊ณ  markdown์œผ๋กœ task list๋ฅผ ์ž‘์„ฑํ•˜์—ฌ progress bar๋กœ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๊ณต์œ ํ•˜์—ฌ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
    • Issue๋งˆ๋‹ค ํŒ€ label ๋ฐ ๊ธฐ๋Šฅ๊ฐœ๋ฐœ(feat), ๋ฒ„๊ทธ์ˆ˜์ •(bug) ๋“ฑ ์ž‘์—… ์ข…๋ฅ˜ label์„ ๋ถ™์—ฌ์„œ ํŒ€๋ณ„๋กœ ์–ด๋–ค ์ž‘์—…์„ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•จ
  • ๋‹ค์ˆ˜์˜ ํŒ€์›์ด ํ•˜๋‚˜์˜ repository์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•จ
    • ํŒ€์›๋“ค์ด develop branch๋ฅผ ๊ฐ์ž์˜ repository๋กœ folkํ•ด์„œ ๊ฐœ๋ฐœํ•˜๊ณ  pull request๋ฅผ ์š”์ฒญํ•˜์—ฌ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋œ ์ฝ”๋“œ๋ฅผ upstream repository์— ๋ฐ˜์˜ํ•จ
    • ์—ฌ๋Ÿฌ ๊ฐ€์ง€ feature๋“ค์„ ๋™์‹œ์— ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด Git-Flow์˜ branch ์ „๋žต์„ ์ ์šฉํ•˜์—ฌ feature branch์—์„œ ๊ฐœ๋ฐœ ์ง„ํ–‰ ํ›„ ์™„์„ฑ๋œ ๊ธฐ๋Šฅ์„ develop์œผ๋กœ mergeํ•จ
  • UITextView์— ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ๊ฐ€ ์ค„๋ฐ”๊ฟˆ์ด ๋  ๋•Œ UITableViewCell์˜ ๋†’์ด๊ฐ€ ์œ ๋™์ ์œผ๋กœ ์กฐ์ ˆ๋˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ
    • UITextField๊ณผ ๋‹ฌ๋ฆฌ UITextView๋Š” ์—ฌ๋Ÿฌ ์ค„์˜ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•จ์— ๋”ฐ๋ผ content size๊ฐ€ ๊ทธ์— ๋งž๊ฒŒ ๋Š˜์–ด๋‚˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ง์ ‘ ์ž…๋ ฅ๋œ text์— ๋งž๋Š” UITextView์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ด์•ผํ•จ
    • Text๊ฐ€ ์ž…๋ ฅ๋  ๋•Œ sizeThatFit(_:)๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ์— ๋”ฑ ๋งž๋Š” textView์˜ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ constraint๋ฅผ ์ ์šฉํ•จ
    • UITableView์˜ beginUpdates()์™€ endUpdates()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ๊ฐ€ ์ž…๋ ฅ๋  ๋•Œ ๋งˆ๋‹ค UITextView์˜ ๋†’์ด ๋ณ€ํ™”์— ๋”ฐ๋ผ Cell์ด ๋†’์ด๋ฅผ ๋™์ ์œผ๋กœ update ํ•˜๋„๋ก ํ•จ
  • Chatting UI ๊ตฌํ˜„ ์‹œ UITableViewCell์ด message ํฌ๊ธฐ์— ๋งž๊ฒŒ ์ค„์–ด๋“ค์ง€ ์•Š๋Š” ๋ฌธ์ œ
    • init(style:reuseIdentifier:)์—์„œ AutoLayout ์ ์šฉ ์‹œ ๋Š˜์–ด๋‚ฌ๋˜ message view์˜ ํฌ๊ธฐ๊ฐ€ ์žฌ์‚ฌ์šฉ๋˜์–ด content ํฌ๊ธฐ์— ๋งž๊ฒŒ ์ค„์–ด๋“ค์ง€ ์•Š์Œ
    • prepareForReuse()์—์„œ cell์ด ์žฌ์‚ฌ์šฉ ๋  ๋•Œ ๋งˆ๋‹ค message view์˜ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œ๋กœ ์กฐ์ ˆํ•˜๋„๋ก ํ•จ
  • App์ด terminate ์ƒํƒœ์ผ ๋•Œ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํ„ฐ์น˜ํ•˜์—ฌ ์•Œ๋ฆผ ํŽ˜์ด์ง€๊นŒ์ง€ ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ
    • App์ด ์ข…๋ฃŒ๋œ ์ƒํƒœ์—์„œ push notification์„ ๋ˆ„๋ฅด๋ฉด application(_:didFinishLaunchingWithOptions)์—์„œ launchOptions?[.remoteNotification]์œผ๋กœ noti ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด
    • ํ•˜์ง€๋งŒ, UserNotificationCenterDelegate์—์„œ userNotificationcenter(_:didReceive:withCompleetionHandleer:)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ launchOptions๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , push notification์„ ์„ ํƒํ•˜๋Š” ๋™์ž‘์€ ๋ชจ๋‘ didReceive delegate method์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค.
    • NotificationTrigger class๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ didReceive method๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ์•ฑ์˜ ์ƒํƒœ(notRunning, foreground, background)์— ๋”ฐ๋ผ ์•Œ๋ฆผํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚ค๋Š” trigger๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์„œ ํ•ด๊ฒฐ
  • Git์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜‘์—…ํ•  ๋•Œ *xcodeproj ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์—์„œ conflict์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ
  • ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” *xcodeproj ํŒŒ์ผ์€ ํด๋”์˜ ์œ„์น˜๋งŒ ๋ฐ”๋€Œ์–ด๋„ ๋‚ด๋ถ€ ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— git์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ trackingํ•˜๊ฒŒ ๋จ
  • GitKraken ๋“ฑ GUI ํˆด์„ ์‚ฌ์šฉํ•˜๋ฉด project์˜ source๋ฅผ ๋ฐ”๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•˜์—ฌ conflict๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Œ
  • GUI ํˆด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ํŒ€์˜ project file conflict๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ raw source code๋ฅผ ์ฐพ์•„์„œ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌย ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

1 Level of Contribution. ๊ธฐ์—ฌ๋„ โ†ฉ๏ธŽ

About

๐Ÿฅ• DaangnMarket Clone Project

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 99.9%
  • Ruby 0.1%