๐ TypeDI ๋?
typeDI
๋ Typescript์ Javascript
์ ์์กด์ฑ ์ฃผ์
์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋๋ค.
์์กด์ฑ ์ฃผ์
์ ํตํด OOP ์ํคํ
์ณ์ ๋ฐฑ์๋ ์๋ฒ ๊ตฌ์กฐ๋ฅผ ๊ฒฌ๊ณ ํ ์ ์งํ ์ ์์ผ๋ฉฐ ์ ์ง๋ณด์๋ฅผ ์ฝ๊ฒ ํฉ๋๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์๋ ์ด๋ฅผ ์ด์ฉํด์ ๊ฐ๊ฐ์ service
์ controller layer
์ ๊ตฌ์กฐ๋ฅผ ์ก์ผ๋ ค ํฉ๋๋ค.
๐ ํจํค์ง ์ค์น
๋จผ์ typeDI
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
$ npm i typedi reflect-metadata
typeDI
๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ tsconfig.json
์์ ๋ค์ ์ค์ ์ ์ ์ฉํด์ผ ํฉ๋๋ค.
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
๐ Node.js + TypeDI ์ ์ฉ ์์
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋ ๋ด์์๋ ์ต ์๋จ์ ๋ค์๊ณผ ๊ฐ์ด reflect-metadata
๋ฅผ ๋ถ๋ฌ์์ผ ํฉ๋๋ค.
Express.js
๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ app.ts
์์ ์ด๋ฅผ ๋ถ๋ฌ ์ค๊ฒ ์ต๋๋ค.
// app.ts
import 'reflect-metadata'
์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฐ์ ๋๋ค์์ ์์ฑํ๊ธฐ ์ํ service
๊ณ์ธต ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Service
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ํด๋์ค๊ฐ ์ธ์คํด์คํ ๋ ์ ์๋๋ก ๋ช
์ํฉ๋๋ค.
// services/nickname.ts
import { Service } from 'typedi';
@Service()
class NicknameService {
public constructor() {
// ...
}
public createNickname() {
// ... nickname ์์ฑํ๊ณ
return nickname;
}
}
export default NicknameService;
์ดํ controller
๊ณ์ธต์์ ์ ์๋น์ค ํด๋์ค๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํฉ๋๋ค.
์ด๋๋ Container.get
์ ์ด์ฉํด์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
// controllers/nickname.ts
import { Container } from 'typedi';
import { Request, Response, NextFunction } from 'express';
import NicknameService from '@/service/nickname';
export const getRandomNickname = async (
req: Request,
res: Response,
next: NextFunction
) => {
const nicknameService = Container.get(NicknameService);
res.status(200).json({
message: '๋๋ค ๋๋ค์ 1๊ฐ๋ฅผ ์์ฑํ์์ต๋๋ค.',
data: {
nickname: nicknameService.createNickname(),
},
});
};
์์๋ ๊ฐ๋จํ ์ฝ๋๋ผ ํ์ฉ๋์ง ์์์ง๋ง ๋ง์ฝ ํด๋์ค ๊ฐ์ ์์กด์ฑ์ ์ฃผ์ ํ๊ณ ์ ํ๋ค๋ฉด
Inject
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํ์ฉํ๋ฉด ๋ฉ๋๋ค.
๐ก Inject ํ์ฉ ๋ฐฉ๋ฒ (/w Typescript)
ํ๋ก์ ํธ์์ ์ฌ์ฉํ Inject
๋ฐ์ฝ๋ ์ดํฐ ํ์ฉ ์์๋ฅผ ํตํด ์ด๋ป๊ฒ ์ ์ฉํ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ์ปค์คํ
ํด๋์ค๋ฅผ ์ฃผ์
๋์์ผ๋ก ํ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด Container
์ ๋ฑ๋ก ํด์ค๋๋ค.
// databases/redis/index.ts
import { Container } from 'typedi';
class RedisClient {
// ...
}
Container.set('nicknameDB', new RedisClient());
์ด์ nicknameDB
๋ผ๋ ๋ค์ ์คํ์ด์ค๋ก ์์กด์ฑ์ ์ฃผ์
ํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์๋น์ค ๊ณ์ธต์์ ์ ํด๋์ค๋ฅผ ์์กด์ฑ ํญ๋ชฉ์ผ๋ก ์ง์ ํ๊ฒ ์ต๋๋ค.
// service/nickname.ts
import { Service, Inject } from 'typedi';
import RedisClient from '@/databases/redis';
@Service()
class NicknameService {
@Inject('nicknameDB') nicknameDB!: RedisClient;
// ...
}
๐ ์ฐธ๊ณ ์๋ฃ
'๐จโ๐ป web.dev > node' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[NPM] npm i ๊ณผ npm ci โฆ ์ฐจ์ด์ ์? (0) | 2022.06.18 |
---|---|
[NPM] package-lock.json ์ ๋ฌด์์ผ๊น? (0) | 2022.06.18 |
Node.js ์๋ฒ์ Redis ์ ์ฉํ๊ธฐ (1) | 2022.05.28 |
multer ๋ชจ๋์ ํ์ฉํ ์ด๋ฏธ์ง ํ์ผ ์ ๋ก๋ ํํ ๋ฆฌ์ผ (2) | 2021.03.05 |
Node.js์ MySQL๋ฅผ ์ด์ฉํ ๊ฒ์๊ธ ์์ฑํ๊ธฐ ํํ ๋ฆฌ์ผ (0) | 2021.03.05 |
๐ฌ ๋๊ธ