Next.js 13(App Router) API Routes - 405, 500 Error ํ•ด๊ฒฐ

์ •์œค์ˆ™ยท2024๋…„ 1์›” 25์ผ
2

Project

๋ชฉ๋ก ๋ณด๊ธฐ
11/12
post-thumbnail

๐Ÿ“’ ์˜ค๋Š˜์˜ ๊ณต๋ถ€

1. Next.js 13(App Router) API Routes Test

405(Method Not Allowed), 500(Internal Server Error) ํ•ด๊ฒฐ

1. Next.js API Routes Test ๋ฐฐ๊ฒฝ

  • Next.js๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ์—์„œ GPT AI๋ฅผ ์—ฐ๋™ํ•˜๊ธฐ ์ „, API Routes๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•˜๋Š”์ง€ test๋ฅผ ํ–ˆ๋‹ค.

API Routes code

  • ๐Ÿ‘‰๐Ÿป Next.js API Routes ๊ณต์‹๋ฌธ์„œ

  • ๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” ๊ฒฝ๋กœ๊ฐ€ pages/api๋กœ ๋˜์–ด ์žˆ๋Š”๋ฐ Next.js 13์—์„œ๋Š” pages ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ๋‹ค.

    • testApi ๊ฒฝ๋กœ -> src/app/api/testApi/route.ts

๐Ÿ’ก Next.js 13 API Routes ๊ฒฝ๋กœ

  • apiํด๋” ์•ˆ์— api์ด๋ฆ„์œผ๋กœ ๋œ ํด๋” ๋ฐ ํ•˜์œ„ route.tsํŒŒ์ผ์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ฐ”๋กœ testTwo.ts์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ๋งŒ๋“ค ๊ฒฝ์šฐ 404 error ๋ฐœ์ƒ


  • Client์—์„œ๋Š” api ํด๋” ์ด๋ฆ„์„ url์˜ endpoint๋กœ ๋ณด๊ณ  ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค.
    ex. const response = await fetch('/api/testApi');

Client code

  • src/app/page.tsx
  • ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด api๋ฅผ callํ•˜๋Š” handleApiTest ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ–ˆ๋‹ค.

2. 405 (Method Not Allowed) ๋ฐœ์ƒ

  • api call ํ•จ์ˆ˜์™€ ์—ฐ๊ฒฐ ๋œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ 405 Error ๋ฐœ์ƒ

๐Ÿ’ก 405 (Method Not Allowed)

  • 405 Error๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŠน์ • URL์— ๋Œ€ํ•ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ, ์„œ๋ฒ„ ์ธก์—์„œ ํ•ด๋‹น ์š”์ฒญ ๋ฐฉ๋ฒ•์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•œ๋‹ค.

  • 405 Error๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ 

    • ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ ์˜ค๋ฅ˜ / CORS (Cross-Origin Resource Sharing) ๋ฌธ์ œ / ๋ผ์šฐํŠธ ๋ฐ ๋ฉ”์†Œ๋“œ ์ผ์น˜
    • ๋ผ์šฐํŠธ ๋ฐ ๋ฉ”์†Œ๋“œ ์ผ์น˜์˜ ๊ฒฝ์šฐ -> Next.js API Routes์—์„œ๋Š” ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด ํ•ด๋‹น ์—”๋“œํฌ์ธํŠธ์˜ HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ 405 Error๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ•ด๊ฒฐ ๊ณผ์ •

    • ์ผ๋ฐ˜์ ์œผ๋กœ Next.js API ๋ผ์šฐํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ทœ์น™์€ ํ•จ์ˆ˜ ์ด๋ฆ„์ด HTTP ๋ฉ”์†Œ๋“œ์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ => api ๋‚ด์—์„œ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ GET์œผ๋กœ ๋ณ€๊ฒฝ
    • ์ผ๋ฐ˜์ ์œผ๋กœ API Routes์—์„œ๋Š” export dafult ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ export ํ•จ์ˆ˜ ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค => default๋ฅผ ์ง€์šฐ๊ณ  export async function GET์œผ๋กœ ๋ณ€๊ฒฝ
  • ์ฝ”๋“œ ์ˆ˜์ • ๊ฒฐ๊ณผ

    • 405 Error๊ฐ€ ๋ฐœ์ƒํ•˜๋˜ code

    • 405 Error๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” code

3. 500(Internal Sever Error) ๋ฐœ์ƒ

  • 405 Error๋Š” ํ•ด๊ฒฐ๋˜์—ˆ์ง€๋งŒ ๋ฐ”๋กœ 500 Error๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๐Ÿ’ก 500(Internal Sever Error)

  • ์„œ๋ฒ„ ์ธก์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” HTTP ์ƒํƒœ ์ฝ”๋“œ๋กœ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์„œ๋ฒ„์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

  • 500 Error๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ 

    • ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ ์˜ค๋ฅ˜ / ์„œ๋ฒ„ ์ž์› ๋ถ€์กฑ / ์™ธ๋ถ€ ์„œ๋น„์Šค ์˜ค๋ฅ˜ / ๊ถŒํ•œ ๋ฌธ์ œ
    • ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ ์˜ค๋ฅ˜์˜ ๊ฒฝ์šฐ -> ์„œ๋ฒ„ ์ธก ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ. ์ด๋Š” ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ, ์ž˜๋ชป๋œ ๊ตฌํ˜„, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜ค๋ฅ˜ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

4. ๋ชจ๋“  ๋ฌธ์ œ์˜ ์ตœ์ดˆ ์›์ธ ๋ฐœ๊ฒฌ

  • Next.js ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ๋Š” pages router๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ / app router ์‚ฌ์šฉํ•  ๋•Œ๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ๊ณต์‹๋ฌธ์„œ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ Next.js๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ๋Š” App Router๋ฅผ ์‚ฌ์šฉ์ค‘์ธ๋ฐ ๊ณต์‹๋ฌธ์„œ๋Š” Pages Router์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์† ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ๊ฒƒ
    • App Router ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.
    • ๐Ÿ‘‰๐Ÿป App Router - Route Handlers ๊ณต์‹๋ฌธ์„œ
    • ๐Ÿ‘‰๐Ÿป App Router - NextResponse ๊ณต์‹๋ฌธ์„œ

5. API Routes Test ์ •์ƒ ์ž‘๋™ํ•˜๋Š” ์ „์ฒด์ฝ”๋“œ

  • Api code

    // src/app/api/testApi/route.ts
    import { NextResponse } from "next/server";
    
    export async function GET(request: Request) {
      return NextResponse.json({ message: 'Hello from Next.js!' })
    }
  • Client code

    // src/app/page.tsx
    
    // api test
    const handleApiTest = async () => {
      try {
        const response = await fetch('/api/testApi');
    
        if (response.ok) {
          const data = await response.json();
          console.log('Response status:', response.status);
          console.log('Response message:', data.message);
        } else {
          console.log('API ์š”์ฒญ ์‹คํŒจ');
        }
      } catch (error) {
        console.error('API ์š”์ฒญ ์˜ค๋ฅ˜:', error);
      }
    };
    
    		...
      
    {/* api Test button */}
    <Button onClick={handleApiTest}>Api test</Button>


๋ฐฐ์šด ๊ฒƒ

  • ๋ฐ”๋กœ ๋ˆˆ ์•ž์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์— ์‹œ์•ผ๊ฐ€ ๋” ์ข์•„์ง€๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ–ˆ๋‹ค.
    • ex. 405 Error ํ•ด๊ฒฐ ํ›„ ์ƒ๊ธด 500 Error ํ•ด๊ฒฐ์—๋งŒ ์ง‘์ค‘
    • ํ•„์š”ํ•œ ๊ฒƒ์€ ์ฒ˜์Œ์— ์™œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๋” ์ƒ์œ„ ์ˆ˜์ค€์˜ ์ ‘๊ทผ
    • ํŠนํžˆ Next.js ์ฒ˜๋Ÿผ Pages Router, App Router ๋“ฑ์œผ๋กœ ๋ฒ„์ „์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•  ๋•Œ๋„ ์˜ฌ๋ฐ”๋ฅธ ๋ฒ„์ „์˜ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์žˆ๋Š”์ง€๋„ ํ•œ ๋ฒˆ ๋” ํ™•์ธํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ๋‹ค.
profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€