๊ณตํต๋ ์์ ์ ๋ชฉํ๋ก ํ๋ ํ์๋ค ๊ฐ์ ์ปค๋ฎค๋ํฐ๋ฅผ ๊ตฌ์ฑํ์ฌ ํ ํ์ ์ ์ํํ๊ฒ ๋๋ ์ดํ๋ก, ํ์ ์ธ์ฆ๋ถํฐ ์ฑ๋ ๊ธฐ๋ฐ์ ์ฑํ ๊น์ง ๋ชจ๋ ๊ณผ์ ์ ํตํฉํ์ฌ ์ ๊ณตํฉ๋๋ค.
2024.01.06 ~ 2024.02.06 (4์ฃผ)
- ํ์ ์ธ์ฆ์ ๊ฑฐ์น ์์ ๋ก๊ทธ์ธ, ๋ก์ปฌ ๋ก๊ทธ์ธ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ก๊ทธ์ธ ์ดํ ์ผ์ ๊ธฐ๊ฐ ๋ด์๋ ํ ํฐ ๊ฐฑ์ ์ ํตํด ๋ก๊ทธ์ธ ์ํ๊ฐ ์๋์ผ๋ก ์ ์ง ๋ฐ ์ฐ์ฅ๋จ
- ๊ฐ์ธ ํ๋กํ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ฉฐ ํ์๋ค ๊ฐ ํ๋กํ์ ํ์ธํ ์ ์์
- ์ปค๋ฎค๋ํฐ์ ๊ธฐ๋ฐ์ด ๋๋ ์ํฌ์คํ์ด์ค ์์ฑ, ์์ , ์ญ์ ๊ฐ ๊ฐ๋ฅํจ
- ์ํฌ์คํ์ด์ค ๋ด์์ ์์ ๋จ์ ํน์ ์ฃผ์ ๋ณ๋ก ์ฑ๋์ ์์ฑํ๊ณ ํ์์ ์ด๋ํ ์ ์์
- ์ฑ๋ ๋ด ํ์๋ค ๊ฐ ์ค์๊ฐ ์ฑํ ์ด ๊ฐ๋ฅํ๋ฉฐ ์ฑํ ์์ ์ ํธ์ ์๋ฆผ์ ๋ฐ๊ฒ๋จ
- SwiftUI, PhotosUI
- Combine
- AuthenticationServices
- MVVM
- Moya
- SocketIO
- RealmSwift
- APNs, Firebase Cloud Messaging
- KakaoSDKUser
- SwiftUI์ Combine์ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ฒ๋ฆฌ ๋ฐ ๋ฐ์ํ UI ๊ตฌํ ํ๋ฉด ๊ฐ ์ด๋ ๋ฐ ๋ฐ์ดํฐ ์ ๋ฌ์ @State, @Binding ๋ฑ์ property wrapper๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ์ฒ๋ฆฌ
- DragGesture๋ฅผ ํตํด ์ฌ์ฉ์์ ์ํธ์์ฉ์ ๋ฐ์ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์
- ์ฑํ ์ RealmDB์ ์ ์ฅ๋์ด ๊ด๋ฆฌ๋๋ฉฐ, ์๋ก์ด ์ฑํ ๋ฉ์์ง๋ฅผ ์ ์กํ ๋๋ SocketIO๋ฅผ ํตํด ์ค์๊ฐ์ผ๋ก ํ์๋ค์๊ฒ ์ ๋ฌ
- FCM๊ณผ APNs๋ฅผ ํ์ฉํ์ฌ ์๋ก์ด ์ฑํ ์ ๋ฐ์ ์ ์ฌ์ฉ์์๊ฒ ์ค์๊ฐ์ผ๋ก ํธ์ ์๋ฆผ ์ ์ก
- AuthenticationServices๋ฅผ ์ฌ์ฉํ ์ ํ ๋ก๊ทธ์ธ๊ณผ KakaoSDKUser๋ฅผ ํ์ฉํ ์นด์นด์ค ๋ก๊ทธ์ธ ๊ตฌํ
-
์ปค์คํ ํฐํธ๋ฅผ ์ ์ฉํ ๋, ํฐํธ์ line height๋ฅผ ์ง์ ์ง์ ํ๋ ๊ธฐ๋ฅ์ด ์ ๊ณต๋์ง ์์
โ ViewModifier ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ๊ณ View extension์ ํ์ฉํ์ฌ ์ปค์คํ ํฐํธ์ line height๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ์ ํํจ
struct FontWithLineHeight: ViewModifier {
let font: UIFont
let lineHeight: CGFloat
func body(content: Content) -> some View {
content
.font(Font(font))
.lineSpacing(lineHeight - font.lineHeight)
.padding(.vertical, (lineHeight - font.lineHeight) / 2)
}
}
extension View {
func fontWithLineHeight(font: UIFont, lineHeight: CGFloat) -> some View {
ModifiedContent(content: self, modifier: FontWithLineHeight(font: font, lineHeight: lineHeight))
}
}
-
ํ๋ฉด ์ ํ์ด ์ฌ๋ฌ๋ฒ ์ด๋ฃจ์ด์ง๋ฉด์ ์ด๋ก ์ธํด ๋ทฐ ๊ณ์ธต์ด ์ฌ๋ฌ ๋ฒ ๊ฒน์ณ์ ธ ์์น ์๋ ๋ทฐ๋ค์ด ์์ฌ์๋ ๊ฒ์ด ํ์ธ๋จ
โ ์ต์์ ๋ทฐ์์ ์ํ ๋ฐ ์กฐ๊ฑด์ ๊ด๋ฆฌํ์ฌ ๋ฃจํธ ๋ทฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ ์ ํ
struct InitialView: View {
@ObservedObject var viewModel = HomeViewModel()
@State var isNewUser = false
var body: some View {
if viewModel.isLogout {
OnboardingView(isRootViewOnboardingView: $viewModel.isLogout, isNewUser: $isNewUser)
.onAppear() {
viewModel.tokenRefresh()
}
} else {
HomeView(isNewUserResult: $isNewUser, isLogout: $viewModel.isLogout)
}
}
}
-
๋ฟ๋ฏํ ์
โบ๏ธ - ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํตํด SwiftUI๋ฅผ ํ์ฉํ ์ฒซ ์๋น์ค๋ฅผ ๊ตฌํํด ๋ณผ ์ ์์๋ค. ๊ธฐ์กด์ UIKit๊ณผ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ํตํด UI๋ฅผ ๊ตฌ์ฑํ๋ฉด์ UI ๊ฐ๋ฐ์ด ๋ณด๋ค ์ง๊ด์ ์ด๊ณ ๋น ๋ฅด๊ฒ ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์ค๊ฐํ๋ค. ๋ํ @State, @Binding ๋ฑ์ ํตํด ๋ทฐ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ ํ๋ฆ์ ์ ์ดํ๋ ๋ฐฉ์์ ์๋กญ๊ฒ ์ตํ ์ ์์๋ค.
- Combine ํ๋ ์์ํฌ๋ฅผ ํ์ตํ๊ณ ๊ตฌํํ๋ฉฐ ๋น๋๊ธฐ์ ์ธ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌ๋ฅผ ๋ณด๋ค ๊ฐํธํ๊ฒ ๊ตฌํํ ์ ์์๊ณ , ๋ฐ์ดํฐ ํ๋ฆ์ ๋์ฑ ๋ช ํํ๊ฒ ๊ด๋ฆฌํ ์ ์์๋ค. Combine์ ์ฌ์ฉํ๋ฉฐ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ ํฅ์์ ๋ํ ๊ด์ฌ์ ๋์ฑ ํค์ฐ๊ฒ ๋์๋ค.
- ScrollView Reader, Tap Gesture ๋ฑ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ์ฌ ์ฌ์ฉ์์ ํธ์์ฑ์ ๊ณ ๋ คํ UI/UX ๋์์ธ๊ณผ ์ํธ์์ฉ ๊ธฐ๋ฅ์ ๊ตฌํํจ์ผ๋ก์จ ์ฌ์ฉ์์๊ฒ ๋ณด๋ค ํธ๋ฆฌํ๊ณ ์ง๊ด์ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์๋ค.
-
์์ฌ์ด ์ ๐ฅฒ
- ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ Combine์ ์ง์ ์ฌ์ฉํ๋ฉฐ ๊ฐ์ ์ตํ ์ ์์์ง๋ง ๋ค์ํ ์ฐ์ฐ์๋ฅผ ํ์ฉํ๋ ๋จ๊ณ๋ก ๋์๊ฐ๊ธฐ์ ๋ถ์กฑํ๋ ๊ฒ ๊ฐ๋ค. Combine ํ๋ ์์ํฌ์ ๋ค์ํ ์ฐ์ฐ์๋ค์ ๋ณด๋ค ๊น์ด ์๊ฒ ์ดํดํ๊ณ ํ์ฉํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ํ์ต์ด ํ์ํ๋ค๊ณ ์๊ฐํ๋ค.
- Enum์ผ๋ก API ์์ฒญ ๊ฒฐ๊ณผ์ ๋ํ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๋ฑ Enum์ ๋ณด๋ค ์ ๊ทน์ ์ผ๋ก ํ์ฉํ์ฌ ์กฐ๊ธ ๋ ๊น๋ํ๊ณ ๊ฐ๋ ์ฑ ์๋ ์ฝ๋๋ฅผ ์์ฑํ์ผ๋ฉด ์ข์์ ๊ฒ์ด๋ค.