코딩 컨벤션 - boostcampwm2023/and01-SnapPoint GitHub Wiki
코딩 컨벤션
Git Convention
Branch
main ( 배포용 )
develop (기능 개발 )
feature-be/작업 내용
feature-aos/
ex) feature-aos/화면-UI-그리기
hotfix/ ( main 브랜치에 문제 발생 시 )
Merge
같은 분야의 팀원이 모두 확인을 했을 경우에만 머지가 가능하도록 규칙 생성.
Issue
<!-- 🔥 다음 양식으로 제목을 작성해주세요 : [task num] task 이름 -->
<!-- ex) [A-01]: 화면에 지도를 보여줄 수 있다. -->
## 작업 내용
<!-- ex) 화면 UI 그리기 -->
- [ ]
## 참고한 자료
## 스크린샷 (필수)
PR
<!-- 🔥 다음 양식으로 제목을 작성해주세요 : 한 일의 type(#issue number): 작업 내용 -->
<!-- ex) Feature(#133): 화면 UI 그리기 -->
## 작업 개요
<!-- 작업에 대한 설명을 간단하게 작성해주세요. -->
## 작업 사항
<!-- 작업에 대한 설명을 코드와 관련하여 남겨주세요. -->
## 고민한 점들(필수 X)
<!-- 작업을 진행하면서 고민했던 점들을 추가해주세요 -->
## 스크린샷(필수 X)
<!-- 작업을 파악하는 데 도움이 되는 스크린샷을 추가해주세요 -->
Commit message
제목
- 50자 이내
- 키워드는
block처리 - 구어체 / 문장형 x, 명령형으로 작성
- 마침표 사용 x
내용
- 생략가능
- 72자 이내
- what, why만 설명. how는 작성x
ex) [FEAT] `asd화면` 기본 레이아웃 작성
로직을 포함하지 않는 레이아웃 파일만 작성
Commit Convention
| Tag | Description |
|---|---|
| [FEAT] | 기능개발 |
| [DESIGN] | UI 레이아웃 추가 및 수정 |
| [FIX] | 버그수정 |
| [TEST] | 테스트 코드 추가 및 수정 |
| [SETTING] | 환경 설정 추가 및 수정 |
| [DOCS] | 문서화, 주석 |
| [REFACTOR] | 리펙토링 |
| [STYLE] | 스타일 |
Android
Android Studio version: Iguana | 2023.2.1 Canary 12
kotlin version: 1.9.0
min SDK: 26
jvmTarget: VERSION_17
JavaVersion: VERSION_17
Layout: XML → Compose
레이아웃 리소스
- 스네이크 케이스
- id ex) TextView → tv_title
- 타입명이 가장 앞에 올 수 있도록
- 타입 명을 제외한 것들은 풀네임 사용.
스트링 리소스
- 스네이크 케이스
- 최대한 구체적으로 작성.
- ex) sign_up_activity_tv_title / sign_up_acitvity_et_email_hint
데이터 바인딩
- fragment, activity 코드 최소화를 위해 데이터바인딩, 바인딩어댑터 지향
- 뷰모델 바인딩 변수는 vm
UI와 이벤트
- 화면마다 화면을 담당하는 UiState를 만듭니다.
- ui 상태 홀더 클래스 suffix - UiState
- model과 매핑된 클래스 suffix - State
- model mapping method name - asXXXState
- UiState는 stateflow로 구현합니다.
- 이벤트는 sharedflow로 구현합니다.
패키지
- 기능 기획 이후 결정
Kotlin
변수
- 타입 명시하기
- 카멜 케이스
- 명사. 데이터타입을 포함하지 않는 이름
- ex) productList (x) products (o)
- private val로 선언. 필요할 때 스코프 조절
함수
- 동사
- compose 함수를 제외, 카멜케이스
- 함수명으로 내부 로직을 예상할 수 있도록. 최대한 서술적으로 명명.
- depth를 최대한 줄입시다.
- 추상화 수준을 맞춥시다.
- 하드코딩을 지양합시다.
- is, has → boolean
- get → return 해야함
- set → return 없음
- fetch - remote
- load - local
클래스
- 파스칼 케이스
상수
- upper snake case
- 화면에 보이는 가를 기준으로 string.xml에 분리.
scope함수
- it, this 지양
if문
- else if 사용 금지. when으로 변환.
- else도 지양 고려. 중괄호 무조건 쓰기.
Backend
https://radlohead.gitbook.io/typescript-deep-dive/styleguide
Ts
any타입은 금지하고, 안쓰면 죽을때는unkown사용하기type사용할 때 이름은PascalCase
const MOBILE_OS = {
IOS: 'iOS',
Android: 'Android'
} as const;
enum사용 금지,const
타입 vs. 인터페이스
- union이나 intersection이 꼭 필요할 때
type을 사용 extends또는implements하고 싶을 때interface를 사용
vscode
eslint
prettier
{
"singleQuote": true,
"semi": true,
"useTabs": false,
"trailingComma": "all",
"printWidth": 120,
"tabWidth": 2
}
변수 명
변수 명: camelCase ex) testTest
class 및 객체 리터럴: PascalCase
디렉토리 구조
도메인 별로 분리
src/movies/movies.conroller.ts
src/movies/entities/movies.entitiy.ts
src/movies/dto/create-movie.dto.ts
파일명
- domain명.종류.ts
- movies.controller.ts
- 두 단어 이상이면 하이픈(-)으로 분리
entitles/movies.ts
controllers/movies.ts
IF 조건문
if (!hasError) {
throw new Error();
}
- if 문에 무조건 중괄호로 쓰기
if (a < 3) {
return false;
}
if (hasError) {
return false;
}
...
a += b;
return a;
- Ealry Return으로 수행되지 않는 조건을 리턴하기