과제 목표
flight Router
✓ GET /flight 요청은 파싱 가능한 JSON 문자열을 돌려줘야 합니다
✓ GET /flight 요청의 응답은 배열의 형태여야 합니다
✓ GET /flight 요청의 응답 객체는 `uuid, departure, destination, departure_times, arrival_times`를 포함해야 합니다
✓ GET /flight?departure_times=2021-12-03T12:00:00&arrival_times=2021-12-03T12:00:00를 입력하면 조건에 해당하는 객체를 응답으로 보냅니다
✓ GET /flight?departure=CJU&destination=ICN 을 입력하면 조건에 해당하는 객체를 응답으로 보냅니다
✓ GET /flight/:uuid 요청의 응답 객체는 `uuid, departure, destination, departure_times, arrival_times`를 포함해야 합니다
Book Router
✓ GET /book 요청의 응답은 배열의 형태여야 합니다
✓ GET /book 요청은 파싱 가능한 JSON 문자열을 돌려줘야 합니다
✓ POST /book 요청시, uuid, name, phone 데이터가 booking 배열에 객체 형태로 저장되어야 합니다.
✓ GET /book/:phone 요청은 특정 예약자 전화번호에 대한 예약 데이터를 응답으로 보냅니다
✓ GET /book/:phone/:flight_uuid 요청은 특정 항공편의 예약자 전화번호에 대한 예약 데이터를 응답으로 보냅니다
Advanced Challenges
✓ PUT /flight/:uuid 요청의 업데이트 된 객체를 응답으로 보냅니다
✓ PUT /flight/:uuid 요청의 일부 데이터만 업데이트 된 객체를 응답으로 보냅니다
참고 자료
Express 공식 문서
Express - Node.js 웹 애플리케이션 프레임워크
Node.js를 위한 빠르고 개방적인 간결한 웹 프레임워크 $ npm install express --save
expressjs.com
내가 겪은 시행착오와 새로 알게된 것
Express와 미들웨어
지난 시간에는 node.js만 사용해서 서버를 구현했는데, 이번 과제에서는 Express를 사용했다.
Express는 node.js 환경에서 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 프레임워크다.
node.js만 이용할 때는 CORS 헤더를 매번 설정해 줘야 하고 요청 body를 받아오는 작업도 직관적이지 않고 복잡했는데,
Express에서 제공되는 미들웨어를 사용하니 번거로운 작업 없이 응답 내용 작성에만 집중할 수 있었다.
미들웨어는 두 애플리케이션 사이를 연결해 데이터를 주고 받을 수 있도록 중간에서 매개 역할을 한다.
Express 미들웨어는 node.js와 http 요청/응답 사이를 연결해서 작업을 처리해 준다.
미들웨어를 자주 사용하는 상황은 다음과 같다.
1. POST 요청 등에 포함된 body(payload)를 구조화할 때(쉽게 얻어내고자 할 때)
2. 모든 요청/응답에 CORS 헤더를 붙여야 할 때
3. 모든 요청에 대해 url이나 메서드를 확인할 때
4. 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때
이번 과제에서는 1번과 2번의 경우에 해당하는 미들웨어를 사용했다.
CORS 헤더를 붙일 때 node.js에서는 origin, method, header, max-age 등을 설정하는 헤더를 만들고
writeHead나 setHeader 메서드를 사용해서 헤더를 붙여줬었는데
Express 미들웨어를 사용하니 단 두 줄로 CORS 설정을 할 수 있었다... Express 외않써??!?
const cors = require('cors');
app.use(cors());
req.params, req.query
req.params는 라우터의 매개변수, req.query는 쿼리 스트링의 매개 변수에 대한 속성이 포함 된 개체다.
라우트 경로가 /user/:name이라면, “name” 값은 req.params.name으로 접근할 수 있다.
req.query는 URI에서 물음표 뒤의 매개변수에 대한 값이므로 '/users?name=john&age=25'라는 URI에서
req.query.name과 req.query.age로 name과 age라는 매개변수에 대한 값에 접근할 수 있다.
put 요청
이번 과제에서 처음으로 put 요청을 다루게 되었다.
get과 post는 여러 번 다뤘는데 put 요청은 처음이라 낯을 좀 가렸다..😅
기존의 데이터(여기서는 flight 데이터)를 가져와 새로운 수정된 데이터로 교체하는 작업을 해야 했는데
포인트는 수정 대상이 아닌 데이터들은 건드리면 안 된다는 것!
특정 uuid로 가져온 비행편 데이터에서 출발지와 도착지만 바꾸고 출도착 시간은 바꾸지 않아야 했다.
요 작업을 하느라 좀 헤맸는데 ⭐️페어님이⭐️ 도와주셔서 해결할 수 있었다!!! 그저 빛..!!
update: (req, res) => {
const { uuid } = req.params;
const bodyData = req.body;
const flightToUpdate = flights.filter((flight) => flight.uuid === uuid)[0];
if (bodyData.departure) flightToUpdate.departure = bodyData.departure;
if (bodyData.destination) flightToUpdate.destination = bodyData.destination;
if (bodyData.departure_times)
flightToUpdate.departure_times = bodyData.departure_times;
if (bodyData.arrival_times)
flightToUpdate.arrival_times = bodyData.arrival_times;
return res.status(200).json(flightToUpdate);
// TODO:
},
각각의 key값에 해당하는 요청이 있는지 확인하고 그때만 수정을 해주는 방식!
그렇게 advanced challenge까지 (중간에 좀 고난이 있긴 했지만) 즐겁게 해결했다.
'프로젝트 > 미니 프로젝트 & 과제' 카테고리의 다른 글
[미니 프로젝트] COZ Shopping 솔로프로젝트 회고 (4) | 2023.05.19 |
---|---|
[과제] 피그마 클론 (0) | 2023.04.17 |
[과제] Mini node server (2) | 2023.04.04 |
[과제] 반복문으로 map, filter, reduce 만들기 (2) | 2023.03.17 |
[미니 프로젝트] 나만의 아고라스테이츠 만들기 (0) | 2023.03.11 |