오래되고 사소한 논쟁이다.
리액트는 공식 문서에 라이브러리라고 명시되어 있는 만큼, 프레임워크라고 말하면 어그로를 끌 수 있다. 하지만 이정도면 프레임워크라고 해도 별로 상관없지 않나 싶은 지점들도 있다. 그리고 라이브러리라고 해버리면 너무 광범위하니까 좀 꺼림칙한 부분이 있다.
일반적으로 지적되는 리액트의 프레임워크적인 특징들은 다음과 같다.
1. 리액트 기반 라이브러리 생태계를 통해서 실질적으로 웹 애플리케이션 개발을 위한 뼈대 역할을 함
2. 사용자에게 특정한 방식의 코드를 작성하도록 강요함 (hooks, jsx)
최근 리액트 팀을 떠났지만, 리액트 코어를 개발한 Dan Abramov는 리액트를 UI 런타임 환경으로 보는 관점의 글을 쓴 적 있다. 이런 관점으로 보면 프레임워크적인 특징이라고 생각했던 것들이, 사실은 런타임적인 특징으로 볼 수도 있다고 생각한다.
프론트엔드 개발자들에게 익숙한 런타임 환경은 브라우저와 Node.js가 있다. 자바스크립트의 런타임 환경으로서 브라우저나 Node.js는 자바스크립트로 작성된 코드를 평가하고 실행하며 각각의 환경에 맞는 API를 제공한다.
마찬가지로 리액트는 jsx로 작성된 UI 상태 트리를 평가하고 화면에 렌더링한다. 특정 동작을 구현하기 위한 API를 사용자에게 제공한다. 브라우저나 Node.js의 내부 동작을 몰라도 프로그램을 작성할 수 있는 것처럼, 리액트에서도 fiber 기반의 스케줄링이나 hooks API의 내부 동작이 실제로 어떻게 동작하는지는 사용자 입장에서 거의 알 필요가 없다.
최근에는 Next.js, Remix 같은 진짜 프레임워크같은 프레임워크들이 널리 사용되면서, 리액트는 점점 런타임 환경 같은 역할을 하기 시작하는 것 같다. 다른 진영에서도 Nuxt, Svelte-kit 같은 프레임워크들이 대중화되면서 비슷한 상황인 것 같다.
그저 아직 용어와 개념이 정리가 덜 된 시기라고 생각한다. 리액트와 Next.js같은 관계를 라이브러리-프레임워크라고 할지, 프레임워크-메타 프레임워크라고 할지 혹은 UI 런타임-프레임워크라고 할지 누가 정해줄 수 있는 건 아니니까...
결론은? 공식문서대로 라이브러리로 부르는 게 제일 안전할 듯. 그래도 역할 구분을 위해서 앞에 UI 정도는 붙여서 UI 라이브러리 정도로 하는 게 적절한 것 같다.