리액트는 프레임워크인가? : 부채가 아닌 투자를 위한 질문
글을 통해 전하고 싶은 메세지
- 리액트는 렌더링 라이브러리이다.
- 내 문제를 다른 사람의 코드로 완벽하게 해결할 수는 없다. 이와 관련된 기술 부채는 항상 염두에 둬야 한다.
- 프레임워크, 라이브러리의 개념과 특징이 무엇인지 명확히 알고, 이에 따라서 내가 맞닥뜨린 문제에 대해 적합한 솔루션을 선택할 수 있는 기준을 키워야 한다.
개요

리액트는 공식적으로 라이브러리이다.
그러나 리액트를 마냥 라이브러리로 바라봐야하는 건가? 하는 이야기가 종종 들리는 듯 하다.
먼저 내 생각을 밝히면 "리액트는 라이브러리이다."라고 설명할 수 있을 것 같다. 단정짓는 건 별로 좋은 습관은 아니지만.. 적어도 내 기준에서는 이렇게 확실하게 말할 수 있을 것 같다.
그러면 지금부터 하나씩 살펴보자.
프레임워크와 라이브러리
리액트가 프레임워크인지, 라이브러리인지 판단하기 위해서 먼저 이 둘의 차이점을 분명하게 이해할 필요가 있을 것 같다.
프레임워크 없는 프론트엔드 개발의 저자인 '프란세스코 스트라츨로'는 라이브러리와 프레임워크의 구분을 다음과 같이 설명하고 있다.
프레임워크는 코드를 실행시킨다. 코드는 라이브러리를 실행시킨다.
나도 이 관점이 프레임워크와 라이브러리의 차이를 분명하게 보여준다고 생각한다.
프레임워크를 사용한다는 것은 곧, 도구가 강제하는 방법에 따라서 개발이 이루어진다는 의미이다.
좀 더 명확하게 표현하면 프레임워크가 애플리케이션의 제어 흐름
을 관리하며, 개발자는 프레임워크가 제공하는 구조 안에서 코드를 작성한다는 데 있다.
반대로 라이브러리는 개발자가 관리하는 제어 흐름
안에서 이를 호출한다는 게 보다 분명하게 표현되는 차이점이라고 볼 수 있다.

그림으로 표현하면 위와 같다.
프레임워크 방식이란?
책을 바탕으로 학습을 하고 있기에, 저자의 생각을 빼놓을 수 없을 것 같다.
작업을 처리할 때 '프레임워크 방식'을 사용하고 있다면 프레임워크로 볼 수 있다.
저자가 책에서 제시한 프레임워크의 판단 기준이다.
프레임워크 방식(Framework's way)이란 무엇일까?
책을 통해 접한 나에게 있어서 새로운 개념이다.
쉽게 말하면 도구를 사용하기 위해서 강제되는 것들로, 앵귤러를 예로 들어서 설명하면 다음과 같다.
- 언어 : TypeScript가 앵귤러 생태계의 사실상 표준이다. (de facto)
- 의존성 주입 : 요소(Element)가 앵귤러 애플리케이션에서 통신하려면 유형에 따라 의존성 주입(dependency injection) 메커니즘을 사용해야 한다.
- 옵저버블 : 앵귤러는 표준 방법인 프라미스(Promise)대신 옵저버블(Observable)을 사용한 반응형 프로그래밍용 라이브러리인 RxJS를 기반으로 설계되었다.
위의 몇몇 요소는 반드시 사용되어야 하는 것은 아니지만, 커뮤니티 사용자들에 있어서 사실상 표준(de facto)처럼 사용되는 방식이다.
결국 프레임워크 방식이란, 프레임워크이든 아니든 상관 없이 커뮤니티 사용자에 의해서 사실상 표준처럼 어떤 규칙이 강제되고, 보편화되어서 사용되는 것을 의미한다고 볼 수 있다.