본문 바로가기

프로젝트 개발 기록/[개발] node.js | nest, express10

[Node.js] Nest.js 폴더 구조 설계하기 0. 개요 [ 기존의 구조 ] 보통 express에서는 컨트롤러, 서비스 별로 쭈욱 파일이 모여있다. 아래는 과거에 진행한 프로젝트 구조이다. 프로젝트를 진행하면서 mvp가 많아질수록 컨트롤러와 서비스는 많아졌고 점점 도메인 별로 코드를 찾기 어려워졌다. 이 구조는 서비스가 확장되면 도메인 별로 흩어져 있기 때문에 파일을 찾아서 개발하는 것이 힘들다. 그래서 좀 더 대규모 서비스의 폴더 구조는 어떻게 설계하는지 궁금해졌고, 이번에는 nest에서 최대한 DDD할 수 있는 폴더 구조를 알아보려 한다. ┣ 📂controllers ┃ ┣ 📜bookMarkController.ts ┃ ┣ 📜checklistController.ts ┃ ┣ 📜scheduleController.ts ┃ ┣ 📜subscribeContro.. 2022. 9. 25.
[Node.js] Nest.js에서 프로젝트 시작하기 0. 개요 [ 왜 Nest.js 인가 ] 이전 프로젝트에서는 Node.js에 express 프레임워크를 사용해서 개발을 해왔다. 하지만 express가 불편하다는 생각을 가지고 있었다. 명확하게 정해져 있는 구조가 없다보니 개발자마다 폴더 구조 등이 자유로웠고 가끔은 이런 것들이 꼬이기도 했다. (그리고 나는 프로젝트 문서화를 중요하게 생각하는데 Express에서는 하나하나 yaml 파일로 작성하고 있었다. 물론 express에서도 좀 더 자동화할 수 있지만 nest에서는 좀 더 간편하게 swagger 문서를 자동으로 달 수 있었다.) ( 참고 ) express에서 nest.js처럼 사용할 수 있는 방법도 있다. expresss 서버 구조 : https://jhyeok.com/node-backend-st.. 2022. 9. 14.
TypeScript + node.js에서 Jest로 단위테스트 하기 0. 개요 [ 내가 TDD를 하게 된 이유 ] 엘리스 2차 프로젝트의 개발 기간은 3주였다. 3주라는 시간 내에 기획과 개발, 배포, 발표 준비를 해야 한다는 부담감에 테스트 코드 작성을 우선순위에서 미루고 바로 비즈니스 로직을 구현했다. 하지만 점점 로직이 쌓이면서 새로운 기능 코드를 작성할 때 기존 코드에 영향을 주지 않고 작성을 해야 하는데 테스트 코드가 없어 내가 생각하지 못한 사이드 이펙트가 터졌다. '코드 작성 -> 사이드 이팩트 -> 코드 수정 -> 사이드 이팩트 -> 코드 수정' 과정이 반복되니 2가지 불편함이 생겼다. 코드 생산성 감소 코드에 대한 자신감 하락 내 코드에 대한 자신감이 떨어졌다. 프론트에서 문제가 생겼다고 물어볼 때 백엔드 API 기능의 문제가 없다는 것을 증명하기 어려웠.. 2022. 7. 17.
[TypeScript+Express] Redis로 Refresh Token 관리 0. 개요 이전 프로젝트에서는 MongoDB를 사용하면서 Refresh Token을 DB에 저장했다. 이번에는 Redis를 연결하여 구현을 해보자. 지난 포스팅에서 JWT에 대한 개념을 올렸기 때문에 이번에는 Redis에 초점을 맞춰서 작성하도록 하겠다. 👉 [Node.js+Express] Refresh Token 구현 1. 사용 이유 [ 왜 Refresh Token을 저장해야할까 ] Access Token은 서버에 따로 저장해 둘 필요가 없지만, Refresh Token의 경우 서버의 stroage에 따로 저장해서 이후 검증에 활용해야 한다. 검증을 위해 서버는 Refresh Token을 별도로 저장하고 있어야 하며, Refresh Token을 이용한다는 것은 추가적인 I/O 작업이 필요하다는 의미이며.. 2022. 6. 21.
[TypeScript + Express] Error handling error middleware를 구현해보자! 1. Express Error handling middleware error.status로 error를 던질 때 상태코드도 설정할 수 있도록 구현했다. import { Request, Response, NextFunction } from "express"; import { HttpException } from "../utils/error-util"; function errorMiddleware(error: HttpException, req: Request, res: Response, next: NextFunction) { console.log("\x1b[33m%s\x1b[0m", error); const status = error.status || 500; r.. 2022. 6. 17.
[#1] TypeScript + Express에서 Sequelize 시작하기 0. 개요 시퀄라이즈는 node.js ORM이다. Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server를 지원한다. 3차 웹 프로젝트에서 MySQL DB를 사용하기 위해서 Sequelize를 사용해보자! 1. 설치 yarn add sequelize sequelize-cli mysql2 sequelize: RDB와 매핑되도록 해주는 ORM 패키지 sequelize-cli: commandline for sequelize mysql2 : mysql과 연결을 위해 필요한 패키지 2. 초기 설정 ✔️ sequelize init sequelize 명령어 확인 -h 옵션으로 명령어를 확인할 수 있다. npx sequelize -h 아래 명령어를 입력하면 초기 폴더 구조가 .. 2022. 6. 14.
TypeScript + Node.js + Express 에서 프로젝트 시작하기 0. 프로젝트 폴더 생성 나의 프로젝트 폴더 구조는 다음과 같다. 1. 패키치 설치 나는 package manager로 yarn을 사용했다. 내 프로젝트 폴더 구조 기준으로 back 폴더에서 다음 명령어를 실행했다. 1) yarn 초기화 $ yarn init 2) 필요한 패키치 설치 typescript 전역으로 설치 yarn add typescript -g $ yarn add ts-node nodemon typescript @types/express @types/node nodemon --dev $ yarn add express typescript는 node에서 바로 실행되지 않기 때문에 tsc를 사용해서 javascript로 변환한 다음 실행된다. 프로덕션 환경에 올리기 위해서는 모든 파일.. 2022. 6. 6.
[Node.js] mongoose에서 새로운 필드 추가하기 01. 개요 DB 구축을 완료한 후 스키마에 새로운 필드가 추가되는 경우가 있다. 우리 서비스에서는 좋아요 수를 스키마에 추가하게 되었고 default 값으로 0이 들어가 있길 바랐다. 기존 데이터에 추가해 새로운 데이터와 동기화하기 위해서 다음과 같은 방법을 사용했다. 02. updateMany static update = async () => { const findCocktail = await Cocktail.updateMany({}, { $set: { likes: 0 } }); return findCocktail; }; updateMany를 활용하여 전체 도큐먼트에 값을 수정해보자! 👉 Mongoose 공식문서 1. 첫번 째 인자 조회 조건문이다. 나는 모든 도큐먼트를 조회할 예정임으로 {} 비우뒀.. 2022. 5. 1.
[Node.js] Validation 라이브러리, Joi로 단단한 코드짜기 01. 개요 1차 프로젝트에서는 request로 들어오는 데이터를 '@sindresorhus/is' 라이브러리를 사용해서 req.body가 비어있는지 여부만 확인했다. 하지만 좀 더 강하게 validation을 하려면 타입이 맞게 들어왔는지, 올바른 칼럼이 들어왔는지 등을 확인해야 한다. 그래서 이번엔 Joi를 사용해서 Validation 해보려 한다. ✔️ 1차 프로젝트 GitHub Repository 👉 @sindresorhus/is 문서 02. Joi 라이브러리 코드 구현 👉 Joi npm 문서 👉 Joi API 문서 외부에서 들어오는 입력을 항상 validation 하는 습관은 중요하다고 한다. Joi에 대한 자료가 많지 않아 문서를 참고해서 구현해보자. 현재 라우터, 서비스 로직, 디비, 미들웨.. 2022. 4. 28.
[Node.js+Express] Refresh Token 구현 01. 개요 ✔️ GitHub Repository 1차 프로젝트로 포트폴리오 공유 웹서비스를 개발했다. 당시 개발 일정이 2주로 한정되어 있었고 시간이 부족해서 Access Token만을 이용한 인증 방식으로 개발을 했다. 개발 과정에서도 팀원끼리 한번 발급받은 Token으로 유효기간이 만료되기 전까지팀원 전체가 돌아가면서 사용했다.이때 들었던 생각은 만약에 제 3자가 유효기간이 만료되기 전 Token을 탈취해서 사용하게 된다면우리 서비스는 보안이 좋다고 할 수 있을까? 우리 서비스의 사용자가 안심하고 서비스를 이용할 수 있을까? 라는 고민이 들었다. 그래서 현재 진행하고 있는 2차 프로젝트에는 Refresh Token을 구현하려고 한다. + 왜 JWT 토큰을 사용할까? Stateful 해야하는 세션의 .. 2022. 4. 25.
반응형