💡 아래 구조분해할당의 구조에 대해 파악해보자.
const { departure_times, arrival_times, destination, departure } = req.query;
javascript에서 가장 많이 사용되는 두가지 데이터 구조는
Object
와Array
이다.
Object
: 키별로 데이터 항목을 저장하는 단일 entity를 만들 수 있다.
Array
: 데이터 항목을 정렬된 목록으로 수집할 수 있다.
하지만Object
와Array
를 함수에 전달할 땐Object
와Array
구조가 아닌 → 개별 조각으로 필요하다.
이때 사용할 수 있는 구문이 ‘구조분해할당’으로, 배열.객체의 여러 변수들을 풀어 → 개별적인 변수로 할당, 사용할 수 있는 특수 구문이다.
다시 위 예제로 돌아와서,
const { departure_times, arrival_times, destination, departure } = req.query;
/flight?departure_times=2021-12-02T12:00:00&arrival_times=2021-12-03T12:00:00
/flight?departure=ICN&destination=CJUn
//클라이언트가 입력한 요청값.
req.query = {"11:30", "19:30", "seoul", "paris"}
//구조분해할당
const { departure_times, arrival_times, destination, departure } = req.query;
return departure_times // "11:30"
return arrival_times // "19:30"
return destination // "seoul"
return departure // "paris
const { v4: uuid } = require('uuid'); //랜덤 UUID 부여, 고유 ID이며 보안성 높음.
네트워크 상에서 고유성을 보장하는 ID를 만들기 위한 표준규약이다. 32개의 16진수로 구성되어 5개 그룹으로 표시되고, 각 그룹은 붙임표(-)로 구분한다.
- 버전
버전 1 : MAC주소
버전 2 : DCE 보안
버전 3 : MD5 해시버전 4 : 랜덤 ←
버전 5 : SHA-1 해시
const flights = require('../repository/flightList');
const fs = require('fs');
module.exports = {
// [GET] /flight
// 요청 된 파라미터 departure_times, arrival_times 값과 동일한 값을 가진 항공편 데이터를 조회합니다.
// 요청 된 파라미터 departure, destination 값과 동일한 값을 가진 항공편 데이터를 조회합니다.
//!항공편 조회(클라이언트에게 항공편을 조회할 때)
findAll: (req, res) => {
//클라이언트가 입력한 자료가 req.query이다.
//req.query에 { departure_times, arrival_times, destination, departure } 이 구조분해할당되어있다.
const { departure_times, arrival_times, destination, departure } = req.query;
if(departure_times && arrival_times){ //if departure_times && arrival_times의 값이 있을 때,
let filtered = flights.filter(list => list.departure_times === departure_times && list.arrival_times === arrival_times)
return res.status(200).json(filtered) //요청한 departure_times와 filter 조건인 list의departure_times가 같으면 리턴한다.
}
if(departure && destination){
let filtered = flights.filter(list => list.departure === departure && list.destination === destination)
return res.status(200).json(filtered) //filter한 값들이 담긴 filtered변수를 json처리로 돌려준다.
}
return res.json(flights);
},
// [GET] /flight/:uuid
// 요청 된 uuid 값과 동일한 uuid 값을 가진 항공편 데이터를 조회합니다.
//!클라이언트 고유 ID값을 기준으로 uuid에 맞는 항공편 조회
findById: (req, res) => {
const { uuid } = req.params;
if(req.params.id) { //req.params.id값이 있을 때,
let filtered = flights.filter(list => list.uuid === req.params.id)
return res.status(200).json(filtered)
}
return res.json(flights);
},
//uuid는 고유한 값이므로(params = path파라미터) -> req.params 이용
//departure_times, arrival_times, destination, departure는 입력값에 따라 변하는 값이므로 -> req.query이용
// Advanced
// [PUT] /flight/:uuid 요청을 수행합니다.
// 요청 된 uuid 값과 동일한 uuid 값을 가진 항공편 데이터를 요청 된 Body 데이터로 수정합니다.
//!클라이언트에서 고유 ID값을 기준으로 항공편을 수정할 때 사용하는 API
/*-> 요청에 포함된 {:uuid}값과 동일한 uuid값을 가진 항공편을 수정한다.
case1. req.params.uuid !== 요청 uuid : 그대로 동일
case2. req.params.uuid === 요청 uuid : 요청한 uuid의 항공편 데이터로 교체되어야함.
=> Object.assign()메서드를 활용하면 될듯
//? Object.assign()메서드 : 출처 객체들의 모든 열거 가능한 자체 속성을 복사해 -> 대상 객체에 붙여 넣고 그 대상 객체를 반환한다.
//*Object.assign(target, ...sources)
target : 목표 객체. 출처 객체의 속성을 복사해 반영한 후 -> 반환할 객체
sources : 출처 객체. 목표 객체에 반영하고자 하는 속성을 가진 객체들
//*설명 : 목표 객체의 속성 중 출처 객체와 동일한 '키'를 갖는 속성의 경우 -> 그 속성 값은 출처 객체의 속성값으로 덮어쓴다.
만약 출처 객체들의 속성 중 키가 겹칠 겨우 -> 뒤쪽 객체의 속성 값으로 덮어진다.
mdn : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
//* Object.assign()은 단순히 복사 or 새로 정의가 아닌 -> 할당(assing)의 개념이다.
*/
update: (req, res) => {
const { uuid } = req.params;
const bodyData = req.body;
// TODO:
if(req.params){
let filtered = flights.filter(list => list.uuid === req.params.uuid) //filtered엔 req.params.uuid과 동일한 uuid인 데이터값이 담김.
//filtered한 데이터 값을 원래 데이터인 req.body에 새로 할당한다(만약 동일한 key값이 있으면 filtered data로 덮어진다(후순위이니까))
let updateData = Object.assign(filtered[0], bodyData);
return res.status(200).json(updateData);
}
}
};
update : async(req, res) => {
let date;
flights.forEach((item, index) => {
if(item.uuid === req.params.id) {
flights[index] = {...item, ...req.body}; //그냥 item에 배정해주면 실행되지 않음.
data = flights[index];
}});
return res.status(200).json(data);
}
// POST /book에서 사용할 uuid입니다.
const { v4: uuid } = require('uuid');
const { listenerCount } = require('../app');
const { filter } = require('../repository/flightList');
// 항공편 예약 데이터를 저장합니다.
let booking = [];
module.exports = {
// [GET] /book 요청을 수행합니다.
// 전체 예약 데이터를 조회합니다.
//!클라이언트에게 모든 예약을 조회할 때
findAll: (req, res) => {
return res.status(200).json(booking); //조회한 전체 예약 데이터를 -> 변수 booking에 담는다.
}, //현재 변수 booking엔 조회한 전체 예약데이터가 들어가있다.
// [GET] /book/:phone 요청을 수행합니다.
// 요청 된 phone과 동일한 phone 예약 데이터를 조회합니다.
//!특정 예약자 전화번호에 맞는 예약 조회
findByPhone: (req, res) => {
const {phone} = req.params;
if(req.params.phone){
let filtered = booking.filter(list => list.phone === req.params.phone)
return res.status(200).json(filtered)
}
},
// [GET] /book/:phone/:flight_uuid 요청을 수행합니다.
// 요청 된 id, phone과 동일한 uuid, phone 예약 데이터를 조회합니다.
//!클라이언트에게 특정 예약자 전화번호와, 항공편 uuid에 맞는 예약 조회
findByPhoneAndFlightId: (req,res) => {
const {phone, flight_uuid} = req.params;
// TODO:
if(req.params.phone && req.params.flight_uuid){
let filtered = booking.filter(list => list.phone ===req.params.phone && list.flight_uuid === req.params.flight_uuid)
return res.status(200).json(filtered);
}
return res.json(booking);
},
// [POST] /book 요청을 수행합니다.
// 요청 된 예약 데이터를 저장합니다.
//!클라이언트에게 예약을 생성할 때 사용하는 API
create: (req, res) => {
// POST /book에서 사용할 booking_uuid입니다.
const booking_uuid = uuid();
booking.push(req.body); //booking변수에 요청한 예약 데이터를 새로 넣는다.
return res.status(200).json(booking);
// TODO:
},
// Optional
// [DELETE] /book/:booking_uuid 요청을 수행합니다.
// 요청 된 id, phone 값과 동일한 예약 데이터를 삭제합니다.
//!클라이언트에게 특정 항공편 예약을 삭제할 때 사용하는 API
deleteByBookingId: (req, res) => {
const {booking_uuid} = req.params;
// TODO
if(req.query.phone && req.query.id){
booking = booking.filter(list => list.phone !== req.query.phone && list.id !== req.query.id)
return res.status(200).json(booking);
}
}
};
const airports = require('../repository/airportList');
module.exports = {
// [GET] /airport?query={query} 요청을 수행합니다.
// 공항 이름 자동완성 기능을 수행합니다!
findAll: (req, res) => { //요청과 응답
if (req.query.query !== undefined) { //존재하지 않을 시,
console.log(req.query.query); //
const filteredAirports = airports.filter((airport) => { //-> 필터로 조건에 맞는 것만 가져오기
return airport.code.includes(req.query.query.toUpperCase());
});
return res.status(200).json(filteredAirports);
}
res.json(airports);
}
};