yeonupark / MessengerProject

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Everyminute ๐Ÿ•ฐ๏ธ๐Ÿ‘จโ€๐Ÿ’ป

ํ•œ ์ค„ ์†Œ๊ฐœ

๊ณตํ†ต๋œ ์ž‘์—…์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ํŒ€์›๋“ค ๊ฐ„์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ํŒ€ ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ๋•๋Š” ์–ดํ”Œ๋กœ, ํšŒ์› ์ธ์ฆ๋ถ€ํ„ฐ ์ฑ„๋„ ๊ธฐ๋ฐ˜์˜ ์ฑ„ํŒ…๊นŒ์ง€ ๋ชจ๋“  ๊ณผ์ •์„ ํ†ตํ•ฉํ•˜์—ฌ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„

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)
        }
    }
}

ํšŒ๊ณ 

  • ๋ฟŒ๋“ฏํ•œ ์  โ˜บ๏ธ

    1. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด SwiftUI๋ฅผ ํ™œ์šฉํ•œ ์ฒซ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ธฐ์กด์˜ UIKit๊ณผ๋Š” ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ด UI๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด์„œ UI ๊ฐœ๋ฐœ์ด ๋ณด๋‹ค ์ง๊ด€์ ์ด๊ณ  ๋น ๋ฅด๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์„ ์‹ค๊ฐํ–ˆ๋‹ค. ๋˜ํ•œ @State, @Binding ๋“ฑ์„ ํ†ตํ•ด ๋ทฐ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹์„ ์ƒˆ๋กญ๊ฒŒ ์ตํž ์ˆ˜ ์žˆ์—ˆ๋‹ค.
    2. Combine ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ•™์Šตํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋ฉฐ ๋น„๋™๊ธฐ์ ์ธ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. Combine์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์„ ๋”์šฑ ํ‚ค์šฐ๊ฒŒ ๋˜์—ˆ๋‹ค.
    3. ScrollView Reader, Tap Gesture ๋“ฑ์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ํŽธ์˜์„ฑ์„ ๊ณ ๋ คํ•œ UI/UX ๋””์ž์ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ณ  ์ง๊ด€์ ์ธ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ์•„์‰ฌ์šด ์  ๐Ÿฅฒ

    1. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Combine์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ฐ์„ ์ตํž ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋‹จ๊ณ„๋กœ ๋‚˜์•„๊ฐ€๊ธฐ์—” ๋ถ€์กฑํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. Combine ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž๋“ค์„ ๋ณด๋‹ค ๊นŠ์ด ์žˆ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ํ•™์Šต์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
    2. Enum์œผ๋กœ API ์š”์ฒญ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋“ฑ Enum์„ ๋ณด๋‹ค ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ์กฐ๊ธˆ ๋” ๊น”๋”ํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฉด ์ข‹์•˜์„ ๊ฒƒ์ด๋‹ค.

About


Languages

Language:Swift 100.0%