![](https://private-user-images.githubusercontent.com/130972950/321193801-a6f1aec5-9393-48ad-aa5e-93feaa704565.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMyNjgzNDYsIm5iZiI6MTcyMzI2ODA0NiwicGF0aCI6Ii8xMzA5NzI5NTAvMzIxMTkzODAxLWE2ZjFhZWM1LTkzOTMtNDhhZC1hYTVlLTkzZmVhYTcwNDU2NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgxMFQwNTM0MDZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1hZWQ3ZmVjZGNhMzU3OTE5ZDVmZWRkNzM5NDg3NWEwMTEzMDY4NGQ5ZjAyYTdhNmJiNjMyN2I3MDRhMWE2YTJlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.daY1wEbNsPUuDlmO4ORNO8TlXzMIKSMKBf20fy0PkkA)
![](https://private-user-images.githubusercontent.com/130972950/321193858-96726cf2-e806-4d5d-9dd2-9e20f2a9acc6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMyNjgzNDYsIm5iZiI6MTcyMzI2ODA0NiwicGF0aCI6Ii8xMzA5NzI5NTAvMzIxMTkzODU4LTk2NzI2Y2YyLWU4MDYtNGQ1ZC05ZGQyLTllMjBmMmE5YWNjNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgxMFQwNTM0MDZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jZDBiZDJlM2RmMjk4NjFjYWQ3ZTQwNzUyNzhlODA1MmU3MjdlNjNlMTc0YTFkNDI0MmNkYjg1ZWVhN2YxM2JjJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.A87J9MMknxIg89l4XPeXwA2VoAhwbmYrKDJmXr3xwoI)
![](https://private-user-images.githubusercontent.com/130972950/321194202-0f608100-d886-4632-af52-084461b815a6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMyNjgzNDYsIm5iZiI6MTcyMzI2ODA0NiwicGF0aCI6Ii8xMzA5NzI5NTAvMzIxMTk0MjAyLTBmNjA4MTAwLWQ4ODYtNDYzMi1hZjUyLTA4NDQ2MWI4MTVhNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgxMFQwNTM0MDZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yMjNlZmMxZmM4MmM0NWY5OTBmNmE0ZTExOGZmNDI1ZTA5ZDRiYmFiODJiYzA5YWQwNTMzOTc1YzE0MjcxZjI4JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.gc585u2uU4mVWprqfk8nG6cus18FxSMPwqiDrSWQtTE)
![](https://private-user-images.githubusercontent.com/130972950/321194231-ed388979-ac5f-4e11-94d6-1c984b63397e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMyNjgzNDYsIm5iZiI6MTcyMzI2ODA0NiwicGF0aCI6Ii8xMzA5NzI5NTAvMzIxMTk0MjMxLWVkMzg4OTc5LWFjNWYtNGUxMS05NGQ2LTFjOTg0YjYzMzk3ZS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODEwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgxMFQwNTM0MDZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lM2M2YzgxYjEwOGMxMGRjMDk3MWY4ZDE4MTliMzlhMmZlODZlZDA4YmQyY2I1ZmMyNjExNTk1NGQwYzNlYTAzJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.v1rzSufKtaJBld-Yl5CnEBJIcneiCRVMzH2A3owV28A)
๊ณตํต๋ ์์ ์ ๋ชฉํ๋ก ํ๋ ํ์๋ค ๊ฐ์ ์ปค๋ฎค๋ํฐ๋ฅผ ๊ตฌ์ฑํ์ฌ ํ ํ์ ์ ์ํํ๊ฒ ๋๋ ์ดํ๋ก, ํ์ ์ธ์ฆ๋ถํฐ ์ฑ๋ ๊ธฐ๋ฐ์ ์ฑํ ๊น์ง ๋ชจ๋ ๊ณผ์ ์ ํตํฉํ์ฌ ์ ๊ณตํฉ๋๋ค.
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์ ๋ณด๋ค ์ ๊ทน์ ์ผ๋ก ํ์ฉํ์ฌ ์กฐ๊ธ ๋ ๊น๋ํ๊ณ ๊ฐ๋ ์ฑ ์๋ ์ฝ๋๋ฅผ ์์ฑํ์ผ๋ฉด ์ข์์ ๊ฒ์ด๋ค.