NextJS ver.14: 서버 컴포넌트와 서버 액션

@Joy Lee · October 10, 2023 · 4 min read

NextJS 14 주요 업데이트

Next.js 14 버전에서는 서버 컴포넌트(Server Components)와 서버 액션(Server Actions)이라는 두 가지 기능이 업데이트되었다.

14 버전의 주요 개선점

  • 개발자 환경 및 생산성 향상
  • 유저가 다운로드하는 자바스크립트 코드 감소
  • 많은 코드와 라이브러리 삭제 가능

1. 서버 컴포넌트

서버 컴포넌트는 컴포넌트를 서버에서 렌더링하여 클라이언트로 전송하는 방식이다. 이를 통해 클라이언트는 자바스크립트 코드를 제외한 최종 렌더링된 HTML를 전송받는다.

서버 컴포넌트의 장점

  • 향상된 성능: 클라이언트로 전송되는 자바스크립트 양이 줄어들어 초기 로드 시간이 단축되므로 사용자 경험이 향상된다.
  • 보안 강화: 서버에서만 데이터를 처리함으로 클라이언트에 민감한 데이터가 노출되지 않는다.
  • 간편한 데이터 페칭: 서버에서 직접 데이터베이스나 API에 접근하여 데이터를 가져오기 때문에 클라이언트 측에서 복잡한 데이터 페칭 로직을 작성할 필요가 없다.

이전 버전과의 비교

이전 버전 :

function Posts() {
  const [posts, setPosts] = useState([])

  useEffect(() => {
    const fetchPosts = async () => {
      const data = await (await fetch("/api/posts")).json()
      setPosts(data)
    }
    fetchPosts()
  }, [])

  return (
    <ul>
      {posts.map(post => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  )
}

Next.js 14 버전 :

export default async function Posts() {
  const data = await (await fetch("/api/posts")).json()

  return (
    <ul>
      {data.map(post => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  )
}

2. 서버 액션

서버 액션(Server Actions)은 서버에서 비동기 작업을 수행하고 결과를 클라이언트로 반환하는 새로운 패턴이다. 이를 통해 클라이언트에서 복잡한 상태 관리 없이 서버와의 상호작용을 단순화할 수 있다.

사용 예제

'use server'; // 서버 컴포넌트 모드 활성화

import { useState } from 'react'; // useState 훅을 React로부터 가져옴

export default function LikeButton() {
  const [likes, setLikes] = useState(0); 

  async function handleLike() {
    'use server'; // 서버에서 실행되는 함수임을 명시

    // 서버에 /api/like 엔드포인트로 POST 요청을 보내고, 새로운 좋아요 수를 받아옴
    const newLikes = await (await fetch('/api/like', { method: 'POST' })).json(); 

    setLikes(newLikes); // 새로운 좋아요 수로 상태 업데이트
  }

  return (
    <button onClick={handleLike}> 
      Like ({likes})
    </button>
  );
}

서버 액션의 장점

  • 간결한 코드: 클라이언트와 서버 간의 상호작용을 간소화하여 클라이언트에서의 상태 관리 코드가 줄어든다.
  • 향상된 성능: 서버에서 직접 작업을 처리하므로 클라이언트에서의 부담이 줄어들어 전체적인 성능이 향상된다.
  • 안정성 및 보안: 서버에서 비동기 작업을 처리하므로 클라이언트에서의 보안 취약점을 줄일 수 있다.

서버 액션 사용 시 고려사항

  • 서버 액션은 서버에서 실행되므로 네트워크 지연에 대한 고려가 필요하다.
  • 비동기 작업의 결과가 클라이언트에 즉시 반영되지 않을 수 있으므로 사용자 경험을 고려한 디자인이 필요하다.
  • 서버에서의 작업이 실패할 경우 이를 처리할 적절한 에러 핸들링이 필요하다.
Joy Lee
FRONTEND DEVELOPER