-
Notifications
You must be signed in to change notification settings - Fork 5
monorepo로 변경
nest와 react를 동시에 배포하기 위한 관리 도구인 turbo를 설치해줍니다.
yarn add turbo
루트 디렉토리 내부에 apps라는 디렉토리를 생성합니다.
그리고 이 apps 디렉토리를 package.json에 workspace로 등록합니다.
package.json
{
"dependencies": {
"turbo": "^2.3.0"
},
"private": true,
"workspaces": [
"apps/*"
]
}
이 apps 디렉토리 안에 backend, frontend 디렉토리를 만들어서 기존 프로젝트들을 넣어줍니다.
그리고 루트 디렉토리에서 패키지를 설치합니다.
yarn install
루트의 package.json에 dev script를 작성합니다.
package.json
{
"scripts": {
"dev": "turbo run dev"
},
"dependencies": {
"turbo": "^2.3.0"
},
"workspaces": [
"apps/*"
],
"packageManager": "[email protected]"
}
추가로 turbo.json에도 각 workspace 내부 package.json에 dev 명령어 파이프라인을 만들어야 합니다.
개발 서버에서 프론트와 백엔드의 포트 번호가 다르기 때문에 CORS 정책에 의해 통신이 되지 않습니다.
서버에서 origin을 허용해도 되지만 그냥 프론트에서 프록시 서버를 설정하는 편이 편합니다.
frontend/vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import tailwindcss from "tailwindcss";
import tsconfigPaths from "vite-tsconfig-paths";
// https://vite.dev/config/
export default defineConfig({
plugins: [react(), tsconfigPaths()],
css: {
postcss: {
plugins: [tailwindcss()],
},
},
server: {
proxy: {
"/api": {
target: "http://localhost:3000",
changeOrigin: true
}
}
}
});
5173번 포트에서 돌아가는 프론트 서버의 요청을 3000번 포트로 바꾸어서 CORS 에러를 피합니다.
(그런데 vite.config.ts가 반영이 안되는 것 같네요... 그냥 직접 등록하겠습니다.)
그리고 백엔드 서버의 api 주소 앞에 api를 붙여줍니다.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './filter/http-exception.filter';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { WsAdapter } from '@nestjs/platform-ws';
import * as dotenv from 'dotenv';
dotenv.config();
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useWebSocketAdapter(new WsAdapter(app));
app.useGlobalFilters(new HttpExceptionFilter());
app.setGlobalPrefix("api");
const config = new DocumentBuilder()
.setTitle('OctoDocs')
.setDescription('OctoDocs API 명세서')
.build();
console.log(process.env.origin);
const documentFactory = () => SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, documentFactory);
app.enableCors({
origin: process.env.origin
});
await app.listen(3000);
}
bootstrap();
react를 빌드한 뒤 생성된 정적 파일을 nest에 포함시키는 과정입니다.
turbo.json
{
"$schema": "https://turbo.build/schema.json",
"tasks": {
"dev": {
"cache": false
},
"build": {
"dependsOn": [
"^build"
],
"outputs": [
"dist/**"
]
}
}
}
root package.json에도 build를 작성해줍니다.
{
"scripts": {
"dev": "turbo run dev",
"build": "turbo run build"
},
"dependencies": {
"turbo": "^2.3.0"
},
"private": true,
"workspaces": [
"apps/*"
],
"packageManager": "[email protected]"
}
마찬가지로 각 workspace에도 build 스크립트가 존재해야 합니다.
이제 nestjs에서 리액트에서 빌드한 정적 파일들을 제공할 수 있는 설정을 해야 합니다.
백엔드 디렉토리 내부에 @nestjs/serve-static 패키지를 설치합니다.
yarn add @nestjs/serve-static
root의 package.json에 dist 디렉토리 내부의 main.js를 실행하도록 합니다.
{
"scripts": {
"dev": "turbo run dev",
"build": "turbo run build",
"start": "node apps/backend/dist/main.js"
},
"dependencies": {
"turbo": "^2.3.0"
},
"private": true,
"workspaces": [
"apps/*"
],
"packageManager": "[email protected]"
}
⚓️ 사용자 피드백과 버그 기록
👷🏻 기술적 도전
📖 위키와 학습정리
✏️ 에디터
Novel이란?
Novel 스타일링 문제
에디터 저장 및 고려 사항들
📠 실시간 협업, 통신
Yorkie와 Novel editor 연동
YJS와 Websocket 그리고 React-Flow
YJS와 Socket.io
WebSocket과 Socket.io에 대해 간단히 알아보기
🏗️ 인프라와 CI/CD
NCloud CI CD 구축
BE 개발 스택과 기술적 고민
private key로 원격 서버 접근
nCloud 서버, VPC 만들고 설정
monorepo로 변경
⌛ 캐시, 최적화
rabbit mq 사용법
🔑 인증, 인가, 보안
passport로 oAuth 로그인 회원가입 구현
FE 로그인 기능 구현
JWT로 인증 인가 구현
JWT 쿠키로 사용하기
refresh token 보완하기
🧸 팀원 소개
⛺️ 그라운드 룰
🍞 커밋 컨벤션
🧈 이슈, PR 컨벤션
🥞 브랜치 전략
🌤️ 데일리 스크럼
📑 회의록
1️⃣ 1주차
킥오프(10/25)
2일차(10/29)
3일차(10/30)
4일차(10/31)
2️⃣ 2주차
8일차(11/04)
9일차(11/05)
11일차(11/07)
13일차(11/09)
3️⃣ 3주차
3주차 주간계획(11/11)
16일차(11/12)
18일차(11/14)
4️⃣ 4주차
4주차 주간계획(11/18)
23일차(11/19)
24일차(11/20)
25일차(11/21)
5️⃣ 5주차
5주차 주간계획(11/25)
29일차(11/25)
32일차(11/28)
34일차(11/30)
6️⃣ 6주차
6주차 주간계획(12/2)
37일차(12/3)