내 손안의 짐 챙김 도우미, 팩맨
2022.07.02 ~
박현지 | 김경린 | 장서희 |
---|---|---|
dingding-21 | kkl4846 | laalaa31 |
🔗 API Docs
UserSchema
const UserSchema = new mongoose.Schema(
{
email: {
type: String,
required: true,
},
nickname: {
type: String,
},
profileImageId: {
type: String,
},
isDeleted: {
type: Boolean,
default: false,
},
},
{
timestamps: true,
},
);
FolderSchema
const FolderSchema = new mongoose.Schema(
{
title: {
type: String,
required: true,
},
isAloned: {
type: Boolean,
required: true,
},
userId: {
type: mongoose.Types.ObjectId,
required: true,
ref: 'User',
},
listNum: {
type: Number,
default: 0,
},
packingListArray: [
{
type: mongoose.Types.ObjectId,
refPath: 'listModel',
},
],
listModel: {
type: String,
required: true,
enum: ['AlonePackingList', 'TogetherPackingList'],
},
},
{ timestamps: true },
);
TemplateSchema
const TemplateSchema = new mongoose.Schema(
{
title: {
type: String,
required: true,
},
categoryIdArray: [
{
type: mongoose.Types.ObjectId,
},
],
isAloned: {
type: Boolean,
required: true,
},
isHelped: {
type: Boolean,
required: true,
},
},
{ timestamps: true },
);
AlonePackingListSchema
const AlonePackingListSchema = new mongoose.Schema(
{
title: {
type: String,
required: true,
},
isSaved: {
type: String,
default: false,
},
departureDate: {
type: Date,
required: true,
},
packTotalNum: {
type: Number,
},
packRemainNum: {
type: Number,
},
categoryIdArray: [
{
type: mongoose.Types.ObjectId,
},
],
isDeleted: {
type: Boolean,
default: false,
},
remainDay: {
type: Number,
},
},
{ timestamps: true },
);
CategorySchema
const CategorySchema = new mongoose.Schema(
{
name: {
type: String,
required: true,
},
packIdArray: [
{
type: mongoose.Types.ObjectId,
},
],
},
{ timestamps: true },
);
PackSchema
const PackSchema = new mongoose.Schema(
{
name: {
type: String,
required: true,
},
isChecked: {
type: Boolean,
default: false,
},
packerId: {
type: mongoose.Types.ObjectId,
},
},
{ timestamps: true },
);
TogetherPackingListSchema
const TogetherPackingListSchema = new mongoose.Schema(
{
title: {
type: String,
required: true,
},
isSaved: {
type: String,
default: false,
},
departureDate: {
type: Date,
required: true,
},
packTotalNum: {
type: Number,
},
packRemainNum: {
type: Number,
},
groupId: {
type: mongoose.Types.ObjectId,
},
categoryIdArray: [
{
type: mongoose.Types.ObjectId,
},
],
isDeleted: {
type: Boolean,
default: false,
},
myPackingListId: {
type: mongoose.Types.ObjectId,
},
remainDay: {
type: Number,
},
},
{ timestamps: true },
);
GroupSchema
const GroupSchema = new mongoose.Schema({
userIdArray: [
{
type: mongoose.Types.ObjectId,
},
],
});
명명규칙(Naming Conventions)
- 이름으로부터 의도가 읽혀질 수 있게 쓴다.
-
ex)
// bad function q() { // ...stuff... } // good function query() { // ..stuff.. }
- 오브젝트, 함수, 그리고 인스턴스에는
camelCase
를 사용한다.
-
ex)
// bad const OBJEcttsssss = {}; const this_is_my_object = {}; function c() {} // good const thisIsMyObject = {}; function thisIsMyFunction() {}
- 클래스나 constructor에는
PascalCase
를 사용한다.
-
ex)
// bad function user(options) { this.name = options.name; } const bad = new user({ name: 'nope', }); // good class User { constructor(options) { this.name = options.name; } } const good = new User({ name: 'yup', });
- 함수 이름은 동사 + 명사 형태로 작성한다.
ex)
postUserInformation( )
- 약어 사용은 최대한 지양한다.
- 이름에 네 단어 이상이 들어가면 팀원과 상의를 거친 후 사용한다
블록(Blocks)
- 복수행의 블록에는 중괄호({})를 사용한다.
-
ex)
// bad if (test) return false; // good if (test) return false; // good if (test) { return false; } // bad function() { return false; } // good function() { return false; }
- 복수행 블록의
if
와else
를 이용하는 경우else
는if
블록 끝의 중괄호( } )와 같은 행에 위치시킨다.
-
ex)
// bad if (test) { thing1(); thing2(); } else { thing3(); } // good if (test) { thing1(); thing2(); } else { thing3(); }
코멘트(Comments)
- 복수형의 코멘트는
/** ... */
를 사용한다.
-
ex)
// good /** * @param {String} tag * @return {Element} element */ function make(tag) { // ...stuff... return element; }
- 단일 행의 코멘트에는
//
을 사용하고 코멘트를 추가하고 싶은 코드의 상부에 배치한다. 그리고 코멘트의 앞에 빈 행을 넣는다.
-
ex)
// bad const active = true; // is current tab // good // is current tab const active = true; // good function getType() { console.log('fetching type...'); // set the default type to 'no type' const type = this._type || 'no type'; return type; }
문자열(Strings)
- 문자열에는 싱크쿼트
''
를 사용한다.
-
ex)
// bad const name = "Capt. Janeway"; // good const name = 'Capt. Janeway';
- 프로그램에서 문자열을 생성하는 경우는 문자열 연결이 아닌
template strings
를 이용한다.
-
ex)
// bad function sayHi(name) { return 'How are you, ' + name + '?'; } // bad function sayHi(name) { return ['How are you, ', name, '?'].join(); } // good function sayHi(name) { return `How are you, ${name}?`; }
함수(Functions)
- 화살표 함수를 사용한다.
-
ex)
var arr1 = [1, 2, 3]; var pow1 = arr.map(function (x) { // ES5 Not Good return x * x; }); const arr2 = [1, 2, 3]; const pow2 = arr.map(x => x * x); // ES6 Good
조건식과 등가식(Comparison Operators & Equality)
==
이나!=
보다===
와!==
을 사용한다.- 단축형을 사용한다.
-
ex)
// bad if (name !== '') { // ...stuff... } // good if (name) { // ...stuff... }
- 비동기 함수를 사용할 때
Promise
함수의 사용은 지양하고async
,await
를 쓰도록 한다
🌱 git branch 전략
main branch
: 배포 단위 branch
develop branch
: 주요 개발 branch, main merge 전 거치는 branch
feature branch
: 각자 개발 branch
- 할 일 issue 등록 후 issue 번호로 branch 생성 후 작업
- ex) feature/#
issue num
- ex) feature/#
- 해당 branch 작업 완료 후 PR 보내기
- 항상 local에서 충돌 해결 후 → remote에 올리기
- reviewer에 서로 tag후 code-review
- comment 전 merge 불가!
- main
- develop
- feature
├── #1
└── #2
👻 git commit message convention
ex) [FEAT]/#
issue num User API 파일 추가
- [CHORE]: 코드 수정, 내부 파일 수정
- [FEAT] : 새로운 기능 구현
- [ADD] : Feat 이외의 부수적인 코드 추가, 라이브러리 추가, 새로운 파일 생성 시
- [FIX] : 버그, 오류 해결
- [DEL] : 쓸모없는 코드 삭제
- [DOCS] : README나 WIKI 등의 문서 개정
- [MOVE] : 프로젝트 내 파일이나 코드의 이동
- [RENAME] : 파일 이름의 변경
- [MERGE]: 다른브렌치를 merge하는 경우
- [STYLE] : 코드가 아닌 스타일 변경을 하는 경우
- [INIT] : Initial commit을 하는 경우
---📁src
------📄index.ts
------📁config
---------📄index.ts
------📁controllers
---------📄index.ts
---------📄UserController.ts
---------📄GroupController.ts
---------📄PackController.ts
---------📄CategoryController.ts
---------📄FolderController.ts
---------📄AlonePackingListController.ts
---------📄TogetherPackingListController.ts
---------📄TemplateController.ts
------📁interfaces
---------📁auth
---------📁common
---------📁user
---------📁group
---------📁pack
---------📁category
---------📁folder
---------📁alonePackingList
---------📁togetherPackingList
---------📁template
------📁loaders
---------📄db.ts
------📁middleware
---------📄auth.ts
------📁models
---------📄User.ts
---------📄Group.ts
---------📄Pack.ts
---------📄Category.ts
---------📄Folder.ts
---------📄AlonePackingList.ts
---------📄TogetherPackingList.ts
---------📄Template.ts
------📁modules
---------📄responseMessage.ts
---------📄statusCode.ts
---------📄util.ts
------📁routes
---------📄index.ts
---------📄AuthRouter.ts
---------📄UserRouter.ts
---------📄PackingListRouter.ts
---------📄FolderRouter.ts
---------📄AloneRouter.ts
---------📄TogetherRouter.ts
---------📄HelpRouter.ts
---------📄TemplateRouter.ts
------📁services
---------📄index.ts
---------📄AuthService.ts
---------📄UserService.ts
---------📄GroupService.ts
---------📄PackService.ts
---------📄CategoryService.ts
---------📄FolderService.ts
---------📄AlonePackingListService.ts
---------📄TogetherPackingListService.ts
---------📄TemplateService.ts
{
"name": "node-typescript-init",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "nodemon",
"build": "tsc && node dist",
"lint": "eslint .",
"test": "mocha -r ts-node/register src/test",
"prepare": "husky install"
},
"author": "",
"license": "ISC",
"devDependencies": {
"@types/chai": "^4.3.1",
"@types/express": "^4.17.13",
"@types/jsonwebtoken": "^8.5.8",
"@types/mocha": "^9.1.1",
"@types/mongoose": "^5.11.97",
"@types/node": "^17.0.25",
"@types/supertest": "^2.0.12",
"@typescript-eslint/eslint-plugin": "^5.30.5",
"@typescript-eslint/parser": "^5.30.5",
"eslint": "^8.19.0",
"eslint-config-prettier": "^8.5.0",
"husky": "^8.0.1",
"lint-staged": "^13.0.3",
"nodemon": "^2.0.15",
"prettier": "^2.7.1",
"ts-node": "^10.7.0",
"typescript": "^4.7.4"
},
"dependencies": {
"@types/cors": "^2.8.12",
"@types/nanoid": "^3.0.0",
"axios": "^0.27.2",
"chai": "^4.3.6",
"cors": "^2.8.5",
"dayjs": "^1.11.4",
"dotenv": "^16.0.0",
"express": "^4.17.3",
"express-validator": "^6.14.0",
"jsonwebtoken": "^8.5.1",
"mocha": "^10.0.0",
"mongoose": "^6.3.1",
"nanoid": "3.3.4",
"supertest": "^6.2.4",
"upgrade": "^1.1.0"
},
"lint-staged": {
"**/*.{js,jsx,ts,tsx}": [
"eslint --cache --fix",
"prettier --write"
]
}
}