SOPT 30th APPJAM
- ํ๋ก์ ํธ ๊ธฐ๊ฐ: 2022.06.29 ~
- ๐ Code Convention
- ๐ Git Convention
์ฒญ์์ ๋ฏผ๊ฐํ์ง๋ง ๋ฃธ๋ฉ์ดํธ๋ ์ฒญ์์ ๋ฏผ๊ฐํ์ง ์์์ ๊ฒฐ๊ตญ ๋ค ํผ์ ์ฒญ์ํ์ง๋ ์์ผ์ จ๋์?
์ ํ ์์ฒ๋ฅผ ์ฃผ๋ ค๊ณ ํ์ง ์์์ง๋ง, ๋ฃธ๋ฉ์ดํธ์ ์ฑํฅ์ด ๋ฌ๋ผ ์์ฒ๋ฅผ ์ค๋ฒ๋ฆฐ ์ ์ด ์์ง๋ ์์ผ์ จ๋์?
๋ฃธ๋ฉ์ดํธ์์ ํํ๋ก์ด ํ์ง์ด์ด๋ฅผ ๋์์ค ๋น์ Hous- ์ ๋๋ค.
โจ ์ด๋ฒคํธ ๋ฑ๋ก
ํจ๊ปํ๋ ์ผ ํน์ ๋ฃธ๋ฉ์ดํธ๋ค์ด ์๋ฉด ์ข์ ์์ ์ ์ผ์ ์ ์ด๋ฒคํธ๋ก ๋ฑ๋กํด ์๋ก์ ์ํ์ ๊ณต์ ํ ์ ์๋๋ก ํ๋ฉฐ ๋น์ผ ์๋ฆผ์ ํตํด ์์ง ์๊ณ ๊ธฐ์ตํ๊ฒ ํด์ค.
โจ ๊ท์น ๋ฑ๋ก
๊ณต๋ ์ํ์ ํ์ํ ๊ท์น์ ๋ฑ๋กํ๊ณ ์นดํ
๊ณ ๋ฆฌ๋ณ ๋ถ๋ฅ๋ฅผ ํตํด ์ฝ๊ฒ ํ์ธํ๋๋ก ํจ. ์ค์ ํ ๋ด๋น์์ ์์ผ์ ๋ฐ๋ผ ์๋ฆผ์ ๋ฐ๊ณ ๊ท์น์ ์ง์ผฐ๋์ง ์ฒดํฌํ ์ ์์.
โจ ์ฑํฅ ํ
์คํธ
ํ๋ฃจ์ ์ํฉ๊ณผ ์ง๋ฌธ์ ์ ์ํด ์๋ต์ ํตํด ์ํ ์ฑํฅ์ ํ์ธํจ. ๊ทธ๋ํ์ ์ฑํฅ ์นด๋๋ฅผ ํตํด ํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ ํ ๋์ ๋ณผ ์ ์๋๋ก ํ๋ฉฐ, ์ด๋ ๋ฃธ๋ฉ์ดํธ๊ฐ ์๋ก์ ๋ํ ์ดํด๋ฅผ ๋์.
Name | Tag | Management Tool |
---|---|---|
SnapKit | Layout | SPM |
Then | Layout, Sugar API | SPM |
Alamofire | Network | SPM |
Inject | Build | SPM |
RxGesture | RxLibrary | SPM |
RxSwift | RxLibrary | SPM |
Lottie | Splash | SPM |
.
โโโ Global
โย ย โโโ Extension
โย ย โโโ Resource
โย ย โย ย โโโ Assets.xcassets
โย ย โย ย โย ย โโโ Common
โย ย โย ย โย ย โโโ Home
โย ย โย ย โย ย โโโ Rules
โย ย โย ย โย ย โโโ Profile
โย ย โย ย โโโ Font
โย ย โโโ Supports
โย ย โย ย โโโ AppDelegate.swift
โย ย โย ย โโโ Info.plist
โย ย โย ย โโโ SceneDelegate.swift
โย ย โโโ UIComponent
โโโ Network
โย ย โโโ API
โย ย โโโ HTTP
โย ย โโโ Model
โโโ Screens
โโโ Home
โโโ Rules
โโโ Profile
โโโ Splash
โโโ Tabbar
แแ ตแแ งแซ | แแ ตแซแแ ข | แแ ด์ง | แแ ฉแแ ฆ |
---|---|---|---|
๊น์งํ | ๊น๋ฏผ์ฌ | ์ด์์ง | ๊นํธ์ธ |
@Jihyun247 | @ffalswo2 | @pabby | @psychehose |
๊ท์นํญ - ์นดํ ๊ณ ๋ฆฌ , ์ค๋์ Todo, ๋์ Todo, ์นดํ ๊ณ ๋ฆฌ ๋ณ ๊ท์น ์กฐํ, ์นดํ ๊ณ ๋ฆฌ ์ถ๊ฐ,์์ ,์ญ์
โโโ ๐ฑRules
ย ย โโโ ๐ฑRulesTodo
ย ย โย ย ย ย โโโ TodayTodo
ย ย โย ย ย ย โโโ MyTodo
ย ย โโโ ๐ฑCategory
ย ย โโโ ๐ฑCategoryEdit
ย ย ย ย ย ย โโโ Add
ย ย ย ย ย ย โโโ Update
๊ท์นํญ์ depth๊ฐ ๊น์ง ์๊ณ ํ๋์ ๋ทฐ ๋ด์์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์
ํ๋์ ๋ทฐ ๋ด์์ SubView๊ฐ ์ธ๊ฐ์ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์กด์ฌํ๊ณ , ๊ทธ SubView ์ SubView Case๋ฅผ ๋๋์ด ๊ตฌํํ์ต๋๋ค.
1๏ธโฃ ์ค๋์ Todo & ๋์ Todo / Category / Category ์ถ๊ฐ ์์ ์ธ๊ฐ์ง ๋ทฐ๋ก ๋๋์ด ๊ตฌํํ์ต๋๋ค.
2๏ธโฃ ์ค๋์ Todo & ๋์ Todo enum์ ์ ์ํ๊ณ case์ ๋ฐ๋ผ cell์ ๋ค๋ฅด๊ฒ dequeue ํด์ฃผ์์ต๋๋ค.
3๏ธโฃ Category ์ถ๊ฐ ์์ ๋ํ enum์ ์ ์ํ๊ณ case์ ๋ฐ๋ผ ๊ฐ์ View๋ฅผ ์ฌ์ฌ์ฉํ๋ฉฐ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
๋ฉ์ธํํญ - ์ด๋ฒคํธ, Rules, Todo, ๊ฐ์ ๋ฐฉ ํธ๋ฏธ(homie)๋ค ์กฐํ, ์ด๋ฒคํธ ์ถ๊ฐ/์์ /์ญ์ ํ์ ์ฐฝ, ํธ๋ฏธํ๋กํ ์กฐํ, ์ฑํฅํ ์คํธ ์กฐํ, ์ฑํฅ ํ ์คํธ ๊ฒฐ๊ณผ ์ถ๊ฐ, ํ ์คํธ ๊ทธ๋ง๋๊ธฐ ํ์
1๏ธโฃ ์ ์ฒด ํ ํ๋ฉด๋ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ปฌ๋ ์
๋ทฐ๋ก ์ก๊ณ ๊ฐ๊ฐ์ ์น์
๊ณผ ์น์
ํค๋๋ฅผ ํตํด ๋ทฐ๋ฅผ ์ค๊ณํ์์ต๋๋ค. ๋๋ฒ์งธ ์
(KeyRules, Todo) ๊ฐ์ ๊ฒฝ์ฐ์ ๋์ ์ผ๋ก cell์ ๋์ด๊ฐ ๋ฐ๋์ด์ผํ๊ธฐ์ ๋์ ๋์ด๋ฅผ ์ ์ฉํ์์ต๋๋ค.
2๏ธโฃ ์ด๋ฒคํธ ํ์
์ฐฝ์ ๊ตฌ์ฑํ ๋ ์์ด์ฝ ๋ผ๋์ค ๋ฒํผ๋ค๊ณผ ๋ ์ง Datepicker๋ถ๋ถ์ ๋ชจ๋ View๋ก ๋นผ๊ณ TapGesture๋ฅผ ์ ์ฉ์์ผ์ ๊ตฌํํ์ต๋๋ค.
Profile Main View
โ ํ๋กํ ์ ๋ณด, ์ฑ๊ฒฉ ์ ํ๋ณ ์ปฌ๋ฌ ์ ์ฉ, ์ฑํฅ ํ ์คํธ ๊ฒฐ๊ณผ ๊ทธ๋ํ ์ ๋๋ฉ์ด์ ๊ธฐ๋ฅProfile
- ์ฑํฅ ํ ์คํธ ๊ฒฐ๊ณผ ๋ทฐ โ ํ๋กํ ์ฑํฅ ๊ฒฐ๊ณผ์ ๋ง๋ ๋ทฐ๋ฅผ ๋ณด์ฌ์คProfile
- Setting ๋ทฐ
์ ์ฒด์ ์ธ ๋ ์ด์์์ Navigation Bar View Component + CollectionView LayOut์ ์ด์ฉํ์ฌ ๊ตฌํํ์์ต๋๋ค.
Enum ์ ์ ๊ทน์ ์ผ๋ก ์ด์ฉ โ Hous- ์ ๊ฒฝ์ฐ ๋ค์ฏ ๊ฐ์ง ์ฑ๊ฒฉ ์ ํ์ด ์๊ณ , ๊ฐ ์ฑ๊ฒฉ๋ณ๋ก ์ปฌ๋ฌ, ํ๋กํ ์ด๋ฏธ์ง ๋ฑ์ด ๋๋ถ๋ถ์ ๋ทฐ์ ์ผ๊ด ์ ์ฉ์ด ๋๋ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. โ ์ด ๋ค์ฏ ๊ฐ์ง ํน์ฑ์ ๋์๋๋ ํ๋กํผํฐ๋ค์ Enum์ ์ ๋ฆฌํ์ฌ ์ฐจํ ์ ๋ฐ์ดํธ ์ Enum๋ง ์์ ํด์ฃผ๋ฉด ๋ชจ๋ ๋ทฐ์ ์ผ๊ด ์ ์ฉ์ด ๊ฐ๋ฅํ๊ฒ ์ค๊ณ๋์์ต๋๋ค. โ ๋ํ ๋ค์ฏ ๊ฐ์ง ํน์ฑ์ด ์ ์ฉ๋๋ ๋ทฐ์์ ์ผ์ผ์ด Switch ๋ฌธ์ ์์ฑํ ํ์๊ฐ ์์ด ์ฝ๋๊ฐ ๋์ฑ ๊ฐ๊ฒฐํด์ง๋๋ค.
๋ ์ด์์ ๊ตฌํ์ configUI(), render() ํจ์๋ฅผ ์ปจ๋ฒค์ ์ผ๋ก ํ์ฌ ๊ณตํต ์ ์ฉํ์ฌ then, Snapkit ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด ๊ตฌํํ์์ต๋๋ค.
๊ทธ๋ํ๊ฐ ๊ทธ๋ ค์ ธ์ผ ํ๋ ์ ์ ์ขํ๋ฅผ ์ป์ด๋ด๋ ๋ถ๋ถ๊ณผ ์ ์ด ์ฃผ์ด์ก์ ๋ ๊ทธ๋ํ๋ฅผ ํ๋ฉด์ ํํํด์ฃผ๋ ๋ถ๋ถ์ผ๋ก ๋๋์ด ๊ตฌํํ์์ต๋๋ค.
๊ทธ๋ํ ์ ์ ์ขํ๋ ์ค์ฌ์ ๋ฒกํฐ์ ๊ทน ์ขํ๊ณ๋ฅผ ์ด์ฉํด ํํํ ๋ฒกํฐ๋ฅผ ํฉํ๋ ๋ฐฉ์์ผ๋ก ์ป์ด๋์ต๋๋ค.
์ ๋๋ฉ์ด์ ์ ์ ๋๋ฉ์ด์ ์์ BezierPath์ ์ ๋๋ฉ์ด์ ๋ BezierPath๋ฅผ CAAnimation ์ ease ์ต์ ์ ์ฃผ์ด์ ์ป์ด๋ด๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ต๋๋ค.
์งํ์ด๊ฐ ๊ตฌํํด ์ค Network Layer๋ก๋ถํฐ NetworkResponse ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋ทฐ์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฉํ ์ ์๋ ๋ฐ์ดํฐ ํฌ๋งท์ธ DataPack ์ ์ ์ํฉ๋๋ค.
NetworkResponse ํฌ๋งท์ DataPack ํฌ๋งท์ผ๋ก ์ ํํ๋ ConvertResponseToDataPack ํจ์๋ฅผ ๊ตฌํํฉ๋๋ค.
DataPack ์ ๊ฐ ๋ทฐ์ ์ ์ฉํ๋ setData ํจ์๋ฅผ ๊ตฌํํ์ฌ ์๋ฒ ์ฐ๊ฒฐ์ ๋ง๋ฌด๋ฆฌํฉ๋๋ค.
์์ ๊ฐ์ ์ผ๊ด๋ ํ๋ก์ฐ๋ก ํต์ ๋ก์ง์ ๊ตฌํํ์ฌ, ์ฐจํ ์ ๋ฐ์ดํธ ์ฌํญ์ด ์์ ๋ ํจ๊ณผ์ ์ผ๋ก ๋์ํ ์ ์๋๋ก ํ์์ต๋๋ค.
์ด๋ฒ์ ๋ด๊ฐ ์ฑ์ผ์์ ๋งก์ ๋ถ๋ถ์ ์ปค์คํ ํญ๋ฐ์ ์๋ก์ด ๊ท์น์ ์์ ํ๊ฑฐ๋, ์ถ๊ฐํ๋ ๋ทฐ์ด๋ค.
1๏ธโฃ ์ปค์คํ
ํญ๋ฐ๋ UITabbarController์ ์์ ์กด์ฌํ๋ tabbar๋ฅผ ์จ๊น ์ฒ๋ฆฌํ๊ณ ์ปค์คํ
ํ Tabbar๋ฅผ ์ฌ๋ ธ๊ณ RxSwift, RxCocoa, RxGestures๋ฅผ ์ด์ฉํด์ ์์ดํ
๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ๋ฐ ๊ตฌ๋
ํ๋ค.
2๏ธโฃ ๊ท์น ์ถ๊ฐ, ์์ ํ๋ ๋ทฐ๋ ๋จผ์ ๋๋๋ค์ด์ด ๋ค์ด๊ฐ ์์ด์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ธ๊น ๋ง๊น ๊ณ ๋ฏผํ๋ค๊ฐ ์ง์ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์๋๋ฐ ๋๋๋ค์ด ํญ ์ด๋ฒคํธ๋ฅผ ์ฃผ๊ธฐ๊ฐ ์ข ๋ณต์กํ๋ค. (์ขํ๊ณ์ฐ์ด ์ข ๊น๋ค๋ก์ ์..)
Hous- ๋ User ๋ง๋ค ์ฑํฅํ
์คํธ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ TypeColor
๊ฐ ์กด์ฌํ๊ณ ์๋ฒ์์ String
์ผ๋ก ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ ๋ฐ์์จ String
์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ค๊ฐ์ง๋ก ๋ณํํด์ผ ํฉ๋๋ค.
1. typeColor์ ๋ฐ๋ฅธ ๋ค์ํ ์์ ์ง์ UIColor
2. typeColor์ ๋ฐ๋ฅธ ๋ค์ํ ์์ ๋ฐฐ๊ฒฝ UIColor
3. typeColor์ ๋ฐ๋ฅธ ๋ค์ํ ์์ ์ผ๊ตด ์ด๋ชจ์ง
4. typeColor์ ๋ฐ๋ฅธ ๋ค์ํ ์์ ์ฒดํฌ๋ ์ผ๊ตด ์ด๋ชจ์ง
ํ์ง๋ง ์๋ฒํต์ ์ ํ ๋๋ง๋ค ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ์ฌ TypeColor์ ๋ฐ๋ฅธ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํ๋๋ ์ค๋ณต ์ฝ๋๊ฐ ๊ต์ฅํ ๋ง์์ก์ต๋๋ค.
์ด ๋ถ๋ถ์ Factory Pattern
์ผ๋ก ๊ฐ์ฒด ์์ฑ์ ์บก์ํ ํ์์ต๋๋ค.
enum AssigneeColor: String {
case yellow, blue, purple, red, green, gray, none
}
protocol AssigneeProtocol {
var checkedFaceImage: UIImage { get set }
var faceImage: UIImage { get set }
var color: UIColor { get set }
var profileBackgroundColor: UIColor { get set }
}
struct YellowAssignee: AssigneeProtocol {
var checkedFaceImage = R.Image.faceCheckedYellow
var faceImage = R.Image.faceYellow
var color = R.Color.paleGold
var profileBackgroundColor = R.Color.offWhite
}
// ์๋ต
struct AssigneeFactory {
static func makeAssignee(type: AssigneeColor) -> AssigneeProtocol {
switch type {
case .yellow:
return YellowAssignee()
//์๋ต
}
}
}
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
let assignee = AssigneeFactory.makeAssignee(type: AssigneeColor(rawValue: data.typeColor.lowercased()))
participantButton.setBackgroundImage(assignee.faceImage, for: .normal)
participantButton.setBackgroundImage(assignee.checkedFaceImage, for: .selected)
1๏ธโฃ git rebase๋ฅผ ์ฒ์ ์ ํ๋ฉด์ ์ฝ๋๋ ํ์ผ๊ตฌ์กฐ git conflict๋ฑ์ ๋ฌด์ํ ๊ฒช์ผ๋ฉฐ resetํ๋ฉฐ rebase๋ฅผ ์ตํ๊ณ git์ ๋ํ ๋๋ ค์์ ์ด๋์ ๋ ๋จ์ณ๋ผ ์ ์์๋ค.
2๏ธโฃ ์ด๊ธฐ์ GET APIํต์ ์ viewWillAppear์ ๋ฃ์ด์คฌ์ผ๋ dismiss์์๋ viewWillAppear๊ฐ ํธ์ถ๋์ง ์์ ์์ํ ๊ฒฐ๊ณผ๊ฐ์ ์ป์ง ๋ชปํ๋ค. iOS 13์ดํ๋ก dismissํ์๋ viewWillAppear๊ฐ ํธ์ถ๋์ง ์๋๋ค ํ์ฌ NotificationCenter๋ฅผ ํ์ฉํด์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ ์ํ๋ CollectionView๋ฅผ ํ์
์ dismissํ ํ์ reload์์ผ์ค ์ ์์๋ค.
3๏ธโฃ ํ
์คํธํ๋ ๊ธ์์๋ฅผ ์ ํํ ํ์๊ฐ ์์๋๋ฐ textFieldDelegate๋ก๋ง ๊ธ์์๋ฅผ ์ ํ์ ํ๋ฉด ํ๊ธ์ ๋ฐ์นจ ํน์ฑ ๋๋ฌธ์ ๊ธ์์๊ฐ ์ ๋ง์ง ์๋ ์ด์๊ฐ ์์ด textDidChangeNotification์ NoficationCenter๋ฅผ ์ด์ฉํด์ ํ๋ฒ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ ํ๊ธ ๊ธ์์ ์ ํ์ ๊ตฌํํ ์ ์์๋ค.
4๏ธโฃ ์ฑํฅํ
์คํธ๋ฅผ ํ ์์ ํ
์คํธ๋ฅผ ํ ๋ฒํผ์ ์ํ๋ฅผ ๊ณ์ ๊ธฐ์ตํ๊ณ ์๊ณ ๋์๊ฐ๋ฉด ์ด๋ฅผ ์์ ํ ์ ์์ด์ผํ๊ธฐ ๋๋ฌธ์ DTO๋ฅผ ๋ฐ๋ก ๋ฐ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ dictionary๋ฅผ ์ด์ฉํด์ ํ๋ฒ์ ๋ค๋ฅธ struct์ผ๋ก ๋ง๋ ํ ์ด๋ฅผ ์ ์ฉํด์ ๊ตฌํํ์ต๋๋ค.
struct TypeTestDTO: Codable {
let id: String
let question: String
let testNum: Int
let questionImg: String
let answers: [String]
let questionType: String
enum CodingKeys: String, CodingKey {
case id = "_id"
case question
case testNum
case questionImg
case answers
case questionType
}
}
struct TestCellItem {
let testTitle: String
let testIdx: Int
let testImg: String
let testType: String
var testAnswers: [ButtonState]
init(dto: TypeTestDTO) {
self.testTitle = dto.question
self.testIdx = dto.testNum
self.testImg = dto.questionImg
self.testType = dto.questionType
var t: [ButtonState] = []
for answer in dto.answers {
let button = ButtonState(optionText: answer, isSelected: false)
t.append(button)
}
self.testAnswers = t
}
}
DTO๋ฅผ ํ๋ฒ ๋ ๊ฐ์ผ custom struct DTO
๐ ํ๋ก์ ํธ ์งํ ๊ฐ ์ด๋ ค์ ๋ ์ ๊ณผ ํด๊ฒฐ ๊ณผ์
1๏ธโฃ ํ์ฐ์ค ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ด๋ ค์ ๋ ๋ถ๋ถ์ ์๋ก์ด ๊ท์น์ ์ถ๊ฐํ ๋, ์ ์ ์ธํฐ๋ ์
์ ๋ฐ๋ผ ๋ณํ๋ UI ๋ก์ง ์ฒ๋ฆฌ์๋ค. ํด๊ฒฐ์ Dictionary๋ฅผ ์ด์ฉํด์ ์ธํฐ๋ ์
๋ง๋ค ์
๋ฐ์ดํธ๋ฅผ ํ๋ ๋ฐฉ์์ผ๋ก ํ๋ค.
2๏ธโฃ ๊ฐ๋ฐ์ด๋ผ๋ ๊ฒ ํน์ฑ์ ํ์
ํ ํ๋ฅ ์ด ๋์๋ฐ Git์ ๋ํด์ ์ข ๋ ์์ธํ ์ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํด์( ์ฌ์ค ๊ทธ๋ฅ One-line์ด ์๋ป์ ) git rebase merge + git flow๋ฅผ ๋์
ํด๋ดค๋ค. rebase๋ฅผ ํ๊ฒ ๋๋ฉด merge ๋ณด๋ค ํจ์ฌ ์ถฉ๋์ด ๋ง์ด ๋ฐ์ํ๋๋ฐ ์ด๊ธฐ์๋ ํ์๋ค์ด ์ด๊ฒ์ ๋ํด์ ๊ฑฑ์ ํ์๋ค. ์ง๊ธ ์ด ๊ธ์ ์ฐ๋ ์์ ์์ ๋ค๋ค git rebase์ ๋ํด ํฐ ๋ถ๋ด๊ฐ์ ๊ฐ์ง์ง ์๊ณ ์ถฉ๋์ ๋ ์ฌ์ ๋ก์์ง ๋ชจ์ต์ ๋ด์ ๋๋ฆ ๋ฟ๋ฏํ๋ค.
3๏ธโฃ ๋ํ Injection์ ๋์
ํด๋ดค๋๋ฐ ๊ฐ์ธ์ ์ผ๋ก๋ ๋๋ฆ ์ ์ฉํ๊ฒ ์ฌ์ฉํ๊ณ ์๊ธฐ๋ ํ๊ณ ํ์๋ค์ด ๋ง์์ ๋ค์ดํ๋ ๊ฑฐ ๊ฐ์์ ์ข์๋ค. ๋ค๋ง ๋ณดํต ์ฌ์ฉํ ๋๋, Test App Target์ ๋ง๋ค๊ณ ์์
์ ํ๋๋ฐ ์ข๋ง ๋ ์ ๊ฒฝ ์จ์, ๊ทธ ๋ถ๋ถ๋ ๋์
ํ์ผ๋ฉด ์ข์ง ์์์๊น ํ๋ ์์ฌ์์ด ๋ค์๋ค.