Data Scientist 옌

매일 발전하는 IT문제해결사

국비지원교육 (22.01-22.07)/강의노트

22-06-07(화) 089일차 [JavaScript, Node.js] Node.js란 무엇인가, 서버 켜는 법

옌炎 2022. 6. 23. 21:37
728x90

수업내용


1교시 (09:30-10:20)

JavaScript

  • script_01.html (미완성)
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
	<script type="text/javascript" src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
	<script type="text/babel">
		
		var pizza = true
		pizza = false
		console.log(pizza);
	</script>
</body>
</html>

2교시 (10:30-11:20)

  • script_01.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
	<script type="text/javascript" src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
	<!-- 
		ECMAScript3 ES3: 1999년 : 우리가 이야기 하는 자바스크립트
		ECMAScript5 ES5 : 2009년
		
		react, vue 사용
		ECMAScript6 ES6 : 2015년 : const, let 키워드 추가, arrow 문법 지원
	 
	 	const : 상수 : 변경하면 안되는 수
	 -->
	<script type="text/babel">
		
		var pizza = true
		pizza = false
		console.log(pizza);

		const p = true;
		p = false;
		console.log(p);
		
	</script>
</body>
</html>

3교시 (11:30-12:20)

  • Node.js 
    ----------------

    https://nodejs.org/dist/

    https://nodejs.org/dist/v14.16.0/ 
    node-v14.16.0-x64.msi


    C:\Users\kosmo>node -v
    v14.16.0

    C:\Users\kosmo>npm -v
    6.14.11


    npm : Node Package Manager
    -------------------------------------
    현재 디렉토리에 NPM 기반으로 프로젝트를 생성
    패키지이름, 버전, 설명등 입력 package.json 생성
    npm init 
    npm init -y (--yes) : 디폴트 값으로 프로젝트 생성


    패키지 설치 
    node_modules 디렉토리 생성
    package-lock.json 파일 생성

    npm install 패키지이름 
    npm install 패키지이름 -g (--global) : 전역 설치 
    npm instal  패키지이름 --save(devDependencies 추가, npm5 기본옵션으로 추가)

    npm install 패키지이름
    -P (--save-prod) : package.json의 dependencies에 패키지를 등록합니다.(default)
    -D (--save-dev)  package.json의 devDepndencies에 패키지를 등록합니다.
    -O (--save-optional) : package.json의 optionalDependencies에 패키지를 등록합니다.
    --no--save : dependencies에 패키지를 등록하지 않습니다.


    버전은 세 자리로 구성
    ----------------------------
    major 버전
    하위 버전이 호환이 안될 정도로 패키지의 내용 수정
    주 버전이 0 이면, 초기 개발 중
    1부터는 정식 버전이다.
    minor 버전 
    하위 버전이 호환이 되는 업데이트 
    patch 버전
    새로운 기능이 추가되었다기 보다는
    기존 기능에 문제가 있어 수정한 것을 내놓았을 때


    ‘^’, ‘~’  
    ^(캐럿): minor 버전까지만 설치 또는 업데이트한다.
    ~(틸트): patch 버전까지만 설치 또는 업데이트한다.




    C:\00.KOSMO108\40.node
    C:\00.KOSMO108\40.node\node_test
    C:\00.KOSMO108\40.node\node_test>node init -y

    C:\00.KOSMO108\40.node\node_test\01_js


    Template literals
    -----------------------------
    탬플릿 리터럴은 내장된 표현식을 허용하는 문자열 리터럴입니다.
    여러 줄로 이뤄진 문자열과 문자 보간 기능을 사용할 수 있습니다.

    백틱(``) (grave accent)을 사용할 수 있습니다.

    플레이스 홀더를 이용하여 표현식을 넣을 수 있는데
    이는 $와 중괄호( ${expression} )로 표기할 수 있습니다.

  • js_01.js
console.log('Node.js Hello');

4교시 (12:30-13:20)

  • sublimetext 다운로드
  • js_02.js
var name = '1234name';

var str = 'Dear' + name + '\n\n Lorem ipsum doloar sit amet,';

var str_template = `Dear ${name} Lorem ipsum

doloar sit amet,`;

console.log(str);
console.log(str_template);


5교시 (14:30-15:20)

  • 자바는 클래스 단위, Node.js는 모듈 단위로 프로그램 실행
  • c_module_01.js
exports.add = function(a, b){
	return a + b;
}

exports.multiply = function(a, b){
	return a * b;
}
  • c_module_02.js
var calc = {};


calc.add = function(a, b){
	return a + b;
}

calc.multiply = function(a, b){
	return a * b;
}

module.exports = calc;
  • js_03.js
// require() 함수 : 모듈을 불러올 때 사용하는 함수
// c_module_01.js 모듈 파일을 불러와서 사용
// require() 함수의 파라미터로 모듈 파일의 이름을 전달하는 데 
// 확장자를 뺀 파일이름 c_module_01 만 사용한다.
// 파일이름 앞에 ./ 는 상대경로를 지정한 것 
var calc = require('./c_module_01');
console.log('calc : %s ', calc);
/*
exports.add = function(a, b){
	return a + b;
}
exports.multiply = function(a, b){
	return a * b;
}
*/
// c_module_01.js 모듈 파일에서 exports.add 로 추가한 add 속성을 
// js_03.js 메인 파일에서 calc 객체로 접근해서
// calc.add() 코드로 함수를 호출할 수 있다.
var calc_add = calc.add(10, 20);
console.log('모듈 테스트 :: calc.add : %d ', calc_add);
var calc_multiply = calc.multiply(10, 20);
console.log('모듈 테스트 :: calc.multiply : %d ', calc_multiply);

var calc2 = require('./c_module_02');
/*
var calc = {};
calc.add = function(a, b){
	return a + b;
}
calc.multiply = function(a, b){
	return a * b;
}
module.exports = calc;
*/
console.log('calc2 : %s ', calc2);
var calc2_add = calc2.add(10, 20);
var calc2_multiply = calc2.multiply(10, 20);
console.log('모듈 테스트 :: calc2.add : %d ', calc2_add);
console.log('모듈 테스트 :: calc2.multiply : %d ', calc2_multiply);


var getipaddress = require('./ip_module');
var ip = getipaddress.getIp();
console.log('모듈 :: ip 함수 호출 결과 : %s', ip);

6교시 (15:30-16:20)

  • Node.js
    노드에서 모듈
    -------------------
    exports 전역 객체 
    require() 함수 
    module 객체 


    하나의 함수 안에 모든 기능을 여러개의 함수(독립적인 기능)로 나눈 후 
    각 함수를 별도의 파일로 분리 후 메인 파일에서 전체적인 실행 순서나 흐름만을 제어 
    별도로 분리된 파일을 노드에서는 모듈이라고 부름

         ===================
    노드는 CommonJs의 표준 스펙을 따라 모듈을 사용
         ===================
    exports 전역 객체 사용
    모듈을 만들 때는 module1.js 처럼 별도의 자바스크립트 파일을 만든 후 
    그 코드에서 exports 객체를 사용
    exports 객체의 속성으로 변수나 함수를 지정하면 
    그 속성을 main.js와 같은 메인 자바스크립트 파일에서 불러와 사용

    모듈을 불러올 때는 require() 메소드를 사용
    모듈로 만들어 둔 파일의 이름을 require() 메소드의 파라미터로 전달한다.
    require() 메소드를 호출하면 모듈 객체가 반환된다.
    모듈에서 exports 객체에 설정한 속성들은 이 모듈 객체를 통해 접근 할 수 있다.

    exports : 여러 개의 변수나 함수를 각각의 속성으로 추가할 수 있다.
    exports.add = function(a,b){
    return a + b;
    }
    exports.multiply = function(a,b){
    return a * b;
    }

    module.exports : 하나의 변수나 함수 또는 객체를 직접 할당한다.
      일반적으로는 객체를 그대로 할당
      이렇게 할당한 객체 안에 넣어 둔 변수나 함수를 
      메인파일에서도 사용할 수 있다.
    var calc = {};
    calc.add = function(a,b){
    return a + b;
    }
    clac.multiply = function(a,b){
    return a *  b;
    }
    module.exports = calc;

    require() : 모듈을 불러올 때 사용하는 함수
  • ip_module.js
var os = require('os');

exports.getIp = function () {
    
    let IPAddress = '';
    var interfaces = os.networkInterfaces();
    
    for (var devName in interfaces) {
      var iface = interfaces[devName];
      
      for (var i = 0; i < iface.length; i++) {
        var alias = iface[i];
        if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
          IPAddress = alias.address;
        }
      }
    }
    
    return IPAddress;
};

7교시 (16:30-17:20)

  • http_01.js
var http = require('http');

var server = http.createServer();

var host = '192.168.219.109';
var port = 3000;

server.listen(port, function(){
	console.log('웹 서버가 시작되었습니다. : %s %d', host, port);
});
  • http_03.js
var http = require('http');

// 웹 서버 객체를 만든다.
var server = http.createServer();

// 웹 서버를 시작하면 3000번 포트에서 대기하도록 설정한다.
var port = 3000;
server.listen(port, function() {
    console.log('웹 서버가 시작되었습니다. : %d', port);
});

// connection 이벤트로 클라이언트 연결 이벤트 처리
server.on('connection', function(socket) {
    var addr = socket.address();
    console.log('클라이언트가 접속했습니다. : %s, %d', addr.address, addr.port);
});

// request 이벤트로 클라이언트 요청 이벤트 처리
server.on('request', function(req, res) {
    console.log('클라이언트 요청이 들어왔습니다.');
    // console.dir(req);
    
    res.writeHead(200, {"Content-Type": "text/html; charset=utf-8"});
    res.write("<!DO/CTYPE html>");
    res.write("<html>");
    res.write("<head>");
    res.write("<title>응답 페이지</title>");
    res.write("</head>");
    res.write("<body>");    
    res.write("<h1>노드제이에스로부터의 응답페이지</h1>");
    res.write("</body>");
    res.write("</html>");
    res.end();
});

// close 이벤트로 서버 종료 이벤트 처리 
server.on('close', function() {
    console.log('서버가 종료됩니다.');
});

  • Node.js를 배우는 이유
    • 가벼운 웹 서버를 만들어 컨트롤 할 수 있음
    • push 서비스에 많이 쓰임 (빨리 죽지만 빨리 살아남)

8교시 (17:30-18:30)

  • 스프링 코드 버전업하기

Notes

  • 내일부터 오전에는 Node.js, React 오후에는 Python
  • Node.js는 3일만 가볍게 다룰 예정

728x90