본격적으로 Node.js 실강 듣는 첫날이었다. 코치님도 다 바뀌셔서 뭔가 새로운 날 같았다. 백엔드는 뭔가 낯선 느낌이 가득하다.. 내가 알던 JS가 아냐..
싱글 스레드 | 멀티 스레드 |
---|---|
한 사람이 주어진 작업을 하나씩 처리하는 방식 | 여러 사람이 주어진 작업을 같이 처리하는 방식 |
경쟁상태(Race Condition) ,교착상태 (Deadlock) X | 경쟁상태(Race Condition) ,교착상태 (Deadlock) 고려 필요 |
멀티스레드 대비 코드 복잡도 낮음 | 코드 복잡도 높음 |
여러 명이 일하는 병렬처리보다는 작업 처리 효율이 평균적으로 떨어짐 | 평균적으로 싱글스레드보다 작업 처리 효율이 높음 |
자바스크립트 : 싱글스레드로 작동하는 언어이며, 효율 극대화를 위해 비동기 처리방식을 채택함.
논블로킹 | 블로킹 |
---|---|
하나의 작업을 실행시키고 그 작업이 마치지 않아도 다음 작업을 실행하는 방식 | 하나의 작업을 마치고나서 다음 작업을 시작하는 순차적 실행 방식 |
작업을 실행시켜 놓기만 하는 행위 | 작업이 길어지면 다음 작업이 지연됨 |
보통 결과값을 return으로 바로 못받아서 콜백으로 받게 된다. | |
자바스크립트에서는 비동기라는 언어와 혼용 | 자바스크립트에서 동기라는 언어와 혼용 |
Q. 근데.. 자바스크립트는 싱글스레드인데 왜 동시 작업 가능한가요???....
A.개발자가 작성한 자바스크립트 코드는 싱글스레드로 순차적으로 실행시키되 특정 비동기 작업(IO작업 또는 CPU 연산 작업에 대해서는 멀티스레드를 사용한다.
• 자바스크립트 코드를 읽어서 해석하고 작업을 수행하는 역할
• 엔진 자체는 작업을 수행만 할 뿐 비동기/동기와는 관계가 없음
• 예: V8, SpiderMonkey, JavaScriptCore
https://www.jsv9000.app/
<< 비동기 컨텍스트 보기에 매우 좋은 시각자료... 최고!
GUI(Graphical User Interface) | CLI (Command Line Interface) |
---|---|
그래픽+키보드+마우스+기타 IO디바이스로 OS 또는 어플리케이션 조작할 수 있게 해주는 인터페이스 | 오직 키보드(마우스)로 명령어를 타이핑해서 OS 또는 어플리케이션을 조작할 수 있도록 해주는 인터페이스 |
일반인을 위한 인터페이스 | 소프트웨어 개발과 관련이 있는 사람들이 사용해야하는 인터페이스 |
웹/모바일 프론트엔드 | 웹 백엔드 |
전 게시물에서 다뤘으니 생략.
전 게시물에서 다뤘으니 생략.
ECMAScript 표준 module system: 비동기 | Node.js의 CommonJS: 동기 |
---|
//require
const getSquare = require('./exports.js');
console.log(getSquare.area(5));
console.log(getSquare.perimeter(5));
const getSquare2 = require('./module_exports.js');
console.log(getSquare2.area(3));
console.log(getSquare2.perimeter(3));
-----------------------------------------------------
// exports 는 프로퍼티값까지 써줘야함.
exports.area = width => Math.pow(width, 2);
exports.perimeter = width => width * 4;
-----------------------------------------------------
//module.exports는 객체 값 통째로 익스포트
module.exports = {
area: width => Math.pow(width, 2),
perimeter: width => width * 4,
};
// sample.json
{ "name": "Someone else",
"lastName": "Kim" }
----------
const sample = require('./sample.json'); console.log(sample);
//
// { name: 'Someone else', lastName: 'Kim' }
const library = require("library") // Node.js CommonJS 키워드
import library from "library" // javascript ES6 키워드
{type : 'module'}
해주면 사용은 가능함. readFileSync | readFile |
---|---|
동기적 | 비동기적 |
readFileSync(path,[option]) | readFile(path,[option],callback) |
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World!');
res.end();
});
server.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
var http = require('http');
function onRequest(request, response) {
response.writeHead(200, { 'Content-Type': 'text/html' });
fs.readFile('./index.html', (err, data) => {
if (err) {
response.writeHead(404, { 'Content-Type': 'text/plain' });
response.end();
} else {
response.write(data);
response.end();
}
});
}
http.createServer(onRequest).listen(8080);
console.log(process.env); // 컴퓨터 환경 관련 정보 가진 객체
console.log(process.version); // node.js버전
console.log(process.versions); // node.js 와 연관된 프로그램들의 버전을 가진 객체
console.log(process.arch); // 프로세서의 아키텍처
console.log(process.platform); //프로세서의 플랫폼 (win32/linux/sunos/freebsd/darwin)
console.log(process.memoryUsage()); //메모리 사용 정보를 가진 객체
console.log(process.uptime()); // 현재 프로그램이 실행된 시간
process.env
를 실행시켜보면 다양한 환경번수가 있음.