[React-NodeJs-MySQL 프로젝트 세팅(restAPI+GraphQL)] (3) server : Nodejs 환경 세팅 - 컨트롤러, Router 설정

2021. 3. 10. 15:27개인 프로젝트/기본 프로젝트 환경 세팅

 

3장은 기본 서버세팅에 관련된 내용이다.

 

서버의 구성은 다음과 같다.

 

<폴더>

 

api 폴더: graphQL의 resolvers

controller 폴더: 실제 restAPI의 로직 구현

middlewares 폴더: app객체 생성, 권한처리, cors 처리 등의 미들웨어성 모듈 코드 관리

routes 폴더: endpoint와 controller를 연결하는 라우터 코드 관리

types 폴더: graphql 스키마 merge 결과가 생성되는 폴더

models 폴더: DB 스키마와 각 테이블을 정의

config 폴더: DB연결에 필요한 config를 정의

 

<파일>

 

server.ts 파일: 서버 실행 파일

schema.ts 파일: graphql merge 로직

codegen.yml 파일: graphql 스키마 merge에 사용되는 스크립트

 

주황색으로 표기된 부분은 Apollo server와 관련된 것이므로 4장에서 설명하겠다

추가적으로 추후 typescript를 이용할 예정이므로 tsconfig를 설치해준다.

 

 

1) express의 app객체 생성 및 cors처리

 

express 라이브러리는 node.js를 서버로 사용할 수 있도록 만들어준다.

따라서 express를 이용해 app객체를 생성하여, use 메소드를 통해 서버에 필요한 패키지들을 실행한다.

보통 app객체를 server.ts에서 직접 생성해도 되지만, 미들웨어로 이용하기 위해 분리하였다.

 

이 과정에서 cors 미들웨어를 작성하여 사용한다.

app객체에서 cors미들웨어를 사용하면 client요청의 cors 문제를 해결할 수 있다. 

 

 

2) server.ts 파일 생성, http서버생성과 연결

 

app객체를 생성하고 http 모듈을 통해 server를 만들어낸다.

프로젝트에 필요한 config를 정의하기 위해 dotenv를 사용하였다.

sequelize는 추후 MySQL을 위해 사용할 ORM인데 지금은 무시해도 된다.

 

이 과정에서 app이 사용해야 할 패키지가 몇개 있는데, 그 중 하나가 bodyParser이다.

이는 restAPI를 사용할때, req.body의 내용을 서버가 온전히 받기위해 꼭 사용해야 한다.

 

라우터 자체는 기본적으로 ( 경로, 라우터) 형태로 사용한다.

testRouter는 라우터와 컨트롤러를 import해오는데 이 부분은 다음 항목에서 자세히 보자.

 

앞서 말했듯 실제 물리적인 서버는 http모듈의 createServer를 통해 만든다.

포트를 지정하고 연결이 되면 로그가 찍히도록 설정하였다.

해당 예시코드에서는 서버 실행을 함수로 만들어 실행하였다.

(이 과정에서 apollo와 graphql관련 코드는 무시해도 괜찮다)

 

3) 라우터 작성

 

라우터는 endpoint와 실제 API로직이 담긴 컨트롤러를 연결해준다.

express에서 제공하는 Router함수로 생성하고, 기존에 만들어 둔 API(컨트롤러)를 import해온다.

 

각 라우터는 restAPI 규약에 따라 get,post,put 등으로 구분된다.

(경로, 컨트롤러)의 구조로 args를 정의한다.

endpoint는 'app.use에 정의한 기본경로'+'라우터에 정의한 경로'가 될 것이다.

예시 코드에서는 app.use에 '/api'를 정의하였고, get라우터는 '/test'이므로, client에서 해당 get API를 이용하기 위해서는 '/api/test'에 요청해야 할 것이다.

 

 

4) 컨트롤러 작성

 

컨트롤러는 모듈별로 묶고, 해당 모듈에서 사용되는 여러가지 API를 한곳에 작성한다.

지금은 로직은 무시하고, 이렇게 request를 받아 처리하고 response를 주는 로직이 컨트롤러에 속해있다는 사실만 알아두자.

모든 컨트롤러는 exports가 필요하고, 예시의 경우 testAPI를 import하면 내부에 있는 모든 컨트롤러에 접근할 수 있게 된다.

이때 client가 response를 받아보기 위해선 모든 처리가 종료된 후 res에 적절한 로직 처리를 해줘야하는데, 이는 6장에서 보자.

 

서버의 API는 DB에 접근해서 로직을 처리하는게 대부분이므로, model에서 정의한 스키마를 import한다.

이 부분 역시 8장에서 자세히 보도록 하겠다.