https://november-itstime.tistory.com/80
node.js + express로 백엔드 서버 구축 도전기 (1) - 소개
회사에서 사내 랜딩 페이지 백엔드를 구축해보라는 과제를 받아서 도전해본 것들을 블로그에 정리하며 개념을 학습하고자 한다.사실 개발하면서 책과 각종 자료들을 참고하긴 했으나 개념 학
november-itstime.tistory.com
이전 글에 이어 작성하지만 이젠 본격적으로 프로젝트 셋팅을 해보았다. 이 모든 지식의 기반은 제로초님의 Node.js 책이였다. 비록 14버전이지만 기본 개념은 일맥상통한다고 생각이 되어 많이 참고하고 배웠다. 또한 사수분께서도 Express 는 규격화된 표준 모델이 없기 때문에 이를 셋팅하는 것 자체가 어렵다고 말씀해주셨고 표준 모델을 많이 찾으라 해서 여러 모델을 찾아보았다.
첫 번째로 아래에서 언급한 아키텍처를 도입하고자 했다. 좋아보이는 구조였지만 다만 이를 내가 흡수하기엔 아직 백엔드에 대해 지식이 없던 터라 많은 레퍼런스를 검색해볼 수 밖에 없었고 그 과정에서 아래와 같은 아키텍처 기반 프로젝트는 잘 나오지 않아서 아쉽지만 다음 기회에 도입하고자 결심했다.
견고한 node.js 프로젝트 설계하기
본 글은 Sam Quinn의 “Bulletproof node.js project architecture” 글을 번역한 것입니다. [Bulletproof node.js project architecture 🛡️ Express.js is great frameworks f
velog.io
그래서 내가 도입하고자 한 것은 MVC 모델 기반의 폴더 구조였다. 가장 레퍼런스도 많았을 뿐더러 백엔드에 대해 잘 모르던 나도 검색 하면서 보던 구조였기 때문에 조금이지만 더 익숙하기도 해서 도입하고자 했다. 따라서 폴더 구조는 아래와 같다. 또한 src 외부에는 lint와 build 체크를 위한 .husky 그리고 node_modules , 그리고 .gitignore , .preettierrc , Dockerfile , eslint.config.js , nodemon.json , package.json과 README.md , 그리고 TypeScript를 사용했기 때문에 tsconfig.json 파일이 포함되었다.
이젠 src 내부 각각의 폴더에 대해 살펴보고자 한다.
* 프로젝트 내부 폴더 구조
📦src
┣ 📂config
┃ ┗ 📜db.ts
┣ 📂controllers
┃ ┣ 📜contactController.ts
┃ ┗ 📜noticeController.ts
┣ 📂interfaces
┃ ┣ 📜IContact.ts
┃ ┗ 📜INotice.ts
┣ 📂models
┃ ┗ 📜noticeModel.ts
┣ 📂routes
┃ ┣ 📜contactRoutes.ts
┃ ┗ 📜noticeRoutes.ts
┣ 📂services
┃ ┣ 📜contactService.ts
┃ ┗ 📜noticeService.ts
┣ 📂utils
┃ ┗ 📜logger.ts
┗ 📜app.ts
1) config
어플리케이션의 전역 설정을 관리하기 위한 폴더다. 주로 db.ts 같이 DB 연결에 필요한 환경변수 , 서버 포트 , API 키 등을 작성하는 곳이다. 초기엔 db.ts로 셋팅 했지만 사수님이 리팩토링 해주 실 땐 더 깔끔하게 폴더를 나누어주셨다.
2) controllers
컨트롤러는 사용자가 요청하는 작업을 처리하는 로직을 담고 있다. 특히 비즈니스 로직을 구분하여 요청/응답 처리만 도와주는데 이를 위해 나는 Services에서 비즈니스 로직을 처리하고 Controllers 에서는 이를 요청받고 응답하는 로직만 작성했다. 즉 response와 에러 혹은 예외 등을 전달해주었다.
3) services
서비스는 비즈니스 로직을 수행한다. 즉, DB에서 어떠한 정보를 내려받거나 , 특정 정보만 갖고 싶거나 이러할 때 서비스에서 호출해야 함
4) routes
Router()를 받아와서 특정 라우트 경로에 컨트롤러를 붙여서 라우팅해준다. 즉, 사용자 요청을 각 요청에 맞는 컨트롤러로 라우팅 해주는 역할이다. 각 기능별로 route를 구분할 수 있다.
5) models
데이터베이스와 상호작용하는 로직을 분리하여 관리하기 위해 만들어진 폴더다. 모델은 데이터베이스의 테이블과 매핑되는 역할을 한다.
데이터베이스에서 데이터를 가져오거나, 데이터를 삽입/업데이트/삭제하는 작업을 담당할 수 있다.
6) app.ts
어플리케이션의 진입점으로, 서버 설정과 초기화 작업을 수행하는 파일이다.
이 파일에서 Express 애플리케이션을 생성하고, 미들웨어 설정, 라우터 연결, 서버 포트 설정 등의 작업을 수행한다. 모든 라우트, 미들웨어, 데이터베이스 연결 설정 등이 이 파일에서 초기화 된다.
기타 설치 라이브러리
1) nodemon : node monitor의 약자로 이 라이브러리가 없이 코드를 수정 시 바로 반영되지 않는 문제가 발생했는데 이러한 것을 해결해주는 모듈이다. 즉, 노드가 실행하는 파일이 속한 디렉터리를 감시하고 있다가 파일이 수정되면 자동으로 노드 애플리케이션을 재시작하는 확장 모듈이다
2) morgan : express 로깅 관리를 용이하게 하기 위한 미들웨어, http 요청 시 상세한 로그를 자동으로 제공해주는 라이브러리다. 개발에서는 주로 dev를 사용하고 이 외 여러 개가 있는데 아래와 같다.
- combined: 일반적으로 많이 사용되는 포맷으로, Apache 서버의 표준 로그 스타일을 따릅니다. 클라이언트의 IP 주소, 요청 메소드, 상태 코드, 응답 시간 등을 기록합니다.
- common: 간결한 로그 형식으로, IP 주소, 요청 메소드, URL, 상태 코드 등이 포함됩니다.
- dev: 개발 환경에서 적합한 포맷으로, 요청 메소드, URL, 상태 코드, 응답 시간 등이 색상으로 구분되어 출력됩니다.
- short: 최소한의 로그를 출력하는 형식입니다.
- tiny: 가장 간단한 로그 형식으로, 요청 메소드, URL, 상태 코드만을 출력합니다.
3) dotenv : 환경변수 설정을 위한 패키지 , 프로젝트의 중요한 설정 값(예: API 키, 데이터베이스 연결 정보, 포트 번호 등)을 코드에 직접 하드코딩하지 않고 .env 파일에 저장한 뒤, 이를 애플리케이션에서 읽어오는 역할을 한다.
4) mysql2 : Node.js 애플리케이션에서 MySQL DB와 상호작용할 수 있는 패키지. mysql2는 비동기적으로 MySQL에 연결하고 쿼리를 실행할 수 있으며, 성능을 개선한 버전임. 또한 Promise와 async/await을 지원하므로, 비동기 처리가 매우 직관적이다.
5) sequelize : MySQL 쿼리를 사용하는 대신 ORM(Object-Relational Mapping)으로 Node.js에서 MySQL을 쉽게 사용할 수 있게 해주는 역할이다. 관계 설정 같은 것들 쉽게 다 해준다.
나는 MySQL + Express를 Sequelize를 통해 구현 했다. 이유는 정말 솔직하게 말하자면 책에서 그렇게 하래서..지만 Sequelize의 장점을 사용하면서 느낀 바로는 JavaScript 클래스처럼 다룰 수 있어 객체지향적으로 쿼리를 사용 가능하다는 점 , 관계 설정을 쉽게 할 수 있다는 점 등이 있어서 편하다는 생각이 들긴 했다.
내가 구현해야 하는 것들은 공지사항 전체 리스트 , 공지사항 상세 게시글을 조회 하는 기능과 사용자가 홈페이지에서 Contact 폼을 입력하면 AWS SES 메일 서비스를 사용하여 관리자 메일로 메일링 되게 하는 기능이다.
일단 저렇게 내가 구현한 코드를 복기 하고 추후 현재 사수님이 리팩토링 해주신 코드를 다 보여줄 순 없지만 변경사항을 토대로 또 추가 개념 학습 예정이다. 이 과정에서 무작정 부딪히며 배워나가는 성격이 아니라 단계 밟아가면서 이해를 해야 직성이 풀리는 성격임을 또 깨닫게 되었다..
'BackEnd Skils' 카테고리의 다른 글
백엔드 입문 (1) - Node.js로 백엔드 시작해보기 (1) | 2024.11.27 |
---|---|
백엔드 사전 지식 (3) - 자바스크립트 생태계 (1) | 2024.11.26 |
백엔드 사전 지식 (2) - 백엔드 배포 방법부터 클라우드 서비스까지 (0) | 2024.11.26 |
백엔드 사전 지식 (1) - DNS 부터 테스트 그리고 배포까지 살펴보기 (1) | 2024.11.25 |
Node.js + express로 백엔드 서버 구축 도전기 (1) - 소개 (3) | 2024.09.06 |