require('dotenv').config();
require 메소드를 통해 dotenv 라이브러리를 호출한 후 config 메소드를 실행한다. 이는 환경변수(.env)에 적어놓았던 TypeORM과 관련된 많은 내용들을 app.js에서 활용할 수 있게 발동시키는 작업을 수행한다. 참고로 dotenv 라이브러리의 config() 함수를 호출하기 전에 process.env를 읽으면 undefinded를 반환하니 항상 자바스크립트에서 최상단에 위치 시킨다.
### Built-in package ###
const http = require('http');
require 함수를 이용해서 node.js에 내장되어 있는 http 라고하는 built-in 모듈을 호출하여 http 변수에 할당하여 API 생성
### 3rd-party package ###
(1) const express = require('express');
(2) const cors = require('cors');
(3) const morgan = require('morgan');
(4) const { DataSource } = require('typeorm');
(1) require 메소드를 통해서 express 모듈을 임포트하여 객체를 생성하고 express 변수가 참조
(2) 백엔드와 프론트 서버가 서로 다른 도메인에서 서로간 통신을 가능하도록 설정
(3) npm 에서 사용되는 로그 관리를 위한 여러 패키지 중 하나, Morgan을 사용하면 http(s) 통신시 프론트-백엔드간 소통시 필요로 하는 ‘기본 정보’들을 자동으로 포매팅하여 편리하게 주고 받을 수 있게 된다.
(4) typeorm 모듈을 호출하여 그 중 DataSource 라는 key에 해당하는 value를 DataSource 라는 변수에 할당한다.
(1) const app = express();
(2) const database = 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
})
(1) ‘app’은 express가 프레임워크로서 기본으로 제공하는 다양한 내부 기능을 담아내기 위해 사용하는 객체로 "express()" 함수를 호출하고, app 이라는 변수에 할당한다. 즉, ‘express()’ 라는 일종의 클래스 기능을 ‘app’이라는 새로운 변수안에 담아 객체 형태로 선언하는 것. 그리고 express라는 함수를 통해서 생성된 app 객체는 전체 API 서버의 기능을 정의하고 서버를 실행시키는 주 객체로 활용된다.
(2).env 파일에 저장해놓은 환경 변수들을 불러와 DataSource 명령어를 통해서 db와의 커넥션 환경 세팅을 완료
database.initialize()
initialize 메소드를 통해 데이터베이스와의 연결 및 연동을 실행한다.
(1) app.use(express.json());
(2) app.use(cors());
(3) app.use(morgan('dev'));
app.use()는 일종의 미들웨어를 추가하는 함수로 매개변수의 형태로 들어오는 다양한 함수들을 받아 app에 middleware로 추가해준다. app.use() 의 소괄호 내부에는 외부 요청시 경로로 활용되는 path가 먼저 자리하고, 이후 기타 callback 함수들이 매개변수로 들어온다. app.use() 의 기본 디폴트 path는 ‘/‘로 만약 app.use() 내부 path 부분에 아무것도 적혀 있지 않았다면, 클라이언트가 그 어떠한 요청을 보내더라도 app.use는 매번 호출되므로 path를 따로 지정하지 않음으로써 런서버 환경의 모든 요청에 필히 동작할 수 있게 설정할 수 있다.
(1) 외부에서 들어온 다양한 양식의 데이터들을 json형식으로 parsing 할 수 있도록 만들어주는 기능.
(2) CORS 설정을 통해서 서로 다른 두개의 origin/domain 끼리의 데이터를 주고 받게 하기 위한 설정하여 이루어지며, 만일 해당 과정을 생략한다면 CORS 정책 위반을 이유로 웹 브라우저 차원에서 서버 통신을 막는다.
(3) http(s) 통신시 프론트-백엔드간 소통시 필요로 하는 ‘기본 정보’들을 자동으로 포매팅하여 편리하게 주고 받을 수 있게 해준다.
app.get('/ping', (req, res) => {
res.status(200).json({message: " Hello World"});
})
http요청 시 get 메소드 이면서 타켓 url이 '/ping' 일 경우 200 상태 코드와 함께 'Hello World' 라는 메세지를 응답으로 보낸다.
(1) const server = http.createServer(app);
(2) const PORT = process.env.PORT;
(3) server.listen(PORT, ()=>{
console.log(`!!!! Server ${PORT} is connected !!!!`)
})
(1) http 모듈에 있는 createServer 메소드를 통해 http 서버객체를 생성해서 server 변수에 할당
(2) process객체를 통해 .env 파일에 있는 PORT 값을 PORT 변수에 할당
(3) listen() 함수를 호출해야만 server가 해당 포트를 리스닝하면서 수신을 대기한다. 여기서, listen() method는 시간이 걸릴 수 있는 작업이라서 callback으로 비동기적으로 동작하며 listen이 완료되었을 때, callback이 실행되면서 !!!! Server ${PORT} is connected !!!! 가 출력된다.