Be happy, take a happic:
๋งค์ผ์ ์ถ์ต์ด ๋์ ํ๋ณต์ด ๋์ด, ํดํฝ
์ ํฌ๋ ํดํฝ์ ๋๋คSOPT 30th APP JAM
ํ๋ก์ ํธ ๊ธฐ๊ฐ : 2022.07.02 ~ 2022.07.23
์ถํ ๋ฆด๋ฆฌ์ฆ ์์
![]() |
![]() |
![]() |
|---|---|---|
| ์ด์์ฐ | ๊น๋์ฌ | ์ ์ก๊ฒฝ |
| dltjdn | ehdwoKIM | ssong915 |
-
main: ๋ฐฐํฌ๋ฅผ ์ํ ๋ธ๋์น ( ์ต์ข ๋ณธ )
-
develop: ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ์๋ฃ๋ ์ฝ๋๋ค์ด ๋ชจ์ด๋ ๊ณณ ( ๊ฒ์ฆ๋ ๊ณณ์ด์ ๊ฒ์ฆํ ๊ณณ )
-
feature: ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ํ ๋ธ๋์น ( feature/๋ณธ์ธ์ด๋ฆ/๊ธฐ๋ฅ๋ช )
- [ADD] : ์๋ก์ด ๊ธฐ๋ฅ ๊ตฌํ
- [FEAT] : ADD ์ด์ธ์ ๋ถ์์ ์ธ ์ฝ๋ ์ถ๊ฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ, ์๋ก์ด ํ์ผ ์์ฑ ์
- [CHORE]: ์ฝ๋ ์์ , ๋ด๋ถ ํ์ผ ์์
- [FIX] : ๋ฒ๊ทธ, ์ค๋ฅ ํด๊ฒฐ
- [DEL] : ์ธ๋ชจ์๋ ์ฝ๋ ์ญ์
- [DOCS] : README๋ WIKI ๋ฑ์ ๋ฌธ์ ๊ฐ์
- [MOVE] : ํ๋ก์ ํธ ๋ด ํ์ผ์ด๋ ์ฝ๋์ ์ด๋
- [RENAME] : ํ์ผ ์ด๋ฆ์ ๋ณ๊ฒฝ
- [STYLE] : ์ฝ๋๊ฐ ์๋ ์คํ์ผ ๋ณ๊ฒฝ์ ํ๋ ๊ฒฝ์ฐ
๋ช ๋ช ๊ท์น (Naming Conventions)
- ์ด๋ฆ์ผ๋ก๋ถํฐ ์๋๊ฐ ์ฝํ์ง ์ ์๊ฒ ์ด๋ค.
- ์ค๋ธ์ ํธ, ํจ์, ๊ทธ๋ฆฌ๊ณ ์ธ์คํด์ค์๋
camelCase๋ฅผ ์ฌ์ฉํ๋ค. - ํด๋์ค๋ constructor์๋
PascalCase๋ฅผ ์ฌ์ฉํ๋ค. - ํจ์ ์ด๋ฆ์ ๋์ฌ + ๋ช
์ฌ ํํ๋ก ์์ฑํ๋ค.
ex)postUserInformation() - ์ฝ์ด ์ฌ์ฉ์ ์ต๋ํ ์ง์ํ๋ค.
- ์ด๋ฆ์ ๋ค ๋จ์ด ์ด์์ด ๋ค์ด๊ฐ๋ฉด ํ์๊ณผ ์์๋ฅผ ๊ฑฐ์น ํ ์ฌ์ฉํ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช ์ ์์ด ์๋ฌธ์๋ก ๊ตฌ์ฑํ๋ค.
๋ธ๋ก (Blocks)
- ๋ณต์ํ์ ๋ธ๋ก์๋ ์ค๊ดํธ({})๋ฅผ ์ฌ์ฉํ๋ค.
- ๋ณต์ํ ๋ธ๋ก์ if ์ else ๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ else ๋ if ๋ธ๋ก ๋์ ์ค๊ดํธ( } )์ ๊ฐ์ ํ์ ์์น์ํจ๋ค.
์ฝ๋ฉํธ (Comments)
- ๋ณต์ํ์ ์ฝ๋ฉํธ๋
/** ... */๋ฅผ ์ฌ์ฉํ๋ค. - ๋จ์ผ ํ์ ์ฝ๋ฉํธ์๋
//์ ์ฌ์ฉํ๊ณ ์ฝ๋ฉํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ ์ฝ๋์ ์๋ถ์ ๋ฐฐ์นํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฉํธ์ ์์ ๋น ํ์ ๋ฃ๋๋ค.
๋ฌธ์์ด (Strings)
- ๋ฌธ์์ด์๋ ์ฑํฌ์ฟผํธ
''๋ฅผ ์ฌ์ฉํ๋ค.. - ํ๋ก๊ทธ๋จ์์ ๋ฌธ์์ด์ ์์ฑํ๋ ๊ฒฝ์ฐ๋ ๋ฌธ์์ด ์ฐ๊ฒฐ์ด ์๋
template strings๋ฅผ ์ด์ฉํ๋ค.
ํจ์ (Functions)
- ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
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- ๋น๋๊ธฐ ํจ์ ์ฌ์ฉ ์ Promiseํจ์์ ์ฌ์ฉ์ ์ง์ํ๊ณ async, await ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ค.
์กฐ๊ฑด์๊ณผ ๋ฑ๊ฐ์ (Comparsion Operators & Equality)
==์ด๋!=๋ณด๋ค===์!==์ ์ฌ์ฉํ๋ค.- ๋จ์ถํ์ ์ฌ์ฉํ๋ค.
- ๋น๋๊ธฐ ํจ์๋ฅผ ์ฌ์ฉํ ๋
Promiseํจ์์ ์ฌ์ฉ์ ์ง์ํ๊ณasync, await๋ฅผ ์ฐ๋๋ก ํ๋ค.
๐ฆ config
โ ๐ index.ts
๐ฆ controllers
โฃ ๐ index.ts
๐ฆ interfaces
โ ๐ film
โ โ ๐ FilmInfo.ts
โ ๐ keyword
โ ๐ KeywordInfo.ts
โ ๐ user
โ ๐ UserInfo.ts
๐ฆ loaders
โ ๐ db.ts
๐ฆ middlewares
โ ๐ auth.ts
๐ฆ models
โฃ ๐ Film.ts
โฃ ๐ Keyword.ts
โ ๐ User.ts
๐ฆ modules
โ ๐ util.ts
โ ๐ statusCode.ts
โ ๐ responseMessage.ts
๐ฆ routes
โฃ ๐ index.ts
๐ฆ services
โฃ ๐ index.ts
Char
const CharSchema = new mongoose.Schema({
characterId: {
type: Number,
required: true,
},
characterName: {
type: String,
required: true,
},
});File
const FileSchema = new mongoose.Schema(
{
link: {
type: String,
required: true,
},
fileName: {
type: String,
required: true,
},
},
{
timestamps: true, // createdAt, updatedAt ์๋๊ธฐ๋ก
}
);User
const UserSchema = new mongoose.Schema({
name: {
type: String,
required: true,
},
social: {
type: String,
required: true,
unique: true,
},
socialId: {
type: String,
required: true,
unique: true,
},
email: {
type: String,
required: true,
unique: true,
},
characterId: {
type: Number,
required: true,
},
characterName: {
type: String,
required: true,
},
growthRate: {
type: Number,
required: true,
default: 0,
},
level: {
type: Number,
required: true,
default: 1,
},
film: [
{
type: mongoose.Types.ObjectId,
ref: 'Film',
},
],
count: {
type: Number,
required: true,
default: 0,
},
fcmToken: {
type: String,
required: true,
unique: true,
},
refreshToken: {
type: String,
required: true,
unique: true,
},
});Film
const FilmSchema = new mongoose.Schema(
{
writer: {
type: mongoose.Types.ObjectId,
required: true,
ref: 'User',
},
photo: {
type: String,
required: true,
},
thumbnail: {
type: String,
},
keyword: [
{
type: mongoose.Types.ObjectId,
required: true,
ref: 'Keyword',
},
],
year: {
type: Number,
required: true,
},
month: {
type: Number,
required: true,
},
},
{
timestamps: true, // createdAt, updatedAt ์๋๊ธฐ๋ก
}
);Keyword
const KeywordSchema = new mongoose.Schema(
{
writer: {
type: mongoose.Types.ObjectId,
required: true,
ref: 'User',
},
category: {
type: String,
required: true,
},
content: {
type: String,
required: true,
},
year: {
type: Number,
required: true,
},
month: {
type: Number,
required: true,
},
count: {
type: Number,
required: true,
default: 0,
},
},
{
timestamps: true, // createdAt, updatedAt ์๋๊ธฐ๋ก
}
);{
"name": "node-typescript-init",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "nodemon",
"build": "tsc",
"start:dev": "node dist/index.js",
"test": "mocha -r ts-node/register src/test/daily.spec.ts"
},
"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/multer": "^1.4.7",
"@types/multer-s3": "^2.7.12",
"@types/node": "^17.0.25",
"@types/supertest": "^2.0.12",
"@typescript-eslint/eslint-plugin": "^5.30.5",
"@typescript-eslint/parser": "^5.30.5",
"chai": "^4.3.6",
"eslint": "^8.19.0",
"mocha": "^10.0.0",
"nodemon": "^2.0.15",
"prettier": "^2.7.1",
"supertest": "^6.2.4",
"ts-node": "^10.7.0",
"typescript": "^4.6.3"
},
"dependencies": {
"aws-sdk": "^2.1143.0",
"axios": "^0.27.2",
"bcryptjs": "^2.4.3",
"bucket": "^0.0.1",
"dayjs": "^1.11.3",
"dotenv": "^16.0.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.2.1",
"express": "^4.18.1",
"express-validator": "^6.14.2",
"firebase-admin": "^11.0.0",
"jsonwebtoken": "^8.5.1",
"mongoose": "^6.3.1",
"multer": "^1.4.4",
"multer-s3": "^2.10.0",
"node-schedule": "^2.1.0",
"winston": "^3.8.1"
}
}
- ๊ฐ๋ฐ ํ๊ฒฝ : Typescript, Express(Node.js)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค : MongoDB, AWS S3
- ์๋ฒ ํ๊ฒฝ : AWS EC2, PM2










