Nuxt 3에서 API 라우트, 정확히 어디에 만들어야 할까?

Nuxt 3를 사용하다 보면 API 라우트를 어디에 만들어야 하는지 헷갈릴 때가 많습니다. server/api/server/routes/ 폴더의 차이를 모르면, 의도와 다르게 API가 동작하지 않아 당황할 수 있죠. 이번 글에서는 Nuxt 3에서 API를 올바르게 만드는 방법, 그리고 구조별 차이점을 명확하게 정리합니다.


✅ Nuxt 3에서 API는 server/api/에 만들어야 해

Nuxt 3의 공식 규칙에 따라, JSON API나 비동기 데이터 처리를 원한다면 반드시 server/api/ 폴더에 파일을 만들어야 정상적으로 API로 동작합니다.

server/routes/api/처럼 만들면 Nuxt가 해당 파일을 API로 인식하지 않고, 일반적인 페이지 응답(HTML, 텍스트 등)으로 처리할 수 있습니다.


📁 Nuxt 3의 올바른 폴더 구조

Nuxt 3에서는 다음처럼 폴더를 구성하는 것이 가장 명확합니다.

server/
├── api/
│   └── ping-search.ts   ✅ ← 여기에 넣은 파일만 API 엔드포인트가 됨
├── routes/
│   └── sitemap.xml.ts   ✅ ← 여긴 XML/텍스트 같은 페이지 응답용
  • server/api/
    • JSON 데이터 또는 동적 처리가 필요한 API 엔드포인트
    • 예시: /api/ping-search
  • server/routes/
    • 브라우저에서 직접 접근할 수 있는 HTML, XML, robots.txt, sitemap 등
    • 예시: /sitemap.xml, /robots.txt

📌 Nuxt 3의 동작 규칙 — 표로 비교!

폴더용도예시
server/api/JSON API, 비동기 처리용/api/ping-search
server/routes/브라우저에서 직접 접근하는 페이지 응답/sitemap.xml, /robots.txt

server/routes/api/something.ts처럼 만들면, Nuxt가 해당 파일을 API로 인식하지 않고 단순 페이지 응답으로 처리할 수 있으니 주의해야 합니다.


✅ 구조별 동작 차이 — 실제 예시

경로동작
server/api/ping-search.tsfetch('/api/ping-search')로 정상 접근
server/routes/ping-search.ts❌ API가 아니라, HTML/텍스트 등 페이지 응답
server/routes/api/ping-search.ts⚠️ 혼란 유발, Nuxt에서 권장하지 않음

Nuxt 3 API 파일 위치, 왜 이렇게 중요할까?

Nuxt가 내부적으로 라우터를 생성할 때 폴더 위치 기반으로 자동 인식하기 때문입니다.

  • server/api/ 내 파일만 JSON API로서의 처리가 적용됩니다.
  • 그 외 경로(server/routes/ 등)는 HTML, XML, 일반 텍스트 등 페이지 응답용으로만 동작합니다.

이 차이를 모르고 API 파일을 잘못된 위치에 두면,

  • API가 404로 뜨거나
  • 예상과 달리 JSON이 아니라 HTML/text로 응답되는 문제가 발생할 수 있습니다.

정리

  • API를 만들려면 반드시 server/api/ 폴더에 파일을 두세요.
  • server/routes/는 HTML/텍스트 등 브라우저에서 직접 접근하는 정적/동적 페이지 응답용입니다.
  • Nuxt의 라우트 자동 생성 규칙을 잘 활용하면, 코드를 더 명확하게 관리할 수 있습니다.

실제 개발 중 혼동하기 쉬운 부분이지만, 폴더 구조만 명확히 이해하면 어렵지 않게 해결할 수 있습니다. 필요하다면 다음 글에서 Nuxt 3의 API 핸들러에서 POST 요청이나 파라미터 처리 방법, 실전 예제도 자세히 다뤄보겠습니다.