StudyServer
web, server, java, spring 등.. 공부한 것을 기록하는 장소 입니다. 공부하면서 정리하였기 때문에 틀린 내용이 있을 수 있습니다. 이야기 해주시면 수정하겠습니다.

git 소개

2018-12-31 00:00:00 +0000

Svn과 Git의 차이점

버전 관리란?

  • 버전 관리 시스템은 파일의 변화를 시간에 따라 기록하여 과거 특정 시점의 버전을 다시 불러올 수 있는 시스템( git 설명 참고 링크 )

중앙집중식 관리 vs 분산관리

  • svn의 중앙 집중식 버전 관리 시스템(Centralized Version Control System; CVCS)
  • git은 분산 버전 관리 시스템(Distributed Version Control System; DVCS)
  • 중앙집중식 시스템은 중앙server가 하나 존재. 중앙server에서 version을 관리. 단점은 중앙server에 문제가 생기면 파일 올리기, 파일 받기 등의 기능을 수행할 수 없음
  • 분산 버전 시스템은 저장소를 통째로 복사.(checkout) 그래서 서버에 문제가 생겨도 언제든 복구가 가능

파일 관리

svn

  • svn은 파일 변화가 있을 때 마다 version을 붙여서 전체 파일을 관리함. 즉 변경되지 않은 파일도 관리

git

  • git은 파일 변화가 없으면 이전 파일 링크만 가지고 있음. 파일을 들고있지 않기때문에 무게도 가볍다

작업 속도

  • svn은 모든 작업이 중앙서버를 통해야 가능하다.그래서 commit, push 시 속도가 느리다
  • git은 checkout할 때 저장소를 통째로 복사하고 거의 대다수의 작업을 local에서 한다(commit, branch 등.. push, pull 등 중앙 서버를 통하는 것은 느리다)그래서 인터넷이 없어도 작업할 수 있다

파일,프로젝트 상태 분류

file, project state

  • git은 파일을 3가지 상태로 분류한다
  • Modified: 파일이 local에서 수정되었다
  • Staged: 현재 수정한 파일을 곧 commit할 것이다
  • Committed: 파일이 local에 저장되었다

sourcetree

  • 또한 프로젝트도 3단계로 분류한다
  • working directory : 수정한 파일들이 있는 디렉터리
  • staging area : 곧 commit할 데이터 정보를 저장.
  • git directory : git이 프로젝트의 메타데이터와 객체 데이터 베이스를 저장하는 곳(.git) commit버튼을 눌러 자신의 local 저장소에 변경사항을 반영하였다

node.js 개발환경 구축

2018-12-30 00:00:00 +0000

Nodejs 개발환경 구축

Node.js란

  • 브라우저가 아닌 서버 환경에서 javascript를 사용할 수 있게 해줌
  • 이벤트방식과 비동기식. 어떤 이벤트가 발생할 때 처리하며, 처리를 하기 위해 서버가 멈추지 않음(callback함수)=>속도향상

Node.js 설치

download url : https://nodejs.org/ko/

Node.js 예제

  • server.js 파일을 만들고 아래와 같이 소스코드를 작성한다
  • 작성 후 cmd 창을 열고 해당 소스코드가 있는 폴더로 이동한다
  • cmd 창에 node server.js 라고 입력한다
  • http://127.0.0.1:52273/ 주소로 들어가면 Hello World…! 라는 글을 볼 수 있다
// 모듈 추출
var http = require('http');

// 웹 서버를 만들고 실행
http.createServer(function(request, response){
    response.writeHead(200, {'Content-Type': 'text/html'});
    response.end('<h1>Hello World...!</h1>');
    
}).listen(52273, function(){
    console.log('Server running at http://127.0.0.1:52273/');    
});

node.js 기본 내장 모듈

2018-12-30 00:00:00 +0000

기본 내장 모듈

  • 아래 url에서 node.js에서 사용하는 기본 내장 모듈 api를 확인할 수 있다
  • https://nodejs.org/api/

os모듈

  • node.js 서버가 실행되고 있는 운영체제에 대한 정보
const os = require('os');
console.log(os.hostname()); // 운영체제의 호스트 이름 리턴
console.log(os.type());   // 운영체제의 이름 리턴
console.log(os.platform()); // 운영체제의 플랫폼 리턴
console.log(os.arch()); // 운영체제의 아키텍처 리턴
console.log(os.release()); // 운영체제의 버전 리턴
console.log(os.uptime()); // 운영체제가 실행된 시간 리턴
console.log(os.loadavg()); // 로드 에버리지 정보를 담은 배열 리턴
console.log(os.totalmem()); // 시스템의 총 메모리 리턴
console.log(os.freemem()); // 시스템의 사용 가능한 메모리 리턴
console.log(os.cpus()); // CPU의 정보를 담은 객체 리턴
console.log(os.networkInterfaces()); // 네트워크 인터페이스의 정보를 담은 배열 리턴

url 모듈

  • url 분석 및 구문 분석을 위해서 사용
var url = require('url');
// parse는 url문자열을 url 객체로 변환해서 리턴
var obj = url.parse('https://parkwonhui.github.io/');
console.log(obj);

Query String 모듈

  • url객체와 쿼리에 관련된 모듈
  • 아래 예제는 url 중에 query만 뽑아내는 예제이다
  • 그래서 쿼리가 있는 Obj1은 쿼리정보가 출력되지만 쿼리정보가 없는 Obj2는 아무것도 출력되지 않는다
//모듈을 추출
var url = require('url');
var querystring = require('querystring');

// parse:쿼리문자열을 쿼리 객체로 리턴
var parsedObj1 = url.parse('http://www.hanbit.co.kr/store/books/look.php?p_code= B4250257160');
var parsedObj2 = url.parse('https://parkwonhui.github.io/java/2018/12/28/java-javabean.html');
console.log(querystring.parse(parsedObj1.query));
console.log(querystring.parse(parsedObj2.query));

Util 모듈

  • node.js에 보조적인 기능을 모아둠
var util = require('util');
// 매개변수로 입력한 문자열을 조합해 리턴
var data = util.format('%d + %d = %d', 52, 273, 52+273);
console.log(data);

crypto 모듈

  • 해시(전자지문)생성과 암호화를 수행하는 모듈
  • 아래 예제는 문자열을 암호화해서 해시값을 출력하는 예제
var crypto = require('crypto');

// 해시생성
var shasum = crypto.createHash('sha256');
shasum.update('werwetg');        // 문자열에 따라 해시 값이 달라진다
var output = shasum.digest('hex');

console.log('crypto_hash:', output);
  • 다음 예제는 암호화 및 복호화를 하는 예제
var crypto = require('crypto');

var key = 'abce1123123';
var input = 'password';

var cipher = crypto.createCipher('aes192', key);
cipher.update(input, 'utf8', 'base64');
var cipheredOutput = cipher.final('base64');

var decipher = crypto.createDecipher('aes192', key);
decipher.update(cipheredOutput, 'base64', 'utf8');
var decipheredOutput = decipher.final('utf8');

console.log(input);             //  암호화 전
console.log(cipheredOutput);    // 암호화 후
console.log(decipheredOutput);  // 복호화

File System 모듈

| 객체 이름 | 설명 | |:——–:|:——–:| | readFile(file,encoding, callback) | 파일을 비동기적으로 읽음 | | readFileSync(file, encoding) | 파일을 동기적으로 읽음 | | writeFile(file, data, encoding, callback) |파일을 비동기적으로 씀 | | writeFileSync(file, data, encoding) | 파일을 동기적으로 씀 |

  • 파일을 동기적으로 읽는다.
  • 그래서 파일 내용다음에 1이 출력된다
    var fs = require('fs');
    var text = fs.readFileSync('ttt.txt', 'utf8');
    console.log(text);
    console.log('1');
    
  • 비동기적 파일 읽기. readFile 함수를 만나면 이벤트 리스너에 등록하고 파일을 읽으면 이벤트 리스너를 실행
  • 비동기적이므로 파일을 읽으면서 프로그램을 실행한다.
  • 그래서 1다음에 파일 내용이 출력된다
var fs = require('fs');

fs.readFile('ttt.txt', 'utf8', function(error, data){
  console.log(data);
});
console.log('1');

node.js의 전역 객체

2018-12-30 00:00:00 +0000

Node.js의 전역 객체

전역변수

  • node.js 이므로 최상위 객체 window는 없음
  • 전역변수, 전역 함수를 가짐.
  • 전역 변수 | 객체 이름 | 설명 | |:——–:|:——–:| | __filename | 현재 실행 중인 코드의 파일 경로를 나타냅니다 | | __dimame | 현재 실행 중인 코드의 폴더 경로를 나타냅니다|
  • 사용법
console.log('filename:', __filename);
console.log('dirname:', __dirname);

전역 객체

| 객체 이름 | 설명 | |:——–:|:——–:| | console | 콘솔 화면과 관련된 기능을 다루는 객체 | | exports | 모듈과 관련된 기능을 다루는 객체 | | process | 프로그램과 관련된 기능을 다루는 객체 |

console 객체

  • 지정한 매개변수 이외의 내용은 그냥 출력된다
  • ‘%j’는 json 데이터가 들어간다
console.log('숫자: %d + %d = %d', 273, 52, 273 + 52,'가나다라라');
console.log('문자열: %s', 'Hello World..!', '특수기호와 상관 없음');
console.log('JSON: %j', {name:'RintTanTt'});
  • 시간측정 예제
  • ‘a’는 타이머의 이름이라고 생각하면 된다(아무 글자를 넣어도 됨)
// 시간측정 시작
console.time('a');

var output = 1;
for(var i = 1; i<=10; ++i){
  output *= 1;
}
console.log('Result:', output);

// 시간 측정을 종료합니다
console.timeEnd('a');
  • 출력 글자 색상을 바꿀 수도 있다
// 출력합니다.
console.log('\u001b[31m', 'Hello World .. !');
console.log('\u001b[32m', 'Hello World .. !');
console.log('\u001b[33m', 'Hello World .. !');
console.log('\u001b[34m', 'Hello World .. !');
console.log('\u001b[35m', 'Hello World .. !');
console.log('\u001b[36m', 'Hello World .. !');
console.log('\u001b[1m');
console.log('\u001b[31m', 'Hello World .. !');
console.log('\u001b[32m', 'Hello World .. !');
console.log('\u001b[33m', 'Hello World .. !');
console.log('\u001b[34m', 'Hello World .. !');
console.log('\u001b[35m', 'Hello World .. !');
console.log('\u001b[36m', 'Hello World .. !');

// 초기화합니다.
console.log('\u001b[0m');

process 객체

  • 프로그램과 관련된 정보를 나타내는 객체
속성 이름 설명
argv 실행 매개변수를 나타냄
env 컴퓨터 환경과 관련된 정보를 나타냄
version Node.js 버전을 나타냄
verisons Node.js와 종속된 프로그램 버전을 나타냄
arch 프로세서의 아키텍처를 나타냄
platform 플랫폼을 나타냄
  • 매개변수를 차례대로 출력하고 ‘–exit’ 문자열을 찾으면 입력 시간 후에 프로그램이 종료되도록 만든 예제
// process.argv
process.argv.forEach(function(item, index){
  // 출력합니다
  console.log("메모리 사용정보(객체반환):",process.memoryUsage());
  console.log(index+':'+typeof(item)+':',item);
  // 실행 매개변수에 --exit가 있을 때
  console.log("프로그램이 실행된 시간:",process.uptime());
  if('--exit' == item){
    // 다음 실행 매개변수를 얻음
    var exitTime = Number(process.argv[index+1]);

    // 일정 시간 후 프로그램을 종료
    setTimeout(function(){
      process.exit();
    }, exitTime);
  }
});

exports 객체와 모듈

  • nodejs는 모듈을 사용하여 기능을 확장
  • 무듈은 기능을 쉽게 사용하고자 메서드와 속성을 미리 정의해서 모아놓은 것
  • 다음 예제는 main.js가 module.js 의 기능을 불러와 사용
  • 모듈 추출 시 require 함수 사용
  • module.js
// abs:절대값을 구함
exports.abs = function(number){
  if(0 < number)
    return number;
  else
    return -number;
};

//원의 넓이를 구하는 메서드
exports.circleArea = function(radius){
  return radius * radius * Math.PI;
}
  • main.js
// 모듈을 추출
var module = require('./module.js');

// 모듈을 사용
console.log('abs(-273)=%d', module.abs(-273));
console.log('circleArea(3) = %d', module.circleArea(3));

node.js http module

2018-12-30 00:00:00 +0000

HTTP 모듈

HTTP

  • TCP/IP를 기반으로 하는 프로토콜
  • 웹서버는 클라이언트에서 요청하면 서버에서 응답을 주는 형식으로 되어있다

server 객체

  • http 모듈에서 가장 중요한 객체는 server객체
  • http 모듈의 createServer() 메서드를 사용하면 server 객체 생성
  • 아래 예제는 서버가 응답하지 않으므로 페이지에 내용을 표시하지 않고 계속 응답만 기다린다
var http = require('http');
// 웹 서버를 생성합니다.
var server = http.createServer();
// 웹 서버를 실행합니다.
server.listen(52273);
메서드 이름 설명
request 클라이언트가 요청할 때 발생하는 이벤트
connection 클라이언트가 접속할 때 발생하는 이벤트
close 클라이언트가 종료될 때 발생하는 이벤트
checkContinue 클라이언트가 지속적인 연결을 하고 있을 때 발생하는 이벤트
upgrade 클라이언트가 HTTP 업그레이드를 요청할 때 발생하는 이벤트
clientError 클라이언트에서 오류가 발생할 때 발생하는 이벤트
var http = require('http');
// server 객체를 생성
var server = http.createServer();

// server 객체에 이벤트 연결
server.on('request', function(code){
  console.log('Request On');
});

server.on('connection', function(code){
  console.log('Connection On');
});

server.on('close', function(code){
  console.log('Close On');
});

// listen()메서드 실행
server.listen(52273);

response 객체

| 메서드 이름 | 설명 | |:——–:|:——–:| | writeHead(statusCode, object) | 응답 헤더를 작성 | | end([data], [encoding]) | 응답 본문을 작성|

  • 클라이언트가 서버 응답을 받으면 페이지가 정상적으로 띄워짐
// 웹서버를 생성하고 실행합니다
require('http').createServer(function(request, response){
  response.writeHead(200, {'Content-Type':'text/html'});
  response.end('<h1>Hello World..!</h1>');

}).listen(60001);

File System 모듈을 사용한 HTML 페이지 제공

  • javascript 파일 위에서 모든 html 페이지를 문자열로 작성하는 것은 불가능
  • file System 모듈을 사용하여 서버에 존재하는 HTML 페이지를 클라이언트에 제공
  • html과 js 파일을 생성
// 모듈을 추출합니다.
var fs = require('fs');
var http = require('http');

// 서버를 생성하고 실행합니다.
http.createServer(function (request, response) {
  // HTML 파일을 읽습니다.
  fs.readFile('6-8.html', function (error, data) {
    response.writeHead(200, { 'Content-Type': 'text/html' });
    response.end(data);
  });
}).listen(52273, function () {
  console.log('Server Running at http://127.0.0.1:52273');
});

-html

<!DOCTYPE html>
<html>
<head>
  <title>Index</title>
</head>
<body>
  <h1>Hello Node.js</h1>
  <h2>Author. RintIanTta</h2>
  <hr />
  <p>Lorem ipsum dolor sit amet.</p>
</body>
</html>

이미지와 음악파일 제공

  • 60001번 포트로는 이미지 파일 제공. 60002번 포트는 음악 파일 제공 ~~~ var fs = require(‘fs’); var http = require(‘http’);

// 60001번 포트에 서버를 생성하고 실행 http.createServer(function(request, response){ // 이미지 파일 읽기 fs.readFile(‘Chrysanthemum.jpg’, function(error, data){ response.writeHead(200, {‘Content-Type’:’image/jpeg’}); response.end(data); }); }).listen(60001, function(){ console.log(‘Server Running at http://127.0.0.1:60001’); });

// 60002번 포트에 서버를 생성하고 실행 http.createServer(function(request, response){ // 음악 파일을 읽습니다 fs.readFile(‘Kalimba.mp3’, function(error, data){ response.writeHead(200, {‘Content-Type’:’audio/mp3’}); response.end(data); }).lesten(60002, function(){ console.log(‘Server Running at http://127.0.0.1:60002’); }); });


### 쿠키 생성
- 쿠키는 key, value로 이루어진 데이터
- 이름, 값 파기 날짜, 경로 정보 등을 가지고 있다
- 일정 기간동안 데이터를 저장할 수 있으므로 로그인을 유지할 때 사용
- response 객체의 Set-Cookie 속석으로 쿠기를 할당할 수 있음
- 아래 예제는 쿠키를 출력하는 예제. 첫 접속 시에는 쿠키가 없으므로 undefined를 출력하지만 두번째 부터는 쿠키의 내용을 출력한다

var http = require(‘http’); http.createServer(function(request, response){ // 변수를 선언 var date = new Date(); date.setDate(date.getDate() + 7);

// 쿠키 입력 response.writeHead(200, { ‘Content-Type’:’text/html’, ‘Set-Cookie’:[‘breakfast = toast;Expires = ‘+ date.toUTCString(), ‘dinner=chicken’] }); // 쿠키를 출력합니다 response.end(‘<h1>‘+request.headers.cookie + ‘</h1>’); }).listen(60001, function(){ console.log(‘server Start’); });


### 페이지 강제 이동
- 네이버 로그인 시 흰화면으로 이동후 재빨리 메인화면으로 이동
- 이렇게 페이지 강제 이동이 발생한다
- 사용법은 응답 헤더의 Location 속성에 이동할 url을 넣어주면 된다
| 응답번호 | 설명 |
|:--------:|:--------:|
| 1XX | 처리중 |
| 2XX | 성공 |
| 3XX | 리다이렉트 |
| 4XX | 클라이언트 오류 |
| 5XX | 서버 오류 |

var http = require(‘http’);

http.createServer(function(request, response){ response.writeHead(302, {‘Location’:’https://parkwonhui.github.io/’}) response.end(); }).listen(60001, function(){ console.log(‘server Start’); });


### request 객체
- 사용자가 요청한 페이지를 적절하게 제공해주고, 요청 방식에 따라서 페이지를 구분할 수 있음
- url 모듈을 사용해 pathname 추출 후 조건문으로 페이지를 따로 처리
| 속성 이름 | 설명 |
|:--------:|:--------:|
| method | 클라이언트의 요청 방식을 나타냄 |
| url | 클라이언트가 요청한 URL을 나타냄 |
| headers | 요청 메시지 헤더를 나타냄 |
| trailers | 요청 메시지 트레일러를 나타냄 |
| httpVersion | http 프로토콜 버전을 나타냄 |

var http = require(‘http’); var fs = require(‘fs’); var url = require(‘url’);

http.createServer(function(request, response){ // 변수를 선언 var pathname = url.parse(request.url).pathname; // 페이지를 구분 if(‘/’ == pathname){ fs.readFile(‘6-17.html’, function(error, data){ response.writeHead(200, {‘Content-Type’:’text/html’}); response.end(data); }); }else if(‘/OtherPage’ == pathname){ fs.readFile(‘6-18.html’, function(error, data){ response.writeHead(200, {‘Content-Type’:’text/html’}); response.end(data);

});   }

}).listen(60001, function(){ console.log(‘server Start’); }); ~~~

Posts

subscribe via RSS