CRUD API ++

2024. 4. 4. 02:55·개발공부

코드

https://github.com/kisusu115/CRUD_Node-MongoDB

HTTP 메서드

라우터 구현 부분에서, 문득 든 생각이 이 4개의 메서드가 사실상 POST로 모두 대체 가능한 것은 아닌가 생각이 들었다..

 

GET은 URL에서 간단한 문자열을 통해 데이터를 요청하고,

POST는 body를 통해 상대적으로 다량의 데이터를 전송받는다.

PUT은 리소스를 생성하거나 수정하기위해 사용하나, 주로 전체 업데이트에 사용되나, 사실상 POST와 같은 기능을 하기에 분기를 나누는 용도를 제외하고는 비슷한 메서드가 아닌가 라는 생각이 들었다

DELETE는 문자 그대로 리소스의 삭제에 사용되는데, DELETE로 받았어도 내가 처리를 어떻게 하냐에 따라 삭제의 기능을 수행하지 않을 수도 있기에, GET과 어느정도 비슷한 느낌이 들었다.

 

그리고 GET과 POST 또한, 세부적인 것을 모두 제외하고 생각하면, BODY 유무에 따라서만 달라지는 메서드가 아닌가 라는 생각이 들었고, 결과적으로 POST로 모든 메서드를 대체할 수 있어 보였다.

 

그러나 GET과 POST는 목적이 다른 메서드이기에, 이를 임의로 교체하는 것은 프로토콜의 의미를 왜곡할 뿐만 아니라 의도하지 않은 동작을 유발할 수 있다는 것이었다. 예를들어, GET 요청은 서버에 상태 변경을 요구하지 않지만, POST 요청은 그렇지 않으며, GET 요청은 브라우저에서 캐시될 수 있지만, POST 요청은 그렇지 않다고 한다.

 

HTTP 메서드에 대해 좀 더 확실한 이해를 해야겠다는 필요성을 느꼈다..

 

추가 기능 구현과 mongoose 메서드

기존에는 Read와 Delete를 모두 Id를 기준으로 동작했기에, 이름과 같은 요소를 기준으로 돌아가게 구현해보고 싶었다.

이를 위해 Name을 Key로 가질만한 컬렉션(MongoDB)의 추가가 필요했고, Employee 컬렉션을 추가하여 name, salaryPerHour, workingTime값을 가지게 하였다.

 

기존의 mongoose 메서드에서, find(조건) / deleteOne() / deleteMany() 메서드를 돌려보았고, deleteOne의 경우 조건에 의해 여러 값이 선택 될 경우 0번째 요소가 삭제되고, deleteMany()는 조건에 해당되면 전부 다 삭제하였다.

이는 updateOne()와 updateMany()에서도 동일했다.

메서드는 https://mongoosejs.com/docs/api/model.html#model_Model.find 에서 찾아보았다.

 

find()의 경우 처음엔 URL 라우트를 "/:name"으로 하였다가, 기존의 "/:id"와 중복되어 오류가 발생하였고, "/:flag/:value"로 분기를 나누어서 구현했다. 하지만 이 라우트 역시 추후의 "byName/name"에서 "byName"이 "flag"로 인식되는 오류가 발생해서 결과적으로 "/search/:flag/:value"로 바뀌었다.

라우트 설정 시, 분기를 나누고 가독성있게 설정하는 것이 중요하다는 것을 맞으면서 배우게 되었다..

const getEmployeeByFlag = async (req, res) => {
  try {
    const params = req.params;
    let validEmployees = null;
    if (params.flag == "id") {
      validEmployees = await Employee.findById(params.value);
    } else if (params.flag == "name") {
      validEmployees = await Employee.find({ name: params.value });
    } else {
      res.status(400).json({ message: "flag 값이 잘못되었습니다." });
    }
    if (!validEmployees) {
      res.status(400).json({ message: "valid한 employee가 없습니다." });
    } else {
      res.status(200).json(validEmployees);
    }
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

 

Id에 해당하는 직원의 주급을 계산하는 getEmployeeWeeklySalary 메서드도 controller에 구현하여, get("/weeklySalary/:id")에 적용하였다. 생각보다 잘 적용되어 다행이었다.

 

DeleteOne() 실행 시 결과

deleteOne() 이전 DB상황
삭제된 인원 : 1명
가장 처음에 추가했던 요소만 삭제된 DB 결과

 

'개발공부' 카테고리의 다른 글
  • CRUD API Tutorial
kisusu
kisusu
  • kisusu
    KISUSU
    kisusu
  • 전체
    오늘
    어제
    • 분류 전체보기 (9)
      • 개발기록 (4)
        • SweetBalance (4)
      • 개발공부 (2)
      • 개념정리 (2)
      • 알고리즘 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SecurityConfig
    인가
    mongoDB
    개발공부
    개념정리
    개발자 유미
    JWT
    NoSQL
    CRUD
    CORS
    통합 로그인 구현
    스프링
    node.js
    redis
    리프레시 토큰
    인증
    스프링 시큐리티
    Top-Down
    셀레니움
    Selenium
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
kisusu
CRUD API ++
상단으로

티스토리툴바