- ๋นํธ๋งต
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- LCs
- golang
- ์นด์นด์ค2021
- ๋นํธ๋ง์คํน
- C++
- go
- ์น๋ฆฐ์ด
- nestjs
- ์ฌ๊ท
- ์๊ณ ๋ฆฌ์ฆ
- ์นด์นด์ค ์ฝํ
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ๋ค์ต์คํธ๋ผ
- BFS
- ํธ๋ฆฌ
- ํ๋ฆฌ์จ๋ณด๋ฉ
- Union-Find
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ์์ฝ๋
- ์ด๋ถํ์
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ํฐ๋
- ๋ฐฑ์ค
- DFS
- Python
- DP
- js
- Today
- Total
Hello Ocean! ๐ผ
[TIL] ํ๋ฆฌ์จ๋ณด๋ฉ ๋ง์ง๋ง, ์ผ๊ณฑ ๋ฒ์งธ ๊ณผ์ _Cardoc ๋ณธ๋ฌธ
์ผ๊ณฑ ๋ฒ์งธ ๊ณผ์ ๐ฅ
์ด๋ฒ ๊ณผ์ ๋ ์ฒ์์ผ๋ก ํผ์ ์งํํ๋ ๊ณผ์ ์๋ค. ํ ๋ฌ๋์ ์ฆ์ ๋ฐค์์ ์ง์ณ๊ฐ๋ ์ค์ด์๋๋ฐ, ๊ฐ์ธ ๊ณผ์ ์ ๊ธฐํ๋ ์ผ์ฃผ์ผ์ด๋ ์ฃผ์ ์ ํ๋ณตํ๋ค.
์ฐ๋ฆฌ ํ์ ๊ฐ์ธ๊ณผ์ ์์๋ ๋ถ๊ตฌํ๊ณ ํ๋ฐํ๊ฒ ์ํตํ๋ฉฐ ๊ณผ์ ๋ฅผ ์งํํ๋ค.
์ฃผ๋ ๋ชฉ์ ์ ์ด๋ชฝ์ด์ค์ ์บ์น๋ง์ธ๋ ์์ง๋ง..
์๊ฐ์ ์ซ๊ธฐ์ง ์์๋ ๋๋, Nestjs ๋ฐ ๋์ปค๋ฅผ ๊ณต๋ถํ๋ฉด์ ์งํํ ์ ์์ด์ ์ข์๋ค.
github ๋งํฌ : https://github.com/sally0226/assignment-7-cardoc
1) DB ๋ชจ๋ธ๋ง ๐ค
์ฒ์์๋ ํ ์ด๋ธ์ ๋๊ฐ๋ง ๋์ด User์, User๊ฐ ๊ฐ์ง ์๋์ฐจ์ ๊ทธ์ ๋ฐ๋ฅธ ํ์ด์ด ์ ๋ณด๋ฅผ ํ ํ ์ด๋ธ์ ์ ์ฅํ๋ ค๊ณ ํ์ผ๋, trimId๊ฐ ๋์ผํ ์๋์ฐจ๋ ํ์ด์ด ์ ๋ณด๊ฐ ๊ฐ์ผ๋ฏ๋ก, Cars ํ ์ด๋ธ๋ก ๋ง๋ค์ด ๋์ผํ ์ปฌ๋ผ๋ค์ ์ค๋ณต ์ ์ฅ์ ์ค์ด๊ณ ์ ํ๋ค.
- OwnedLists
- ํ user๊ฐ ๋์ผํ trimId์ ์ฐจ๋์ ์ฌ๋ฌ๊ฐ ๋ฑ๋กํ ์ ์๋๋ก, id + trimId ์ปฌ๋ผ์ ๋ฌถ์ด Unique์์ฑ์ ๋ถ์ฌ
@Unique(["user", "car"])
- Cars
- ์ฒ์์๋ ํญ , ํธํ๋น, ํ ์ฌ์ด์ฆ ์ปฌ๋ผ์ ๋์ด frontTire์ ๋ณด๊ฐ ์์ผ๋ฉด ์ ์ฅ, ์์ผ๋ฉด rearTire์ ๋ณด๋ก ์ ์ฅํ๋ ค๊ณ ํ๋ค.
- ํ์ง๋ง, frontTire์ rearTire์ ๊ท๊ฒฉ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ์ผ๋ก ํ๋จ๋์ด frontTire์ rearTire์ ์ ๋ณด๋ฅผ ๋ฐ๋ก ์ ์ฅํ ์ ์๋๋ก ์ปฌ๋ผ์ ์๋ฅผ ๋๋ฆผ
- ํ์ง๋ง ์๋์ ๊ฐ์ด rearTire์ ์ ๋ณด๊ฐ ์๋ case๋ฅผ ๋ฐ๊ฒฌํ๊ฒ ๋์ด, rearTire๊ด๋ จ ์ปฌ๋ผ์ nullable ์์ฑ์ ์ฃผ์๋ค.
2) ์ธ์ฆ ๐ค
์ง๋ ๋๋ถ๋ถ์ ๊ณผ์ ๋ค์๋ ์ธ์ฆ ๊ธฐ๋ฅ์ด ํ์ํ์ฌ ๊ตฌํํ์ง๋ง, ์๊ฐ์ด ๋๋ํ์ง ์์ ๋ค๋ฅธ ํ์๋ถ์ด ์ด์ ์ nestjs๋ก ์์ฑํด๋์ผ์ ํด๋๊ตฌ์กฐ์ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฒ ๋ผ๋ค์ํผ ๊ตฌํํ์๋ค.
๊ทธ๋์ ์ด๋ฒ ๊ณผ์ ๋ฅผ ํ ๋๋, Nestjs ๊ณต์ ๋ฌธ์๋ฅผ ๊ผผ๊ผผํ ๋ณด๋ฉด์ ์ดํดํ๋ฉด์ ๊ตฌํํ๋ค.
๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉฐ ๊ตฌํํ๋, JwtStrategy์ localStrategy๊ฐ guard๋ฅผ ์ํด ํ์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
guard๋ฅผ ๋ง๋ค๊ณ , ํด๋น guard๊ฐ ํ์ํ ๊ณณ์์ @UseGuard() ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ , ํ์๊ฐ์ ์ฑ๊ณต์ ๋ฐ๋ก ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด JWT๋ฅผ ๋ฐ๊ธํด์ฃผ๋ ๋ฐฉ์์ ์ ์ฉํ๋ค.
3) ์ฌ์ฉ์๊ฐ ์์ ํ ํ์ด์ด ์ ๋ณด๋ฅผ ์ ์ฅํ๋ API ๐
์ด API๋ ์ฌ๋ฌ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ํ ๋ฒ์ ์์ฒญํ ์ ์๋ API์ด์ง๋ง, ๊ณผ์ ์๋ด ํ์ด์ง์
์ดํ์ API๋ ์ธ์ฆ๋ ์ฌ์ฉ์๋ง ํธ์ถํ ์ ์๋ค.๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ์์๊ธฐ์, ๋ก๊ทธ์ธ์ด ๋์ด์๋์ง ๊ฒ์ฌํ๋ค.
๋ค๋ง, ๋๊ฐ ๋ก๊ทธ์ธํ๋์ง๋ ์ ๊ฒฝ์ฐ์ง ์์๋ค.
์ด API์ res๋ฅผ ์ ํ๋ ๊ณผ์ ์์ ๋ง์ ๊ณ ๋ฏผ์ ํ๋ค.
Request body๋ก ์ฌ์ฉ์ ์ ๋ณด + trimId ์์ ์ต๋ 5๊ฐ ๊น์ง ๋ฐ์ ์ ์๋๋ฐ,
๊ทธ๋์ ์ผ๋ถ๋ ์ฑ๊ณตํ๊ณ , ์ผ๋ถ๋ ์คํจํ ๊ฒฝ์ฐ์ ์ด๋ป๊ฒ Response๋ฅผ ๋ณด๋ด์ค์ง์ ๋ํด ๊ณ ๋ฏผ์ด ๋์๋ค.
1. ํ ๊ฐ๋ผ๋ ์คํจํ๋ฉด Error Res
2. ํ ๊ฐ๋ผ๋ ์ฑ๊ณตํ๋ฉด 200 Res, ๋์ ์ ์์ ๋ฐฐ์ด๋ก ๋ฉ์ธ์ง ์ ์ด ๋ณด๋ด๊ธฐ
์ค์ ๊ณ ๋ฏผ์ ํ๋๋ฐ, 1๋ฒ ๋ฐฉ๋ฒ์ ๋นํจ์จ์ ์ด๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
๊ฐ๋ฅํ ํญ๋ชฉ์ ๋ํด์๋ ์ต๋ํ ์ฒ๋ฆฌํด์ฃผ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ 1๊ฐ๋ผ๋ ์ฑ๊ณตํ๋ฉด 200์ผ๋ก Response๋ฅผ ๋ณด๋ด๋ ๋ฉ์ธ์ง๋ก ์คํจํ ๊ฒฝ์ฐ๋ฅผ ๋ํ๋ด์ฃผ์๋ค.
[์์]
- ํ ๊ฐ๋ผ๋ ์ฑ๊ณตํ ๊ฒฝ์ฐ
- ์ฑ๊ณตํ ๊ฒฝ์ฐ๋ ์์ฑ๋ id์ trimId์์ด,
[ { "id": "bada1", "trimId": 5 }, "์ค๋ณต๋ ์ ๋ณด์ ๋๋ค.", "์กด์ฌํ์ง ์๋ user์ ๋๋ค." ]
- ์คํจํ ๊ฒฝ์ฐ์๋ ํด๋น case์ ๋ํ error message๊ฐ ๋ค์ด์๋ค.
- 200๊ณผ ํจ๊ป ๋ฐฐ์ด์ด Response๋๋ค.
- ์ฑ๊ณตํ ๊ฒฝ์ฐ๋ ์์ฑ๋ id์ trimId์์ด,
- ์ ๋ถ ์คํจํ ๊ฒฝ์ฐ
{ "statusCode": 400, "message": [ "์ค๋ณต๋ ์ ๋ณด์ ๋๋ค.", "์กด์ฌํ์ง ์๋ user์ ๋๋ค." ], "path": "/owned-lists" }
- 400๊ณผ ํจ๊ป ๋ฉ์ธ์ง๊ฐ ๋ฐฐ์ดํํ๋ก Response๋๋ค.
- ๊ฐ ํญ๋ชฉ๋ง๋ค ์คํจํ ์ด์ ๊ฐ ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ์ง๋ฅผ ๋ฐฐ์ดํํ๋ก ์ ์กํ๋ค.
๋ค๋ง, DTO๊ฐ ํ ๊ฐ๋ผ๋ ์ด๊ธ๋ฌ์ ๋์๋ ๋ฐ๋ก 400์ด Response๋๋ค.
Nestjs๊ฐ DTO๊ฐ ์ด๊ธ๋ฌ์ ๋, ์ด๋ป๊ฒ Error Handle์ ํ๋์ง ๋ ๊ณต๋ถํ ์ ์๋ ์๊ฐ์ด ์์์ผ๋ฉด ์ข์์ ๊ฒ ๊ฐ๋ค.
๋ค์์ ์ด ๋ถ๋ถ์ ๊ณต๋ถํด๋ณผ ๊ฒ์ด๋ค.
{
"statusCode": 400,
"message": [
"list.1.id should not be empty",
"list.1.id must be a string"
],
"path": "/owned-lists"
}
๐๏ธ
4) ์๋์ฐจ ์ ๋ณด ์กฐํ API์ ์ฌ์ฉ[API ํธ์ถ]
์๋์ ์ ๋ณด ์กฐํ API๋ฅผ ํธ์ถํ๊ธฐ ์ํด axios์ HttpService๋ฅผ ์ด์ฉํ๋ค.
๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ APIํธ์ถ์ด ์๋ฃ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์์๋๋ฐ, return type์ด Promise๊ฐ ์๋๋ผ Observable์ด์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก await๋ฅผ ์ฌ์ฉํ ์ ์์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด rjax์ lastValueFrom ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ์ด ํจ์๋ Observable๋ฅผ Promise๋ก ๋ฐ๊ฟ์ฃผ๋ฉฐ ํจ์ ์ด๋ฆ์ด ๋ปํ๋ ๋ฐ์ ๊ฐ๊ฒ ๋ง์ง๋ง value๋ฅผ returnํด์ค๋ค.
์ง๋ ํด๋จผ์ค์ผ์ดํ์ ๊ณผ์ ์์ ์ธ๋ถ API ํธ์ถ์ด ํ์ํ์๊ธฐ ๋๋ฌธ์, ์ด๋ ต์ง ์๊ฒ ๊ตฌํํ ์ ์์๋ค.
axios๋ง๊ณ , @nestjs/common์์ ์ ๊ณตํ๋ HttpService๋ ์์ด์ ์ง๋ ๊ณผ์ ์์ ์ด๊ฒ์ ์ด์ฉํ๋ ค๊ณ ํ๋๋ฐ,
"HttpModule" (from the "@nestjs/common" package) is deprecated and will be removed in the next major release. Please, use the "@nestjs/axios" package instead.
(๋์ถฉ ์ด์ ์ด๊ฑฐ ์ง์์ํ๋๊น axios ์ฐ๋ผ๋ ์๊ธฐ)
์ด๋ฐ ๋ฉ์ธ์ง๊ฐ ๋ด๊ธฐ ๋๋ฌธ์ axios๋ฅผ ์ค์นํด ์ด์ฉํ๋ค.
[์ ๊ท์ ์ด์ฉ]
๋ํ, frontTire/rearTire.value๊ฐ 205/75R18์ ๊ฐ์ด ํ๋์ string์์ ํญ, ํธํ๋น, ํ ์ฌ์ด์ฆ๊ฐ ๋ชจ๋ ํฌํจ๋์ด ์๋ ํํ์๋ค.
๋ฐ๋ผ์ ์ฃผ์ด์ง string์ /์ R๋ก splitํด์ฃผ์ด์ผ ํ๋๋ฐ, ์ ๊ท์์ ์์ฑํ์ฌ ํ ๋ฒ์ splitํจ์๋ก [ํญ, ํธํ๋น, ํ ์ฌ์ด์ฆ]๋ฅผ ๊ตฌํ ์ ์๋๋ก ํ๋ค.
์ด๋ฒ ๊ณผ์ ๋ฅผ ํตํด ์ ๊ท์์๋ "(๋ฐ์ดํ)๋ฅผ ๋ถ์ด์ง ์๋๋ค๋ ๊ฒ์ ์๊ฒ๋์๋ค.
์ด๊ฑธ ๋ชจ๋ฅด๊ณ ๋ฐ์ดํ๋ฅผ ๋ถ์ธ ์ฑ๋ก ์ ์๋์ง? ํ๋ค๊ฐ ๋์ค์ ์๊ฒ๋์๋ค..
const frontInfo = frontTire ? frontTire.split(/R|\//) : null;
[nullable]
Cars ์ํฐํฐ ๋ชจ๋ธ๋ง์์๋ ์ค๋ช ํ ๋ด์ฉ์ด์ง๋ง,
frontTire์ rearTire์ ์ ๋ณด๋ฅผ ๊ฐ๊ฐ ์ ์ฅํ๋๋ฐ, rearTire๊ฐ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์, ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ null์ด ๋ค์ด๊ฐ ์ ์๋๋ก ํด์ฃผ์๋ค.
frontTire, rearTire ๋ชจ๋ null → error
๋ ์ค์ ํ๋๋ง null → ํต๊ณผ ํ ํด๋น ์ปฌ๋ผ๊ฐ์ด null๋ก ์ ์ฅ๋๋๋ก ์ฒ๋ฆฌ
carService๋ด์ ์๋์ฐจ ์ ๋ณด ์กฐํ API๋ฅผ ํธ์ถํ๋ ํจ์ ๋งํฌ
async getCarInfo(trimId: number) {
const url = `https://dev.mycar.cardoc.co.kr/v1/trim/${trimId}`;
try {
const responseData = await lastValueFrom(
this.httpService
.get(url)
.pipe(map((response) => response.data?.spec?.driving))
);
const frontTire = responseData.frontTire?.value;
const rearTire = responseData.rearTire?.value;
if (!frontTire && !rearTire) return null;
const frontInfo = frontTire ? frontTire.split(/R|\//) : null;
const rearInfo = rearTire ? rearTire.split(/R|\//) : null;
const result = await this.carsRepository.createOne(
trimId,
frontInfo,
rearInfo
);
return result;
} catch (error) {
return null;
}
}
โณ
5) HTTP Status Code๊ฐ API์ status code๋ ๊ณผ์ ์๋ด ํ์ด์ง์ ๋ฐ๋ผ 200, 400, 401, 500์ผ๋ก ๊ตฌ์ฑํ๋ค.
400์ ๊ฒฝ์ฐ, error์ ์ด์ ๊ฐ ๋ค์ํ๋ฏ๋ก error message๋ฅผ ๋ค๋ฅด๊ฒ ๋ฃ์ด์ฃผ์๋ค.
ex) ํ์๊ฐ์ ์ ์ค๋ณต ๊ฐ์ ์ ๊ฒฝ์ฐ, DTO๊ฐ ์ ๋ง๋ ๊ฒฝ์ฐ ๋ฑ..
// ์ค๋ณต ๊ฐ์
์
{
"statusCode": 400,
"message": "์ค๋ณต๋ id์
๋๋ค.",
"path": "/users/signup"
}
// DTO์ ๋ง์ง ์์ ๋
{
"statusCode": 400,
"message": [
"id should not be empty",
"id must be a string"
],
"path": "/users/signup"
}
๐ซ
6) Exception ์ฒ๋ฆฌ์ง๋ ๊ณผ์ ๋ค์์๋ Exception ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ์๋ค. ํ์ง๋ง Nestjs๋ฅผ ์ ๋ชจ๋ฅด๋ ์ํ์ฌ์ ๋ค๋ฅธ ํ์์ด ํด ๋์ ๋ฐฉ์์ ๊ทธ๋๋ก ์ด์ฉํ๋ค. ๋ค๋ง ๊ทธ ๊ตฌ์กฐ๊ฐ ํ์ผ์ด ๋ง์ด ํ์ํ๊ณ ๋ณต์กํด์, ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง ์์๊น ์๊ฐํ๋ค.
๋ค๋ฅธ ํ์๋ค๋ ๋์ ๊ฐ์ ์๊ฐ์ ํด์, ๋์ค์ ๊ณต๋ถํด๋ณด์๊ณ ์ด์ผ๊ธฐ๋ฅผ ๋๋ด์๋๋ฐ ์ด๋ฒ ๊ณผ์ ๋ฅผ ํตํด ๋ ๋์ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์๋ค.
๋ต์ ์ญ์ ๊ณต์๋ฌธ์์ ์์๋ค. Nestjs ๊ณต์๋ฌธ์๋ฅผ ํตํด ๊ตฌํํ์ผ๋ฉฐ, ํ์ํ ๋ถ๋ถ์ ์์ ํ๋ค.
ํนํ message๋ณ์๋ฅผ ์์ ํ๋ค.
๋ณดํต์ ๊ฒฝ์ฐ์๋ exception.message์ string ํํ์ message๊ฐ ๋ค์ด์๋๋ฐ,
DTO๊ด๋ จ error์ ๊ฐ์ด error message๊ฐ 1๊ฐ ์ด์์ผ๋ก ๋ฐฐ์ด ํํ๋ก ์กด์ฌํ ๋,
exception.message ์๋ ํฌ๊ด์ ์ธ ๋ฉ์ธ์ง๋ง ๋ค์ด์๊ณ ,
์์ธํ ๋ฉ์ธ์ง๋ค์ exception.getResponse()["message"]์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
const status = exception.getStatus();
const message = exception.getResponse()["message"] || exception.message;
response.status(status).json({
statusCode: status,
message,
path: request.url
});
}
}
๐ณ
7) Docker๋ฅผ ์ด์ฉํ ๋ฐฐํฌ์ธ๊ณต์ง๋ฅ ์คํํธ์ ์์ ์ธํด์ ํ ๋, Docker๋ฅผ ์ฒ์ ์ ํ๋ค. ์ง์ image๋ฅผ ๋น๋ํ๊ฑด ์๋์๊ณ , ๋น๋๋ ์ด๋ฏธ์ง ์ฌ๋ฌ๊ฐ๋ฅผ ์คํ์์ผ๋ณด๊ณ , ์คํ์ค์ธ ์ปจํ ์ด๋์ ์ ์ํด ํ์ผ๋ชฉ๋ก์ ๋ณด๋ ์ ๋์ ์์ ๋ง ์ํํ๋ค.
ํ ๋์ ์ปดํจํฐ์์ ๋ ๋ฆฝ์ ์ธ ํ๊ฒฝ์ ๋ง๋ค์ด ์ด์ฉํด ์๋ก ์ถฉ๋์ด ์ผ์ด๋์ง ์๊ฒ ํ๋ ์ ์ด ๋งค๋ ฅ์ ์ด์๊ณ , ์ฐจ์ด์ ์ด ์๊ธด ํ์ง๋ง, ์๋์ฝ๋ค์ ๊ฐ์ํ๊ฒฝ๊ณผ ๋น์ทํ ๊ฐ๋ ์ด๋ผ๋ ์๊ฐ๋ ๋ค์๋ค.
[MySQL]
docker hub์์ latest๋ฒ์ ์ image๋ฅผ ๋ค์ด๋ฐ์ ์ปจํ ์ด๋๋ฅผ ์์ฑ ๋ฐ ์คํํ๋ค.
[Nestjs ์๋ฒ]
- v12์ node image๋ฅผ ์ด์ฉ
- ๊ฐ๋ฐ์ ์ด์ฉํ ๋ฒ์ ์ v14.x.x ์์ง๋ง, docker image๋ค ๊ฐ์ฅ ์ต์ LTS์ธ v12๋ฅผ ์ฌ์ฉํด๋ณด์๋๋ฐ, ๋ฒ์ ์ฐจ์ด์ ๋ฐ๋ฅธ ๋ณ๋ค๋ฅธ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ ๊ทธ๋ฅ v12 image๋ฅผ ์ด์ฉํ๋ค.
- ์ถํ์ docker์ node image๋ค์ ๋ํด์๋ ์์๋ณผ ์์ ์ด๋ค.
- ์์ ์ ์ธ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ์ ์ํด pm2๋ฅผ ์ด์ฉ
- ๊ทธ๋ฅ pm2๊ฐ ์๋ ๋์ปค์ ์ ํฉํ pm2-runtime ๋ช ๋ น์ด๋ฅผ ์ด์ฉ
- --output option์ ์ด์ฉํด, ํน์ ์์น์ logํ์ผ์ด ์๊ธธ ์ ์๋๋ก ์ฒ๋ฆฌ
์ต์ข ์ ์ผ๋ก, ์๋์ ๊ฐ์ Dockerfile์ ์์ฑํ์ฌ ์ด์ฉ
From node:12
# ์ฑ ๋๋ ํ ๋ฆฌ ์์ฑ
WORKDIR /usr/src/app
COPY package*.json /usr/src/app/
RUN npm install
RUN npm install -g pm2
COPY . /usr/src/app/
RUN npm run build
EXPOSE 3000
CMD ["pm2-runtime", "start", "dist/main.js", "-i", "max", "--output", "/home/contents/log/main_out.log"]
# ํ๊ฒฝ๋ณ์ ์ค์
# DATABASE
ENV MYSQL_HOST ...
ENV MYSQL_USERNAME ...
ENV MYSQL_PASSWORD ...
ENV MYSQL_DATABASE ...
# JWT
ENV JWT_SECRET_KEY ...
์ด๋ฒ ๊ณผ์ ๋ฅผ ํตํด ์ฒ์์ผ๋ก ์ง์ Docker image๋ฅผ ๋น๋ํด๋ณด์๋ค.
image๋ฅผ ๋น๋ํ๋ ๊ณผ์ ์์ ๊ต์ฅํ ํ์ด ๋ง์์ผ๋,, ์ฌ๋ฌ ๋ฒ์ ์ํ์ฐฉ์ค ๋์ ์ฑ๊ณตํ๊ฒ ๋์ด ๊ต์ฅํ ํ๋ณตํ๋ค.
- COPY . . ์๋๋ ๋ฌธ์
- WORKDIR ๋ช ๋ น์ด๋ก ํด๋๋ฅผ ์ง์ ํด์ค ํ, COPY . .๋ฅผ ํด์ฃผ๋ฉด ํด๋น ํด๋์ ์นดํผ๊ฐ ๋๋ ์ค ์์๋๋ฐ, ๋์ง ์์์ . ๋์ ์ ์ ๋๊ฒฝ๋ก๋ฅผ ์ ์ด์ฃผ์๋ค.
- pm2 ์คํ ํ log๋ฅผ ํ์ธํ ์ ์๋ ๋ฌธ์
- pm2 monit์ ์ด์ฉํด ์ค์๊ฐ์ผ๋ก ์๊ธฐ๋ log๋ฅผ ํ์ธํ ์๋ ์์์ง๋ง, ์ด์ ์ ์์ฑ๋ log๋ค์ ํ์ธํ ์ ์์๋ค.
- pm2-runtime์ผ๋ก ์คํํ๋ defalut๋ก clustor๊ฐ 2๊ฐ ์์ฑ๋์ด์ ๊ทธ๋ฐ์ง pm2 logs [์ด๋ฆ]์ผ๋ก log๋ฅผ ํ์ธํ ์๊ฐ ์์๋ค.
- ๋ฐ๋ผ์, pm2-rumtime ๋ช ๋ น์ด๋ฅผ ์คํํ ๋ --output๋ช ๋ น์ด๋ก log๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ฃผ์๋ค. ์ด๋ ๊ฒ ํ๋ ํด๋น ๊ฒฝ๋ก์ logํ์ผ์ด ์๊ฒจ์ ์ง๋ log๋ค์ ์ ์์ ์ผ๋ก ํ์ธํ ์ ์์๋ค.
์๊ฐ ์ด ๋ง๋ ๐
์์๋ถ๋ถ์๋ ์ ์์ง๋ง, ํ๋ฆฌ์จ๋ณด๋ฉ ์ฝ์ค์์ ์ฒ์์ด์ ๋ง์ง๋ง์ธ ๊ฐ์ธ๊ณผ์ ์๋ค.
ํ ๋ฌ๋์ 2๋ฐ3์ผ๋ ์๋๋ ๊ธฐํ์ผ๋ก 6๊ฐ์ ๊ณผ์ ๋ค์ ๋ชฐ์์น๋ฏ์ด ์ํํ๋ฉด์,
ํ์ ๋ฐฉ์์ด๋, ๊ธฐ์ ์ ์ธ ๋ฉด์์๋ ๋ง์ด ์ฑ์ฅํ์ง๋ง ๋ด๊ฐ ๋ฐฐ์ด๊ฒ๋ค์ ์ํ์ํค์ง ๋ชปํ๊ณ ๊พธ์ญ๊พธ์ญ ๋ฐ์ด ๋ฃ๋ ๋๋์ด ๋ค ๋๊ฐ ์์๋ค.
์ด๋ ๊ฒ ๋ง์ง๋ง ๊ณผ์ ๋ฅผ ๊ฐ์ธ๊ณผ์ ๋ก ํ๋ฉด์, ๊ทธ ๋์ ๋ฐฐ์ ๋ ๊ฒ๋ค์ ์ฒ์ฒํ ์ ๋ฆฌํ๊ณ , ๊ณต๋ถํ๋ฉด์ ๋์๋ณผ ์ ์๋ ์๊ฐ์ด ๋์ด ์ฐธ ์ข์๋ค.
ํ๋ฆฌ์จ๋ณด๋ฉ ์ฝ์ค ์ ๋ฐ์ ๋ํ ํ๊ธฐ๋ ๋์ค์ ๋ฐ๋ก ํฌ์คํ ์ผ๋ก ๋จ๊ธธ ์์ ์ด๋ค.
์ด ๊ณผ์ ์ ๋ํด ๋ ์๊ธฐํด๋ณด์๋ฉด,
Docker๋ฅผ ์ด์ฉํด ๋ฐฐํฌํด๋ณผ ์ ์์ด ์ข์๋ค. Docker ์จ๋ดค๋ค! nestjs๋ฅผ Docker๋ก ๋ฐฐํฌํ ์ ์๋ค! ๋ผ๋ ์ญ๋ ํ ์ค์ด ์๊ฒผ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ , ์ด์ ๋ถํฐ ๋๋ผ๋๊ฑฐ์ง๋ง Nestjs๋ Spring์ด๋ ๋น์ทํ ์ ์ด ๋ง์ ๊ฒ ๊ฐ๋ค. ์์กด์ฑ ์ฃผ์ ๋ฐ ๋ฐ์ฝ๋ ์ดํฐ ๋ฑ๋ฑ..
๋ค๋ง Spring์ ๊ฒํฅ๊ธฐ์์ผ๋ก๋ง ๋ฐฐ์์, ์ ํํ ๋ ํ๋ ์์ํฌ๊ฐ ์ด๋ป๊ฒ ๋น์ทํ๊ณ , ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๋!
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AWS EC2] key-pair๋ฅผ ์ด์ฉํ ssh ์ฐ๊ฒฐ (0) | 2024.06.24 |
---|---|
[TIL] ํ๋ฆฌ์จ๋ณด๋ฉ ์ธ ๋ฒ์งธ ๊ณผ์ _RedBrick (1) | 2021.12.12 |
[TIL] ํ๋ฆฌ์จ๋ณด๋ฉ ๋ ๋ฒ์งธ ๊ณผ์ _MAPIA (0) | 2021.11.25 |
[TIL] ํ๋ฆฌ์จ๋ณด๋ฉ ์ฒซ ๋ฒ์งธ ๊ณผ์ ํ๊ณ ๋ก (0) | 2021.11.12 |
[CS/DB] Transaction (0) | 2021.10.09 |