Skip to content

PET-P/zollezolle_ios

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

582 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

μ«„λž˜μ«„λž˜ - λ°˜λ €λ™λ¬Ό λ™λ°˜μ—¬ν–‰ O2O μ„œλΉ„μŠ€

Generic badge Generic badge Generic badge Generic badge Generic badge

191_드ᄅᅒ그ᄒᅑᆷ_

'μ«„λž˜μ«„λž˜'앱은 λ°˜λ €λ™λ¬Όκ³Ό μ‚¬λžŒμ΄ ν•¨κ»˜ 여행을 갈 수 μžˆλ„λ‘ 도움을 μ£ΌλŠ” μ•±μž…λ‹ˆλ‹€. λ°˜λ €λ™λ¬Ό 정보와 μœ„μΉ˜μ •λ³΄λ₯Ό ν†΅ν•΄μ„œ λ°˜λ €λ™λ¬Ό λ™λ°˜ κ°€λŠ₯ μž₯μ†Œλ₯Ό μΆ”μ²œν•΄μ£Όκ³ , 앱을 ν†΅ν•΄μ„œ λ°˜λ €λ™λ¬Ό λ™λ°˜μ—¬ν–‰μ„ κ³„νšν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•±μŠ€ν† μ–΄ λ°”λ‘œκ°€κΈ° ν˜„μž¬ version 1.0.2

version 1.0.2 (2022.3.10)

vesions 1.0.1 (2021.11.7)

μ•± ν™”λ©΄

κΈ°νšμ˜λ„

1500만 반렀인의 55%κ°€ λ°˜λ €λ™λ¬Ό μ–‘μœ‘ μ‹œ μ™ΈμΆœ/μ—¬ν–‰μ˜ 어렀움을 ν˜Έμ†Œν•œλ‹€. λ˜ν•œ 검색 μ‹œ 업체 수 λŒ€λΉ„ κ³Όλ„ν•œ μ½˜ν…μΈ  μ–‘ 및 λΆˆν•„μš” κ΄‘κ³ μš© 컨텐츠에 고객은 λ…ΈμΆœλœλ‹€. λ”°λΌμ„œ μ•±μ—μ„œ λ°˜λ €λ™λ¬Ό 정보와 μœ„μΉ˜μ •λ³΄λ₯Ό ν†΅ν•΄μ„œ λ°˜λ €λ™λ¬Ό λ™λ°˜ κ°€λŠ₯ μž₯μ†Œλ₯Ό μΆ”μ²œ 및 검색을 κ°€λŠ₯ν•˜κ²Œν•˜μ—¬, λ°˜λ €λ™λ¬Ό λ™λ°˜ 여행을 κ³„νšν•  수 μžˆλŠ” 앱을 κΈ°νšν•˜μ˜€λ‹€.

Dependencies

  pod 'SwiftLint'
  pod 'Kingfisher', :git => 'https://github.com/onevcat/Kingfisher.git', :branch => 'version6-xcode13'
  pod 'Moya', '~> 14.0'
  pod 'FSCalendar'
  pod 'NMapsMap'
  pod 'naveridlogin-sdk-ios'
  pod 'KakaoSDKCommon'
  pod 'KakaoSDKAuth'
  pod 'KakaoSDKUser'
  pod 'KakaoSDKTalk'
  pod 'Firebase/Analytics'
  pod 'Firebase/Storage'
  pod 'Gifu'
  pod 'Toast-Swift', '~> 5.0.1'

MVC μ•„ν‚€ν…μ²˜ 및 Foldering

  • MVCλ₯Ό 기반으둜 앱을 κ°œλ°œν•˜μ˜€λ‹€. MVCλ₯Ό μ„ νƒν•œ μ΄μœ λŠ” 앱을 κΈ°νšν•˜κ³ , κ°œλ°œν•˜κ³  ν•΄μ»€ν†€μ˜ 일정을 λ§žμΆ”λŠ”λ° μžˆμ–΄μ„œ, 속도가 μ€‘μ‹œλ˜μ—ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— κ°€μž₯ μ΅μˆ™ν•œ MVC μ•„ν‚€ν…μ²˜κ°€ μ±„νƒλ˜μ—ˆλ‹€. λ˜ν•œ 직관적인 UIκ°œλ°œμ„ μœ„ν•˜μ—¬ storyboardλ₯Ό ν™œμš©ν•œ 개발이 μ§„ν–‰λ˜μ—ˆλ‹€.
  • Foldering κ΅¬μ‘°μ—μ„œλŠ” Global, Screen, Support 폴더가 μ‘΄μž¬ν•œλ‹€. Global ν΄λ”μ—λŠ” μ•± μ „λ°˜μ μœΌλ‘œ μ“°μ΄λŠ” Modelλ“€, λ„€νŠΈμ›Œν¬ 톡신 μ„œλΉ„μŠ€, 킀체인 μ„œλΉ„μŠ€, μ»€μŠ€ν…€ λ·° 등이 μ‘΄μž¬ν•œλ‹€. Screenμ—λŠ” View, ViewController듀이 μ‘΄μž¬ν•œλ‹€. Support ν΄λ”μ—λŠ” AppDelegate 및 이미지 Asset, Font 등이 μ‘΄μž¬ν•œλ‹€.
β”œβ”€β”€ Global
β”‚Β Β  β”œβ”€β”€ Custom
β”‚Β Β  β”œβ”€β”€ Extension
β”‚Β Β  β”œβ”€β”€ Model
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Location
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Pet
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Place
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Review
β”‚Β Β  β”‚Β Β  └── User
β”‚Β Β  β”œβ”€β”€ Protocol
β”‚Β Β  └── Service
β”œβ”€β”€ Screen
β”‚Β Β  β”œβ”€β”€ Base.lproj
β”‚Β Β  β”œβ”€β”€ Detail
β”‚Β Β  β”œβ”€β”€ Login
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Storyboard
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ View
β”‚Β Β  β”‚Β Β  └── ViewController
β”‚Β Β  β”œβ”€β”€ MainTabBar
β”‚Β Β  β”œβ”€β”€ PlaceDetail
β”‚Β Β  β”‚Β Β  └── InnerReview
β”‚Β Β  β”œβ”€β”€ Review
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ AllReviews
β”‚Β Β  β”‚Β Β  └── CreateReview
β”‚Β Β  β”œβ”€β”€ Search
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Model
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ Storyboard
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ View
β”‚Β Β  β”‚Β Β  └── ViewController
β”‚Β Β  β”œβ”€β”€ Splash
β”‚Β Β  β”‚Β Β  └── Storyboard
β”‚Β Β  β”‚Β Β      └── Base.lproj
β”‚Β Β  └── Tabs
β”‚Β Β      β”œβ”€β”€ HomeTab
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ Stroyboard
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ViewController
β”‚Β Β      β”‚Β Β  └── Xib
β”‚Β Β      β”œβ”€β”€ MapTab
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ Storyboard
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ View
β”‚Β Β      β”‚Β Β  └── ViewController
β”‚Β Β      β”œβ”€β”€ MyInfoTab
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ Storyboard
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ View
β”‚Β Β      β”‚Β Β  └── ViewController
β”‚Β Β      └── WishListTab
β”‚Β Β          β”œβ”€β”€ Storyboard
β”‚Β Β          β”œβ”€β”€ View
β”‚Β Β          └── ViewController
└── Support

배운점

ν˜‘μ—…λŠ₯λ ₯

기획자, λ””μžμ΄λ„ˆ, iOS 개발자, μ„œλ²„ κ°œλ°œμžμ™€ ν˜‘μ—…μ„ μ§„ν–‰ν•˜λ©΄μ„œ, ν˜‘μ—… λŠ₯λ ₯을 ν‚€μšΈ 수 μžˆμ—ˆλ‹€. ν˜‘μ—…μ„ ν•˜λ©΄μ„œ WBS, μŠ€ν† λ¦¬λ³΄λ“œλ₯Ό ν™•μΈν•˜λ©΄μ„œ μ–΄λ–»κ²Œ ν•΄μ•Όμ§€λ§Œ, μ‚¬μš©μžμ—κ²Œ μ‚¬λž‘μ„ λ°›λŠ” 앱을 λ§Œλ“€ 수 μžˆλŠ”μ§€ 생각할 수 μžˆμ—ˆλ‹€. κ²°κ΅­ 'μ«„λž˜μ«„λž˜'λ₯Ό κ°œλ°œν•˜λ©΄μ„œ, 기획파트, λ””μžμΈνŒŒνŠΈ κ°œλ°œνŒŒνŠΈμ— λͺ¨λ‘ μ°Έμ—¬λ₯Ό ν•˜μ˜€κ³  μ•± 개발의 A-Zλ₯Ό κ²½ν—˜ν•  수 μžˆμ—ˆλ‹€.

WBS, IA, ν†΅ν•©μ΄μŠˆκ΄€λ¦¬ μžμ„Ένžˆλ³΄κΈ°

μ•± 배포의 κ²½ν—˜

첫 μ•± 배포λ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ μ–΄λ–»κ²Œ μ•± 배포λ₯Ό ν•  수 μžˆλŠ”μ§€, μ•± 배포λ₯Ό ν•  λ•Œ μ–΄λ–€ μ£Όμ˜μ‚¬ν•­μ΄ ν•„μš”ν•œμ§€λ₯Ό μ•Œ 수 μžˆμ—ˆλ‹€. 첫 μ•± 배포λ₯Ό ν•˜λ©΄μ„œ ν•΄κ²°ν•΄μ•Όν–ˆλ˜ λ¬Έμ œλŠ” μžλ™λ‘œκ·ΈμΈκ³Ό Auth2.0 λ¬Έμ œμ˜€κ³ , 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ Request Token, Access Tokenκ³Ό μ΄λ©”μΌλ‘œκ·ΈμΈ, μ†Œμ…œλ‘œκ·ΈμΈμ— λŒ€ν•œ 뢄기문을 λͺ¨λ‘ λ§Œλ“€μ—ˆλ‹€.

λ„€νŠΈμ›Œν¬ 톡신에 λŒ€ν•œ 이해

첫 앱을 λ§Œλ“€λ©΄μ„œ μ–΄λ €μ› λ˜ λΆ€λΆ„ 쀑 ν•˜λ‚˜λŠ” λ„€νŠΈμ›Œν¬ ν†΅μ‹ μ˜ λ¬Έμ œμ˜€λ‹€. λ„€νŠΈμ›Œν¬ 톡신 κ΄€λ ¨ μ½”λ“œλ₯Ό Githubμ—μ„œ μ°Ύμ•„λ³΄λ©΄μ„œ λ‹€μ–‘ν•œ μ½”λ“œλ₯Ό λ°œκ²¬ν•  수 μžˆμ—ˆκ³ , 그쀑에 ν˜‘μ—…ν•˜κΈ°λ„ μ’‹μ•„λ³΄μ΄λŠ” Moyaλ₯Ό μ±„νƒν•œ μ½”λ“œ, 그리고 μ œλ„€λ¦­μ„ ν™œμš©ν•œ μ½”λ“œλ₯Ό μ°Έκ³ ν•΄μ„œ μ«„λž˜μ«„λž˜λ§Œμ˜ λ„€νŠΈμ›Œν¬ λ§€λ‹ˆμ € 객체λ₯Ό λ§Œλ“€ 수 μžˆμ—ˆλ‹€. 특히 μ„œλ²„ κ°œλ°œμžμ™€ Response ν˜•μ‹μ„ λ§žμΆ”κ³ , μ œλ„ˆλ¦­ν•œ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ μž¬μ‚¬μš©μ„±μ΄ νŽΈν•œ μ½”λ“œλ₯Ό μ§°λ‹€.

  func judgeGenericResponse<T: Codable>(_ target: APITarget,
                                        completion: @escaping ((NetworkResult<T>) -> Void)) {
    provider.request(target) { response in
      switch response {
      case .success(let result):
        do {
          let decoder = JSONDecoder()
          let body = try decoder.decode(GenericResponse<T>.self, from: result.data)
          if let data = body.data {
            completion(.success(data))
          }
        } catch {
          print("ꡬ쑰체λ₯Ό ν™•μΈν•˜μ„Έμš”")
        }
      case .failure(let error):
        print("\(#function), error: \(error)")
        completion(.failure(error.response?.statusCode ?? -1))
      }
    }
  }

이미지 μΊμ‹œμ²˜λ¦¬

KingFisher 라이브러리λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ 이미지 μΊμ‹œμ²˜λ¦¬λ₯Ό μ§„ν–‰ν•˜μ˜€λ‹€.

Firebase μŠ€ν† λ¦¬μ§€μ— 이미지 μ €μž₯κ³Ό 메타데이터

Firebase μŠ€ν† λ¦¬μ§€μ— 이미지λ₯Ό λ„˜κΈ°κ³ , κ΄€λ ¨ urlκ³Ό 메타데이터λ₯Ό μ„œλ²„μ— λ„˜κΈ°λ©΄μ„œ 이미지λ₯Ό μ €μž₯ν•˜μ˜€λ‹€. 이 방법을 μ‚¬μš©ν•˜λ©΄μ„œ, μ„œλ²„λ‘œ 직접 이미지 데이터λ₯Ό 보낼 ν•„μš” μ—†κ²Œ λ˜μ—ˆκ³ , νŽΈλ¦¬ν•œ 방식이라고 μƒκ°ν•œλ‹€.

λ‹€μ–‘ν•œ μ• λ‹ˆλ©”μ΄μ…˜

λ‹€μ–‘ν•œ μ• λ‹ˆλ©”μ΄μ…˜μ„ ν™œμš©μ„ ν•˜μ˜€λ‹€. μ›ν•˜λŠ” λŠλ‚Œμ„ μ• λ‹ˆλ©”μ΄μ…˜μœΌλ‘œ λ§Œλ“œλŠ” 것이 λ‚œμ΄λ„κ°€ μžˆμ—ˆλ‹€.

달λ ₯

달λ ₯은 FSCanlendar 라이브러리λ₯Ό μ‚¬μš©ν–ˆλ‹€. FSCanlendarλ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ μ•ˆμ—μ„œ μ‚¬μš©λ˜λŠ” 둜직과 μŠ€νƒ€μΌμ€ λ‹€ μ»€μŠ€ν…€μ΄ ν•„μš”ν–ˆλ‹€. FSCalendarλ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ ν›„μ—λŠ” FSCalendar 라이브러리 μ½”λ“œλ₯Ό μ°Έκ³ ν•˜μ—¬ 달λ ₯을 μ§μ ‘λ§Œλ“œλŠ”κ²Œ 였히렀 νŽΈν•  수 μžˆκ² λ‹€λŠ” μƒκ°μ΄λ“€μ—ˆλ‹€. κ·Έ 쀑에 μ–΄λ €μ› λ˜ λ‘œμ§μ€ μ—¬ν–‰κ³„νšμ„ μ§€λ•Œ μ‚¬μš©λ˜λŠ” 달λ ₯μ΄μ—ˆλ‹€. μ–΄λ–¨λ•Œ 달λ ₯의 Cell μ’…λ₯˜λ₯Ό λ°”κΏ”μ€˜μ•Όν• μ§€, μ΄ˆκΈ°ν™”ν• μ§€ λ“± λ³΅μž‘ν•œ λ‘œμ§μ΄μ΄μ—ˆλ‹€. κ΄€λ ¨ λ‘œμ§μ€ Screen/Tabs/WishlistTab/ViewController/WishCalendarViewController에 μ‘΄μž¬ν•œλ‹€. func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) μ—λŠ” 달λ ₯의 셀을 μ„ νƒν–ˆμ„λ•Œ ν•„μš”ν•œ 둜직, func calendar(_ calendar: FSCalendar, didDeselect date: Date, at monthPosition: FSCalendarMonthPosition)μ—λŠ” 선택을 μ·¨μ†Œν–ˆμ„λ•Œ ν•„μš”ν•œ 둜직이 μ‘΄μž¬ν•œλ‹€.

μˆ˜μƒμ΄λ ₯

  • 'μ«„λž˜μ«„λž˜' μš°μˆ˜μƒ(2021 펫 아이디어 κ²½μ§„λŒ€νšŒ, κ±΄κ΅­λŒ€ν•™κ΅), 2021.12
  • 'μ«„λž˜μ«„λž˜' μš°μˆ˜μƒ(2021 μ„Έμ’…-ν•˜κ³„ Start-up camp), 2021.07
  • 'μ«„λž˜μ«„λž˜' 3λ“±-ν•œκ΅­μ½˜ν…μΈ ν•™νšŒμž₯상 (9th K-Hackathon Software Contest), 2021.12

μ•„μ‰¬μš΄μ 

  • 처음으둜 규λͺ¨κ°€ μžˆλŠ” iOS ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜κ³ , 해컀톀에 일정을 λ§žμΆ”λ©΄μ„œ μ‹œκ°„μ΄ λΆ€μ‘±ν•˜λ‹€λŠ” 것을 λŠκΌˆλ‹€. 그둜 μΈν•΄μ„œ κ΅¬ν˜„μ΄ μ–΄λ €μš΄ 뢀뢄을 λ””μ§€μ•„λ„ˆ, κΈ°νšμžμ™€ μ„œλ‘œ ν˜‘μ˜λ₯Ό ν•˜λ©΄μ„œ μ€„μ—¬λ‚˜κ°”λ‹€. λ˜ν•œ MVC νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄μ„œ ViewController에 μ—„μ²­λ‚œ 둜직이 많이 λ“€μ–΄κ°€λŠ” 과정을 직접 νŒŒμ•…ν•˜λ©΄μ„œ, 더 μœ μ§€λ³΄μˆ˜κ°€ λ‚˜μ€ μ½”λ“œ, μ•„ν‚€ν…μ²˜μ˜ λ‹Ήμœ„μ„±μ΄ 맀우 λŒ€λ‘λ˜μ—ˆλ‹€. 특히 μ—¬λŸ¬κ°€μ§€ κΈ°λŠ₯이 μ‘΄μž¬ν•˜λŠ” ViewControllerμ—μ„œλŠ” 각각의 κΈ°λŠ₯듀이 잘 λ‚˜λˆ μ Έμžˆμ–΄μ•Όν•˜κ³ , κ·Έ κΈ°λŠ₯λ“€μ˜ 유기적인 연결이 μ–΄λ– ν•œ 기쀀에 맞좰져 μžˆμ–΄μ•Όν•œλ‹€λŠ” 것을 λŠκΌˆλ‹€. 개발 도쀑에, MVCλ³΄λ‹€λŠ” 더 각각의 κΈ°λŠ₯에 λ§žμΆ°μ„œ μ„ΈλΆ„ν™”κ°€ λ˜μ–΄μžˆλŠ” μ•„ν‚€ν…μ²˜, νŒ¨ν„΄μ΄ ν•„μš”ν•˜λ‹€λŠ” 것을 λŠλΌλ©΄μ„œ, 이 ν”„λ‘œμ νŠΈλ₯Ό ν†΅ν•΄μ„œ MVVM, Clean Architecture, DI Patterns, RIBsλ₯Ό κ³΅λΆ€ν•΄λ³΄λŠ” 계기가 λ˜μ—ˆλ‹€.

About

μ«„λž˜μ«„λž˜πŸΆπŸΆ

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors