2017년 10월 22일 일요일

Node.js 공부[3]

3챕터

노드의 자바스크립트와 친해지기 이다. 
이 챕터에서는 노드에 본격적으로 들어가기 전에 자바스크립트에 대해 간단히 소개하고 있다.

객체와 함수

자바 스크립트는 자바나 c와 다르게 자료형을 명시하지 않아도 된다.
자바스크립트에서는 Boolean, Number, String, undefined, null, Object 등의 자료형을 사용할 수 있으며, 코드에서는 var 키워드만을 사용하므로 타입을 바로 확인할 수 는 없다.
하지만 typeof연산자로 타입을 확인할 수 있다.

다음은 간단한 변수와 객체를 간단히 생성해본 예제이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var age=20;
console.log('나이: %d', age);
var name='소녀시대';
console.log('이름: %s'name);
//간단한 객체 생성
var Person ={};
Person['age'=20;
Person['name'= '소녀시대';
Person.mobile = '010-1000-1000';
console.log('나이: %d', Person.age);
console.log('이름: %s', Person.name);
console.log('전화번호: %d', Person.mobile);
cs

자바스크립트가 자료형을 표시하지 않기 때문에 함수를 호출하는 형도 약간 달라진다.
함수 선언 방식을 예제를 통해 보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//함수 선언 -자료형을 따로 안해준다는 특징이 있다. 
function add(a,b){
    return a+b;
};
var result = add(10,10);
console.log('더하기(10,10) : %d', result);
//다른 방식의 함수 선언
var add2 = function(a,b){
    return a+b;
}
var result2 = add2(10,10);
console.log('더하기2(10,10) : %d', result2);
cs
자바스크립트는 이렇게 변수에 함수를 할당하는 경우도 많다고 한다.

함수는 객체 안에 속성으로도 들어갈 수도 있다. 2가지 예제가 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var Person={};
Person['age'=20;
Person['name'='소녀시대';
var oper =function(a,b){
    return a+b;
};
Person['add'= oper;
console.log('더하기: %d', Person.add(10,10));
//객체를 만들면서 동시에 속성 초기화
var Person2={
    age:20,
    name:'소녀시대',
    add2: function(a,b){
        return a+b;
    }
};
console.log('더하기2: %d', Person2.add2(10,10));
cs
같은 결과가 나온다. 

배열

배열은 여러 개의 데이터를 하나의 변수에 담아 둘 수 있다.
배열은 대괄호를 통해 만들 수 있다. 그렇게 어렵지 않는 내용이니 예제들을 통해 이해하자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//Users라는 배열 생성
var Users = [{name:'소녀시대', age:20}, {name'걸스데이', age:22}];
//이름이 티아라인 객체를 push()를 통해 추가한다.
Users.push({name:'티아라',age:23});
//변수에 함수를 할당할 수 있는 것처럼 배열의 각 요소에도 함수를 직접 할당할 수 있다.
var add = function(a,b){
    return a+b;
};
Users.push(add);
//add가 4번째로 추가되었기때문에 User[3]으로 접근한다
console.log('함수 실행: %d', Users[3](10,10));
//배열 요소 확인하는 방법
console.log('배열 요소 확인 %s', Users[1].name);
//forEach 문을 통해 반복문을 수행하고 있다. 
Users.forEach(function(item, index){
    console.log('배열 요소 #'+ index + ':%s', item.name);
});
//배열의 끝에 있는 요소를 삭제한다. 
Users.pop();
//요소 확인을 해보면 마지막에 push된 add가 삭제된 것을 알 수 있다.
Users.forEach(function(item, index){
    console.log('pop 후 배열 요소 확인 #'+ index + ':%s', item.name);
});
//unshift는 배열의 맨앞에 추가한다. shift는 반대로 맨앞 요소를 제거한다. 
Users.unshift({name:'add', age:10});
Users.forEach(function(item, index){
    console.log('unshift 후 배열 요소 확인 #'+ index + ':%s', item.name);
});
//delete를 통해 중간의 요소를 삭제할 수 있다. 삭제해도 빈칸으로 남는듯? 길이를 출력해보면 여전히 4로 나온다.
delete Users[1];
console.log('delete로 삭제');
console.dir(Users);
console.log(Users.length); 
//slice를 통해 배열 요소를 여러개를 한꺼번에 추가하거나 삭제할 수 있다.
//두번째 인자를 0으로 준 후 추가하려는 객체를 파라미터로 전달하면 추가할 수 있다. 
Users.splice(0,0,{name:'추가'});
console.log('splice로 추가');
console.dir(Users);
//1번인덱스 부터 3개를 삭제한다.
Users.splice(1,3);
console.log('splice로 삭제');
console.dir(Users);
//또한 변수에 splice로 자른 배열을 저장할 수 있다.
var sliceUsers = Users.splice(0,1);
console.log('변수에 splice로 자른 배열 저장');
console.dir(sliceUsers);
cs

결과 



콜백 함수

자바스크립트 변수에는 숫자나 문자열 같은 데이터, 객체, 함수를 할당할 수있다. 이렇게 변수에 함수를 할당할 수 있다는 특징은 함수를 호출할 때 다른 함수를 파라미터로 전달하거나 함수 안에서 또 다른 함수를 만들어 반환할 수 있다는 뜻이다.

책의 예제이다.
이해가 조금 부족한 것 같으니 더 공부해야할 것같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
함수를 호출했을 때 또 다른 함수를 파라미터로 전달하는 방법
*/
//add에 callback 이라는 함수의 파라미터가 쓰인다
function add (a,b, callback){
    var result = a + b;
    
    //더한 값을 파라미터로 전달된 콜백 함수를 호출하면서 그 콜백함수로 전달한다. 
    callback(result);
};
//add함수 호출
//아까 callback(result)형태로 전달했으므로 function(res)형태엔 res에 더한 값이 저장 된다.
add(10,10function(res){
    console.log('파라미터로 전달된 콜백 함수 호출됨');
    console.log('더하기 (10,10)의 결과: %d', res);
    
});
/*
함수 안에서 값을 반환할 때 새로운 함수를 만들어 반환하는 방법
*/
//add2에는 callback2 라는 함수를 파라미터로 쓴다
function add2(a,b,callback2){
    var result2 = a+b;
    //더한 값 result2 를 callback에 넣는다
    callback2(result2);
    
    //count를 줘서 add2안의 history가 몇번 실행됬는지 볼 수 있다.
    var count = 0;
    var history = function(){
        count++;
        return count + '>>' + a + '+' + b + '=' + result2;
    };
    
    return history;
};
var add_history = add2(1010function(res2){
    console.log('파라미터로 전달된 콜백함수 호출됨');
    console.log('더하기(10,10)의 결과: %d', res2);
});
//콘솔창으로 count의 변화를 볼 수 있다. 
console.log('결과 값으로 받은 함수 실행 결과: '+ add_history());
console.log('결과 값으로 받은 함수 실행 결과: '+ add_history());
cs

프로토타입 객체

자바스크립트는 클래스는 개념이 없고, 기존의 객체를 복사하거나 객체의 특성을 확장하여 새로운 객체를 생성하는 프로토타입 기반의 언어이다. 프로토타입을 이용하여 새로운 객체를 만들고 이것이 또 다른 객체의 원형이 될 수 있다.

책의 예제 이다. 이것도 공부를 좀 더 해야할 것같다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Person(name, age){
    this.name = name;
    this.age = age;
}
//객체에 속성을 추가하고 싶다면 객체.prototype.속성 = ~~ 으로 할 수 있다.
//Person의 속성에 walk라는 함수를 추가한다. 
Person.prototype.walk = function(speed){
    console.log(speed +'속도로 걸어갑니다.');
}
var person1 = new Person('소녀시대'20);
var person2 = new Person('걸스데이'22);
console.log(person1.name + '객체의 walk(10)을 호출합니다.');
person1.walk(10);
cs

참고할 것!
콜백 관련

프로토타입 관련

Real MySQL 13장[프로그램 연동] 정리 ...작성 중

수업 때 사용한 개발자와 DBA를 위한 Real MySQL책에서 이부분들을 학습/정리해보자.

13장 프로그램 연동
14장 데이터 모델링
16장 베스트 프랙티스

프로그램 연동

책에서는 JDBC 드라이버나 MySQL의 C API를 이용해 프로그램을 작성할 때의 2가지를 소개하고 있다.


자바

자바 프로그램 언어로 MySQL 데이터베이스에 접속해서 SQL을 실행하려면 자바에서 제공하는 접속 API인 JDBC를 이용해야한다. 

연결하는 방식은 예전에 JSP로 DB연동할때랑 똑같은 것 같다.


*Statement와 PreparedStatement 차이
MySQL서버로 쿼리를 요청하면 MySQL 서버는 쿼리를 분석해 파스 트리를 만들고 그 정보를 분석해 권한 체크나 쿼리의 최적화 작업을 수행한다. 그리고 최종적으로 준비된 쿼리의 실행 계획을 이용해 쿼리를 실행한다.
요청> 쿼리 분석 > 최적화 > 권한 체크 > 쿼리 실행

하지만 쿼리 분석이나 최적화 같은 작업은 상대적으로 시간이 걸린다. 하지만 preparedStatement를 사용하면 쿼리 분석이나 최적화의 일부 작업을 처음 한 번만 수행해 별도로 저장해 두고, 다음부터 요청되는 쿼리는 저장된 분석 결과를 재사용한다. 이로써 빠르게 처리 가능하다.  
>>한 번 싱행된 쿼리는 매번 쿼리 분석 과정을 거치지 않고 처음 분석된 정보를 재사용한다는 성능적인 장점을 가지고 있음. 


2017년 10월 21일 토요일

Node.js 공부[2]

2챕터

노드  간단하게 살펴보기이디.
책에서는 실행방법을 간단히 소개하고있다.

명령 프롬프트 창에서 실행하기 




브라켓의 확장 기능 NodeJS Integration 설치 후 브라켓에서 실행




노드 셸에서 직접 코드 입력하고 실행 



노드에서 사용할 수 있는 대표적인 전역 객체

console : 콘솔 창에 결과를 보여주는 객체
ex)
console.log('%d', 10); >>숫자
console.log('%s', '안녕'); >>문자열
console.log('%j', {name: '안녕'}); >>JSON객체

process : 프로세스의 실행에 대한 정보를 다루는 객체

exports : 모듈을 다루는 객체

**JSON 이란??
자바스크립트의 객체 포맷으로 단말끼리 데이터를 주고받을 때 많이 사용함.
중괄호{}를 이용해 객체를 만들 수 있으며, 그 안에 key와 value 으로 구성된 속성들은 ,로 구분함. 

JSON 참조
http://boramjeong.com/140199144589
http://www.json.org/json-ko.html
https://ko.wikipedia.org/wiki/JSON


이 3개에 대해 예제를 통해 보자 

콘솔 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var result = 0;
console.time('duration_sum'); //time 실행 시간을 측정하기 위한 시간을 기록
for(var i =1; i<=10000; i++){
    result +=1;
}
console.timeEnd('duration_sum'); //timeEnd 실행시간을 측정하기 위한 끝시간 기록
console.log('결과물은: %d', result);
console.log('현재 실행한 파일의 이름: %s', __filename); //실행한 파일의 이름을 출력, 파일의 전체 패스가 출력됨
console.log('현재 실행한 파일의 패스: %s', __dirname); //실행한 파일이 들어 있는 폴더를 출력, 폴더 전체의 패스가 출력됨
var Person = {name:"소녀시대", age:20};
console.dir(Person);
//ㅎㅇ
cs

예제 실행 결과 


프로세스 객체 예제

process 객체는 프로그램을 실행했을 때 만들어지는 프로세스 정보를 다루는 객체이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
console.log('argv 속성의 파라미 수:' + process.argv.length);
//argv : 프로세스를 실행할 때 전달되는 파라미터(매개변수) 정보
console.dir(process.argv);
if(process.argv.length > 2){
    console.log('세 번째 파라미터의 값 :S', process.argv[2]);    
}
process.argv.forEach(function(item, index){
console.log(index+':', item);
});
console.dir(process.env);
//env : 환경 변수 정보 
//exit() : 프로세스를 끝내는 메소드
cs

결과

port 와 7001 를 추가하여 실행해본 결과이다. 
argv는 배열 객체이므로 인덱스 2를 사용하면 세번째 파라미터 값을 알 수 있다.
forEach문을 실행한 결과를 보면 port와 7001이 추가되어 출력되는 것을 볼 수 있다. 
추가 안해줬을때는 0,1 번만 출력됨을 알 수 있다. 


Exports / 모듈 예제

모듈을 통해 기능을 나누어 프로그램을 관리할 수 있다. 
이때 exports 객체의 속성으로 변수나 함수를 지정하면 그 속성을 다른 곳에서 불러와 사용할 수 있다. 

2가지형태로 불러올 수 있다.
1
2
3
4
5
6
//exports.함수 형태
exports.add = function(a,b){
    return a+ b;
}
cs
1
2
3
4
5
6
7
8
9
10
11
//module.exports형태
var calc ={};
calc.add = function(a,b){
    return a+b;
};
module.exports = calc;
cs

1
2
3
4
5
6
7
8
9
10
11
//exports.함수 호출
var calc = require('./calc');
console.log('모듈로 분리한 후 - calc 함수 호출 결과 : %d', calc.add(10,10));
//module.exports 호출 
var calc2 = require('./calc2');
console.log('모듈로 분리한 후 - calc2.add 함수 호출 결괴: %d', calc2.add(1010));
cs

실행 결과


외장 모듈 사용하기 

다른 사람이 만들어 놓은 모듈을 불러와 사용할 수 있다. 
책에선 시스템 환경 변수에 접근할 수 있는 nconf를 사용한다. 
모듈은 npm패키지를 사용하여 다운로드 할 수 있다. 

npm을 사용하여 nconf 패키지 설치 
경로에 보면 node_modules 라는 폴더가 생성되었다. 

그 후 
1
2
3
4
var nconf = require('nconf');
nconf.env();
console.log('OS 환경 변수의 값 : %s' , nconf.get('OS'));
cs
실행 시 정상적으로 작동한다.(패키지 설치전에는 nconf 모듈을 찾을 수 없다고 뜬다)



하지만 설치한 노드모듈은 이 프로젝트 폴더 내에서만 작동하므로, 이 폴더를 상위로 옮기면 모든 프로젝트에 적용가능하다. 

만약 다른 프로젝트나 PC에서 자신이 만든 프로그램을 실행하려할때 외부 패키지가 많다면 일일히 다시 설치해야할 것이다. 
노드에서는 외부 패키지의 수만큼 npm명령을 입력해야하는 번거로움을 없앨 수 있도록 package.json파일 안에 패키지들의 정보를 넣어둘 수 있다.

예제 폴더에 package.json을 만드려면 해당 폴더 경로에서 npm init 실행 후 name:질문에 node라 입력 후 엔터를 계속 입력하면 생성된다. name에는 영문 소문자이면 된다고 한다. 

package.json 이후 패키지 설치할때는 npm install ㅁㅁ --save 를  하면된다.
dependencies 속성에서 설치된 것을 볼 수 있다. 

이 모듈들을 다른 곳에서 사용하고 싶을때는 package.json파일을 옮긴 후 npm install 명령을 입력하면 dependencies 속성을 참조하여 패키지들이 설치된다. 


내장 모듈 사용하기

노드를 설치했을 때 기본적으로 들어 있는 몇가지 내장모듈에 대해 간단히 살펴본다.
https://nodejs.org/api/ 에서 내장 모듈에 대한 정보를 찾을 수 있다.

책에서는 os와 path 모듈에 대한 예제가 나와있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//시스템 정보를 알려주는 os모듈
var os = require('os'); 
//파일 패스를 다루는 path 모듈
var path = require('path');
console.log('시스템의 hostname : %s', os.hostname());
//hostname():운영체제의 호스트 이름을 알려준다.
console.log('시스템의 메모리: %d / %d', os.freemem(), os.totalmem());
//freemem(): 시스템에서 사용가능한 메모리 용량을 알려준다. 
//totalmem(): 시스템의 전체 메모리 용량을 알려준다.
console.log('시스템의 CPU 정보\n');
console.dir(os.cpus());
//cpus(): CPU정보를 알려준다
console.log('시스템의 네트워크 인터페이스 정보\n');
console.dir(os.networkInterfaces());
//networkInterfaces(): 네트워크 인터페이스 정보를 담은 배열 객체를 반환함
//디렉터리 이름 합치기
var directories = ["users""mikes""docs"];
var docsDirectory = directories.join(path.sep);
//join() : 여러개의 이름들을 모두 합쳐 하나의 파일패스로 만들어 준다. 파일 패스를 완성 할때 구분자 등을 알아서 조정해준다.
console.log('문서 디렉토리 : %s', docsDirectory);
//디렉터리 이름과 파일 이름 합치기 
var curPath = path.join('/Users/mike''notepad.exe');
console.log('파일 패스 : %s', curPath);
//패승에서 디렉터리, 파일 이름, 확장 구별하기
var filename="C:\\Users\\mike\\notepad.exe";
var dirname = path.dirname(filename);
//dirname(): 파일 패스에서 디렉터리 이름을 반환한다. 
var basename = path.basename(filename);
//basename(): 파일 패스에서 이름을 반환한다.
var extname = path.extname(filename);
//extname(): 파일 패스에서 파일의 확장자를 반환한다. 
console.log('디렉터리 : %s, 파일 이름: %s, 확장자: %s', dirname, basename, extname);
cs


4챕터부터 미션이 생기니 3챕터까지는 빠르게 해야할 것 같다.

ajax 예제(cot에서 쓰인 부분 정리)

커뮤니티 페이지(Cot)에서 ajax를 쓴 부분을 정리


게시물 조회시 댓글을 ajax방식으로 호출 했다.
1
2
3
4
5
6
7
8
9
10
11
//게시물 조회시 댓글 호출    
function listReply() {
        $.ajax({
            type : "get",
            url : "${path}/freereply/list.do?bnum=${dto.bnum}",
            success : function(result) {
                // responseText가 result에 저장됨.
                $("#listReply").html(result);
            }
        });
    }
cs

type은 통신 타입이다. POST 또는 GET을 선택할 수 있다.
url은 요청할 url로 글번호(bnum)에 맞는 댓글들을 불러오는 컨트롤러로 연결된다.
success는 성공적으로 요청/응답이 되면 listReply 부분에 결과를 html형식으로 표시한다.
해당 jsp에서는 

<!-- 댓글 목록 위치 -->
<div id="listReply"></div>

으로 댓글 목록을 위치시켰다.



댓글 수정화면 댓글의 댓글 창또한 ajax를 이용해 새로고침 없이 창을 보이게 하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 댓글 수정화면 생성 
function showReplyModify(rnum) {
    $.ajax({
        type : "get",
        url : "${path}/freereply/detail/" + rnum,
        success : function(result) {
            $("#modifyReply").html(result);
            // 태그.css("속성", "값")
            $("#modifyReply").css("visibility""visible");
        }
    })
}
// 댓글의  코멘트 생성 
function showReplyComment(rnum) {
    $.ajax({
        type : "get",
        url : "${path}/freereply/commentwrite/" + rnum,
        success : function(result) {
            $("#ReplyComment").html(result);
            // 태그.css("속성", "값")
            $("#ReplyComment").css("visibility""visible");
        }
    })
}
cs
형태는 위와 비슷하다. 


로그인을 사이드 메뉴에서 구현하였다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function signin() {
            if($("#user_id").val()==""){
                alert("아이디를 입력해주세요.");
                $("#user_id").focus();
                }else if($("#password").val() ==""){
                    alert("비밀번호를 입력해주세요");
                    $("#password").focus();
                    
                    }else{
            $.ajax({
                url : './j_spring_security_check',
                data : $('form input').serialize(),
                type : 'POST',
                dataType : 'json',
               
            }).done(function(body) {
                var message = body.response.message;
                var error = body.response.error;
                if (error)
                    get_msg(message);
                if (error == false) {
                    var url = '${referer}';
                    if (url == '')
                        url = '<c:url value="/users/mypage" />';
                    location.href = url;
                }
            });
         }
        }
cs
앞의 if문은 아이디 비밀번호 체크이므로, ajax부터 본다면, 

data는 서버에 요청시 보낼 파라미터이다.
dataType은 응답 받을 데이터 타입을 선택한다.(XML, TEXT, HTML, JSON 등) 

아까랑 다르게 success가 아닌 done인데 같은의미인데 순서가 다른 것 같다.
검색해보니 success error 보다는 done fail 패턴이 동일한 요청에 대해 여러 성공 콜백을 호출할 때 함수 배열을 통해 더 깔끔?하게 처리해서 최근 done이 많이 쓰이는 것 같다...


beforesend에 대해서도 찾아볼 것 

2017년 10월 20일 금요일

Node.js 공부[1]

예전에 조금했던 Do it node.js 책을 다시 공부시작!

이번엔 제대로 정리해보면서 한 게시글에 1챕터씩 정리!

노드 정리 블로그가 많으니 찾아보면서 하자
http://asfirstalways.tistory.com/43

1챕터

노드(Node.js)는 자바스크립트를 이용해서 서버를 만들 수 있는 개발 도구


노드는 왜 만들게 되었는가??

웹 서버에 파일을 업로드할 때, 업로드가 완료되기 전까지 웹 서버에서 데이터를 조회한다거나 하는 등의 작업을 할 수 없었는데, 이 문제를 해결하기 위해 만든 것
>> 비동기 입출력(논블록킹 입출력, Non-Blocking IO)방식 적용


동기 입출력 방식 vs 비동기 입출력 방식 비교
참고 ,,다시 정리 할것 

모듈이란?

필요한 기능을 별도의 자바스크립트로 만든 후 필요할 때 불러와서 사용할 수 있음

>>이 여러 개의 모듈을 합쳐서 하나의 패키지로 만들어 두면, 다른 프로그래머들도 npm을 통해 쉽게 설치하여 사용할 수 있음
npm(Node Package Manager)


노드 특징

V8엔진
자바스크립트는 코드를 한 줄씩 해석하면서 실행하는 인터프리터 방식을 사용하여 속도가 느려 문제가 되었지만, 구글(크롬)의 V8엔진으로 해결
>>V8엔진은 자바스크립트 코드를 네이티브 코드로 바꾼 후 실행할 수 있는데, 노드는 V8엔진을 이용해 자바스크립트 코드를 빠르게 실행할 수 있음

이벤트 기반 방식
입력장치로 데이터를 전송했을때만 작동하는 방식
자원 최소화 가능?

Non-Blocking
비동기 참조

Single Thread

개발 도구

책에서는 브라켓과 크롬을 사용한다.  [2]부턴 직접 써볼듯?