NestJS에서 HTTP Method Get, Head 등록 우선순위 문제를 알아보자 #HTTP #GET #HEAD
HTTP Method인 GET과 HEAD를 사용하여 파일의 메타정보(예: 용량)를 확인한 후 다운로드하는 로직을 개발하던 중, HEAD 요청을 보내더라도 GET 핸들러가 호출되는 현상을 발견하였다.
해당 라우팅 로직은 GET과 HEAD 요청 모두 S3 Bucket으로부터 presigned URL을 생성한 뒤, 클라이언트를 해당 URL로 리다이렉트하는 방식이다. HEAD 요청임에도 GET 핸들러가 실행되는 것이 이상하여 리서칭을 진행한 결과, StackOverflow의 이 글과 Express 공식 문서에 따르면 Express 4.x에서는 "first come, first served", 즉 먼저 정의된 라우트가 우선 처리된다는 규칙이 있음을 확인할 수 있었다.
실제 코드를 다시 확인해보니 GET 메서드가 HEAD보다 먼저 선언되어 있었고, 이로 인해 HEAD 요청이 GET 핸들러에 의해 처리된 것이었다. 이를 해결하기 위해 GET과 HEAD 요청을 동일한 라우팅 경로에서 처리하되, 내부에서 req.method를 통해 분기 처리하는 방식으로 수정하였다.
이런 세세한 부분들을 마주할때마다 특정 프레임워크나 기술 스택에 깊은 이해를 가진 "좁은 분야의 전문가"가 얼마나 중요한지 절실히 깨닫는다.
겉보기에는 단순한 HTTP Method 처리의 차이처럼 보이지만, 실제로는 프레임워크 내부의 요청 처리 순서나 표준 명세에 대한 해석, 그리고 이를 구현체가 어떻게 반영했는지를 정확히 이해해야만 원인을 파악하고 적절한 해결책을 찾을 수 있다.
결국, 복잡도가 낮아 보이는 부분일수록 사소한 차이 하나가 전체 로직의 흐름이나 결과에 큰 영향을 줄 수 있으며, 이러한 미묘한 차이를 짚어내는 데에는 해당 분야에 대한 전문성과 경험이 큰 역할을 한다.