비동기 프로그래밍
동기식
하나가 끝나면 다른 하나가 시작
비동기식
하나가 끝날 때까지 기다리지 않고 다른 일을 시작
Node js는 쓰레드가 없어도 비동기가 가능
비동기를 효율적으로 하느냐 안하느냐가 중요한 것이지 쓰레드의 유무가 중요한 것이 아니다.
서버에서 비동기 처리 실력이 중요하다.
stdio
process.stdin
process.stdout
process.exit
process.stdin.resume() //keyboard
process.stdin.setEncoding('utf-8')
const util = require('util')
process.stdin.on('data', function(text){
console.log(`echo : ${text}`);
console.log(`echo : ` + text);
//숨겨진 개행 문자를 날려야함 (\n), ==보다 ===이 정확하므로 === 사용 추천
if(text === 'exit\n'){
process.exit()
}
})
stream io
file system -> file io
입력이 있으면 출력이 있고 입력과 출력은 한방향이다.
createWriteStream
import fs from 'fs' // 파일시스템을 가져오는 것
const dest = fs.createWriteStream('out.txt');
const src = process.stdin;
src.pipe(dest);
createReadStream
// 파일에서 읽어서 콘솔로 출력
import fs from 'fs' // 파일시스템을 가져오는 것
const src = fs.createReadStream('out.txt');
const dest = process.stdout;
src.pipe(dest);
file system
const fs = require('fs')
import fs from ('fs')
writeFile
import fs from 'fs'
fs.writeFile(
'test.txt', //파일 이름
'hello', // 데이터
{
encoding: 'utf-8'
},
function(err) {
if(err){
console.log(err);
}
else{
console.log('ok');
}
}
);
console.log('done');
여기서 코드를 순서대로 생각한다면 ok가 먼저 나오고 done이 나와야 한다. 하지만 비동기식 통신이므로 done이 먼저 나오고 ok가 나온 것 이다.
writeFileSync
import fs from 'fs'
//입출력이 다 끝나고 로그가 찍힘
// 보기엔 동기식이 좋지만 시스템 효율엔 비동기가 좋음
fs.writeFileSync('text2.txt',
'hello',
{
encoding: 'utf-8'
}
);
console.log('done');
이런식으로 writeFileSync를 사용하면 보기에 좋은 동기식이지만 효율적이지 못하다.
readFile
readFileSync
import fs from 'fs'
let data = fs.readFileSync('text2.txt',
{
encoding: 'utf-8'
}
);
console.log(data);
fs.readFile('text2.txt',
{
encoding: 'utf-8'
},
function(err, data){
if(err){
console.log(err);
}
else{
console.log('ok');
console.log(data);
}
}
);
console.log(data);
parse argument
process.argv -> 배열로 -> 첫 번째: 노드실행패스 -> 두번째 노드스크립트 파일
커맨드라인 인자는 3번째 부터 -> [2]...
이것을 응용해서 5개를 입력받고 평균값을 구해보자.
console.log(process.argv[2]);
let a = parseInt(process.argv[2]);
let b = parseInt(process.argv[3]);
let c = parseInt(process.argv[4]);
let d = parseInt(process.argv[5]);
let e = parseInt(process.argv[6]);
console.log((a+b+c+d+e)/5);
repl
앱속에 인터프리터 기능을 내장 시킬 때 사용한다.
context 객체에 필요한 객체를 추가하는 방식으로 사용한다.
node 실행기를 단독으로 실행시킨 것에 자기가 필요한 기능을 추가적으로 넣을 수 있다.
// relp객체는 큰 규모의 프로젝트를 실행하기 위해서 사용한다.
import repl from 'repl';
let repl_context = repl.start({
/*
node를 실행하면 나오는 인터프리터이다.
함수의 타이밍을 잡아 디버깅을 해야하는 상황일 때 필요하다.
디버깅을 할 때 중요 프롬프트를 실행 한 뒤, foo()로 함수를 실행시킨다.
*/
prompt: '>',
input: process.stdin,
output: process.stdout,
}).context;
// 타이밍이 아주 중요한 함수
function foo(){
console.log('hello world');
}
repl_context.foo = foo;
git
github.com
context 객체에 필요한 객체를 추가하는 방식으로 사용한다.
node 실행기를 단독으로 실행시킨 것에 자기가 필요한 기능을 추가적으로 넣을 수 있다.
docker, 포트 포워딩
FROM node:14
#이미지 받기
# :은 태그이지만 버전을 나타내기도 함.
# docker build . -t study/hello-node:step1
# .은 위치 -t는 도커 이미지의 이름과 태그를 지정
# 태그는 필수가 아니다
# docker create -it --name doc-node-test study/hello-node:step1
# i는 interactive하게 통신을 하겠다 t는 tty를 통해 터미널로 들어간다
# docker start id(name, images) 시작
# exec -it 실행
# apt-get update
# apt-get install vim
# apt-get install nano
# 위처럼 복잡하게 만들 때마다 입력할 것이 아니라 아래의 명령문을 사용
# 컨테이너는 rm 이미지는 rmi
# 컨테이너 생성 시 먼저 실행 후 생성해주세요라는 명령문이며
# 한줄로 작성할 수 있지만 개행해서 작성
# exe보다 ssh로 접속하여 더 일반적이고 현실적이다
RUN apt-get update && \
apt-get install -y vim nano net-tools openssh-server
# \은 실행하라라는 뜻
# docker create -p 8080:8080 -p 8022:22 -it --name
# 도커의 8080포트에 ssh 8080 포트로하고 8022포트에 22ssh로 함
# 나노나 vim에서 아이디 주석풀고 yes 달고
# passwd root 해서 패스워드 달고
# 나와서 exit하고 ssh root@localhost -p 8022 입력하여 ssh 접속
# service ssh start
# exit 하고 ssh root@localhost -p 8022
# logout
# 로컬과 컨테이너 내부를 구분해야함
# 로컬의 ip를 알아내서 해야 ssh root@192.168.25.35 -p 8022로 가상의 가상으로 접속할 수 있음
# 서로 다른 콘테이너를 만들고 독립된 시스템처럼 서로 통신한다 실제로 데이터를 제어할 수 있게 가능
#
image를 먼저 생성한다.
그 후, container를 생성하고, start, stop 으로 컨테이너를 실행이나 종료하고 해당 컨테이너를 실행한 뒤
exec bash(실행)으로 접근한다.
create -p 8080:8080 -p 8022:22
openssh-server -> /etc/ssh/sshd_config -> PermitionLogin yes
service ssh start
ssh root@localhost -p 8022
vscode -> remote ssh 설치 -> 원격탐색기 설정 추가 후,
설정한 비밀번호를 입력하여 접근한다.
'이것 저것 공부 > 프론트엔드 백엔드 몰입교육' 카테고리의 다른 글
15일차 (0) | 2021.08.13 |
---|---|
14일차 (0) | 2021.08.12 |
mongo db, server와 client, docker로 서비스 돌리기 13일차 (0) | 2021.08.11 |
JAVASCRIPT 8일차 (0) | 2021.08.05 |
트랜지션과 애니메이션(7일차) (0) | 2021.08.04 |