๐ ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ ๊ตฌ์กฐํ ๋ฒ ์คํธ ํ๋ํฐ์ค ๐ป

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์กฐํํ๋ฉด ์ข์์ง์ ๋ํด ์๊ธฐํด๋ณผ๊ฒ์. ํ์ ์คํฌ๋ฆฝํธ๋ก ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ค๋๋ฐ ์ด๋ป๊ฒ ๊ตฌ์กฐ๋ฅผ ์ก์์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค๊ตฌ์? ๊ฑฑ์ ๋ง์ธ์! ์ ๊ฐ ์ฌ๋ฌ๋ถ์ ๊ณ ๋ฏผ์ ์น~ ๋ ๋ ค๋ฒ๋ฆด ๊ฟํ๋ค์ ์ค๋นํ์ต๋๋ค. ๐
ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ ๊ตฌ์กฐํ๋ ๋ง์น ๋ ๊ณ ๋ธ๋ก ์๊ธฐ์ ๋น์ทํด์. ๊ธฐ์ด๋ฅผ ํํํ ๋ค์ง๊ณ , ๊ทธ ์์ ์ฐจ๊ณก์ฐจ๊ณก ๋ธ๋ก์ ์์ ์ฌ๋ฆฌ๋ฏ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฑฐ์ฃ . ์, ๊ทธ๋ผ ์ฐ๋ฆฌ ํจ๊ป ํ์ ์คํฌ๋ฆฝํธ์ ์ธ๊ณ๋ก ๋น ์ ธ๋ณผ๊น์? ๐โโ๏ธ
์ ๊ทธ๋ฆผ์์ ๋ณผ ์ ์๋ฏ์ด, ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ ๊ตฌ์กฐํ๋ ํฌ๊ฒ ํ๋ก์ ํธ ์ค์ , ํด๋ ๊ตฌ์กฐ, ์ฝ๋ ๊ตฌ์ฑ์ผ๋ก ๋๋ ์ ์์ด์. ์ด ์ธ ๊ฐ์ง ์์๋ฅผ ์ ์กฐํฉํ๊ณ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ์ ์ฉํ๋ฉด, ํจ์จ์ ์ด๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ด ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ์ ์๋ต๋๋ค. ๐
์, ์ด์ ๊ฐ ์์๋ค์ ํ๋์ฉ ์์ธํ ์ดํด๋ณผ๊น์? ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ๊ณ ๊ณ ์ฝ~! ๐๐จ
1. ํ๋ก์ ํธ ์ค์ : ๊ธฐ์ด๋ฅผ ํํํ! ๐๏ธ
ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ๋ญ๊น์? ๋ฐ๋ก ํ๋ก์ ํธ ์ค์ ์ด์์! ์ด๊ฑด ๋ง์น ์ง์ ์ง์ ๋ ๊ธฐ์ด ๊ณต์ฌ๋ฅผ ํ๋ ๊ฒ๊ณผ ๊ฐ์์. ํผํผํ ๊ธฐ์ด๊ฐ ์์ด์ผ ๋ฉ์ง ์ง์ ์ง์ ์ ์๋ฏ์ด, ์ฌ๋ฐ๋ฅธ ํ๋ก์ ํธ ์ค์ ์ด ์์ด์ผ ์์ ์ ์ธ ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ์ ์๋ต๋๋ค.
1.1 tsconfig.json: ํ์ ์คํฌ๋ฆฝํธ์ ์ฌ์ฅ ๐
tsconfig.json
ํ์ผ์ ํ์
์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์ ์ฌ์ฅ๊ณผ๋ ๊ฐ์์. ์ด ํ์ผ์์ ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ์ ์ต์
์ ์ค์ ํ๊ณ , ํ๋ก์ ํธ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํ ์ ์์ฃ .
๐จ ์ฃผ์! tsconfig.json
ํ์ผ์ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์์นํด์ผ ํด์.
์, ๊ทธ๋ผ tsconfig.json
ํ์ผ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ํ๋ฒ ๋ณผ๊น์?
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "**/*.spec.ts"]
}
์ฐ์~ ๋ญ๊ฐ ๋ณต์กํด ๋ณด์ด์ฃ ? ํ์ง๋ง ๊ฑฑ์ ๋ง์ธ์. ํ๋์ฉ ๋ฏ์ด๋ณผ๊ฒ์! ๐
- compilerOptions: ์ปดํ์ผ๋ฌ ์ต์
์ ์ค์ ํ๋ ๋ถ๋ถ์ด์์.
- target: ์ปดํ์ผ๋ JavaScript์ ๋ฒ์ ์ ์ง์ ํด์. ์ฌ๊ธฐ์๋ ES5๋ก ์ค์ ํ๋ค์.
- module: ๋ชจ๋ ์์คํ ์ ์ง์ ํด์. CommonJS๋ฅผ ์ฌ์ฉํ๊ณ ์์ด์.
- strict: ์๊ฒฉํ ํ์ ์ฒดํฌ๋ฅผ ํ์ฑํํด์. ๋ฒ๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ์ก์ ์ ์์ด์ ์ข๋ต๋๋ค!
- esModuleInterop: CommonJS ๋ชจ๋์ ES6 ๋ชจ๋์ฒ๋ผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค์.
- outDir: ์ปดํ์ผ๋ ํ์ผ์ด ์ ์ฅ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํด์.
- rootDir: ์์ค ํ์ผ์ด ์๋ ๋ฃจํธ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํด์.
- include: ์ปดํ์ผํ ํ์ผ๋ค์ ์ง์ ํด์. ์ฌ๊ธฐ์๋ src ํด๋ ์๋์ ๋ชจ๋ ํ์ผ์ ํฌํจํ๊ณ ์์ด์.
- exclude: ์ปดํ์ผ์์ ์ ์ธํ ํ์ผ๋ค์ ์ง์ ํด์. node_modules์ ํ ์คํธ ํ์ผ๋ค์ ์ ์ธํ๊ณ ์๋ค์.
์ด๋ ๊ฒ ์ค์ ํ๋ฉด ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ป๊ฒ ๋์ํด์ผ ํ ์ง ์ ์ ์์ด์. ๋ง์น ์๋ฆฌ์ฌ์๊ฒ ๋ ์ํผ๋ฅผ ์ฃผ๋ ๊ฒ๊ณผ ๊ฐ์ฃ ! ๐ณ
1.2 package.json: ํ๋ก์ ํธ์ ์ ๋ถ์ฆ ๐
package.json
ํ์ผ์ ํ๋ก์ ํธ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ด์. ํ๋ก์ ํธ์ ์ด๋ฆ, ๋ฒ์ , ์์กด์ฑ ๋ฑ์ ๊ด๋ฆฌํ ์ ์์ฃ . npm์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐํํ๋ฉด ์๋์ผ๋ก ์์ฑ๋๋ ํ์ผ์ด์์.
{
"name": "my-awesome-project",
"version": "1.0.0",
"description": "A super cool TypeScript project",
"main": "dist/index.js",
"scripts": {
"start": "node dist/index.js",
"build": "tsc",
"dev": "ts-node src/index.ts"
},
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"@types/express": "^4.17.11",
"typescript": "^4.2.4",
"ts-node": "^9.1.1"
}
}
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ๋งํ ๋ถ๋ถ์ scripts
์์. ์ด ๋ถ๋ถ์์ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ณ ์คํํ๋ ๋ช
๋ น์ด๋ฅผ ์ ์ํ ์ ์์ด์. ์๋ฅผ ๋ค์ด, npm run build
๋ฅผ ์คํํ๋ฉด ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ(tsc
)๊ฐ ์คํ๋์ด ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ฒ ๋์ฃ .
๊ทธ๋ฆฌ๊ณ dependencies
์ devDependencies
์์๋ ํ๋ก์ ํธ์ ํ์ํ ํจํค์ง๋ค์ ๊ด๋ฆฌํด์. dependencies
๋ ํ๋ก๋์
ํ๊ฒฝ์์ ํ์ํ ํจํค์ง๋ค์ด๊ณ , devDependencies
๋ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ํ์ํ ํจํค์ง๋ค์ด์์.
๐ก ๊ฟํ: package.json
ํ์ผ์ ์ ๊ด๋ฆฌํ๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๊ณผ ํ์
ํ ๋ ์ ๋ง ํธํด์. ํ๋ก์ ํธ๋ฅผ ํด๋ก ํ๊ณ npm install
๋ง ์คํํ๋ฉด ๋ชจ๋ ์์กด์ฑ์ ํ ๋ฒ์ ์ค์นํ ์ ์๊ฑฐ๋ ์!
์, ์ด์ ํ๋ก์ ํธ์ ๊ธฐ์ด ์ค์ ์ ๋๋ฌ์ด์. ์ด๋ ๊ฒ ํํํ ๊ธฐ์ด๋ฅผ ๋ค์ก์ผ๋, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์ก์๋ณผ๊น์? ๋ค์ ์น์ ์์ ํด๋ ๊ตฌ์กฐ์ ๋ํด ์์๋ณด๋๋ก ํด์! ๐โโ๏ธ๐จ
์ด ๊ทธ๋ฆผ์ ๋ณด๋ฉด ํ๋ก์ ํธ ์ค์ ์ ํต์ฌ ์์๋ค์ ํ๋์ ๋ณผ ์ ์์ฃ ? tsconfig.json
๊ณผ package.json
, ์ด ๋ ํ์ผ๋ง ์ ์ค์ ํด๋ ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ๋ ๋ฐ์ ์ฑ๊ณตํ ๊ฑฐ๋ ๋ค๋ฆ์์ด์! ๐
2. ํด๋ ๊ตฌ์กฐ: ์ ๋ฆฌ์ ๋์ ๋ฏธํ ๐๏ธ
์, ์ด์ ํ๋ก์ ํธ์ ๋ผ๋๋ฅผ ์ธ์ธ ์ฐจ๋ก์์! ํด๋ ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ์ก๋๋์ ๋ฐ๋ผ ํ๋ก์ ํธ์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์์ด์. ๋ง์น ์ง ์์ ๋ฌผ๊ฑด์ ์ ๋ฆฌ์ ๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ฃ . ์ ์ ๋ฆฌ๋ ์ง์์๋ ํ์ํ ๋ฌผ๊ฑด์ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ฏ์ด, ์ ๊ตฌ์กฐํ๋ ํ๋ก์ ํธ์์๋ ํ์ํ ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ฐพ๊ณ ์์ ํ ์ ์๋ต๋๋ค. ๐
2.1 ๊ธฐ๋ณธ ํด๋ ๊ตฌ์กฐ
ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์ ๊ธฐ๋ณธ์ ์ธ ํด๋ ๊ตฌ์กฐ๋ ์ด๋ ๊ฒ ๊ตฌ์ฑํ ์ ์์ด์:
my-project/
โโโ src/
โ โโโ index.ts
โ โโโ config/
โ โโโ models/
โ โโโ controllers/
โ โโโ services/
โ โโโ utils/
โโโ dist/
โโโ tests/
โโโ node_modules/
โโโ package.json
โโโ tsconfig.json
์ฐ์~ ๋ญ๊ฐ ๋ณต์กํด ๋ณด์ด์ฃ ? ํ์ง๋ง ๊ฑฑ์ ๋ง์ธ์. ํ๋์ฉ ์ค๋ช ํด ๋๋ฆด๊ฒ์! ๐
- src/: ์์ค ์ฝ๋๊ฐ ์์นํ๋ ํด๋์์. ์ฌ๊ธฐ์ ๋ชจ๋ TypeScript ํ์ผ๋ค์ด ๋ค์ด๊ฐ์.
- dist/: ์ปดํ์ผ๋ JavaScript ํ์ผ๋ค์ด ์ ์ฅ๋๋ ํด๋์์. ๋ฐฐํฌํ ๋๋ ์ด ํด๋์ ๋ด์ฉ์ ์ฌ์ฉํด์.
- tests/: ํ ์คํธ ์ฝ๋๋ฅผ ์ ์ฅํ๋ ํด๋์์. ๋จ์ ํ ์คํธ, ํตํฉ ํ ์คํธ ๋ฑ์ด ์ฌ๊ธฐ์ ๋ค์ด๊ฐ์.
- node_modules/: npm์ผ๋ก ์ค์นํ ํจํค์ง๋ค์ด ์ ์ฅ๋๋ ํด๋์์. ์ด ํด๋๋ .gitignore์ ์ถ๊ฐํด์ ๋ฒ์ ๊ด๋ฆฌ์์ ์ ์ธํ๋ ๊ฒ ์ข์์.
src/ ํด๋ ์์ ๊ตฌ์กฐ๋ฅผ ์ข ๋ ์์ธํ ์ดํด๋ณผ๊น์?
- index.ts: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์ ์ด์์. ์ฌ๊ธฐ์ ์ฑ์ ์์ํ๊ณ ํ์ํ ๋ชจ๋๋ค์ ๋ถ๋ฌ์์.
- config/: ์ค์ ํ์ผ๋ค์ ๋ชจ์๋๋ ํด๋์์. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด, ํ๊ฒฝ ๋ณ์ ๋ฑ์ ์ฌ๊ธฐ์ ์ ์ฅํด์.
- models/: ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ์ํ๋ ํด๋์์. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ ์ธํฐํ์ด์ค ๋ฑ์ด ์ฌ๊ธฐ์ ๋ค์ด๊ฐ์.
- controllers/: ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ฐํํ๋ ์ปจํธ๋กค๋ฌ๋ค์ด ์์นํด์.
- services/: ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์๋น์ค๋ค์ด ์์นํด์.
- utils/: ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๋๋ ์ ํธ๋ฆฌํฐ ํจ์๋ค์ ๋ชจ์๋๋ ํด๋์์.
๐จ ๋์์ธ ํ: ํด๋ ๊ตฌ์กฐ๋ ํ๋ก์ ํธ์ ํน์ฑ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ์กฐ์ ํ ์ ์์ด์. ์ค์ํ ๊ฑด ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฑฐ์์!
2.2 ๋ชจ๋ํ: ์์ ์กฐ๊ฐ๋ค์ ํฉ์ฃผ ๐งฉ
ํด๋ ๊ตฌ์กฐ๋ฅผ ์ก์ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฑด ๋ชจ๋ํ์์. ๊ฐ ํด๋๋ ํน์ ํ ์ญํ ์ ๊ฐ์ง ๋ชจ๋๋ค์ ํฌํจํ๊ณ ์์ด์ผ ํด์. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๋ ๋์์ง๊ณ , ์ ์ง๋ณด์๋ ์ฌ์์ง๋ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํด๋ณผ๊น์? ์ด๋ฐ ์์ผ๋ก ๊ตฌ์ฑํ ์ ์์ด์:
src/
โโโ models/
โ โโโ User.ts
โโโ controllers/
โ โโโ UserController.ts
โโโ services/
โ โโโ UserService.ts
โโโ utils/
โโโ passwordHash.ts
์ด๋ ๊ฒ ๊ตฌ์ฑํ๋ฉด ์ฌ์ฉ์์ ๊ด๋ จ๋ ๋ชจ๋ ๋ก์ง์ด ๊น๋ํ๊ฒ ๋ถ๋ฆฌ๋์ด ์์ฃ ? ๐
2.3 ๋ช ๋ช ๊ท์น: ์ด๋ฆ์ง๊ธฐ์ ์์ ๐จ
ํด๋์ ํ์ผ์ ์ด๋ฆ์ ์ง์ ๋๋ ์ผ๊ด๋ ๊ท์น์ ๋ฐ๋ฅด๋ ๊ฒ ์ข์์. ๋ณดํต ์ด๋ฐ ๊ท์น๋ค์ ๋ง์ด ์ฌ์ฉํด์:
- ํด๋ ์ด๋ฆ์ ๋ณต์ํ์ผ๋ก: models, controllers, services
- ํ์ผ ์ด๋ฆ์ PascalCase๋ก: UserController.ts, AuthMiddleware.ts
- ์ธํฐํ์ด์ค๋ I๋ก ์์: IUser.ts
- ํ์ ์ T๋ก ์์: TUserResponse.ts
์ด๋ ๊ฒ ๊ท์น์ ์ ํด๋๋ฉด ํ์๋ค๊ณผ ํ์ ํ ๋๋ ํผ๋์ ์ค์ผ ์ ์์ด์. ๋ง์น ๊ตํต ์ ํธ์ ๊ฐ์ ๊ฑฐ์ฃ ! ๐ฆ
์ด ๊ทธ๋ฆผ์ ๋ณด๋ฉด ํ๋ก์ ํธ์ ํด๋ ๊ตฌ์กฐ๊ฐ ํ๋์ ๋ค์ด์ค์ฃ ? src ํด๋ ์์ ์ฌ๋ฌ ํ์ ํด๋๋ค์ด ์๊ณ , ๊ทธ ์์ dist, tests, node_modules ํด๋๊ฐ ์์ด์. ์ด๋ ๊ฒ ๊ตฌ์กฐํํ๋ฉด ํ๋ก์ ํธ๊ฐ ํจ์ฌ ์ ๋๋์ด ๋ณด์ด๊ณ ๊ด๋ฆฌํ๊ธฐ๋ ์ฌ์์ ธ์! ๐
์, ์ด์ ํด๋ ๊ตฌ์กฐ์ ๋ํด ์์๋ดค์ด์. ์ด๋ ๊ฒ ์ ์ ๋ฆฌ๋ ๊ตฌ์กฐ ์์ ์ฝ๋๋ฅผ ์์์ฌ๋ฆฌ๋ฉด ํจ์ฌ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํด์ง ๊ฑฐ์์. ๋ค์ ์น์ ์์๋ ์ค์ ๋ก ์ด ๊ตฌ์กฐ ์์ ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ข์์ง ์์๋ณด๋๋ก ํ ๊ฒ์! ์ค๋น๋์ จ๋์? ๊ณ ๊ณ ์ฝ~! ๐
3. ์ฝ๋ ๊ตฌ์ฑ: ํ์ ์คํฌ๋ฆฝํธ์ ๊ฝ ๐ธ
์, ์ด์ ์ง์ง ๊ฟ์ผ ํํธ๊ฐ ์์ด์! ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋๋์ ๋ฐ๋ผ ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ๊ฐ ์ฒ๊ตญ์ด ๋ ์๋, ์ง์ฅ์ด ๋ ์๋ ์๋ต๋๋ค. ๊ทธ๋ฌ๋๊น ์ง์คํด์ฃผ์ธ์! ๐
3.1 ์ธํฐํ์ด์ค์ ํ์ : ํ์ ์คํฌ๋ฆฝํธ์ ์ฌ์ฅ โค๏ธ
ํ์ ์คํฌ๋ฆฝํธ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ๋ญ๋ค? ๋ฐ๋ก 'ํ์ '์ด์ฃ ! ์ธํฐํ์ด์ค์ ํ์ ์ ์ ํ์ฉํ๋ฉด ์ฝ๋์ ์์ ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ํฌ๊ฒ ๋์ผ ์ ์์ด์.
// models/User.ts
interface IUser {
id: number;
name: string;
email: string;
age?: number; // ์ ํ์ ์์ฑ
}
type TUserResponse = Omit<iuser>; // email์ ์ ์ธํ User ํ์
</iuser>
์ฌ๊ธฐ์ IUser
๋ ์ฌ์ฉ์์ ๊ธฐ๋ณธ ์ ๋ณด๋ฅผ ์ ์ํ๋ ์ธํฐํ์ด์ค์์. TUserResponse
๋ IUser
์์ email์ ์ ์ธํ ํ์
์ด์์. ์ด๋ ๊ฒ ํ๋ฉด API ์๋ต์์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์ธํ ์ ์์ฃ .
๐ก ๊ฟํ: ์ธํฐํ์ด์ค๋ ํ์ฅ์ด ๊ฐ๋ฅํ๊ณ , ํ์ ์ ์ ๋์จ์ด๋ ์ธํฐ์น์ ๊ฐ์ ๊ณ ๊ธ ํ์ ์ฐ์ฐ์ด ๊ฐ๋ฅํด์. ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ์ธ์!
3.2 ํด๋์ค์ ๋ฐ์ฝ๋ ์ดํฐ: ๊ฐ์ฒด์งํฅ์ ์ ์ ๐ญ
ํ์ ์คํฌ๋ฆฝํธ์์๋ ํด๋์ค์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์์ด์. ํนํ ๋ฐ์ฝ๋ ์ดํฐ๋ ๋ฉํํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด์ฃ .
// controllers/UserController.ts
import { Controller, Get, Post, Body } from 'some-framework';
import { UserService } from '../services/UserService';
import { IUser } from '../models/User';
@Controller('users')
export class UserController {
constructor(private userService: UserService) {}
@Get()
async getAllUsers(): Promise<iuser> {
return this.userService.getAllUsers();
}
@Post()
async createUser(@Body() userData: IUser): Promise<iuser> {
return this.userService.createUser(userData);
}
}
</iuser></iuser>
์ด ์์ ์์๋ @Controller
, @Get
, @Post
๊ฐ์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด ๋ผ์ฐํ
์ ์ฒ๋ฆฌํ๊ณ ์์ด์. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ง๊ณ ๊ฐ๋
์ฑ๋ ์ข์์ง์ฃ !
3.3 ๋น๋๊ธฐ ์ฒ๋ฆฌ: Promise์ async/await์ ํฅ์ฐ ๐ญ
ํ๋ ์น ๊ฐ๋ฐ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ํ์์ฃ . ํ์ ์คํฌ๋ฆฝํธ์์๋ Promise์ async/await๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์ฝ๊ฒ ์์ฑํ ์ ์์ด์.
// services/UserService.ts
import { IUser } from '../models/User';
import { UserRepository } from '../repositories/UserRepository';
export class UserService {
constructor(private userRepo: UserRepository) {}
async getAllUsers(): Promise<iuser> {
try {
return await this.userRepo.findAll();
} catch (error) {
console.error('Failed to get users:', error);
throw error;
}
}
async createUser(userData: IUser): Promise<iuser> {
try {
return await this.userRepo.create(userData);
} catch (error) {
console.error('Failed to create user:', error);
throw error;
}
}
}
</iuser></iuser>
์ฌ๊ธฐ์๋ async /await
๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์์ด์. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ๋ธ๋กํน๋์ง ์๊ณ ํจ์จ์ ์ผ๋ก ์คํ๋ ์ ์๋ต๋๋ค.
3.4 ์ ํธ๋ฆฌํฐ ํจ์: ์ฌ์ฌ์ฉ์ฑ์ ๊ทน๋ํ ๐
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ์ฌ๋ฌ ๊ณณ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ๋ค์ด ์์ด์. ์ด๋ฐ ๊ธฐ๋ฅ๋ค์ ์ ํธ๋ฆฌํฐ ํจ์๋ก ๋ง๋ค์ด ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ด์.
// utils/stringUtils.ts
export function capitalize(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1);
}
export function truncate(str: string, length: number): string {
return str.length > length ? str.substring(0, length) + '...' : str;
}
// utils/dateUtils.ts
export function formatDate(date: Date): string {
return date.toISOString().split('T')[0];
}
์ด๋ ๊ฒ ๋ง๋ ์ ํธ๋ฆฌํฐ ํจ์๋ค์ ํ๋ก์ ํธ ์ ์ฒด์์ ์ฝ๊ฒ importํด์ ์ฌ์ฉํ ์ ์์ด์. ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค!
3.5 ์๋ฌ ์ฒ๋ฆฌ: ์์ ํ ์ฝ๋์ ๋น๊ฒฐ ๐ก๏ธ
์๋ฌ ์ฒ๋ฆฌ๋ ์์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ํ์์ ์ด์์. ํ์ ์คํฌ๋ฆฝํธ์์๋ ์ปค์คํ ์๋ฌ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ ์ธ๋ฐํ ์๋ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํด์.
// utils/errors.ts
export class AppError extends Error {
constructor(public statusCode: number, message: string) {
super(message);
this.name = 'AppError';
}
}
export class NotFoundError extends AppError {
constructor(message: string = 'Resource not found') {
super(404, message);
this.name = 'NotFoundError';
}
}
// services/UserService.ts
import { NotFoundError } from '../utils/errors';
export class UserService {
// ...
async getUserById(id: number): Promise<iuser> {
const user = await this.userRepo.findById(id);
if (!user) {
throw new NotFoundError(`User with id ${id} not found`);
}
return user;
}
}
</iuser>
์ด๋ ๊ฒ ์ปค์คํ ์๋ฌ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฌ์ ์ข ๋ฅ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ ์ ์๊ณ , ์ ์ ํ HTTP ์ํ ์ฝ๋๋ ์ฝ๊ฒ ์ค์ ํ ์ ์์ด์.
3.6 ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ: ์์ ํ๊ณ ์ ์ฐํ ์ค์ ๐
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด๋ API ํค ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ์ฝ๋์ ์ง์ ์์ฑํ๋ฉด ์ ๋ผ์. ๋์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํด ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
// config/env.ts
import dotenv from 'dotenv';
dotenv.config();
export const ENV = {
NODE_ENV: process.env.NODE_ENV || 'development',
PORT: process.env.PORT || 3000,
DB_URL: process.env.DB_URL || 'mongodb://localhost:27017/myapp',
JWT_SECRET: process.env.JWT_SECRET || 'your-secret-key'
};
// ๋ค๋ฅธ ํ์ผ์์ ์ฌ์ฉํ ๋
import { ENV } from './config/env';
console.log(`Server running on port ${ENV.PORT}`);
์ด๋ ๊ฒ ํ๋ฉด ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ค์ ์ ์ฝ๊ฒ ์ ์ฉํ ์ ์๊ณ , ๋ฏผ๊ฐํ ์ ๋ณด๋ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์์ด์.
์ด ๊ทธ๋ฆผ์ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ์ดํด๋ณธ ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋ ๊ตฌ์ฑ์ ์ฃผ์ ์์๋ค์ ๋ณด์ฌ์ฃผ๊ณ ์์ด์. ๊ฐ๊ฐ์ ์์๋ค์ด ์๋ก ์กฐํ๋กญ๊ฒ ์๋ํ ๋, ์ฐ๋ฆฌ์ ์ฝ๋๋ ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋๋ค! ๐
์, ์ด์ ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์กฐํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฐ์ ์ผ๋ก ์์๋ดค์ด์. ์ด๋ฐ ๊ตฌ์กฐ์ ํจํด๋ค์ ์ ์ฉํ๋ฉด ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ๋ ํ์ธต ๋ ์ฒด๊ณ์ ์ด๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์์ง ๊ฑฐ์์. ๋ฌผ๋ก ์ด๊ฑด ์์์ผ ๋ฟ์ด์์. ์ค์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ฌ๋ฌ๋ถ๋ง์ ์คํ์ผ๊ณผ ํจํด์ ๋ฐ๊ฒฌํ๊ณ ์ ์ฉํด ๋๊ฐ๋ ๊ฒ์ด ์ค์ํด์. ์ฝ๋ฉ์ ๊ฒฐ๊ตญ ์ฐฝ์์ ์ธ ์์ ์ด๋๊น์! ๐จ
ํ์ ์คํฌ๋ฆฝํธ์ ์ธ๊ณ์์ ์ฆ๊ฒ๊ฒ ์ฝ๋ฉํ์ธ์! ํ์ดํ ! ๐ช๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ