저는 학교에서 Python, C/C++, Java를 다루는 수업을 수강하고, 문법을 익혔고,
Java와 C로는 여러 토이프로젝트를 해보면서 나름 프로그래밍 언어를 배우고 사용하는데 익숙해져 있어서 내심 프로그래밍 언어는 거기서 거기지~ 라는 생각을 해왔습니다.
자바스크립트를 배우면서 그 오만한 생각은 와장창 깨져버렸습니다...
이 글에서는 제가 자바스크립트를 공부하며, 사용하며 어떤게 어려웠는지,
그럼에도 계속 자바스크립트를 공부하는 이유, 제가 생각하는 자바스크립트의 매력을 소개해보려 합니다!
제일 처음으로 저는 웹 프론트 페이지를 만들기 위해 Reactjs 라이브러리를 공부했습니다.
이전까지 HTML/CSS/JQuery로 페이지를 구성했는데, 이때는 HTML문서에 Javascript를 끼워넣는 느낌이어서 코딩을 한다는 느낌이 들지는 않았고, 제대로된 페이지를 만들어 본 경험은 없었습니다.
조금 더 제대로된 다이나믹한 웹 페이지를 만들기 위해 Jquery를 더 공부할까 고민했습니다.
그러던 도중 주변에서 React가 정말 쉽고 간편하다는 이야기를 듣고 React를 시작하게 되었습니다.
결론부터 말씀드리자면,React는 간편하지만 절대 쉽지는 않습니다.
위에서 말씀드렸듯, 저는 프로그래밍 언어 학습을 몇차례 학습하고, 각 언어들이 가지는 공통점과 차이점을 비교하면서 학습하는 것에 익숙해져 있었는데요, React에서 다루는 중점적인 개념은 여타 프로그래밍 언어와 상당히 차이가 있었습니다!
대표적인 예시로,state와 property를 다루는 일, 컴포넌트의 생명주기, 모듈화, 컴포넌트, 훅 등이 그것입니다.
React에서는 컴포넌트의 렌더링이 Property와 State라고 불리는 리액트 컴포넌트의 특수 변수의 변경에 따라 일어나는데,
이런 개념을 멀리서 보면 객체지향의 상속과 비슷하다 생각할 수도 있지만 전혀 다른 개념이며, 이와 비슷하게 리액트가 사용하는 생소한 개념에 익숙해지는 것에 생각보다 시간이 많이 걸렸습니다...
이렇듯, "쉽다"는것이 (최소한 저에게) 리액트의 장점이 아닙니다.
그럼에도 불구하고, 저는 이제 페이지를 구현할 때 React만을 사용합니다.
리액트는 컴포넌트를 재사용하기에 정말 편리합니다.
물론 HTML/CSS코드도 하면 재활용할 수 있지만 이는 말그대로 재활용이고, 상황에 맞게 코드를 수정해주어야 합니다.
컴포넌트를 재사용한다는 것은, 기존 HTML/CSS/JS로 작성된 소스코드를 마치 함수 호출하듯 편리하게 사용하는것을 의미합니다.
저에게는 이것이 React를 배우는 데 걸리는 어떤 어려움도 커버할 수 있을만한 큰 장점이라고 생각합니다.
프론트엔드 코드를 객체지향적으로 다루는 것 또한 저에게 장점으로 다가왔습니다.
저는 여태 서버 프로그램을 작성하기 위해 Spring framework의 Spring boot를 사용했습니다.
스프링 부트를 사용하면서 딱히 불만이나 단점에 대해 생각해본 적이 없고, 오히려 SpringFramework는 국내에서 주도적으로 사용되는 만큼 문서가 풍부하고 한국 내 커뮤니티도 활발해 버그를 해결하는 것이 어렵지 않았습니다.
그러던 어느날 저는 어떤 계기로 Nodejs의 express 라이브러리를 이용해 서버 프로그램을 작성해보았고, 스프링을 사용할때와 상당히 다른 느낌을 받았습니다.
짧은 기간 사용했지만, 그 느낌을 공유해볼까 합니다.
스프링같은 경우, 엔터프라이즈급 서버 프로그램을 위한 **"프레임워크"**이기 때문에,
시작부터 어떤 틀 위에서 시작하고, 여러가지 설정을 거쳐 프로젝트를 시작합니다. 누군가는 이 과정이 너무 복잡하고 쓸데없다고 말하지만, 저는 절대 그렇게 생각하지 않습니다.
프로젝트를 시작함과 동시에 많은 부분을 프레임워크로부터 보장받는 것이기에, 프레임워크를 사용하는것과 Node같은 라이브러리 패키지를 사용하는 것과의 장단점을 비교하는 것은 의미가 없다고 생각합니다.
Springboot: 46.1k stars, 662contributers
nodejs : 68.3k stars, 2657contributers
다만 Node.js 런타임 뿐만 아니라 Javascript 라이브러리 전반적으로 커뮤니티 활성화 정도가 매우 높다고 느꼈습니다.
위는 Nodejs와 Spring project의 컨트리뷰터 수입니다. 물론 Node는 Spring과 비교될 격이 아니고, OpenJRE나 OpenJDK와 비교해야 옳지만, jre,jdk는 상용 버전인 oracle의 비중이 더 높기에 최대한 커뮤니티 활정정도를 비교할만한 지표로 생각했습니다.
커뮤니티 활성 정도를 보며 한편으론 다른 재단이나 커뮤니티에 비해 유저들이 참여해 생성해낸 프로젝트가 큰 영향력을 갖는 것이 신기했습니다.
Spring같은 경우 pivotal이라는 회사에서 spring 관련 프로젝트를 시작하고 키워나가는 방식입니다. 어찌보면 pivotal이 시작한 프로젝트가 무조건 메인 프로젝트이므로 유저에게 선택권이 줄어들 수 있다고 생각할 수 있습니다.
반면 Nodejs의 경우 인증이라는 커다란 부분을 담당하는 패키지 Passport.js는 개인이 설립한 프로젝트임에도 유저들에게 그 편리성과 효용성을 입증받아 가장 많이 사용되는 패키지로 선택되었습니다. 이런 적자생존 방식으로 생태계가 유지되는 것이 매우 어렵지만, 그만큼 유저에게 많은 편리함을 주고있다고 생각했습니다.
나름 장단점을 설명한다고 글을 썼지만, 너무 장점 위주로 설명한 것 같습니다...
생태계가 활발하고 자주 변화한다고 좋은 것만은 아니라고 생각합니다. 유저는 변화한 내용을 계속 학습하는 것에 비용이 많이 발생할 수도 있고, 새로운 보안 취약점이 발생하거나 기반 패키지가 업데이트 된 경우 상위 패키지와 호환성이 떨어질 수도 있습니다.
마지막 부분, nodejs의 특징을 조금 더 잘 설명하기 위해 제가 경험한 Spring framework와 비교하며 작성했지만, 위에 말씀드렸 듯 모든것에는 장단점이 있으니, 프로젝트에 사용할 기술스택을 잘 선택하셨으면 합니다!