Pair / 과제 - Statesairline Server
이번 과제는 StatesAirline 서버를 구현합니다. 이 서버는 Express 프레임워크를 이용해 만들고, 로컬 호스트와 연결합니다. States Airline Server는 클라이언트의 요청에 따라 항공편과 예약 데이터를 조회, 생성, 수정, 그리고 삭제하는 기능을 수행할 수 있어야 합니다. "States Airline Server" 스프린트를 통해 Express 프로젝트에서 사용하는 폴더 구조를 이해하고, Express를 활용하여 API 요청을 처리하는 방법을 실습하게 됩니다. 코드를 작성하면서 폴더 구조가 어떻게 구성이 되어 있고 router ,controller가 어떠한 역할을 수행하는지 관찰해 보세요. 문제를 해결하기 전에, 문제가 무엇인지 파악하는 것이 우선이 돼야 합니다. 생산적인 고민을 통해 문제를 정의하고, 차근차근 해결할 수 있어야 합니다. 소프트웨어 엔지니어는 낯선 문제를 만났을 때 문제 자체를 스스로 재정의하고 해결해나가는 능력은 필수사항입니다.
학습 목표
- Express 프레임워크를 사용하여 States Airline API Server를 개발합니다.
- Flight API 와 Book API 에서 정의한 API 요청을 수행하는 코드를 작성합니다.
- Flight Router, Book Router 에 있는 모든 테스트를 통과해야 합니다.
Getting Started
StatesAirline Server 과제 Github Repository
1. statesairline
- statesairline/app.js 는 서비스에 필요한 미들웨어와 웹 서버를 실행하는 코드가 작성되어 있습니다.
2. router
- statesairline/router/ 안에는 airport API, book API, flight API 요청을 수행하는 라우터가 작성되어 있습니다. 작성된 라우터 내용을 통해 API 요청을 받을 수 있습니다.
3. controller
- statesairline/controller/ 안에는 정의된 API 요청을 수행하는 코드를 작성해야 합니다. ( airportController.js 에 작성된 내용을 참고하여 작성합니다. )
4. repository
- statesairline/repository/flightlist.js 는 서비스에서 제공하는 항공편 데이터가 작성되어 있습니다. 이 데이터로 서비스를 구현합니다.
- statesairline/repository/airportlist.js 는 서비스에서 제공하는 공항 데이터가 작성되어 있습니다.
5.test
- statesairline/__test__/statesairline.test.js 은 Jest 스펙을 가지고 있으며 코드 테스트를 위한 테스트 케이스가 작성되어 있습니다.
- npm install 을 통해서 package.json에 설정된 패키지를 설치하세요.
- npm start를 통해 서버를 실행하세요.
- Postman으로 API 동작 여부를 확인하세요.
- npm test를 통해 테스트를 실행하세요.
- 서버에서 사용되는 포트 번호로 실행되지 않는 경우, 관리자 권한을 부여하여 실행하거나 해당 포트를 사용 중인 프로그램을 종료 후 재시작을 합니다.
Bare Minimum Requirements
- statesairline/controller/flightController.js와 statesairline/controller/bookController.js 에 코드를 작성하세요.
- Express 공식문서에서 req.query , req.params를 사용하는 방법을 확인하세요. Query와 Params를 기준으로 데이터를 필터링하는 코드를 작성해야 합니다.
- 예약 데이터는 controller/bookController.js 안에 작성된 let booking = []; 배열에 저장해야 합니다.
- Flight API -> 항공편 수정은 Advanced Challenges입니다.
참고 블로그 : https://velog.io/@support/코드스테이츠-8주차StatesAirline-Server
코드스테이츠 8주차/StatesAirline Server
이번 스프린트는 States Airline 서버를 구현합니다. States Airline Client Application과 이번 스프린트에서 구현한 서버를 연결합니다. 이 서버는 Express 프레임워크를 이용해 만들고, 로컬호스트와 연결합
velog.io
레퍼런스 코드
flightController.js
const flights = require('../repository/flightList');
const fs = require('fs');
module.exports = {
// [GET] /flight
// 요청 된 departure_times, arrival_times, destination, departure 값과 동일한 값을 가진 항공편 데이터를 조회합니다.
findAll: (req, res) => {
const { departure_times, arrival_times, destination, departure } =
req.query;
if (Object.keys(req.query).length === 0) return res.json(flights);
else if (departure_times !== undefined && arrival_times !== undefined) {
const data = flights.filter(
flight =>
flight.departure_times === departure_times &&
flight.arrival_times === arrival_times
);
return res.json(data);
} else if (departure !== undefined && destination !== undefined) {
const data = flights.filter(
flight =>
flight.departure === departure && flight.destination === destination
);
return res.json(data);
} else {
return res.json('Incorrect request');
}
},
// [GET] /flight/:uuid
// 요청 된 uuid 값과 동일한 uuid 값을 가진 항공편 데이터를 조회합니다.
findById: (req, res) => {
// TODO:
const { uuid } = req.params;
const data = flights.filter(flight => flight.uuid === uuid);
return res.json(data);
},
// [PUT] /flight/:uuid 요청을 수행합니다.
// 요청 된 id 값과 동일한 uuid 값을 가진 항공편 데이터를 요쳥 된 Body 데이터로 수정합니다.
update: (req, res) => {
const { uuid } = req.params;
const bodyData = req.body;
const beUpdatedIdx = flights.findIndex(flight => flight.uuid === uuid);
const updatedFlight = { ...flights[beUpdatedIdx], ...bodyData }; //최종적으로 업데이트된 flight
flights.splice(beUpdatedIdx, 1, updatedFlight);
/* 파일 수정 */
// const jsonData = JSON.stringify(flights);
// fs.writeFileSync(
// `${__dirname}/../repository/flightList.js`,
// `module.exports = ${jsonData}`
// );
return res.status(200).json(updatedFlight);
},
};
레퍼런스 코드
bookController.js
const { v4: uuid } = require('uuid');
// 항공편 예약 데이터를 저장합니다.
let booking = [];
module.exports = {
// [GET] /book 요청을 수행합니다.
// 전체 예약 데이터를 조회합니다.
findAll: (req, res) => {
return res.status(200).json(booking);
}
,
// [GET] /book/:phone 요청을 수행합니다.
// 요청 된 phone과 동일한 phone 예약 데이터를 조회합니다.
findByPhone: (req, res) => {
const {phone} = req.params;
const data = booking.filter(book => book.phone === phone);
return res.status(200).json(data);
},
// [GET] /book/:phone/:flight_uuid 요청을 수행합니다.
// 요청 된 id, phone과 동일한 uuid, phone 예약 데이터를 조회합니다.
findByPhoneAndFlightId: (req,res) => {
const {phone, flight_uuid} = req.params;
const data = booking.filter(book => book.phone === phone && book.flight_uuid === flight_uuid);
return res.status(200).json(data);
},
// [POST] /book 요청을 수행합니다.
// 요청 된 예약 데이터를 저장합니다.
create: (req, res) => {
const booking_uuid = uuid();
const { flight_uuid, name, phone } = req.body;
if(booking.find(book => book.phone === phone && book.flight_uuid === flight_uuid )){
return res.status(409).json("It's Already booked.")
}
else{
booking.unshift({booking_uuid, flight_uuid, name, phone});
res.location(`/book/${booking_uuid}`);
return res.status(201).json(booking[0])
}
},
// Optional
// [DELETE] /book/:booking_uuid 요청을 수행합니다.
// 요청 된 id, phone 값과 동일한 예약 데이터를 삭제합니다.
deleteByBookingId: (req, res) => {
const {booking_uuid} = req.params;
booking = booking.filter(book => book.booking_uuid !== booking_uuid);
return res.status(200).json({booking_uuid});
}
};
'코드스테이츠 42기 > [TIL] Section 2' 카테고리의 다른 글
나만의 아고라 스테이츠 서버 만들기 (0) | 2022.12.13 |
---|---|
S2U10 [Web Server] 기초2 (0) | 2022.12.09 |
S2U10 [Web Server] 기초 1 (0) | 2022.12.08 |
S2U9 [React] 클라이언트 Ajax 요청 2 (0) | 2022.12.07 |
S2U9 [React] 클라이언트 Ajax 요청 1 (0) | 2022.12.06 |