S2 . 과제 : StatesAirline Server

Haizel·2023년 2월 13일
0

Front-End Developer 되기

목록 보기
42/70
post-thumbnail

🧨 구조분해할당 파악하기

💡 아래 구조분해할당의 구조에 대해 파악해보자.

const { departure_times, arrival_times, destination, departure } = req.query; 

구조분해 할당이란?

javascript에서 가장 많이 사용되는 두가지 데이터 구조는 ObjectArray이다.
Object : 키별로 데이터 항목을 저장하는 단일 entity를 만들 수 있다.
Array : 데이터 항목을 정렬된 목록으로 수집할 수 있다.
하지만 ObjectArray함수에 전달할 땐 ObjectArray구조가 아닌 → 개별 조각으로 필요하다.
이때 사용할 수 있는 구문이 ‘구조분해할당’으로, 배열.객체의 여러 변수들을 풀어 → 개별적인 변수로 할당, 사용할 수 있는 특수 구문이다.

다시 위 예제로 돌아와서,

const { departure_times, arrival_times, destination, departure } = req.query; 

1. req.query는 클라이언트가 입력한 요청값(request)이다.

/flight?departure_times=2021-12-02T12:00:00&arrival_times=2021-12-03T12:00:00
/flight?departure=ICN&destination=CJUn

2. . req.query의 원래 형태는 아래와 같았을 것이다.

//클라이언트가 입력한 요청값.
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

🧨 범용 고유 식별자 : UUID

const { v4: uuid } = require('uuid'); //랜덤 UUID 부여, 고유 ID이며 보안성 높음.

범용 고유 식별자, UUID(Universally Unique IDentifier)란?

네트워크 상에서 고유성을 보장하는 ID를 만들기 위한 표준규약이다. 32개의 16진수로 구성되어 5개 그룹으로 표시되고, 각 그룹은 붙임표(-)로 구분한다.

  • 버전

버전 1 : MAC주소
버전 2 : DCE 보안
버전 3 : MD5 해시

버전 4 : 랜덤 ←
버전 5 : SHA-1 해시

🔹 최종 결과

1. flightController.js

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);
    }
  }
};

🧨 Advanced : update 또 다른 방법 forEach()

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);
}

2. bookController.js

// 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);
    }
  }
};
  1. airportController.js(소스코드)
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);
  }
};
profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글