🗓 프로젝트 소개 : 신발 커뮤니티 앱 
🗓 기간 : 2022.10.15 ~  2023.3.21  
🗓 팀원: 로이, 민, 영, 소낙, 리넴, 루비 
많은 인기를 얻고 있는 신발이 무엇이 있는지를 확인해볼 수 있습니다.
신발과 관련하여 자유롭게 이야기를 나눌 수 있는 커뮤니티 기능을 담고 있습니다.
- 신발 상세 페이지에 들어가면 커뮤니티 기능을 구현해주세요
- 댓글 달기 같은 기능을 만들어주세요
- 앱 리스트에 border 맞게 수정해주세요!
- 그리고 처음 로그인 후 프로필에 들어가서 프로필 수정 할때 로그인 뷰가 보이는데 숨겨주세요!
- 1.0.5
- 프로필 화면 수정
- 배너 이미지 변경
- 로딩 화면 변경
- 로딩 화면 수정
- 로그인 이슈수정
- 앱 삭제 했을 경우 로그아웃 수정
- 버그 수정
 
| Developer | Product Manger | Developer | Developer | Developer | Designer | 
|---|---|---|---|---|---|
|  |  |  |  |  | |
| Roy | Min | Sonak | Young | Linem | Ruby | 
| Environment | Version | 
|---|---|
| Swift | |
| Xcode | |
| iOS Deployment Target | 
- Notion,- Figma
- Kingfisher,- SwiftLint,- Firebase,- Moya,- PopupView,- lottie
- Fastlane,- Slack
- MVVM 패턴
let url = URL(string : "https://640de3d61a18a5db83827295.mockapi.io/shoes")let url = URL(string : "https://640de3d61a18a5db83827295.mockapi.io/shoes/id")- @published
- @State
- @EnvironmentObject
- Combine
- 커스텀 폰트
- 커스텀 컬러
- extension view
- Moya 통신
- 컴포넌트 분리
- Search bar
- Firebase RemoteConfig
- Firebase Crashlytics
- Firebase FCM
- 앱이 삭제 되었을때 로그아웃
- 공유
- 로그인 안했을경우 프로필뷰 숨김처리
- 프로필 사진 변경
- push 알림
- 커스텀 폰트
- 커스텀 팝업
- 소셜 로그인
- 신발 검색
- 앱 공유
📦── MarketApp
│   ├── Info.plist
│   📦── Resources
│   │   📂── Firebase
│   │   📂── Assets.xcassets
│   │   📂── ColorAssets.xcassets
│   │   📂── IconImage
│   │   📂── Loading.json
│   │   📂── MarketApp.entitlements
│   │   📂── Preview Content
│   │   📂── mockData.json
│   📦── Sources
│   │   📂── Application
│   │   📂── Util
│   │   │    📂── AppCheck
│   │   │    📂── Authoriation
│   │   │    📂── Color
│   │   │    📂── Extensions
│   │   │    📂── Font
│   │   │    │    📂── CustomFont
│   │   │    └─   📂── FontAsset
│   │   │    📂── ImageManger
│   │   │    📂── SignUPCheck
│   │   │    📂── View
│   │   │    │    📂── ModalView
│   │   │    │    📂── ScrollView
│   │   │    │    📂── ACarousel
│   │   │    │    📂── EditImage
│   │   │    └─   📂── ScreenSize
│   │   📂── UI
│   │   │   📂── View
│   │   │   │    📂── Component
│   │   │   │    │   📂── Alert
│   │   │   │    │   📂── Lanch
│   │   │   │    │   📂── List
│   │   │   │    │   📂── Lottie
│   │   │   │    │   📂── Page
│   │   │   │    │   📂── Search
│   │   │   │    │   📂── Share
│   │   │   │    │   📂── TextField
│   │   │   │    └─  📂── WebView
│   │   │   │    📂── Authorization
│   │   │   │    │    📂── FindEmail
│   │   │   │    │    📂── FindPassword
│   │   │   │    │    📂── Login
│   │   │   │    └─   📂── SignUP
│   │   │   │    📂── Home
│   │   │   │    📂── Notice
│   │   │   │    📂── ProductDetail
│   │   │   │    📂── ProductList
│   │   │   │    📂── Profile
│   │   │   │    📂── Search
│   │   │   │    📂── Tab
│   │   │   └─   📂── Favorite
│   │   📂── ViewModel
│   │   │    📂── MainShoesViewModel
│   │   │    📂── ProfileViewModel
│   │   └─   📂── SignUpViewModel
│   │   📂── Model
│   │   │    📂── ShoesModel
│   │   📂── Network
│   │   │    📂── MainService
│   │   │    📂── MarketAPI
│   │   └─   📂── APIError
│   📦── MarketAppTests
│   │    │    📂── MainViewModelTest
│   │    │    📂── SignUPViewModelTest
│   │    │    📂── ProfileViewModelTest
│   📦── MarketAppUITests
📦── fastlane
│    📂── metadata
│    │    📂── ko
│    │    📂── review_information
│    📂── output
│    📂── screenshots
│    │    📂── ko
└──  📂── test_output
import Foundation
import Moya
enum MainShoesService {
    case mainShoesData
}
extension MainShoesService: TargetType {
    var baseURL: URL {
        return URL(string: "https://640de3d61a18a5db83827295.mockapi.io")!
    }
    
    var path: String {
        switch self {
        case .mainShoesData:
            return AffinityAPI.MainShoes
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .mainShoesData:
            return .get
        }
    }
    
    var task: Task {
        switch self {
        case .mainShoesData:
            return .requestPlain
        }
    }
    
    var headers: [String : String]? {
        switch self {
        case .mainShoesData:
            return [
                "Accept": "application/json",
                "Content-Type": "application/json"
            ]
        }
    }
}
import UIKit
import SwiftUI
enum NanumSquareNeoFamily: String {
    case aLt, bRG, cBd, dEb, eHv
}
struct NanumSquareNeoFont: ViewModifier {
    var family: NanumSquareNeoFamily
    var size: CGFloat
    var color: Color
    
    func body(content: Content) -> some View {
        return content.font(.custom("NanumSquareNeoTTF-\(family)", fixedSize: size))
            .foregroundColor(color)
    }
}
extension View {
    func nanumSquareNeo(family: NanumSquareNeoFamily, size: CGFloat, color: Color) -> some View {
        return self.modifier(NanumSquareNeoFont(family: family, size: size, color: color))
    }
}
extension UIFont {
    static func nanumSquareNeo(family: NanumSquareNeoFamily, size: CGFloat, color: Color) -> UIFont?{
        let font = UIFont(name: "NanumSquareNeo-\(family)", size: size)
        return font
    }
}
extension Font {
    static func nanumSquareNeo(family: NanumSquareNeoFamily, size: CGFloat, color: Color) -> Font{
        let font = Font.custom("NanumSquareNeo-\(family)", size: size)
        return font
    }
}import Foundation
import SwiftUI
struct ColorAsset {
    let backGroudColor = Color("BackgroundColor")
    let mauve = Color("mauve")
    let mainColor = Color("MainColor")
    let mauve2 = Color("mauve2")
    let gray = Color("Gray")
    let lightBlack = Color("LightBlack")
    let black = Color("Black")
    let blueGray = Color("BlueGray")
    let lightGray = Color("LightGray")
    let beige = Color("Beige")
    let white = Color("White")
}
extension Color {
    static let colorAsset = ColorAsset()
}- 
Origin(main branch) - Origin(dev branch)
- Local(feature branch)
 
 
- Origin(dev branch)
- 
Branch - Main
- Dev
- Feature
- Fix
 
- 
방법 - 
- Pull the Dev branch of the Origin
 
- 
- Make a Feature branch in the Local area
 
- 
- Developed by Feature branch
 
- 
- Push the Feature from Local to Origin
 
- 
- Send a pull request from the origin's Feature to the Origin's Dev
 
- 
- In Origin Dev, resolve conflict and merge
 
- 
- Fetch and rebase Origin Dev from Local Dev
 
 
- 
커밋 제목은 최대 50자 입력
본문은 한 줄 최대 72자 입력
Commit 메세지
🪛[chore]: 코드 수정, 내부 파일 수정. 
✨[feat]: 새로운 기능 구현. 
🎨[style]: 스타일 관련 기능.(코드의 구조/형태 개선) 
➕[add]: Feat 이외의 부수적인 코드 추가, 라이브러리 추가 
🔧[file]: 새로운 파일 생성, 삭제 시 
🐛[fix]: 버그, 오류 해결. 
🔥[del]: 쓸모없는 코드/파일 삭제. 
📝[docs]: README나 WIKI 등의 문서 개정. 
💄[mod]: storyboard 파일,UI 수정한 경우. 
✏️[correct]: 주로 문법의 오류나 타입의 변경, 이름 변경 등에 사용합니다. 
🚚[move]: 프로젝트 내 파일이나 코드(리소스)의 이동. 
⏪️[rename]: 파일 이름 변경이 있을 때 사용합니다. 
⚡️[improve]: 향상이 있을 때 사용합니다. 
♻️[refactor]: 전면 수정이 있을 때 사용합니다. 
🔀[merge]: 다른브렌치를 merge 할 때 사용합니다. 
✅ [test]: 테스트 코드를 작성할 때 사용합니다. 
제목 끝에 마침표(.) 금지
한글로 작성
브랜치 이름 규칙
- STEP1,- STEP2,- STEP3
- main브랜 치는 앱 출시
- Dev는 테스트 및 각종 파일 merge
- 각 스텝 뱔로 브런치 생성해서 관리
