구식 엔터프라이즈 Java 프로그래머로서 Node.js에 대해 사람들과 이야기 할 때 두 가지 개별 고백을 해야 한다고 생각합니다. 먼저, 저는 Node.js를 정말 좋아한다고 동료들에게 고백해야 합니다. 이것은 종종 흥분된 동의에서 노골적인 혐오감에 이르기까지 다양한 반응을 나타냅니다. 둘째, 90 년대 후반부터 자바 스크립트 작업을 해왔지만 처음에는 정말 마음에 들지 않았다고 고백해야 합니다. 이것은 내가 사랑하게 된 플랫폼에서 사람들을 겁을 줄 위험이 있습니다.
https://www.openlogic.com/blog/programmers-guide-what-nodejs-used
주제에 대한 내 자신의 감정을 조사한 결과, Node.js에 대한 초기 혐오감이 Java와 같이 더 잘 훈련 된 언어로 부적절하다고 생각했던 일을 하도록 요구하는 언어에서 비롯된 것임을 깨달았습니다. 제가 100 % 정확하다면, 저의 첫 번째 망설임은 그보다 훨씬 더 이른 것입니다. 그것은 저의 귀중하고 중요한 백엔드 로직을 제어하기 위해 자바 스크립트와 같은 '불완전한'언어를 신뢰하는 바로 그 행위였습니다!
Node.Js 가이드
언어, 아마도 더 중요한 아키텍처와 생태계를 탐구하기 시작하면서 Node.js가 아닌 것을 요청하는 것임을 깨달았습니다. Node.js에게 구식 언어가 되도록 요청했습니다. 문제가 저에게 있다는 사실과 세상에 정말로 필요한 것은 Node.js에 대한 구식 프로그래머 가이드라는 것을 깨닫는 데 큰 도약이 필요하지 않았습니다.
적절한 가이드는 여러 권을 채울 수 있으며 언젠가는 그렇게 될 것입니다. 그 동안 저는 Node.js의 예시적이고 독특한 측면 중 일부를 강조하고 싶습니다. Node.js를 처음 접하는 사람들에게는 문제가 될 수 있고 저와 같은 배경을 가진 사람에게는 가장 확실한 문제였습니다.
비동기 대 동기 워크 플로
대부분의 구식 개발자가 Node.js를 만났을 때 가장 먼저 도달하는 난관은 본질적으로 비동기 패턴입니다. 순서대로 작업하는 데 익숙한 개발자의 경우 Node.js가 앱의 한 부분이 앱의 다른 부분의 진행 상황에 대해 '관심'하는 것을 원하지 않는다는 사실을 당연하게 여기지 않는 것이 실망스러울 수 있습니다.
Factor 앱은 우리의 프로세스를 격리 된 상태 비 저장 프로세스로 생각해야 한다고 알려줍니다.
왜? 우리는 이러한 프로세스가 일시적으로 실행되어 프로그램 워크 플로를 중단하지 않고 한 실행 환경에서 다른 실행 환경으로 원활하게 전달할 수 있기를 원합니다. 왜 또? 따라서 앱이 병렬로 워크 플로의 많은 부분을 실행할 수 있으므로 필요한 만큼 수평 적으로 확장 된 컴퓨팅 리소스에서 실행할 수 있습니다.
오늘날 컴퓨팅 용량의 증가는 프로세서 클럭 속도의 향상에서 비롯된 것이 아니라 보드에 넣을 수 있는 개별 코어의 수에서 비롯됩니다.
이러한 추가 용량을 활용하려면 애플리케이션이 개별 구성 요소가 작업을 완료 할 때까지 기다리지 않고 해당 코어를 동시에 활용할 수 있어야 합니다.
Node.js의 아키텍처 이벤트 루프 "Libuv"
Node.js 아키텍처의 핵심에는 "libuv"라는 이벤트 루프 라이브러리가 있습니다. Libuv는 개발자가 제공 한 코드에서 Javascript 작업 단위를 해석하고 이러한 요청을 비동기 이벤트로 큐에 넣는 책임이 있습니다.
각 작업 단위는 V8 Javascript Engine의 분리 된 자체 인스턴스에서 실행되므로 기본적인 스레드 안전성을 달성 할 수 있습니다. 이는 각 작업 단위와 함께 메타 정보를 제공해야 하는 대가로 발생하지만 대부분의 경우 Node.js는 이를 숨겨두므로 걱정할 필요가 없습니다.
이 작업을 본질적으로 수행하는 언어를 구축 할 때의 이점이 이제 더 명확해질 수 있지만, 초보자가 의미론적으로 비동기 프로그래밍을 처리하기가 더 쉬워지는 것은 아닙니다. EventEmitter 클래스를 사용하면 이 경험을 훨씬 쉽게 할 수 있습니다. 함수와 콜백을 중첩 하는 대신 각 작업 단위를 이벤트로 처리 할 수 있습니다.
var events = require('events'); var eventEmitter = new events.EventEmitter(); var ringPhone= function ringPhone() { console.log(’brrrrrr-ring, brrrr-ing, brrrrring…’ ); } eventEmitter.on(’incomingCall’, ringPhone); eventEmitter.emit(‘incomingCall');
최근에 도입 된 async / await 기능은 보다 절차적인 구문에 익숙한 개발자에게도 도움이 될 수 있습니다.
const getData = () => { fetch('https://jsonplaceholder.typicode.com/todos/1') .then(response => response.json()) .then(json => console.log(json)); };
그러면 다음과 같이 될 수 있습니다.
const getDataAsync = async () => { const response = await fetch('https://jsonplaceholder.typicode.com/todos/1'); const data = await response.json(); console.log(data); };
Node.js의 개체 및 입력
자바 스크립트는 동시에 기능적 언어이자 객체 지향 언어입니다. Node.js에서는 Java에서 익숙한 것처럼 클래스를 만들 수 있으며 함수를 일류 시민으로 취급 할 수도 있습니다. 즉, 일반 변수를 전달하는 것처럼 전달할 수 있습니다.
function callMeFirst(callMeLater) { callMeLater('my first message'); } callMeFirst( (message) => { console.log(message) } This is an ‘anonymous’ function being passed );
디버거로 코딩을 연습하는 것이 도움이 됩니다. 코드에 중단 점을 만들고 Node.js가 함수를 캡슐화 하는 데 사용하는 함수 및 메타 데이터 구조를 확인하려면 이를 검사하는 데 익숙해져야 합니다.
그 구조가 본질적으로 객체라고 생각하고 해당 객체에 실행 가능하고 평가 가능한 자바 스크립트 코드와 함수를 식별하고 관리하는 데 도움이 되는 메타 정보가 포함되어 있다면 머리를 감싸는 것이 조금 더 쉽습니다.
Java에서 오는 또 다른 고려 사항은 Javascript가 느슨한 형식의 언어라는 것입니다. 디버거가 다시 도움을 줄 수 있는 곳입니다. 당신이 보고 있는 값에 들어가는 메타 정보는 당신이 어떤 종류의 물건을 다루고 있는지 정확하게 알려줄 것입니다.
하지만 느슨하게 입력 할 수 없다면 자바 스크립트가 다음과 같은 사항을 고려하는 "엄격한"모드를 지원한다는 점에 유의하세요.
코드 맨 위에 "use strict"를 추가하여 전체 스크립트에 대해 이 모드를 켜거나 단일 함수에 포함하여 해당 함수에 대한 엄격한 검사 범위를 지정할 수도 있습니다.
마지막으로 다른 언어와 마찬가지로 신중하고 포괄적 인 예외 검사를 대체 할 수 없습니다. 수행 중인 계산을 인식하고 모든 계산이 유효하거나 데이터가 코드에 생성 될 때까지 데이터가 올바르게 변환 될 것이라고 당연하게 생각하지 마십시오. 잘 작성된 코드는 예상치 못한 상황을 계획하고 try / catch 블록을 사용하여 조건부 논리를 계획합니다.
IDE 고려 사항
익숙한 모든 프로그래밍 언어와 마찬가지로 Node.js는 인내심, 카페인 및 VIM을 사용하여 100 % 프로그래밍 할 수 있습니다. 그러나 대부분의 베테랑 개발자는 잘 설계된 IDE의 이점을 인식하게되었습니다.
Microsoft의 크로스 플랫폼 오픈 소스 Visual Studio Code (VSCode)는 Node.js와 관련하여 제가 선택한 IDE입니다. 빌드 및 실행 구성은 유지 관리가 매우 쉽고 코드 디버거는 원활하고 사용하기 쉬우며 인터페이스 자체는 가볍고 효율적이며 시각적으로 만족스럽습니다.
대부분의 편집기 구성은 JSON으로 이루어 지므로 Node.js를 포함한 모든 자바 스크립트 기반 프레임 워크와 함께 사용하면 전반적으로 일관된 경험을 제공 할 수 있습니다. Git 등과 같이 예상되는 모든 SCM 상호 운용성이 잘 구현되어 있습니다.
이는 Node.js 커뮤니티에서 제공하는 풍부한 확장 기능과 플러그인에 추가 된 것입니다.
이것은 Eclipse 및 IntelliJ와 같은 Java 친화적 조직의 제품을 포함하여 선택할 수 있는 많은 IDE가있는 유일한 옵션이 아닙니다.
Node.js에서 종속성 관리
Maven 및 Gradle과 같은 Java 빌드 관리 도구에 익숙해 진 사람들은 Node.js에 대해 'npm'이라는 광범위한 패키지 관리자가 존재하며 종속성을 처리하기 위해 쉽게 호출 할 수 있다는 사실을 알고 기뻐할 것입니다.
종속성이 있는 Node.js 애플리케이션은 모범 사례에 따라 package.json이라는 빌드 설명 파일과 함께 제공되어야 합니다. 이 파일에는 제목 및 버전과 같은 메타 데이터와 종속성 정보를 포함한 빌드 자체에 대한 정보가 포함됩니다.
{ "name": "helloworld", "version": "1.0.0", "description": "Hello World!", "main": "hello.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Justin Reock", "license": "GPL-3.0-or-later" }
새 Node.js 애플리케이션을 배포 할 때 package.json 파일과 애플리케이션에 대한 맞춤형 소스 코드 만 배포하는 것이 일반적입니다. 'npm install'명령은 앱의 루트 설치 폴더에서 실행할 수 있으며 애플리케이션에 대해 규정 된 모든 종속성이 다운로드 되고 정렬됩니다.
Artifactory 및 Sonatype Nexus와 같은 도구에 익숙한 것과 비슷하게 Node.js 용 로컬 개인 리포지토리를 구축하는 것은 간단합니다. Npm을 사용하면 빌드 프로세스에 시맨틱 버전 관리를 빌드 할 수 있으므로 비 속성 릴리스의 자동 종속성 패치와 같은 작업을 추가로 자동화 할 수 있습니다. 지속적인 피드백 루프 및 카나리아 릴리스를 달성하기 위한 새로운 방법론과 함께 사용하면 매우 강력하고 안전하며 자체 업데이트 되는 종속성 관계를 만들 수 있습니다.
모든 Node.js 개발자는 몇 가지 프롬프트 후 시작 package.json 파일을 생성하는 'npm init'를 호출하여 Node.js 앱을 생성해야 합니다. 거기에서 'npm install'지시문을 사용하여 코딩에 즉시 사용할 수 있는 새 종속성을 추가 할 수 있습니다.
Node.js는 기업에서 자리를 차지할 가치가 있습니다
이것이 Node.js로 이동하는 것이 베테랑 코더가 인식하게 된 친숙한 개념을 모두 피하는 것을 의미하지 않는다는 것을 당신에게 밝혀주는 데 도움이 되었기를 바랍니다. 여러 측면에서 다르지만 Node.js는 신규 및 베테랑 개발자 모두의 프로그래밍 스타일을 처리하는 방법을 제공합니다. OpenLogic과 같은 그룹의 교육과 지원은 이 인기 있고 흥미로운 플랫폼을 조직에서 사용할 수 있는 좋은 방법이 될 수 있음을 잊지 마십시오!
오픈 소스로 실제 문제를 해결하는 데 도움이 되는 엔터프라이즈 아키텍트 중 한 명으로부터 실질적인 컨설팅 지원을 받으십시오. OpenLogic을 무료로 사용해보십시오!
등록된 댓글이 없습니다.