앞서 프로젝트 생성방식과 똑같이 yarn init -y
로 패키지 관리자 설치 후 yarn add express mongoose
로 Express 와 Mongoose를 설치
추가로 yarn add body-parser
로 body-parser 도 설치
+a) body-parser 라이브러리
app.get('/test', (req, res) => {
res.send('test');
console.log(req.body);
});
공식문서에 따르면 Express 사용 시 body는 Undefined 취급 됨
따라서 위와 같이 requset 에서 body 값을 기져오려고 하면 Undefined가 출력 됨
body-parser 같은 미들웨어를 이용하면 서버 내에서 해석 가능한 구문으로 변환하여 그 값을 req.body에 담아주어 body 값을 읽어 올 수 있게 됨
app.use(bodyParser.json())
로 body 값에 대한 parser를 설정
이후 DB uri를 mongoose.connect
에 인수로 전달
추가로 {useNewUrlParser : true}
도 전달
useNewUrlParser
-mongoDB 의 DB 연결 주소에는 다양한 정보가 들어가는 데 3.1.0 버전 이전에는 기존의 parser로 기본 uri를 변환하는 데 제약사항이 있었음
-이에 따라 보다 안정적인 해석처리를 위해 분석하는 new Parser가 도입됨
-useNewUrlParser: true
로 지정하면 새로 도입된 parser를 사용해서 더 향상된 분석 기능 사용 가능
Mongoose 5.3.0 버전 이상 부터는 해당 기능이 Default로 내장되어 따로 옵션을 줄 필요가 없음!!
관련 링크
+a) RESTful API
index.js
파일 생성To-Do List 관련 기능에 따라 router 기본 관련 메서드 코드 작성
이 때 수정, 삭제는 특정한 데이터에 대한 조작이 이루어져야 함으로 이를 인식할 수 있도록 엔드포인트(URI)에 id값을 추가
module.exports
로 router 객체를 내보내서 외부에서 사용가능하도록 함+a) router 관련 코드분리 작업 (단순화)
현재 index.js
내의 코드를 보면 주소값에 tasks 가 반복적으로 사용되고 있음
반복되는 코드에 통일된 작업이 가능하도록 우선 이 전체 코드를 새로 만든 task.api.js
내에 붙여넣음
기존의 index.js
내의 코드는 위와 같이 작성
앞서 정의한 task.api
에서 module.exports 한 핸들링 router 객체를 taskAPI 변수에 담음
router.use 메서드를 사용해서 들어오는 엔드포인트 요청에 /tasks 가 포함되면 지정해 둔 taskAPI router를 사용하도록 설정
이 같이 공통적으로 사용되는 부분은 파일을 분리하고 통합화하여 코드가 간결해짐
index.js
에서 재정의한 router 객체를 메인 서버와 연결하기 위해 app.js 에서 가져옴app.use()
메서드로 /api 로 들어오는 모든 요청에 대해 indexRouter를 사용하도록 지정task.js
파일 생성필요한 Collection 구조를 생각 후 이를 토대로 Schema 를 만듬
이후 해당 Schema를 Task라는 이름으로 mongoose.model 에 담아서 모델 생성 및 export
task.controller.js
파일 생성앞서 만들어 둔 model 객체(Task)를 불러 옴
이후 각 함수들을 담을 빈 객체 taskController 생성
위에서 정의한 대로 createTask 함수가 실행되면 요청으로 받은 body 에서 task, isComplete 의 값을 가져옴
이후 모델 객체에 값들을 넣은다음 해당 데이터 결과를 save()로 DB에 저장
이후 클라이언트 측에 응답을 보내는 데 이 때 try, catch 구문을 이용해 성공과 실패의 케이스 분기를 나눔
성공 => 200 상태코드와 함께 ok문구 및 data 결과를 반환
실패 => 400 상태코드와 함께 fail문구 및 에러메시지 반환
이후 task.api.js
에 만들었던 router.post 의 인수 자리에 만들어 둔 커스텀 함수를 넣어 줌
결과적으로 해당 엔드포인트(URI) 로 POST 요청이 들어오면 taskController.createTask 함수가 실행되며 내부로직이 실행됨
마찬가지로 GET 에 대해서도 함수를 만들고 내부로직 작성
여기서는 GET 요청에 대해 DB의 모든 데이터를 전달
+a) 수정 API 테스트
이후 findById 메서드로 URI 상에 전달된 params(동적 쿼리 parameter) 객체 내부에 전달된 id값을 꺼내와서 이를 통해 특정 데이터를 찾음
객체의 덮어쓰기 속성을 이용해 요청에서 받아온 데이터로 덮어씌워 줌
이후 변경된 데이터 값을 DB에 저장