씨워터삼준실버영의 사과를 키-핀🍎
프로젝트 기간: 2021. 06. 26 ~ 2021. 07. 17
보충&릴리즈준비 기간: 2021. 07. 18 이후
선물의 두근거림을 오래도록, 선물 아카이빙 서비스 Keepin 🎁
잊어버리기 쉬운 감사한 순간들! 이제는 Keepin해 보세요.
주고받은 선물들을 간직하고, 챙겨야 할 이벤트들을 리마인드하도록 도와드려요.
Core Value
Keepin - 주고받은 선물을 보관하고
Keepin mind - 그 순간의 마음을 간직하고
Keepin touch - 다가오는 이벤트를 잘 챙길 수 있도록
ThreeJoon(최이준) | SilverYoung(이은영) | Seawater(김혜수) |
---|---|---|
라이브러리(Library) | 목적(Purpose) | 버전(Version) |
---|---|---|
Alamofire | 서버통신 | 5.4 |
Kingfisher | 이미지 처리 | 6.0 |
폴더링
🗂 Configuration/
- Constants.swift : API Constants 저장, 싱글턴으로 변수 생성
- Base/ 🗂 : 뷰 컨트롤러에서 공통되는 부분 분리 (클래스 상속해서 사용)
- BaseViewController.swift (ex. class HomeViewController: BaseViewController {} )
- Extension/ 🗂 : Extension을 통해 기능 확장한 파일 저장
- UIColor+.swift
- UIButton+.swift
- UIView+MakeAlert.swift
- ...
- Secret/ 🗂 : git에 올라가면 안되는 파일 저장 (ex. token)
- CommonClass/ 🗂 : 커스텀 클래스, 스트럭트 저장
- Device.swift : ex) 디바이스 크기, 여백 정보 담은 struct
🗂 Sources/
- 뷰1/ 🗂 : 뷰 단위로 폴더링
- HomeStoryboard.xib : xib 파일
- HomeViewController.swift : 뷰 컨트롤러 (xib와 1대1 매칭)
- Cell/ 🗂 : 셀 관련 파일 저장 like CollectionView Cells, TableView Cells
- (ex. ~CVC.swift, ~TVC.swift, ~CVC.xib, ~TVC.xib)
- DataManager/ 🗂 : 네트워크 파일 저장 (ex. ~DataManager.swift)
- DataModel/ 🗂 : 데이터 모델 저장 (ex. ~Request.swift - 보내는거, ~Response.swift - 받는거)
- 뷰2/ 🗂
- 뷰3/ 🗂
- ...
- AppDelegate.swift
- SceneDelegate.swift
- Assets.xcassets
- LaunchScreen.storyboard
- Info.plist
Git 컨벤션
커밋컨벤션: [커밋타입] #이슈번호 설명(한글)
[feat] 기능추가시
[fix] 버그 수정
[docs] 문서 수정
[style] 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우
[refactor] 코드 리팩토링 (이해하기 쉬운 구조로 변경하며 기능의 변경은 없다.)
[test] 테스트 코드, 리팩토링 테스트 코드 추가
[chore] 빌드 업무 수정, 패키지 매니저 수정
브랜치 전략
develop
ㄴ dev_yijoon
ㄴ dev_silver
ㄴ dev_seawater
ISSUE: [prefix] description(한글로)
prefix 소문자
description 한글
코드 컨벤션
- tableView - TV
- tableViewCell - TVC
- collectionView- CV
- collectionView Cell - CVC
- viewController - VC
- navigationController - NVC
- 파일이름앞에 꼭 뷰이름 붙이기!
-
한 줄은 최대 99자를 넘지 않아야 합니다.
Xcode의 Preferences → Text Editing → Display의 'Page guide at column' 옵션을 활성화하고 99자로 설정하면 편리합니다.
-
빈 줄에는 공백이 포함되지 않도록 합니다.
-
모든 파일은 빈 줄로 끝나도록 합니다.
-
MARK 구문 위와 아래에는 공백이 필요합니다.
class{ //MARK: - Custom Variables //MARK: - IBOutlets @IBOutlet @IBOutlet //MARK: - LifeCycle Methods override func viewDidLoad(){ } //MARK: - Custom Methods //MARK: - @objc Methods //MARK: - IBActions } //MARK: - UITableViewDelegate //MARK: - UITableViewDatasource //MARK: - Server Functions
모듈 임포트는 알파벳 순으로 정렬합니다. 내장 프레임워크를 먼저 임포트하고, 빈 줄로 구분하여 서드파티 프레임워크를 임포트합니다.
import UIKit
import SwiftyColor
import SwiftyImage
import Then
import URLNavigator
- 클래스 이름에는 UpperCamelCase를 사용합니다.
- 클래스 이름에는 접두사Prefix를 붙이지 않습니다.
-
함수 이름에는 lowerCamelCase를 사용합니다.
-
Action 함수의 네이밍은 '주어 + 동사 + 목적어' 형태를 사용합니다. 지키면 좋다
- Tap(눌렀다 뗌)*, clicked는
UIControlEvents
의.touchUpInside
에 대응하고, *Press(누름)*는.touchDown
에 대응합니다. - will~*은 특정 행위가 일어나기 직전이고, did~는 특정 행위가 일어난 직후입니다.
- should~*는 일반적으로
Bool
을 반환하는 함수에 사용됩니다.
좋은 예:
func backButtonDidTap() { // ... }
나쁜 예:
func back() { // ... } func pressBack() { // ... }
- Tap(눌렀다 뗌)*, clicked는
- 변수 이름에는 lowerCamelCase를 사용합니다.
-
상수 이름에는 lowerCamelCase를 사용합니다.
좋은 예:
let maximumNumberOfLines = 3
나쁜 예:
let kMaximumNumberOfLines = 3 let MAX_LINES = 3
-
enum의 각 case에는 lowerCamelCase를 사용합니다.
좋은 예:
enum Result { case .success case .failure }
나쁜 예:
enum Result { case .Success case .Failure }
-
약어로 시작하는 경우 소문자로 표기하고, 그 외의 경우에는 항상 대문자로 표기합니다.
좋은 예:
let userID: Int? let html: String? let websiteURL: URL? let urlString: String?
나쁜 예:
let userId: Int? let HTML: String? let websiteUrl: NSURL? let URLString: String?
-
Delegate 메서드는 프로토콜명으로 네임스페이스를 구분합니다.
좋은 예:
protocol UserCellDelegate { func userCellDidSetProfileImage(_ cell: UserCell) func userCell(_ cell: UserCell, didTapFollowButtonWith user: User) }
나쁜 예:
protocol UserCellDelegate { func didSetProfileImage() func followPressed(user: User) // `UserCell`이라는 클래스가 존재할 경우 컴파일 에러 발생 func UserCell(_ cell: UserCell, didTapFollowButtonWith user: User) }
-
Array<T>
와Dictionary<T: U>
보다는[T]
,[T: U]
를 사용합니다.좋은 예:
var messages: [String]? var names: [Int: String]?
-
//
를 사용해서 문서화에 사용되는 주석을 남깁니다.// 사용자 프로필을 그려주는 뷰 class ProfileView: UIView { // 사용자 닉네임을 그려주는 라벨 var nameLabel: UILabel! }
- 클래스
- 구조체
- 익스텐션
- 프로토콜
- 열거형
- 함수
- 메서드
- 인스턴스
-
분류 | 뷰이름 | 담당 | 구현 |
---|---|---|---|
로그인 | 로그인 메인 | 김혜수 | 🎁 |
이메일 로그인 | 김혜수 | 🎁 | |
회원가입 | 회원가입 1 | 김혜수 | 🎁 |
회원가입 2 | 김혜수 | 🎁 | |
홈 | 홈 화면 | 김혜수 | 🎁 |
선물 모아보기 | 모아보기 메인 | 최이준 | 🎁 |
모아보기 상세 | 최이준 | 🎁 | |
상세보기 수정 | 최이준 | 🎁 | |
키핀하기 | 키핀하기 | 김혜수 | 🎁 |
친구선택 | 김혜수 | 🎁 | |
새친구등록 | 새친구등록 | 이은영 | 🎁 |
리마인더 | 리마인더 메인 | 최이준 | 🎁 |
리마인더 등록 | 최이준 | 🎁 | |
검색 | 검색 | 최이준 | 🎁 |
마이페이지 | 마이페이지 메인 | 이은영 | 🎁 |
마이페이지 상세 | 이은영 | 🎁 | |
친구이름 수정 | 이은영 | 🎁 | |
설정 및 프로필편집 | 이은영 | 🎁 |