Next.js 15 App Router에서 서버액션 vs API 라우트
Next.js 15로 프로젝트를 시작하려는데, 서버 액션과 API 라우트 중 어떤 걸 써야 할지 고민입니다. 폼 제출이 많은 CRUD 앱인데, 서버 액션이 편리해 보이지만 보안이나 확장성 측면에서 API 라우트가 더 낫다는 얘기도 있더라고요. 실제 운영 환경에서 두 방식 비교 경험 있으신 분 계신가요? 특히 인증 처리나 에러 핸들링 차이가 궁금합니다.
7 개의 답변
저도 비슷한 고민 했었는데요, 개인적으로는 폼 제출이 많은 CRUD라면 서버 액션을 추천합니다. 서버 액션은 폼 데이터를 바로 처리하고 revalidatePath로 캐시 갱신이 쉬워서 생산성이 확 올라가요. 인증은 middleware에서 처리하면 되고, 서버 액션 내에서도 try-catch로 에러 핸들링 가능합니다. 다만 복잡한 API나 외부 연동이 많으면 API 라우트가 더 나을 수 있어요.
운영 환경에서 서버 액션 써봤는데, 생각보다 괜찮았습니다. 보안 걱정은 서버에서만 실행되니까 크게 문제 없었고, CSRF는 Next.js가 자동 처리해줘서 편했어요. 에러 핸들링은 서버 액션에서 throw하면 클라이언트에서 catch로 받을 수 있고, 인증은 supabase나 next-auth랑 조합해서 잘 돌아갑니다. 다만 규모가 커지면 API 라우트로 분리하는 게 유지보수에 좋더라고요.
저는 반대로 API 라우트를 선호합니다. 서버 액션은 편리하지만 디버깅이 어렵고, 특히 에러 로그 추적이 불편했어요. API 라우트면 RESTful하게 관리되고, Postman으로 테스트하기도 좋고, 인증 미들웨어도 route.ts에서 깔끔하게 적용 가능합니다. CRUD라면 오히려 API 라우트가 더 체계적이고 확장성 있어요.
둘 다 써본 입장에서 조언드리자면, 초기에는 서버 액션으로 빠르게 개발하고 필요할 때 API 라우트로 전환하는 전략도 괜찮습니다. Next.js 15에서 서버 액션은 클라이언트 번들에 포함 안 되고, 인증은 auth() 함수로 서버에서 직접 처리하면 보안 문제 거의 없어요. 에러 핸들링은 formState나 toast 조합으로 UX 좋게 만들 수 있습니다.
저는 인증 처리 때문에 API 라우트를 고집했는데, 서버 액션에서도 충분히 가능하더라고요. 다만 JWT 토큰 관리나 리프레시 로직은 API 라우트가 더 직관적이에요. 서버 액션은 페이지 단위로 데이터를 처리할 때 빛을 발하고, 여러 클라이언트에서 호출되는 공통 로직은 API 라우트가 낫습니다. 혼용해서 쓰는 것도 방법입니다.
저도 같은 고민 중인데요, 혹시 서버 액션 사용할 때 파일 업로드나 이미지 처리 같은 건 어떻게 하시나요? API 라우트면 multer 같은 미들웨어 쓰기 편한데, 서버 액션은 제약이 있을까봐 걱정됩니다. 경험담 공유해주시면 감사하겠습니다!
서버 액션 vs API 라우트 논쟁은 결국 정답이 없는 것 같아요. 저는 작은 프로젝트는 서버 액션, 팀 단위나 외부 API 연동 많으면 API 라우트로 가는 게 좋다고 생각합니다. Next.js 15에서 서버 액션은 form action과 결합하면 코드 줄이 확 줄어서 생산성 좋고, API 라우트는 테스트와 문서화에 강점 있네요. 현업에서는 보통 혼용해서 쓰는 추세입니다.