Unit10 - [Web Server] 기초, StatesAirline Server 과제

44523·2023년 2월 2일

서버 구현에 익숙하지 않아 헤메었지만 미숙하게나마 완성한것 같다.

<구현해야 할 목록>

항상 같은 프로세스이지만 과제를 접했을때 혼란스러움을 최대한 줄이기 위해서는 어떤 파일들이 어떤곳에 영향을 주고 있는지, 구조가 어떻게 되어 있는지를 빠르게 파악하는것이 중요한 것 같다.

과제 파일 목록

  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 스펙을 가지고 있으며 코드 테스트를 위한 테스트 케이스가 작성되어 있습니다.

과제의 목표

  1. express 프레임워크를 이용하여 StatesAirline 서버를 구현하고 로컬 호스트와 연결
  2. 클라이언트의 요청에 따라 항공편 및 예약 데이터를 조회하고 생성 및 수정/삭제를 할 수 있어야 한다.

flightController.js

GET 요청에 query에는 클라이언트가 입력한 데이터가 들어오는데 이 데이터를 활용하여 flight에서 동일한 값을 가진 데이터를 filter를 이용하여 리턴해주는 작업이 필요했다.

uuid값도 마찬가지의 작업을 하였다.

update부분이 좀 헷갈리고 어려웠는데 이부분은 이해가 더 필요할 것 같다.

update: (req, res) => {
    const { uuid } = req.params;
    const bodyData = req.body;
    // TODO:
    let list = flights;
    const index = flights.findIndex((obj) => obj.uuid == uuid);

    list[index] = {
      uuid: uuid,
      departure: bodyData.departure
        ? bodyData.departure
        : list[index].departure,
      destination: bodyData.destination
        ? bodyData.destination
        : list[index].destination,
      departure_times: bodyData.departure_times
        ? bodyData.departure_times
        : list[index].departure_times,
      arrival_times: bodyData.arrival_times
        ? bodyData.arrival_times
        : list[index].arrival_times,
    };

    fs.writeFileSync(
      "statesairline/repository/flightList.js",
      "module.exports = " + JSON.stringify(list)
    );

    return res.status(200).json(list[index]);
  },
};

<내가 작성한 코드>

update: (req, res) => {
    const { uuid } = req.params;
    const bodyData = req.body;
    // TODO:

    let findIndex; //flights 배열의 요소들 중 uuid가 같은 요소의 인덱스를 담을 변수
    for (i = 0; i < flights.length; i++) {
      if (flights[i].uuid === uuid) {
        findIndex = i;
      }
    }
    flights[findIndex] = { ...flights[findIndex], ...bodyData };
    //flights[findIndex]의 요소였던 객체를 스프레드 연산자를 이용해 풀어서 새로운 객체 안에 넣고,
    // bodyData로 받아온 객체도 풀어서 새로운 객체 안에 넣음
    //뒤에 들어온 객체에 동일한 key가 있을 때 뒤에 들어온 값을 따르게 됨
    return res.status(200).json(flights[findIndex]);
  },

<스프레드를 이용한 코드>

bookController.js

이부분 또한 booking에 있는 데이터중 동일한 값을 가진 데이터를 filter로 리턴해주면 된다.

구조분해 할당을 더 이해하여 코드를 깔끔하게 다시 작성할 수 있어야할 것 같다.

create 함수 부분의 body부분으로 좀 애를 먹었는데, 요청 객체인 req.body때문이었다. req.body는 POST 방식으로 넘어오는 파라미터를 담고 있다고 한다.

// const {flight_uuid, name, phone} = req.body
    // 구조분해할당을 통해 키 값들을 변수처럼 사용할 수 있다 
    // const newBook = {
    //   booking_uuid,
    //   flight_uuid,
    //   name,
    //   phone
    //  }
    //  booking.push(newBook);
    //  res.status(201).json(newBook)},

deleteByBookingId

deleteByBookingId: (req, res) => {
    const {booking_uuid} = req.params;
    booking = booking.filter(book => book.booking_uuid !== booking_uuid);
    return res.status(200).json({booking_uuid});

요청된 id, phone 값과 동일한 예약 데이터를 삭제해주어야 한다.
filter를 통해 같지 않은 값을 담아주면 동일한 예약 데이터를 제외한 나머지가 리턴되기 때문에 해결.

0개의 댓글