Express와 Typeorm을 적용한 DB operation API Server 시작하기

Joe·2022년 11월 9일
1

앞의 글에서 말한 것처럼 특히 API개발의 생산성과 효율성 향상을 위해서는 프레임워크를 사용해야한다. Node.js와 호환되는 수많은 Server-side Framework들 중 Express.js를 사용해보려한다.

Express 설치

  • 프로젝트를 진행할 폴더에 가서 npm init -y 를 입력하여 작업을 의도한 어플리케이션에 package.json 파일을 생성
    • -y 명령어를 통해 디폴트 값으로 제공하는 기본 설정 값을 남겨둠. 추후 바꾸고 싶은 내용들은 package.json 에 들어가서 수정할 수 있음.
  • 그 후 npm install express를 입력하여 배포용으로 쓰일 패키지임을 명시하는 package.json 파일 내 dependency list에 저장!
  • 여러개의 모듈 설치
    • nodemon: 서버코드 변경될때마다 서버 재시작을 자동으로 해주는 도구
    • cors(cross-origin Resource Sharing) : 백엔드,프론트앤드의 통신이 원활하도록 엄격한 통신을 조금 완화시켜주는 도구
    • dotenv: 환경변수 파일(.env)을 외부에 만들어 접근할 수 있게해주는 도구
    • morgan: 로깅에 도움을 주는 도구

TypeORM 설치

  • npm install typeorm 명령어를 통해 설치
  • .env 파일 내부에 typeorm 환경 변수 정보를 저장해야한다.
TYPEORM_CONNECTION = mysql
TYPEORM_HOST = 127.0.0.1
TYPEORM_USERNAME = root
TYPEORM_PASSWORD = myPassword
TYPEORM_DATABASE = myDB
TYPEORM_PORT = 3306
TYPEORM_LOGGING =TRUE
  • typeorm과 database 연결
    • 아래와 같이 dotenv를 사용할 수 있게 선언한 후 typeorm의 Datasource를 불러온다.

      const dotenv = require("dotenv")
      dotenv.config()
      // require("dotenv").config() -> 이렇게 한줄로 적는 것이 권장됨
      
      const { DataSource } = require('typeorm');
    • 이후, .env 파일에 저장해놓은 환경변수들을 불러와 Datasource의 명령어를 통해 database와의 connection 환경세팅을 완료한다. 그리고 나서는 initialize() 메소드를 통해 실제 연결을 한다.

      const myDataSource = new DataSource({
          type: process.env.TYPEORM_CONNECTION,
          host: process.env.TYPEORM_HOST,
          port: process.env.TYPEORM_PORT,
          username: process.env.TYPEORM_USERNAME,
          password: process.env.TYPEORM_PASSWORD,
          database: process.env.TYPEORM_DATABASE
      })
      
      myDataSource.initialize()
          .then(() => {
              console.log("Data Source has been initialized!")
          })

      위의 process 객체는 node.js에서 기본으로 설정되는 글로벌 객체라 별도의 require호출없이 언제,어디서든 상관없이 모든 모듈에서 접근이 가능한 객체이다(프로그램과 관련된 정보를 나타내는 객체로 속성과 메소드가 많은 편이기도 하다). 그중 process.env는 사용자의 환경을 포함하는 객체를 반환하기에 위에 내용처럼 하나하나 객체를 수정하여 database와 연결을 시키는 것이다.

API 서버 만들기

  • 먼저 http모듈에서 벗어나 express를 웹프레임워크로 사용하여 express가 간단히 적용된 서버의 동작을 확인하는 코드를 살펴보겠다.
const express = require('express') // --- (1)
const cors = require('cors') // --- (2)
const app = express()// --- (3)
 
app.use(cors()) // --- (4)
 
app.get('/ping', function (req, res, next) { // --- (5)
  response.json({message : 'pong'})
})
 
app.listen(3000, function () {
  'listening on port 3000'
})
  • (1) : require 메소드를 통해서 express 모듈을 import하여 객체를 생성하고 express 변수가 참조
  • (2) : require 메소드를 통해서 cors 모듈을 import하여 객체를 생성하고 cors 변수가 참조
  • (3) : express 함수를 호출하고, app 이라는 변수안에 담는다 → express()라는 일종의 클래스 기능을 app 이라는 새로운 변수안에 담아 객체 형태로 선언
  • (4): app.use()는 일종의 미들웨어를 추가하는 함수이다(매개변수의 형태로 들어오는 다양한 함수를 받아 app에 middleware로 추가해준다)→ corsㅇ
    • middleware(미들웨어): 서로 다른 애플리케이션이 서로 통신할 수 있게 중계역할을 해주는 소프트웨어

app 객체는 그 내부에 존재하는 다양한 메소드를 활용할때 계속해서 사용된다. 왜냐하면 express() 라는 함수를 통해서 생성된 이 객체는 전체 API 서버의 기능을 정의하고 서버를 실행시키는 주 객체로 사용되기 때문!! 즉, app객체를 사용하면서 현재 만들고 있는 API 기능이 실행되고 구현되는 것이라고 생각할 수 있다.

💡 **Express가 제공하는 대표적인 Application 기능**
  • HTTP 요청 라우팅 기능
  • 미들웨어 상세설정
  • HTML 렌더링 기능
  • 템플릿 엔진 렌더링 기능
  • (5)
    • : req는 HTTP 통신시 요청에 대한 정보를 담는 객체를 의미한다. 그리고 이 req에 상응하여 응답에 대한 정보를 담는 객체가 바로 res라고 표현될 수 있다.(request & response 관련 포스팅 참고)
    • : app.httpMethod()는 외부에서 들어오는 HTTP 네트워크 요청을 라우팅한다. 즉, CRUD 기능에 상응하는 세부 HTTP 메서드(GET,POST,DELETE,PATCH등)을 의미한다. 이것을 사용하기 위해서는 app.get(),app.post()의 형태로 작성해야한다.

  • 지난번 포스팅에서 express가 무엇이고 왜 사용하는지 node.js와의 관계를 살펴보면서 이해했었다면 이번에는 그 내용들을 실제로 적용시켜 데이터베이스 기반에 API서버를 만들기 위한 기초 준비를 해보았다. 앞으로 계속해서 express, typeorm을 설치하고 연결하여 서버를 만들텐데 단순히 연결하는 방법을 외우고 기록하기보다는 각각의 내용들이 왜 저렇게 사용되었는지, 기능들이 무엇인지 정리해보았다. 시간이 걸리고 진행속도가 좀 늦을 수 있겠지만 어쩔 수 없다. 좁은 길도 갈 줄 아는 개발자의 습관을 갖도록 하자.

    profile
    Creator

    1개의 댓글

    comment-user-thumbnail
    2022년 11월 11일

    덕분에 express를 이해하게 되었어요!

    답글 달기