환경변수: 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임
OS에는 환경변수가 존재한다. 즉, 윈도우나 linux나 macOs나 모두 환경변수는 존재한다.
윈도우>시스템속성>환경변수
path 환경설정하는 이유
$ node server.js
여기서 node가 path를 검색한다. 환경변수 설정해야지만 가능하다.
$ env
라고 터미널에 치면 환경변수들이 나온다.
위에 보면 HOME=/home/seunghee
라고 되어있는 것을 확인할 수 있다. 그러면 다음과 같이 쳐보자.
$ echo $HOME
참고로 echo 명령어는 출력의 명령어이다.
$ echo $USER
을 치면 다음과 같이 나온다.
###1-2-1. node.js에서 서버에서 환경변수 사용의 예
process.env.NODE_ENV가 없으면 PORT를 3000번으로 하라는 뜻이다.
당연히 아직은 process.env.NODE_ENV가 없으니 3000번 포트로 실행되는 것을 알 수 있다.
$ export NODE_ENV=8080
export는 환경변수를 설정하는 예약어이다. 위와 같은 명령어는 NODE_ENV라는 환경변수를 8080으로 설정하는 것이다.
여기서 node.js를 서버에서 작동하는 것으로 생각할 수도 있는데, 실질적으로 node.js는 컴퓨터를 조작할 쁀이고, express가 웹서버를 가능케 하는 것이다. node.js는 node환경에서만 사용되는 javascript로 컴퓨터를 조작할 수 있다.
console.log(process)
로만 구성되는 파일을 하나 만든다.
나는 aaa.js로 만들었다.
❓process란?
Node.js에서 구동되는 코드 안에서 컴퓨터가 가지고 있는 정보를 담은 객체, 즉 어느 환경에서 구동하냐에 따라서 결과물이 다르다. 윈도우에서 실행하는 것하고, linux안에 있는 것하고 다르다.
위와 같이 많은 것이 포함되어 있음을 알 수 있다.
모드를 production랑 developer으로 나눈다. 그러려면 방법이 여러가지가 있다.
1. const PORT = process.env.NODE_ENV == 'production'? 8080:3000
process.env.NODE_ENV가 프로덕션이면 PORT를 8080으로, 아니면 3000으로 정하는 방법
2. const PORT = process.env.PORT || 3000
process.env.PORT를 설정해서 바꾸는 방법(매번 바꿔주어야 함.)
둘 중 후자를 사용한다면
이렇게 설정을 해주어야 한다.
리눅스는 생성과 수정을 구분하지 않는다.
기본 개념은 export는 수정이다. 없으면 만들고, 있으면 수정한다.
수정하려면 새로 만드는 것과 같이 설정해주면 된다.
dot env
Node.js에서 환경변수를 쉽게 가져올 수 있는 package이다. 그런데 서버는 한개가 있을 수 없다. 각각의 서버마다 시스템 환경변수를 일일이 넣어주면 오타가 날수도 있고 번거롭기 때문에 만들어진 것이다. 것임. 그래서 .env를 넣어서 한번에 한다.
console.log의 태생은 process.stdout.write이다.
브라우저에서 콘솔로그 찍히는 것과는 조금 다르다.
process.stdin.resume()
은 입력만 받을 역할을 한다.
NODE.js의 가장 큰 장점
논 블록킹 IO
싱글 스레드이기에 가능하다.
끝나는 지점을 정확하게 알 수가 없다.
그래서 직접 끝내줘야하고, 다른 언어들보다는 코드가 복잡하다.
입력받고 출력을 할 때 이벤트 처리를 해주어야 한다!
입력받은 건 비동기로 처리되고 있다. 이벤트쪽으로 입력을 처리해야 한다.
위와 같은 내용을 가진 .js파일을 하나 만들어준다. 그리고 그걸 실행시켜보자. 나는 bbb.js파일로 만들었다.
그러면 위와 같이 BUffer로 출력되는 것을 알 수 있다.
버퍼는 컴퓨터가 알아들을 수 있는 언어이지 우리가 해석할 수 있는 언어가 아니다. 그렇기에 Buffer.toString을 이용해서 다음과 같이 작성하면 다음과 같이 나온다.
여기서는 우리가 입력한 것을 버퍼형태가 아닌 우리가 원하는 형식으로 잘 나타냄을 알 수 있다. 엔터도 하나의 값으로 입력받기에 한줄씩 띄어졌음을 알 수 있다.
성
위의 코드는 10을 입력하면 종료가 되는 코드이다. process.exit(0)
은 프로세스를 성공적으로 종료시키는 코드이다.
그런데 위와 같이 입력하면 10을 입력하면 종료가 되야되는데 되지 않는다. 그 이유는 enter도 받기 때문이다. 그래서 다음과 같이 입력해준다.
.trim()은 개행문자를 잘라 입력해준다.
이제 ctrl을 누르지 않아도 10을 입력하면 process가 종료가 된다.
node.js는 입력을 받으면 buffer로 처리해서 저장한다. 그러면 처음부터 'utf8'로 입력받을 때 인코딩을 할 수도 있다.
$ cd ~
$ mkdir scripts
$ cd scripts
홈 디렉토리로 간 다음 scripts 폴더를 만들어주고, 그 안으로 들어간다.
서버 자동화 작업이나 반복적인 작업을 하기 편하도록 하기 위해 사용함.
그래서 얘도 프로그래밍언어라고 봐도 무방함.
쉘 script를 만들어주지 않아도 node.js내에서도 구현할 수 있다.
그러나 Shell Script는운영체제가 이해할 수 있는 언어기때문에 실행속도가 빠르다.
$ cal
을 터미널에 입력하면 다음과 같이 캘린더가 뜬다. cal은 시스템 환경변수에 잡혀 있다.
date또한 다음과 같이 현재 시간을 알려준다.
;(세미콜론)은 도대체 무엇인가요?
코드 최소단위 구분값
shell script에서 여러가지 명령어를 한줄로 입력하고 싶을 때 다음과 같이 각 코드를 ;으로 구분해서 입력해주면 순서대로 모두 실행이 된다.
shell script파일의 확장자는 .sh이다. 한 번 만들어 보자.
$ sh practice1.sh
를 터미널 창에 입력하면 아래와 같이 순서대로 실행되는 것을 알 수 있다.
한 줄로 할 때는 ;으로 하고 여러줄로 할거면 ;을 안써도 작동한다.
그러나 한줄에 쓰는 경우 각 코드마다 ;이 없으면 한줄 절체를 해석하려다가 오류가 난다!
#:주석
cal 과 date는 echo가 포함되어있기 때문에 굳이 echo를 써 줄 필요는 없다.
저렇게 다 띄어쓰면 다음과 같은 오류가 난다.
ShellScript는 띄어쓰기 하지 말아야함.
또 오류가 났는데 그 이유는 code=hello
까지는 변수로 인식을 하였지만 world!는 새로운 명령어로 인식하여서 오류가 난 것이다. 띄어쓰기때문에 다른 예약어일것이라고 인식한 것이다.
이를 해결하기 위한 방법을 찾아보자.
val=helloworld!
에서 컴퓨터는 helloworld!라는 프로그램이 있는지 찾고 없으면 txt로 인식한다. 즉, 에약어인지 찾아보고 없으면 텍스트로 인식한다.
ps에는 여러가지 옵션이 있다. -ef는 루트까지 프로세스까지 모든 포맷을 보여주는 것이다. 그냥 -f를 치면 모든 포맷을 보여주고, -e를 치면 루트 영역까지 보여준다.
이렇게 하고 파일을 실행시키면 다음과 같이 나올 것이다.
띄어쓰기를 하면 다음과 같이 오류가 난다.
그렇다고 위의 코드처럼 붙여서 써도 계산이 되지 않고 그대로 출력을 할 뿐이다.
[]: 코드를 실행시킬 영역을 잡아준다.(이 방법은 맥북에서만 되는 것 같다.)
이렇게 expr을 써준다. 그리고 연산자 앞에 \을 넣어준다. 그리고 연산자 다음에 띄어쓰기를 한다.
그러면 expr과 echo의 차이점에 대해서 알아보자.
다음과 같이 echo는 그냥 문자 그대로 받아들이는 반면 expr은 연산을 한 결과를 출력하는 것을 알 수 있다.
변수에 담지 않고, 명령어를 줘서 shellscript를 실행하면 다른 txt파일을 만들어내기
'>' 결과를 파일로 내보낼 수 있다.
ps -ef | grep node
의 결과를 node.txt에 저장한다. node.txt를 보면 다음과 같이 나온다.
head -1 node.txt
위로부터 첫번재 항목을 볼 수 있다. (=head -n 1 node.txt)
tail -1 node.txt
파일의 끝에서부터 첫번재 항목을 볼 수 있다.(=tail -n 1 node.txt
파일명의 끝에 띄어쓰고 &을 적으면 백그라운드로 실행시킬 수 있다.
이제 node2.txt에 ps -ef | grep node의 결과를 넣어보자.
cd ~ 를 통해 홈 디렉토리로 간다. 거기서 .zshrc로 들어가서 다음과 같은 명령어를 만들어준다.
그 다음에 터미널을 껐다가 다시 켜준다. 그러면 실행이 되는 것을 알 수 있다.
이를 전역변수로 만들고 싶다면 .zshrc에
이렇게 적고 터미널을 껐다가 켜주면
어느 위치에서나 nodeserver라는 명령어를 치면 실행이 된다.
또한
이렇게 직접적으로 터미널창에 입력해서 설정할 수도 있다.