최근 OpenAI는 자사의 프레임워크를 Next.js에서 Remix로 전환했습니다. 이 변화는 개발 커뮤니티에서 큰 화제가 되었고, 많은 사람들이 그 이유에 대해 궁금해하고 있습니다. 아직 OpenAI의 공식적인 입장은 없는 걸로 보이지만, 왜 OpenAI가 왜 이러한 전환을 했는지, 그리고 Remix와 Next.js가 어떤 차이점을 가지고 있는지 알아보도록 하겠습니다.
이 글을 보시는 대부분은 한 번이라도 ChatGPT를 사용해보셨을 겁니다.
ChatGPT는 사용자의 입력에 실시간으로 반응하고 대화를 생성하는 매우 동적인 웹 어플리케이션이죠.
Remix는 초기 렌더링 시 서버에서 필요한 데이터를 미리 준비하여 빠른 첫 화면 로딩과 클라이언트 측의 효율적인 데이터 처리를 가능하게 합니다. 페이지 전환 이후에는 CSR(Client-Side Rendering) 을 주로 사용하여 빠른 반응성을 유지합니다. Remix의 Loader API 를 통해 필요한 데이터를 서버에서 미리 로드하고, 이를 클라이언트로 전달해 성능을 극대화합니다.
Next.js는 기본적으로 페이지를 요청할 때마다 서버에서 HTML을 생성해 클라이언트로 전달하는 SSR 방식에 중점을 둡니다. 또한 SSG(Static Site Generation) 과 ISR(Incremental Static Regeneration) 같은 기능을 통해 SEO(검색 엔진 최적화)와 성능 최적화를 제공합니다.
Next.js는 SSR에 강점을 두고 있는 반면, Remix는 CSR 중심 애플리케이션을 더 유연하게 지원합니다. OpenAI는 클라이언트에서 대부분의 렌더링을 처리하기 때문에 Remix를 선택을 했을지도 모르겠습니다 🧐
두 프레임워크의 라우팅 방식도 주목할 만한 차이점 중 하나입니다.
Remix는 React Router를 기반으로 한 라우팅 시스템을 제공합니다. Remix의 라우팅 시스템은 매우 유연하고 강력하며, CSR과 SSR 간의 자연스러운 전환이 가능합니다. 특히, 페이지 전환 시 Loader API를 통해 필요한 데이터를 미리 서버에서 받아올 수 있기 때문에, 클라이언트에서 추가 API 호출 없이도 빠르게 페이지를 렌더링할 수 있습니다.
Next.js는 파일 기반의 라우팅 시스템을 사용합니다. 이는 페이지 파일이 곧 URL 구조가 되는 방식으로, 페이지가 명확하게 구성되는 장점이 있습니다. 하지만 CSR을 사용하는 데 있어 제한적인 면이 있어 주로 SSR이 강력하게 적용됩니다.
Next.js는 SSR 기반의 라우팅이 강점인 반면, Remix는 클라이언트에서 복잡한 라우팅을 더욱 유연하게 처리할 수 있습니다. OpenAI는 복잡한 클라이언트 사이드 전환을 쉽게 처리하기 위해 Remix의 라우팅 시스템을 선택했다고 볼 수 있겠습니다.
OpenAI가 Next.js에서 Remix로 전환한 또 다른 중요한 이유로 꼽히는 것중 하나는 Vite와 Webpack이라는 두 빌드 도구 간의 차이입니다. 이 두 도구는 프로젝트 빌드와 개발 서버 성능에 매우 중요한 역할을 합니다.
Remix는 Vite를 사용하여 빌드와 개발 환경을 처리합니다. Vite는 경량성과 빠른 속도를 자랑하는 도구로, 특히 개발 서버에서 탁월한 성능을 발휘합니다. Vite는 모듈을 동적으로 로드하는 방식을 사용하여, 최초 빌드 시간이 짧고, 코드 변경 사항을 즉시 반영할 수 있어 개발 경험이 매우 뛰어납니다.
또한, Vite는 ESM(ECMAScript Modules)을 활용하여 모듈 번들링 과정을 최소화하고, 빠르게 코드 변화를 반영하는 구조로 설계되었습니다. Remix 애플리케이션은 Vite와의 호환성이 좋아서, CSR(Client-Side Rendering)과 API 기반 데이터 처리에 매우 적합합니다.
반면, Next.js는 전통적으로 Webpack을 사용해 왔습니다. Webpack은 대규모 애플리케이션에서 모듈 번들링을 처리하는 데 매우 유용하지만, 많은 설정이 필요하고 개발 서버 속도에서 Vite만큼 빠른 반응성을 제공하지 못하는 경우가 많습니다. 특히, Webpack은 파일을 변환하고 번들링하는 과정에서 속도 저하 문제가 발생할 수 있으며, 개발자들이 이러한 복잡한 설정을 해결하는 데 어려움을 겪을 수 있습니다.
Next.js 팀도 이러한 문제를 해결하기 위해 Turbo Pack이라는 새로운 빌드 도구를 개발 중이며, 이는 Webpack의 성능 문제를 개선하려는 시도로 알려져 있습니다. 하지만 아직 개발 중인 기능이기 때문에 현재로서는 Vite의 빠른 속도와 경량성에 비해 부족한 점이 있습니다.
OpenAI가 Remix를 선택하면서 얻은 또 다른 장점은 바로 Vite의 간편함과 성능입니다. Vite는 개발 중 Webpack에서 발생할 수 있는 복잡한 설정 문제나 성능 이슈를 피할 수 있으며, 더 빠르고 가벼운 개발 환경을 제공합니다. 특히, API 기반의 애플리케이션에서 자주 사용하는 WebSocket이나 서버 전송 이벤트(Server-Sent Events, SSE) 를 다룰 때도 Vite는 매우 효율적입니다.
Remix는 Vite와의 호환성이 좋기 때문에, 개발자들이 보다 빠르고 가벼운 빌드 환경을 구축할 수 있습니다.
반면, Next.js는 여전히 Webpack 기반이기 때문에 성능 문제를 해결하기 위한 별도의 설정이 필요하며, 이로 인해 개발자 경험이 다소 복잡해질 수 있습니다.
OpenAI가 Remix로 전환한 이유는 여러 가지로 해석될 수 있습니다. Next.js는 SSR 중심의 렌더링을 지원하고, SEO가 중요한 애플리케이션에 적합하지만, OpenAI의 애플리케이션은 다소 다른 특성을 가지고 있습니다.
클라이언트 중심 렌더링: OpenAI의 애플리케이션은 대부분 클라이언트 측에서 렌더링이 이루어집니다. 페이지 전환 시 데이터를 API로부터 받아오는 구조가 주를 이루기 때문에, Remix의 CSR 기능과 강력한 라우팅 시스템이 더 적합합니다.
데이터 로딩 최적화: Remix의 Loader API는 초기 렌더링 시 서버에서 필요한 데이터를 미리 수집하고 클라이언트로 전달해 성능을 크게 개선합니다. OpenAI는 초기 페이지 렌더링 시 모든 필요한 데이터를 미리 클라이언트에 제공하여 빠른 첫 화면 렌더링을 실현합니다.
경량 서버: Remix는 Express 같은 경량 서버에서 실행될 수 있습니다. OpenAI는 이 점을 활용해 서버를 효율적으로 운영하면서도 빠른 성능을 유지할 수 있었을 것입니다.
CSR과 SSR의 유연한 전환: OpenAI는 애플리케이션의 특성상 API 중심의 아키텍처를 사용합니다. Remix는 이러한 API와의 상호작용에서 CSR과 SSR을 유연하게 전환할 수 있어, Next.js보다 더 유연하고 적합한 솔루션을 제공했을 가능성이 큽니다.
물론, Next.js는 여전히 많은 애플리케이션에서 강력한 선택지입니다. SSG, ISR 같은 기능을 활용해 정적 웹사이트나 SEO 최적화가 중요한 프로젝트에서는 Next.js가 여전히 최적의 프레임워크입니다. 반면, Remix는 API 중심의 애플리케이션이나 클라이언트 중심 렌더링이 중요한 경우, 특히 라우팅과 데이터 처리가 핵심인 프로젝트에서 강점을 발휘합니다.
OpenAI가 Next.js에서 Remix로 전환한 결정은 기술적 필요와 아키텍처적인 요구사항에 따른 합리적인 선택으로 보입니다. Remix는 API 중심의 데이터 로딩과 라우팅에 강점이 있어, OpenAI의 요구 사항에 더 적합한 솔루션을 제공했을 것으로 보입니다. 두 프레임워크는 각각의 장점이 뚜렷하기 때문에, 프로젝트 특성에 맞는 프레임워크를 선택하는 것이 중요합니다.