Next.js Route Handler Server Actionsnext.js routernext.js route handlernext.js server actionsnext.js data fetching

Next.js에서 Route Handler와 Server Actions의 차이점

KUKJIN LEE
KUKJIN LEE
2024년 5월 23일
668

Next.js를 사용하면서 데이터 페칭을 할 때, "Route Handlers"와 "Server Actions"라는 두 가지 주요 방법이 있습니다. 이 두 가지는 각각의 목적과 사용 사례가 다릅니다.

 

주요 차이점

  • 공개 여부: Route Handlers는 외부에서 API처럼 호출할 수 있지만, Server Actions는 주로 내부 로직에서 사용됩니다.

  • 설정의 용이성: Server Actions는 설정이 간단하며, 클라이언트와 서버 컴포넌트 모두에서 호출할 수 있습니다.

  • 응답 형식 제어: Route Handlers는 다양한 응답 형식을 반환할 수 있어 더 유연한 제어가 가능합니다.

  • 사용 사례: Route Handlers는 복잡한 서버 로직이나 외부 호출을 위한 API에 적합하며, Server Actions는 폼 데이터 처리나 간단한 이벤트 핸들링에 적합합니다.

 

Route API를 사용하면 외부에서 악의적인 사용자가 API를 통해 데이터를 조작할 위험이 있습니다. 이를 방지하기 위해 서버 액션(Server Actions)을 사용하여 내부 로직으로 숨길 수 있습니다. 이렇게 하면 API가 외부에 노출되지 않고, 애플리케이션 내부에서만 안전하게 데이터를 처리할 수 있습니다.

 

공개 API를 사용하는 경우 (Route Handlers)

만약 공개 API를 통해 POST 요청을 처리하게 되면, 외부에서 누구나 해당 API를 호출하여 데이터를 작성할 수 있습니다. 예를 들어, 다음과 같이 공개된 API를 설정할 수 있습니다.

 

// app/api/post/route.js
export async function POST(request) {
    const data = await request.json();
    // 데이터베이스에 새로운 포스트를 저장하는 로직
    await savePostToDatabase(data);
    return new Response(JSON.stringify({ success: true }), { status: 201 });
}

 

위의 예시에서는 /api/post 엔드포인트를 통해 POST 요청을 처리합니다. 이 엔드포인트는 외부에서 호출될 수 있기 때문에 보안상의 위험이 있습니다.

 

서버 액션을 사용하는 경우

반면, 서버 액션을 사용하면 이러한 작업을 내부적으로 처리할 수 있습니다. 서버 액션은 클라이언트에서 직접 호출할 수 없으므로 외부 공격으로부터 더 안전합니다.

 

// app/lib/actions/postActions.js
export async function createPost(data) {
    // 데이터베이스에 새로운 포스트를 저장하는 로직
    await savePostToDatabase(data);
}
// 서버 컴포넌트에서 서버 액션을 호출하여 사용
import { createPost } from '@/lib/actions/postActions';
export default async function PostComponent() {
    const handleSubmit = async (event) => {
        event.preventDefault();
        const data = {
            title: event.target.title.value,
            content: event.target.content.value,
        };
        await createPost(data);
        // 성공 시 사용자에게 알림
    };
    return (
        <form onSubmit={handleSubmit}>
            <input type="text" name="title" placeholder="Title" required />
            <textarea name="content" placeholder="Content" required></textarea>
            <button type="submit">Create Post</button>
        </form>
    );
}

 

결론

서버 액션을 사용하면 API 엔드포인트가 외부에 노출되지 않아 보안상 더 안전합니다. 이는 특히 민감한 데이터나 중요한 작업을 처리할 때 매우 유용합니다. 공개 API(Route Handlers)는 외부에서 데이터를 접근하거나 사용할 필요가 있을 때 유용하며, 서버 액션은 내부 로직을 보호하고 보안을 강화하는 데 적합합니다.

따라서, 공개 API로 인해 발생할 수 있는 보안 문제를 피하기 위해 중요한 기능이나 데이터 처리 로직을 서버 액션으로 이동하는 것이 좋습니다. 이를 통해 악의적인 사용자가 접근할 수 없도록 보호할 수 있습니다.

관련 글

[SQL 입문] 필요한 데이터만 콕 집어 가져올 수 있는 WHERE 절

사용자는 테이블에 있는 모든 데이터를 다 보고 싶어 하지는 않습니다. 오히려 특정 항목에 대한 데이터만 가져오고 싶을 때가 훨씬 많습니다. 예를 들어, 어떤 사용자의 이메일이나 ID는 알고 있는데, 그 사람이 언제 우리 앱에 가입했는지 확인하고 싶다고 가정해 봅시다...

2026년 1월 27일10

SQL에서 SELECT란 무엇인가?

데이터베이스를 거대한 서류 보관함이라고 생각하면 됩니다. 보관함 안에는 수많은 데이터가 차곡차곡 쌓입니다. SELECT는 이 보관함에서 "내가 원하는 정보를 찾아줘!"라고 요청하는 명령어입니다. 이 과정을 전문 용어로 '쿼리(Query)'라고 부릅니다. &amp;nbs...

2026년 1월 26일10

[SQL 기초] "언제 하나씩 다 넣어?" 데이터 한 번에 넣기

개발을 하다 보면 데이터베이스(DB)에 샘플 데이터를 대량으로 넣어야 할 때가 있습니다. 메뉴 100개를 추가해야 하는데 INSERT 문을 100번 쓰고 있다면? 너무 비효율적이죠! 오늘은 SQL에서 여러 데이터를 한 번에 넣는 '다중 삽입(Multiple Inse...

2026년 1월 21일13

SQL 데이터 삽입하기

데이터가 없는 데이터베이스는 연료 없는 로켓과 같습니다. 이제 'Missions' 테이블에 새로운 행(row)을 추가하는 방법을 알아보겠습니다. "삽입(Inserting)"은 '데이터 추가'를 의미합니다. 기존 Missions 테이블 ...

2026년 1월 20일12