ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ NestJS ๋ฐฑ์๋ ๊ฐ๋ฐ: ๊ธฐ์ด๋ถํฐ ์ค์ ๊น์ง - NestJS ์ค์๊ฐ SaaS ๋ฐฑ์๋ ์ค๊ณ (GraphQL + WebSocket)
octo54 2025. 3. 28. 11:01๐ NestJS ๋ฐฑ์๋ ๊ฐ๋ฐ: ๊ธฐ์ด๋ถํฐ ์ค์ ๊น์ง
19. NestJS ์ค์๊ฐ SaaS ๋ฐฑ์๋ ์ค๊ณ (GraphQL + WebSocket)
SaaS ๋ฐฑ์๋์์๋ ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์ค์ํ ์์์
๋๋ค.
ํนํ ์ค์๊ฐ ์๋ฆผ, ๋์๋ณด๋ ์
๋ฐ์ดํธ, ์ฑํ
, ์ค์๊ฐ ํ์
๊ธฐ๋ฅ ๋ฑ์์ WebSocket๊ณผ GraphQL์ ํ์ฉํ ํจ์จ์ ์ธ ๊ตฌํ์ด ํ์ํฉ๋๋ค.
์ด๋ฒ ๊ธ์์๋ NestJS์์ GraphQL + WebSocket์ ํ์ฉํ์ฌ ์ค์๊ฐ SaaS ๋ฐฑ์๋๋ฅผ ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค. ๐
19.1 SaaS์์ ์ค์๊ฐ ๊ธฐ๋ฅ์ด ์ค์ํ ์ด์
โ ์ค์๊ฐ ๊ธฐ๋ฅ์ด ํ์ํ SaaS ์ฌ๋ก
โ ์ค์๊ฐ ๋์๋ณด๋ → ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ฆ์ ๋ฐ์
โ ์ค์๊ฐ ์๋ฆผ(Notification) → ์ ์ ์ ํ๋์ ๋ฐ๋ฅธ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ
โ ์ฑํ
๋ฐ ํ์
→ ๋ค์ค ์ฌ์ฉ์ ๊ฐ ์ค์๊ฐ ์ปค๋ฎค๋์ผ์ด์
๐ก GraphQL Subscriptions + WebSocket์ ์กฐํฉํ๋ฉด ํจ์จ์ ์ธ ์ค์๊ฐ ๊ธฐ๋ฅ ๊ตฌํ ๊ฐ๋ฅ
19.2 NestJS์์ GraphQL + WebSocket ์ค์
โ 1) GraphQL Subscriptions ํจํค์ง ์ค์น
npm install @nestjs/graphql apollo-server-express graphql-ws
โ 2) GraphQL Subscriptions ํ์ฑํ
๐ app.module.ts
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { PubSub } from 'graphql-subscriptions';
@Module({
imports: [
GraphQLModule.forRoot({
autoSchemaFile: true,
subscriptions: {
'graphql-ws': true, // WebSocket ์ฌ์ฉ ์ค์
},
}),
],
providers: [{ provide: 'PUB_SUB', useValue: new PubSub() }],
})
export class AppModule {}
โ subscriptions ์ต์ ์ graphql-ws๋ก ์ค์ ํ๋ฉด WebSocket ๊ธฐ๋ฐ์ GraphQL Subscriptions ํ์ฑํ
19.3 ์ค์๊ฐ ์๋ฆผ ๊ธฐ๋ฅ ๊ตฌํ (GraphQL Subscriptions ์ฌ์ฉ)
โ 1) ์ด๋ฒคํธ ๋ฐํ (PubSub ์ฌ์ฉ)
๐ notifications.resolver.ts
import { Resolver, Mutation, Subscription } from '@nestjs/graphql';
import { PubSub } from 'graphql-subscriptions';
@Resolver()
export class NotificationsResolver {
constructor(private readonly pubSub: PubSub) {}
@Mutation(() => String)
async sendNotification() {
const message = '์๋ก์ด ์๋ฆผ์ด ๋์ฐฉํ์ต๋๋ค!';
await this.pubSub.publish('NOTIFICATION_ADDED', { notificationAdded: message });
return '์๋ฆผ ์ ์ก ์๋ฃ';
}
@Subscription(() => String, {
resolve: (payload) => payload.notificationAdded,
})
notificationAdded() {
return this.pubSub.asyncIterator('NOTIFICATION_ADDED');
}
}
โ 2) GraphQL Subscription ์์ฒญ ์์
subscription {
notificationAdded
}
โ ํด๋ผ์ด์ธํธ๊ฐ Subscription์ ๊ตฌ๋ ํ๊ณ ์์ผ๋ฉด, Mutation ๋ฐ์ ์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ ์ ๋ฌ
19.4 NestJS WebSocket์ผ๋ก ์ค์๊ฐ ์ฑํ ๊ตฌํ
โ 1) WebSocket ๋ชจ๋ ์ค์น
npm install @nestjs/websockets @nestjs/platform-socket.io
โ 2) WebSocket Gateway ์์ฑ
๐ chat.gateway.ts
import { WebSocketGateway, WebSocketServer, SubscribeMessage, MessageBody } from '@nestjs/websockets';
import { Server } from 'socket.io';
@WebSocketGateway({ cors: true })
export class ChatGateway {
@WebSocketServer()
server: Server;
@SubscribeMessage('chatMessage')
handleMessage(@MessageBody() message: string): void {
this.server.emit('chatMessage', message);
}
}
โ 3) ํ๋ก ํธ์๋ WebSocket ํด๋ผ์ด์ธํธ ์์
const socket = io('http://localhost:3000');
socket.emit('chatMessage', '์๋
ํ์ธ์!');
socket.on('chatMessage', (msg) => {
console.log('๋ฐ์ ๋ฉ์์ง:', msg);
});
๐ก NestJS WebSocket Gateway๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑํ , ์ค์๊ฐ ํ์ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
19.5 ์ค์๊ฐ SaaS ์์คํ ์ค๊ณ ์ ๊ณ ๋ คํ ์
โ Connection ๊ด๋ฆฌ → WebSocket์ ์ํ ์ ์ง ๋ฐ ์ธ์
์ฒ๋ฆฌ ํ์
โ ๋ณด์ ๋ฐ ์ธ์ฆ → JWT ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ผ๋ก ๋ณด์ ๊ฐํ
โ ๋ก๋ ๋ฐธ๋ฐ์ฑ → WebSocket ์ฌ์ฉ ์ Redis PubSub ๋๋ Kafka ํ์ฉ
โ ๊ณ ๊ฐ๋ณ ์ค์๊ฐ ๋ฐ์ดํฐ ๋ถ๋ฆฌ → ๋ฉํฐ ํ
๋์ ํ๊ฒฝ์์ tenantId ๊ธฐ๋ฐ์ ํํฐ๋ง ํ์
19.6 ๊ฒฐ๋ก : NestJS๋ก ๊ฐ๋ ฅํ ์ค์๊ฐ SaaS ๋ฐฑ์๋ ๊ตฌ์ถํ๊ธฐ
โ
GraphQL Subscriptions๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์๊ฐ ๋์๋ณด๋, ์๋ฆผ ๊ธฐ๋ฅ ๊ตฌํ ๊ฐ๋ฅ
โ
WebSocket Gateway๋ฅผ ํ์ฉํ๋ฉด ์ค์๊ฐ ์ฑํ
๋ฐ ํ์
์๋น์ค ๊ฐ๋ฅ
โ
๋ฉํฐ ํ
๋์ ํ๊ฒฝ์์ ๊ฐ ํ
๋ํธ๋ณ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ์ ๋ต ํ์
๋ค์ ๊ธ์์๋ NestJS์์ AI/ML ๋ชจ๋ธ์ ํ์ฉํ์ฌ SaaS ์๋น์ค์ ์ธ๊ณต์ง๋ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค! ๐
๐ ๋ค์ ๊ธ ์๊ณ : NestJS AI/ML ์ฐ๋ํ์ฌ SaaS ๊ธฐ๋ฅ ํ์ฅ
๐ ๋ค์ ํธ: 20. NestJS์์ AI/ML ์ฐ๋ ์ค์ ๊ฐ์ด๋
'study > ๋ฐฑ์๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- Webpack
- fastapi
- LangChain
- kotlin
- gatsbyjs
- github
- SEO์ต์ ํ
- Docker
- NestJS
- ๊ด๋ฆฌ์
- ๋ฐฑ์๋
- nodejs
- PostgreSQL
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- seo ์ต์ ํ 10๊ฐ
- ๋ฐฑ์๋๊ฐ๋ฐ
- Next.js
- App Router
- CI/CD
- AI์ฑ๋ด
- nextJS
- rag
- AI ์๋ํ
- REACT
- ํ๋ก ํธ์๋
- ์น๊ฐ๋ฐ
- Prisma
- ์ค๋งํธ ์ปจํธ๋ํธ
- Ktor
- llm
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |