22.01.02 ~ 22.01.22 - SOPT 29th APPJAM
👉 협업 성향 테스트를 통해 나의 협업 유형을 알아보고, 태그에 등록하여 나와 잘 맞는 팀원들을 찾아보자
👉 협업 성향 태그와 관심 프로젝트 분야, 협업 포지션 설정과 자기소개 글을 통해 나를 표현하자
👉 모집 포지션, 선호 협업 성향 및 프로젝트 분야 태그 등을 선택해 나와 잘 맞는 팀원들을 구해보자
👉 키워드 태그 필터 검색을 통해 나와 잘 맞는 프로젝트와 팀원을 찾아보자
👉 콕 찌르기를 통해 함께 하고 싶은 프로젝트 팀원에게 관심을 표현해 보자
박현지 | 문규원 |
---|---|
dingding-21 | MoonGyu1 |
이름 | 역할 |
---|---|
박현지 | 초기 환경 세팅, 데이터베이스 설계, API 명세서 작성 및 구현 |
문규원 | README 작성, 데이터베이스 설계, API 명세서 작성 및 구현 |
Click!
main은 모든 작업이 끝난 후 develop에서 Merge 시킨다.
—————————————————————————
-
main
- 초기 세팅 존재 -
develop
- local 작업 완료 후 Merge 브랜치 -
name_feature/#issue
- 각자의 기능 추가 브랜치ex)
gyuwon_login/#1
—————————————————————————
- 각 기능이 추가될 때마다 Issue 및 Branch 생성
local - name_feature/#issue
에서 각자 기능 작업- 작업 완료 후
remote - develop
에 Pull Request - 코드 리뷰 후 Confirm 받고 Merge
remote - develop
에 Merge 될 때 마다 모든 팀원remote - develop pull
받아 최신 상태 유지
Click!
태그 | 설명 |
---|---|
[CHORE] | 코드 수정, 내부 파일 수정 |
[FEAT] | 새로운 기능 구현 |
[ADD] | Feat 이외의 부수적인 코드 추가, 라이브러리 추가, 새로운 파일 생성 시 |
[HOTFIX] | issue나, QA에서 급한 버그 수정에 사용 |
[FIX] | 버그, 오류 해결 |
[DEL] | 쓸모없는 코드 삭제 |
[DOCS] | README나 WIKI 등의 문서 개정 |
[CORRECT] | 주로 문법의 오류나 타입의 변경, 이름 변경 등에 사용 |
[MOVE] | 프로젝트 내 파일이나 코드의 이동 |
[RENAME] | 파일 이름 변경이 있을 때 사용 |
[IMPROVE] | 향상이 있을 때 사용 |
[REFACTOR] | 전면 수정이 있을 때 사용 |
[MERGE] | 다른 브랜치를 Merge 할 때 사용 |
Click!
- 이름으로부터 의도가 읽혀질 수 있게 쓴다.
-
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( )
- 약어 사용은 최대한 지양한다.
-
모든 참조는
const
를 사용하고,var
는 사용하지 않는다. -
참조를 재할당 해야한다면
var
대신let
을 사용한다.이때,
const
와let
은 블록스코프임을 유의
- 복수행의 블록에는 중괄호({})를 사용한다.
-
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(); }
- 복수형의 코멘트는
/** ... */
를 사용한다.
-
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; }
- 주요 중괄호({}) 앞에는 스페이스 1개를 넣는다.
-
ex)
// bad function test() { console.log('test'); } // good function test() { console.log('test'); }
- 제어구문 (
if
문이나while
문 등) 의 소괄호 (()) 앞에는 스페이스를 1개 넣고 함수 선언이나 함수 호출시 인수 리스트의 앞에는 스페이스를 넣지 않는다.
-
ex)
// bad if (isJedi) { fight(); } // good if (isJedi) { fight(); } // bad function fight() { console.log('Swooosh!'); } // good function fight() { console.log('Swooosh!'); }
- 연산자 사이에는 스페이스를 넣는다.
-
ex)
// bad const x = y + 5; // good const x = y + 5;
- 선두의 콤마 BAD
-
ex)
// bad const story = [once, upon, aTime]; // good const story = [once, upon, aTime];
- 끝의 콤마 GOOD
-
ex)
// bad const hero = { firstName: 'Dana', lastName: 'Scully', }; // good const hero = { firstName: 'Dana', lastName: 'Scully', };
- 세미콜론을 사용한다.
- ex)
// bad (function () { const name = 'Skywalker'; return name; })()( // good () => { const name = 'Skywalker'; return name; } )();
- 문자열에는 싱크쿼트
''
를 사용한다.
-
ex)
```jsx // 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}?`; }
- 화살표 함수를 사용한다.
-
ex)
```jsx 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 ```
- 함수식보다 함수 선언을 이용한다.
-
ex)
```jsx // bad const foo = function () { }; // good function foo() { } ```
==
이나!=
보다===
와!==
을 사용한다.
- 단축형을 사용한다.
-
ex)
// bad if (name !== '') { // ...stuff... } // good if (name) { // ...stuff... } // bad if (collection.length > 0) { // ...stuff... } // good if (collection.length) { // ...stuff... }
- 비동기 함수를 사용할 때
Promise
함수의 사용은 지양하고async
,await
를 쓰도록 한다.
기능 | URI | HTTP 메서드 |
설명 | 담당 | 완료 |
---|---|---|---|---|---|
회원가입/ 로그인 |
/auth/signup | POST | 유저 회원가입 | 규원 | 💜 |
/auth/login | POST | 유저 로그인 | 현지 | 💜 | |
/auth/login | GET | 유저 자동 로그인 | 현지 | 💜 | |
랜딩 페이지 | /project/top | GET | 주목할만한 프로젝트 조회 | 규원 | 💜 |
프로젝트 | /project/metadata | GET | 프로젝트 생성 - 더미 데이터 받기 | 현지 | 💜 |
/project | POST | 프로젝트 생성 | 현지 | 💜 | |
/project/photo/:projectId | POST | 프로젝트 생성 - 사진 추가 | 현지 | 💜 | |
/project/member | POST | 프로젝트 생성 - 팀 구성원 추가 | 현지 | 💜 | |
/project/search/metadata | GET | 프로젝트 찾기 - 더미 데이터 받기 | 현지 | 💜 | |
/project/search | POST | 프로젝트 찾기 - 조회 | 현지 | 💜 | |
/project/:projectId | GET | 프로젝트 상세뷰 조회 | 현지 | 💜 | |
/project/:projectId | DELETE | 프로젝트 모집 완료 | 현지 | 💜 | |
팀원 찾기 | /member/metadata | GET | 팀원 찾기 뷰 더미 데이터 받기 | 규원 | 💜 |
/member | POST | 팀원 찾기 조회 | 규원 | 💜 | |
마이페이지/ 팀원 상세뷰 |
/user/profile/:userId | GET | 유저 프로필 가져오기 | 규원 | 💜 |
/user/profile/metadata | GET | 유저 프로필 수정 더미 데이터 받기 | 규원 | 💜 | |
/user/profile/:userId | GET | 유저 프로필 수정 | 규원 | 💜 | |
/user/profile/photo /:userId |
POST | 유저 프로필 사진 변경 | 규원 | 💜 | |
콕 찌르기/ 팀 지원하기 |
/user/poke-user | POST | 콕찌르기 | 규원 | 💜 |
/user/poke-project | POST | 팀 지원하기 | 현지 | 💜 | |
/user/poke-user/:userId | GET | 나를 찔러본 사람 | 규원 | 💜 | |
/user/poke-project/:userId | GET | 내 프로젝트에 지원한 사람 | 현지 | 💜 | |
/user/poke-user /:userId/:pokingUserId |
DELETE | 나를 찔러본 사람 삭제 | 규원 | 💜 | |
/user/poke-project /:projectId/:pokingUserId |
DELETE | 내 프로젝트에 지원한 사람 삭제 | 현지 | 💜 |
|-📋 firebaserc
|-📋 firebase.json
|-📋 .gitignore
|-📁 db_query
|-📁 functions_
|- 📋 index.js
|- 📋 package.json
|- 📋 .gitignore
|- 📋 .env
|- 📁 api_
| |- 📋 index.js
| |- 📁 routes_
| |- 📋 index.js
| |- 📁 auth
| |- 📁 member
| |- 📁 project
| |- 📁 user
|
|- 📁 config_
| |- 📋 dbConfig.js
| |- 📋 firebaseClient.js
|
|- 📁 constants_
| |- 📋 jwt.js
| |- 📋 responseMessage.js
| |- 📋 statusCode.js
|
|- 📁 db_
| |- 📋 db.js
| |- 📋 index.js
|
|- 📁 lib_
| |- 📋 convertSnakeToCamel.js
| |- 📋 jwtHandlers.js
| |- 📋 util.js
|
|- 📁 middlewares_
|- 📋 auth.js
|- 📋 uploadImage.js
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"lint": "eslint .",
"serve": "cross-env NODE_ENV=development firebase emulators:start --only functions --project dev",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "cross-env NODE_ENV=production firebase deploy --only functions --project prod",
"logs": "firebase functions:log"
},
"engines": {
"node": "16"
},
"main": "index.js",
"dependencies": {
"axios": "^0.25.0",
"busboy": "^0.3.1",
"cookie-parser": "^1.4.6",
"cors": "^2.8.5",
"cross-env": "^7.0.3",
"dayjs": "^1.10.7",
"dotenv": "^11.0.0",
"eslint-config-prettier": "^8.3.0",
"express": "^4.17.2",
"firebase": "^9.6.2",
"firebase-admin": "^9.8.0",
"firebase-functions": "^3.14.1",
"helmet": "^5.0.1",
"hpp": "^0.2.3",
"jsonwebtoken": "^8.5.1",
"lodash": "^4.17.21",
"pg": "^8.7.1"
},
"devDependencies": {
"eslint": "^7.32.0",
"eslint-config-google": "^0.14.0",
"firebase-functions-test": "^0.2.0"
},
"private": true
}