Skip to content

Runnect/Runnect-Server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

564 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿƒโ€โ™€๏ธ Runnect_Server

[32st SOPT APPJAM] Server team repository of Runnect

์ ๊ณผ ์ ์œผ๋กœ, ์ฝ”์Šค์™€ ์ฝ”์Šค๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๋„ˆ์™€ ๋‚˜์˜ ๋Ÿฌ๋‹ ๊ฒฝํ—˜

ํ‘œ์ง€
A333



โ˜ ์„œ๋น„์Šค ํ•ต์‹ฌ ๊ธฐ๋Šฅ

1. ์ฝ”์Šค ๊ทธ๋ฆฌ๊ธฐ

์ฝ”์Šค ๊ทธ๋ฆฌ๊ธฐ๋กœ ๋‹ฌ๋ฆฌ๊ธฐ ์ „ ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ค์‹œ๊ฐ„ ํŠธ๋ž˜ํ‚น์œผ๋กœ ์ฝ”์Šค๋ฅด ๋”ฐ๋ผ ์ž˜ ๋‹ฌ๋ฆฌ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

2. ์ฝ”์Šค ๋ฐœ๊ฒฌ

์ฝ”์Šค ๋ฐœ๊ฒฌ์„ ํ†ตํ•ด ๋‚˜์—๊ฒŒ ๋งž๋Š” ์ฝ”์Šค๋ฅผ ์ถ”์ฒœ ๋ฐ›๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์œ ์ €๊ฐ€ ๊ณต์œ ํ•œ ์ฝ”์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์Šคํฌ๋žฉํ•ฉ๋‹ˆ๋‹ค. ์ฝ”์Šค๋ฅผ ์ง์ ‘ ์—…๋กœ๋“œํ•  ์ˆ˜ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์ฝ”์Šค ๋ณด๊ด€ํ•จ

์ฝ”์Šค ๋ณด๊ด€ํ•จ์—์„œ ๋‚ด๊ฐ€ ๊ทธ๋ฆฐ ์ฝ”์Šค์™€ ์Šคํฌ๋žฉ ์ฝ”์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

4. ๋งˆ์ดํŽ˜์ด์ง€

๋งˆ์ดํŽ˜์ด์ง€์—์„œ ํ”„๋กœํ•„๊ณผ ํ™œ๋™ ๊ธฐ๋ก, ์—…๋กœ๋“œํ•œ ์ฝ”์Šค๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ชฉํ‘œ ๋ณด์ƒ์œผ๋กœ ๋™๊ธฐ๋ฅผ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.



๐Ÿ”จ Dependencies Module ( package.json )

{
  "name": "Runnect_Server",
  "version": "1.0.0",
  "main": "index.js",
  "repository": "https://github.com/Runnect/Runnect_Server.git",
  "author": "YuSuhwa-ve <dhfhfkzjxms@sookmyung.ac.kr>",
  "license": "MIT",
  "scripts": {
    "dev": "nodemon",
    "build": "tsc && node dist",
    "db:pull": "npx prisma db pull",
    "db:push": "npx prisma db push",
    "generate": "npx prisma generate",
    "prepare": "chmod ug+x .husky/* && husky install",
    "greet": "hello husky!",
    "test": "mocha ./test/ -r ts-node/register"
  },
  "dependencies": {
    "@prisma/client": "^4.8.0",
    "aws-sdk": "^2.1281.0",
    "bcryptjs": "^2.4.3",
    "dayjs": "^1.11.7",
    "dotenv": "^16.0.3",
    "express": "^4.18.2",
    "express-validator": "^6.14.2",
    "jsonwebtoken": "^9.0.0",
    "multer": "^1.4.5-lts.1",
    "multer-s3": "^3.0.1",
    "prisma": "^4.8.0"
  },
  "devDependencies": {
    "@types/bcryptjs": "^2.4.2",
    "@types/chai": "^4.3.4",
    "@types/express": "^4.17.15",
    "@types/express-validator": "^3.0.0",
    "@types/jsonwebtoken": "^8.5.9",
    "@types/mocha": "^10.0.1",
    "@types/multer": "^1.4.7",
    "@types/multer-s3": "^3.0.0",
    "@types/node": "^18.11.17",
    "@types/supertest": "^2.0.12",
    "chai": "^4.3.7",
    "commitizen": "^4.2.6",
    "cz-conventional-changelog": "3.3.0",
    "cz-emoji-conventional": "^1.0.1",
    "husky": "^8.0.0",
    "mocha": "^10.2.0",
    "nodemon": "^2.0.20",
    "supertest": "^6.3.3",
    "ts-node": "^10.9.1",
    "typescript": "^4.9.4"
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-emoji-conventional"
    }
  }
}


๐Ÿ  server architecture

์„œ๋ฒ„์•„ํ‚คํ…์ณ



๐Ÿ“ Folder ๊ตฌ์กฐ

๐Ÿ“ src
|_ ๐Ÿ“ config
|_ ๐Ÿ“ constant
|_ ๐Ÿ“ controller
|_ ๐Ÿ“ interface
|_ ๐Ÿ“ middleware
|_ ๐Ÿ“ module
|_ ๐Ÿ“ prisma
|_ ๐Ÿ“ router
|_ ๐Ÿ“ service
|_ index.ts

๐Ÿ“ test


๐Ÿ’ฝย DB ERD

image



๐Ÿ“„ API(+ Non - API) Docs

image



๐Ÿ™†โ€โ™€๏ธ ์—ญํ• ๋ถ„๋‹ด & ๊ตฌํ˜„ ์ง„์ฒ™๋„

๋‹ด๋‹น์ž ๋‹ด๋‹น ๋‚ด์šฉ ๊ตฌํ˜„ ์ง„์ฒ™๋„
์œ ์ˆ˜ํ™” EC2, publicCourse & stamp ๊ด€๋ จ api 100%
์ „์„ ํฌ RDS, course & user ๊ด€๋ จ api 100%
๋ฐ•์ˆ˜๋ฆฐ S3, record & scrap ๊ด€๋ จ api 100%


๐Ÿ—ฃ๏ธ๏ธ ์ปจ๋ฒค์…˜

๐Ÿ’ก ๋™๋ฃŒ๋“ค๊ณผ ๋งํˆฌ๋ฅผ ํ†ต์ผํ•˜๊ธฐ ์œ„ํ•ด ์ปจ๋ฒค์…˜์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜คํ•ฉ์ง€์กธ์˜ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ, ํ•œ ์‚ฌ๋žŒ์ด ์ง  ๊ฒƒ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ถ”ํ›„ ์œ ์ง€๋ณด์ˆ˜๋‚˜ ํ˜‘์—…์—์„œ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด์„œ ์งค ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฃฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค!

๐Ÿ‘ฉโ€๐Ÿ’ปย Coding Conventions

๋ช…๋ช…๊ทœ์น™(Naming Conventions)
  1. ์ด๋ฆ„์œผ๋กœ๋ถ€ํ„ฐ ์˜๋„๊ฐ€ ์ฝํ˜€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ์“ด๋‹ค.
  • ex)

    // bad
    function q() {
      // ...stuff...
    }
    
    // good
    function query() {
      // ..stuff..
    }
  1. ์˜ค๋ธŒ์ ํŠธ, ํ•จ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ์ธ์Šคํ„ด์Šค์—๋Š” camelCase๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // bad
    const OBJEcttsssss = {};
    const this_is_my_object = {};
    function c() {}
    
    // good
    const thisIsMyObject = {};
    function thisIsMyFunction() {}
  1. ํด๋ž˜์Šค๋‚˜ 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",
    });
  1. ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋™์‚ฌ + ๋ช…์‚ฌ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•œ๋‹ค. ex) postUserInformation( )
  2. ์•ฝ์–ด ์‚ฌ์šฉ์€ ์ตœ๋Œ€ํ•œ ์ง€์–‘ํ•œ๋‹ค.
  3. ์ด๋ฆ„์— ๋„ค ๋‹จ์–ด ์ด์ƒ์ด ๋“ค์–ด๊ฐ€๋ฉด ํŒ€์›๊ณผ ์ƒ์˜๋ฅผ ๊ฑฐ์นœ ํ›„ ์‚ฌ์šฉํ•œ๋‹ค
๋ธ”๋ก(Blocks)
  1. ๋ณต์ˆ˜ํ–‰์˜ ๋ธ”๋ก์—๋Š” ์ค‘๊ด„ํ˜ธ({})๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // bad
    if (test)
      return false;
    
    // good
    if (test) return false;
    
    // good
    if (test) {
      return false;
    }
    
    // bad
    function() { return false; }
    
    // good
    function() {
      return false;
    }
  1. ๋ณต์ˆ˜ํ–‰ ๋ธ”๋ก์˜ if ์™€ else ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ else ๋Š” if ๋ธ”๋ก ๋์˜ ์ค‘๊ด„ํ˜ธ( } )์™€ ๊ฐ™์€ ํ–‰์— ์œ„์น˜์‹œํ‚จ๋‹ค.
  • ex) java // bad if (test) { thing1(); thing2(); } else { thing3(); } // good if (test) { thing1(); thing2(); } else { thing3(); }
์ฝ”๋ฉ˜ํŠธ(Comments)
  1. ๋ณต์ˆ˜ํ˜•์˜ ์ฝ”๋ฉ˜ํŠธ๋Š” /** ... */ ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // good
    /**
     * @param {String} tag
     * @return {Element} element
     */
    function make(tag) {
      // ...stuff...
    
      return element;
    }
  1. ๋‹จ์ผ ํ–‰์˜ ์ฝ”๋ฉ˜ํŠธ์—๋Š” // ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ์˜ ์ƒ๋ถ€์— ๋ฐฐ์น˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋ฉ˜ํŠธ์˜ ์•ž์— ๋นˆ ํ–‰์„ ๋„ฃ๋Š”๋‹ค.
  • ex) jsx // 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)
  1. ๋ฌธ์ž์—ด์—๋Š” ์‹ฑํฌ์ฟผํŠธ '' ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // bad
    const name = "Capt. Janeway";
    
    // good
    const name = "Capt. Janeway";
  1. ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์ด ์•„๋‹Œ template strings๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • ex) jsx // 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)
  1. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • 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)
  1. == ์ด๋‚˜ != ๋ณด๋‹ค === ์™€ !== ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  2. ๋‹จ์ถ•ํ˜•์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // bad
    if (name !== "") {
      // ...stuff...
    }
    
    // good
    if (name) {
      // ...stuff...
    }
  1. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Promiseํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์€ ์ง€์–‘ํ•˜๊ณ  async, await๋ฅผ ์“ฐ๋„๋ก ํ•œ๋‹ค


๐ŸŒณ Branch

๐ŸŒฑ git branch ์ „๋žต

main branch : ๋ฐฐํฌ ๋‹จ์œ„ branch

dev branch : ์ฃผ์š” ๊ฐœ๋ฐœ branch, main merge ์ „ ๊ฑฐ์น˜๋Š” branch

feat branch: ๊ฐ์ž ๊ฐœ๋ฐœ branch

  • ํ•  ์ผ issue ๋“ฑ๋ก ํ›„ issue ๋ฒˆํ˜ธ์™€ isuue ์ด๋ฆ„์œผ๋กœ branch ์ƒ์„ฑ ํ›„ ์ž‘์—…
    • ex) feat/#issue num-isuue name(๊ธฐ๋Šฅ์š”์•ฝ)
  • ํ•ด๋‹น branch ์ž‘์—… ์™„๋ฃŒ ํ›„ PR ๋ณด๋‚ด๊ธฐ
    • ํ•ญ์ƒ local์—์„œ ์ถฉ๋Œ ํ•ด๊ฒฐ ํ›„ โ†’ remote์— ์˜ฌ๋ฆฌ๊ธฐ
    • reviewer์— ์„œ๋กœ tagํ›„ code-review
    • comment ์ „ merge ๋ถˆ๊ฐ€!
    • review๋ฐ˜์˜ ํ›„, ๋ณธ์ธ์ด merge.

branch ๊ตฌ์กฐ

- main
- dev
- feat
   โ”œโ”€โ”€ #1-isuue name1
   โ””โ”€โ”€ #2-isuue name2


๐Ÿงต Commit Convention

๐Ÿ“ git commit message convention

ex) feat(๋ณ€๊ฒฝํ•œ ํŒŒ์ผ) : ๋ณ€๊ฒฝ ๋‚ด์šฉ (/#issue num)

- โœจ feat:      ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ตฌํ˜„
- ๐Ÿ› fix:       ๋ฒ„๊ทธ, ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
- ๐Ÿงน chore:     src ๋˜๋Š” test ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ๊ธฐํƒ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ( ์ƒˆ๋กœ์šด ํŒŒ์ผ ์ƒ์„ฑ, ํŒŒ์ผ ์ด๋™, ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋“ฑ )
- โ™ป๏ธ refactor:  ๋ฒ„๊ทธ ์ˆ˜์ •์ด๋‚˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๊ฐ€ ์—†๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ ( ์ฝ”๋“œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๋“ฑ์˜ ๋ฆฌํŒฉํ† ๋ง )
- ๐Ÿ’Ž style:     ์ฝ”๋“œ์˜ ์˜๋ฏธ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ( ์ฝ”๋“œ ํ˜•์‹, ์„ธ๋ฏธ์ฝœ๋ก  ์ถ”๊ฐ€: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋ณ€๊ฒฝ ์—†์Œ )
- ๐Ÿ—๏ธ build:    ๋นŒ๋“œ ์‹œ์Šคํ…œ ๋˜๋Š” ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ข…์†์„ฑ ( ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ ๋“ฑ )
- ๐Ÿ“ˆ perf:      ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ๋ณ€๊ฒฝ
- ๐Ÿงช test:      ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๋˜๋Š” ์ด์ „ ํ…Œ์ŠคํŠธ ์ˆ˜์ •
- ๐Ÿ“ docs:      README๋‚˜ WIKI ๋“ฑ์˜ ๋ฌธ์„œ ๊ฐœ์ •
- โช๏ธ revert:    ์ด์ „ ์ปค๋ฐ‹์„ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒฝ์šฐ
- ๐Ÿ“ฆ ci:      CI ๊ตฌ์„ฑ ํŒŒ์ผ ๋ฐ ์Šคํฌ๋ฆฝํŠธ ๋ณ€๊ฒฝ
- Merge: ๋‹ค๋ฅธ๋ธŒ๋ Œ์น˜๋ฅผ mergeํ•˜๋Š” ๊ฒฝ์šฐ
- Init : Initial commit์„ ํ•˜๋Š” ๊ฒฝ์šฐ

About

Server team repository of Runnect (Node.js) ๐Ÿƒ๐Ÿปโ€โ™€๏ธ๐Ÿƒ๐Ÿปโ€โ™‚๏ธ๐Ÿƒ๐Ÿป

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors