ํจ์คํธ์บ ํผ์ค iOS School์์ ์งํํ๋ Backend School๊ณผ์ ํ์ ํ๋ก์ ํธ์ ๋๋ค.
- ๊ธฐ๊ฐ : 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์ ํตํด ์งํ ์ํฉ์ ํ์ ํ์ฌ ์ผ์ ์ ์ ๋์ ์ผ๋ก ์กฐ์ ํ๋ค๋ฉด ์ข์์ ๊ฒ ๊ฐ๋ค.
-
Flow chart : ์ด๊ธฐ ๊ธฐํ ๋จ๊ณ์์ ์ฑ์ ์ ์ฒด ํ๋ฆ๊ณผ ๊ตฌํ์์ ์ ์ธํ ๋ถ๋ถ์ ํ์ ํจ
-
Wire frame : ์ฑ UI๋ฅผ ๋ถ์ํ๊ณ flow chart๋ฅผ ๊ตฌ์ฒดํํจ
-
๋๋ค ์ค์ ๋ฐ ๋ฌธ์ ์ธ์ฆ ๊ธฐ๋ฅ ๊ตฌํ
-
ํธ์์๋ฆผ
-
์ฑํ
์ฑํ ์ UI ์์ฑ ํ backend์ ์์ ์ค์ ๋๋ค.
- Custom alert : Toast ์๋ฆผ(
DGToastAlert
) ๋ฐ ์๋จ์์ ๋ด๋ ค์ค๋ ์๋ฆผ(DGUpperAlert
)์ ์ง์ ๊ตฌํ
-
Github : ํด์ผ ํ ์์ ๋จ์๋ก issue๋ฅผ ๋ฑ๋กํ๊ณ project board์์ ์งํ ์ํฉ์ ํ์ ํ์ฌ ์ผ์ ๊ด๋ฆฌ
-
Notion : ํ์ ๋ฐ trouble shooting ๊ด๋ฆฌ
-
Slack : Web hook ๊ธฐ๋ฅ์ ํตํด Github์ commit, issue, pull request ๋ฑ์ ์ค์๊ฐ์ผ๋ก ์๋ฆผ๋ฐ๊ณ ๋์
- ํจ์จ์ ์ผ๋ก ํ์
ํ ์ ์๋ ํ๊ฒฝ ๊ตฌ์ถ
- 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๋ฅผ ๋ฐ์์์ผ์ ํด๊ฒฐ
- App์ด ์ข
๋ฃ๋ ์ํ์์ push notification์ ๋๋ฅด๋ฉด
- Git์ ์ฌ์ฉํ์ฌ ํ์
ํ ๋
*xcodeproj
ํ๋ก์ ํธ ํ์ผ์์ conflict์ด ๋ฐ์ํ๋ ๋ฌธ์ - ํ๋ก์ ํธ์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋
*xcodeproj
ํ์ผ์ ํด๋์ ์์น๋ง ๋ฐ๋์ด๋ ๋ด๋ถ ์ฝ๋๊ฐ ๋ฐ๋๊ธฐ ๋๋ฌธ์ git์ด ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก trackingํ๊ฒ ๋จ - GitKraken ๋ฑ GUI ํด์ ์ฌ์ฉํ๋ฉด project์ source๋ฅผ ๋ฐ๋ก ํ์ธ ๊ฐ๋ฅํ์ฌ conflict๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์์
- GUI ํด์ ์ฌ์ฉํ์ง ์๋ ๋ค๋ฅธ ํ์ project file conflict๋ฅผ ํด๊ฒฐํ ๋ raw source code๋ฅผ ์ฐพ์์ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ์ฌย ๋ฌธ์ ๋ฅผ ํด๊ฒฐํจ
1 Level of Contribution. ๊ธฐ์ฌ๋ โฉ๏ธ