오늘은 Node.js에 대해서 알아보겠습니다.
회사 들어갔다가 퇴사하고 3개월이 지났는데 아무것도 안하긴 너무 무료해져서 이것저것 해보고 있습니다 최근에는 SQLD 자격증도 따고 영어 공부도 하고 있답니다(물론 지금은 안하고 있지만ㅎ) 아무튼 그래서 사이드 프로젝트를 해보려고 합니다.
IntelliJ로 스프링을 하면 좋지만, 예전부터 React를 했었고, Node.js도 사용해 보고싶었습니다 그래서 사이드 프로젝트를 React에서 TypeScript를 사용해보고 백엔드로는 Node.js로 구축하려고 합니다. 프로젝트 주제에 대해서는 다른 포스팅에 첫 글에 간단히 작성해보겠습니다. 매번 이해도 잘 안되고 깊이 있는 프로젝트를 해본 적이 없어서 차근차근 해보려고 합니다.
Node.js란?
Node.js는 Javascirpt 코드를 브라우저 밖에서 실행할 수 있게 해주는 오픈 소스 런타임 환경입니다.
2009년 5월 27일 처음 출시되었으며, 오픈 소스 Javascript 엔진인 크롬에 비동기 이벤트 처리 라이브러리인 libuv를 결합하여 구현되었습니다. Ryan Dahl이 처음 개발했으며, 처음엔 리눅스와 macOS만 지원되었으나 2011년 7월에 Windows 버전도 발표되었습니다.
Node.js는 특히 비동기 I/O 처리와 이벤트 기반 아키텍처를 지원하며, 고성능 서버 애플리케이션을 구축하기에 적합합니다.
런타임 환경?
런타임 환경이라고 하면 저도 항상 헷갈리게 실행시켜주는 환경이라고 생각했습니다. 이번 기회에 런타임 환경이라는 의미를 파악하고 다른 런타임 환경은 어떤게 있는 지 알아보면 좋을 것 같습니다.
런타임(Runtime) : 실행 시간, 컴퓨터 과학에서 컴퓨터 프로그램이 실행되고 있는 동안의 동작을 말합니다.
런타임 환경(Runtime Environment) : 컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상 머신의 상태입니다. → 운영체제 자체에 속하는 경우도 있고, 작동하는 소프트웨어라고 이해했습니다.
그렇다면 Node.js는 Javascript 코드의 런타임 환경인데 실행 동작 원리에 대해서 알아보겠습니다.
Javascript와 Node.js의 동작 원리
일단 보통 Javasciprt는 브라우저나 Node.js 등과 같은 환경에서 실행됩니다.
그리고 동작원리에 대해 알아보면 "자바스크립트 엔진"이라는 내용도 있답니다. 자바스크립트 엔진이란 자바스크립트 코드를 기계가 이해할 수 있는 형태로 변환하고 실행하는 프로그램입니다. 즉 컵퓨터가 읽을 수 있게 바꿔주는 것입니다.
대표적으로 V8 엔진(Google), Spider Monkey(Mozilla), JavascriptCore(Apple), Chakra(Microsoft)가 있습니다. 자바스크립트 엔진으로는 V8엔진이 가장 유명합니다.
자, 그러면 여기에서 V8 엔진과 Node.js의 연결점은 뭔지 궁금해졌습니다.
Node.js는 javascript 엔진, V8엔진을 내장해 Javascript를 실행할 수 있도록 구성된 것에서 출발합니다.
즉, Node.js가 실행되면 V8 엔진이 내장된 Javascript 코드를 읽고, V8 엔진이 코드를 파싱하여 바이트코드나 머신코드로 변환하고 실제 컴퓨터에서 실행 할 수 있게 해줍니다. 여기에서 파싱(Parsing)이란 자바스크립트 엔진은 자바스크립트 코드를 받아서 이를 문자열 형태로 분석하고, 문법에 맞게 추상구문 트리라는 구조로 변환합니다. 즉 코드의 문법 오류를 확인하고, 이해할 수 있는 형태로 변환하는 것을 말합니다.
- V8 엔진은 Javascript 코드를 해석하고 실행하는 역할을 담당
- Node.js는 Javascirpt가 서버 환경에서도 실행될 수 있게 하는 환경을 제공하며, V8 엔진을 활용해 Javascript를 실행하고, 시스템 자원에 대한 접근을 제공
- libuv와 같은 C++기반 모듈은 비동기 작업을 처리하고 Node.js가 Javascript의 비동기 실행 모델을 효과적으로 활용할 수 있도록 도움
** 서버환경 : Server, 사전적 의미로는 서비스를 제공하는 사람을 뜻하고 컴퓨터과학에서의 server는 다양한 기능, 데이터, 서비스를 제공하는 컴퓨터나 소프트웨어 전반을 의미합니다.(웹 서버, 도메인 서버, 이미지 서버, 이메일 서버, DB 서버, 게임 서버, 미디어 서버 등)
Node.js의 강점
1. 비동기 및 이벤트 기반 처리 : Node.js는 비동기적이고 이벤트 지향적인 모델을 사용해 여러 작업을 동시에 수행할 수 있어, 데이터베이스 요청이나 파일 읽기와 같은 작업이 끝날 때까지 기다릴 필요 없이 다른 작업을 처리할 수 있다. 이 방식은 고성능이 필요한 실시간 애플리케이션, 특히 채팅 애플리케이션이나 실시간 스트리밍 서비스에 유리하다.
2. 빠른 속도: Node.js는 V8 엔진을 기반으로 하여 JavaScript 코드를 매우 빠르게 실행할 수 있다. 비동기 모델 덕분에 시스템 리소스를 효율적으로 사용해 높은 처리량을 유지할 수 있다.
3. 단일 언어로 전체 스택 구성: 프런트엔드와 백엔드를 모두 JavaScript로 개발할 수 있어 개발자 간의 언어 일관성을 유지하고 생산성을 높일 수 있다. 또한 코드를 재사용할 수 있어 개발 속도도 향상된다.
4. 풍부한 생태계: Node.js는 NPM(Node Package Manager)을 통해 다양한 패키지와 모듈을 제공한다. 이를 통해 기능을 빠르게 확장할 수 있고, 여러 오픈 소스 라이브러리를 활용해 개발 효율성을 높일 수 있다.
5. 확장성과 커뮤니티 지원: Node.js는 마이크로서비스 아키텍처를 채택하여 애플리케이션을 쉽게 확장할 수 있다. 또한, 대규모 커뮤니티와 기업들이 Node.js를 지원하고 있어 다양한 자료와 프레임워크가 지속해서 업데이트되고 있다.
자바스크립의 장점에 V8의 엔진의 장점까지 더하여 복합적인 런타임 환경이 되었습니다.
하지만, 이에 반하여 단점도 있습니다.
Node.js의 단점
1. 싱글 스레드 기반의 병목 현상 : 싱글 스레드 이벤트 루프 모델을 사용하기 때문에 비동기 작업을 처리할 수 있습니다. 하지만 CPU 집약적인 작어블 수행할 때는 스레드가 과부화되어 성능 저하가 발생할 수 있습니다. 또한 싱글 스레드 기반이기 때문에 다중 코어의 장점을 충분히 활용하기 어렵습니다. 대규모 연산이 필요한 서비스의 경우 부하 분산이 어려워 질 수 있습니다.
2. 콜백 지옥 : Node.js의 비동기 처리 모델은 많은 콜백을 사용하기 때문에, 콜백이 중첩되면서 코드가 복잡해지기 쉽습니다. 코드의 가독성과 유지보수를 어렵게 만듭니다. Promise와 Async/await가 도입되어 콜백 지옥 문제를 줄였지만, 호환성 문제나 코드 이해의 어려움이 남아 있습니다.
3. 라이브러리와 비표준 모듈 문제 : Node.js는 NPM(Node Package Manager) 생태계는 방대하고 지속해서 성장하고 있지만, 일부 라이브러리는 다른 언어에 비해 버그가 있을 수 있습니다.
4. 낮은 성능의 데이터베이스 트랜잭션 처리 : Node.js는 비동기적이고 논 블로킹 특성 덕분에 높은 I/O 성능을 제공하지만, 데이터베이스 트랜잭션과 같은 복잡한 작업을 처리할 때 성능이 떨어질 수 있습니다.
5. 보안 문제 : Node.js는 오픈 소스 모듈에 의존하는 경우가 많아 의존성이 많을 수록 보안 취약점이 늘어납니다. 특히 타사의 라이브러리와 패키지가 여러번 중첩되어 의존성을 가지게 되면 보안 관리가 까다로워집니다.
6. 초보자에게 어려운 비동기 코드 작성 : Node.js는 비동기 처리가 기본이기 때문에 초보 개발자에게 비동기 코드 작성과 디버깅이 어려울 수 있습니다.
이번 시간에 node.js에 대해 알아보고 Javascript와 어떤 연관이 있는지 알아봤습니다. 또한 Node.js의 장단점을 알게 되면서 과연 프로젝트의 백엔드 언어로 적합한지에 대해 다시금 생각하게 되었습니다. 이런 포스팅을 하는 이유가 프로젝트에 사용할 것들을 공부하고 정리하면서 올리는 거니까요ㅎㅎ
프로젝트에서 지금 작성하고 있는 요구사항에는 여러 데이터들이 많이 발생할 것으로 예상되며 실제 배포까지하면(배포까진 못하겠지만) 사용할 여러 클라이언트들이 생성되고비동기 처리도 필요하지만 대규모 데이터 처리가 많아질 것으로 예상됩니다.(그치만 Node.js는 써보고 싶고,,,,,) 왜냐하면 지금 구상중인 프로젝트는 대표적으로 3종류의 클라이언트가 있습니다. 그리고 데이터 베이스 설계 했을 때도 쉽지 않아 잠깐 멈추기도 했습니다. 초반에는 괜찮겠다 싶었는데 차근차근 알아보니 적합한 환경인지 의문점이 들었습니다.
아니면 다른 프로젝트로 생각해볼까?
고민이 많아지네요,,
참고
https://namu.wiki/w/Node.js?from=%EB%81%84%ED%88%AC%EC%98%A8%EB%9D%BC%EC%9D%B8
'백 > Node.js' 카테고리의 다른 글
[Node] node.js로 로그인, 회원가입 구현하기 Sign-Up, Sign-In API(MVC 패턴) (1) | 2024.12.17 |
---|---|
[Node.js] Node와 Mysql 연동하기 쿼리문 사용법, node.js, 데이터베이스 연동(Mysql) (1) | 2024.11.26 |
[Node] Node.js 백엔드 폴더 구조 (1) | 2024.11.25 |
[Node.js] Node로 간단한 API 만들기, 웹 서버 만들어보기 (5) | 2024.11.11 |