반응형
nodejs 파일 읽기 방식 : 

readFileSync: 동기
readFile :비동기


package.json 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
  "name""nodejs-console-app1",
  "version""0.0.0",
  "description""NodejsConsoleApp1",
  "main""app.js",
  "author""PC_D",
  "dependencies"{
    "nconf""^0.10.0",
    "underscore""^1.8.3"
  },
  "devDependencies"{},
  "scripts"{
    "test""echo \"Error: no test specified\" && exit 1"
  },
  "license""ISC"
}
 






파일 읽기 example


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var fs = require('fs');
 
/*
 * //파일을 다 읽은 이후에 완료가 뜬다
var data = fs.readFileSync('./package.json', 'utf8');
console.log(data);
console.log('완료');
*/
 
//비동기 방식으로
//파일을 읽는 동안 완료가 먼저 뜨고 그다음 파일 내용을 보여준다
//파일이 다 읽히면 call back 함수를 호출한다
var data = fs.readFile('./package.json''utf8'function (err, data) {
    //파일 다 읽었을 대 호출 됨
    console.log(data);
});
console.log('완료');
 
 





결과 :


이며 결과는 동기 일때 '완료'가 파일 내용 하단에 뜬다



반응형
반응형

기존 전역 객체 process 가 아닌 모듈로 만들어 이벤트를 호출 할 수있는 즉 객체에 EventEmitter를

상속 받아 이벤트를 호출하는 구조


util 모듈을 통해 상속구문을 보다 간편하게 처리할 수 있다


//calculation는 EventEmitter을 상속 받는다
util.inherits(calculation, EventEmitter);



'stop' 인 사용자 정의형 이벤트를 calculation 에 등록함


calculation.js

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
 
 
var EventEmitter = require('events').EventEmitter;      //이벤트를 위한 모듈
var util = require('util');                             //프로포타입 객체를 쉽게 상속 할 수 있게 해줌
 
 
var calculation = function () {
 
    this.on('stop'function ()
        {
        console.log('calculation 에 stop 이벤트 전달됨');
        }
    );
 
};
 
calculation.prototype.add = function (a, b) {
    return a + b;
}
 
//calculation는 EventEmitter을 상속 받는다
util.inherits(calculation, EventEmitter);
 
 
 
module.exports = calculation;
 
 




1
2
3
4
5
6
7
var calc = require('./calculation');
 
//모듈로 읽어온 것을 객체로 만들 수 있음 moudle.exports 느 calculation 과 동일한 형태임으로
var calculationReal = new calc();
 
calculationReal.emit('stop');
 





결과




반응형
반응형

emit 으로 해당 이벤트를 보내고
on 을 통해 등록된 이벤트가 실행된다

이벤트는 EventEmitter 를 상속 받아 객체를 만들어 이벤트를 처리한다

require();

process 전역 객체는 이미 EventEmitter 를 상속 받고 있기때문에 on() 함수를 쓸 수 있음

exit 이벤트가 발생되면 함수가 실행됨

process 에 {'exit', function(){ ...} } 를 등록한것

이벤트 중에는 미리 정의되어 있는 것들이 있음 (ex : exit)


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
 
//미리 정의된 이벤트
process.on('exit', function(){
    console.log('exit 이벤트 발생 되었음');
});
 
 
//사용자 정의형 이벤트
process.on('tick', function (num) {
    console.log('tick 이벤트 실행** : ' + num);
}
);
 
console.log('2초후 이벤트 실행 대기');
 
setTimeout(
    function () {
 
        process.emit('tick', 20000);
    }
    , 2000
);
 
 
setTimeout(
    function () {
        process.exit();     //이벤트 발생
    }
    , 2000
);
 
 
   

         



결과 화면

2호후 이벤트 대기 실행 부분에서 멈춰 있다가 2호 후에 이벤트 들이 실행된다





반응형
반응형


'url' 과 'querystring' 모듈로 주소 파싱하기


검색했던 query 찾는 방법


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
var url = require('url');
 
 
//naver 에서 3dmp 검색한 url
var urlStr = 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=3dmp';
 
 
var curUrl = url.parse(urlStr); //각 url 을 각 속성으로 분리
 
console.dir(curUrl);
 
console.log();
 
 
console.log(curUrl.query);
 
console.log(url.format(curUrl));   // 다시 합치기
 
 
console.log();
 
var querystring = require('querystring');       //query 만을 알아보곳 피을떄 querystring 모듈 로딩
console.log(querystring.parse(curUrl.query));
 
console.log();
 
console.log(querystring.parse(curUrl.query).query);  // parse 한다음 분리된 속성 중  query 를통해 얻을 수 있음
 
console.log();




반응형
반응형

prototype 기본 사용

 

개체 클래스의 프로토타입에 대한 참조를 반환합니다.


1
objectName.prototype

objectName 인수는 개체의 이름입니다.

  1. prototype 속성은 개체 클래스에 기본적인 함수 집합을 제공하기 위해 사용합니다.  

  2. 개체의 새로운 인스턴스는 해당 개체에 할당된 프로토타입의 동작을 "상속"받습니다.  
    새로운 객체를 prototype 에 대입하면 대입된 객체가 부모가 됨

  1. 예를 들어 가장 큰 배열 요소의 값을 반환하는 Array 개체에 메서드를 추가하려면
    함수를 선언하고 이를 Array.prototype에 추가한 후 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function array_max( )
{
    var i, max = this[0]; //이때 this 는 자기자신 배열의 원소들을 가져오기위한 용도로 사용된다
    for (i = 1; i < this.length; i++)
    {
    if (max < this[i])
     max = this[i];
    }
    return max;
}
Array.prototype.max = array_max;
var myArray = new Array(71311259);
document.write(myArray.max());
 
// 결과 :
// 25










JavaScript는 클래스라는 개념이 없습니다. 그래서 기존의 객체를 복사하여(cloning) 새로운 객체를 생성하는 프로토타입 기반의 언어입니다. 프로토타입 기반 언어는 객체 원형인 프로토타입을 이용하여 새로운 객체를 만들어냅니다. 이렇게 생성된 객체 역시 또 다른 객체의 원형이 될 수 있습니다. 프로토타입은 객체를 확장하고 객체 지향적인 프로그래밍을 할 수 있게 해줍니다. 프로토타입은 크게 두 가지로 해석됩니다. 프로토타입 객체를 참조하는 prototype 속성과 객체 멤버인 proto 속성이 참조하는 숨은 링크가 있습니다. 이 둘의 차이점을 이해하기 위해서는 JavaScript 함수와 객체의 내부적인 구조를 이해 해야합니다. 이번 글에서는 JavaScript의 함수와 객체 내부 구조부터 시작하여 프로토타입에 대해 알아보겠습니다.

1. 함수와 객체의 내부 구조

JavaScript에서는 함수를 정의하고, 파싱단계에 들어가면, 내부적으로 수행되는 작업이 있습니다. 함수 멤버로 prototype 속성이 있습니다. 이 속성은 다른 곳에 생성된 함수이름의 프로토타입 객체를 참조합니다. 프로토타입 객체의 멤버인 constructor 속성은 함수를 참조하는 내부구조를 가집니다. 아래의 그림 1과 같이 표현합니다.

tip : 이미지상 오른쪽을로 '프로토타입 객체' 라고 하는데, '프로토타입 객체'라는 두 단어가 각각 다른것을 의미하는 것이 아니고
       두단어가 합쳐져 프로토타입객체 라고 칭하고있음




[그림 1]
function Person(){}  

[소스 1]

속성이 하나도 없는 Person이라는 함수가 정의되고, 파싱단계에 들어가면, Person 함수 Prototype 속성은 프로토타입 객체를 참조합니다. 프로토타입 객체 멤버인 constructor 속성은 Person 함수를 참조하는 구조를 가집니다. 여기서 알아야 하는 부분은 Person 함수의 prototype 속성이 참조하는 프로토타입 객체는 new라는 연산자와 Person 함수를 통해 생성된 모든 객체의 원형이 되는 객체입니다. 생성된 모든 객체가 참조한다는 것을 기억해야 합니다. 아래의 그림 2와 같이 표현합니다.

[그림 2]
function Person(){}

var joon = new Person();  
var jisoo = new Person();  

[소스 2]

JavaScript에서는 기본 데이터 타입인 boolean, number, string, 그리고 특별한 값인 null, undefined 빼고는 모두 객체입니다. 사용자가 정의한 함수도 객체이고, new라는 연산자를 통해 생성된 것도 객체입니다. 객체 안에는 proto(비표준) 속성이 있습니다. 이 속성은 객체가 만들어지기 위해 사용된 원형인 프로토타입 객체를 숨은 링크로 참조하는 역할을 합니다.


2. 프로토타입 객체란?

함수를 정의하면 다른 곳에 생성되는 프로토타입 객체는 자신이 다른 객체의 원형이 되는 객체입니다. 모든 객체는 프로토타입 객체에 접근할 수 있습니다. 프로토타입 객체도 동적으로 런타임에 멤버를 추가할 수 있습니다. 같은 원형을 복사로 생성된 모든 객체는 추가된 멤버를 사용할 수 있습니다.


[그림 3]
function Person(){}

var joon = new Person();  
var jisoo = new Person();

Person.prototype.getType = function (){  
    return "인간"; 
};

console.log(joon.getType());   // 인간  
console.log(jisoo.getType());  // 인간  

[소스 3]

위 소스 3 6라인은 함수 안의 prototype 속성을 이용하여 멤버를 추가하였습니다. 프로토타입 객체에 getType()이라는 함수를 추가하면 멤버를 추가하기 전에 생성된 객체에서도 추가된 멤버를 사용할 수 있습니다. 같은 프로토타입을 이용하여 생성된 joon과 jisoo 객체는 getType()을 사용할 수 있습니다.

여기서 알아두어야 할 것은 프로토타입 객체에 멤버를 추가, 수정, 삭제할 때는 함수 안의 prototype 속성을 사용해야 합니다. 하지만 프로토타입 멤버를 읽을 때는 함수 안의 prototype 속성 또는 객체 이름으로 접근합니다.

[그림 4]
joon.getType = function (){  
    return "사람"; 
};

console.log(joon.getType());   // 사람  
console.log(jisoo.getType());  // 인간

jisoo.age = 25;

console.log(joon.age);   // undefined  
console.log(jisoo.age);  // 25  

[소스 4]

위 소스 4 1라인은 joon 객체를 이용하여 getType() 리턴 값을 사람으로 수정하였습니다. 그리고 joon과 jisoo에서 각각 getType()을 호출하면 joon 객체를 이용하여 호출한 결과는 사람으로 출력되고, jisoo로 호출한 결과는 인간이 출력됩니다. joon 객체를 사용하여 getType()을 호출하면 프로토타입 객체의 getType()을 호출한 것이 아닙니다. joon 객체에 추가된 getType()을 호출한 것입니다. 프로토타입 객체의 멤버를 수정할 경우는 멤버 추가와 같이 함수의 prototype 속성을 이용하여 수정합니다.

[그림 5]
Person.prototype.getType = function (){  
    return "사람"; 
};

console.log(jisoo.getType());  // 사람  

[소스 5]

소스 5를 보게 되면 함수의 prototype 속성을 이용하여 getType() 리턴 값을 사람으로 수정합니다. 그리고 jisoo 객체를 이용하여 호출한 결과 사람이 나옵니다.

결론을 내리면, 프로토타입 객체는 새로운 객체가 생성되기 위한 원형이 되는 객체입니다. 같은 원형으로 생성된 객체가 공통으로 참조하는 공간입니다. 프로토타입 객체의 멤버를 읽는 경우에는 객체 또는 함수의 prototype 속성을 통해 접근할 수 있습니다. 하지만 추가, 수정, 삭제는 함수의 prototype 속성을 통해 접근해야 합니다.





3. 프로토타입이란?

JavaScript에서 기본 데이터 타입을 제외한 모든 것이 객체입니다. 객체가 만들어지기 위해서는 자신을 만드는 데 사용된 원형인 프로토타입 객체를 이용하여 객체를 만듭니다. 이때 만들어진 객체 안에 __proto__ (비표준) 속성이 자신을 만들어낸 원형을 의미하는 프로토타입 객체를 참조하는 숨겨진 링크가 있습니다. 이 숨겨진 링크를 프로토타입이라고 정의합니다.

[그림 6]
function Person(){}

var joon = new Person();  

[소스 6]

위 그림 6 joon 객체의 멤버인 __proto__ (비표준) 속성이 프로토타입 객체를 가리키는 숨은 링크가 프로토타입이라고 합니다. 프로토타입을 크게 두 가지로 해석된다 했습니다. 

함수의 멤버인 prototype 속성은 프로토타입 객체를 참조하는 속성입니다. 그리고 함수와 new 연산자가 만나 생성한 객체의 프로토타입 객체를 지정해주는 역할을 합니다. 객체 안의 __proto__(비표준) 속성은 자신을 만들어낸 원형인 프로토타입 객체를 참조하는 숨겨진 링크로써 프로토타입을 의미합니다.

JavaScript에서는 숨겨진 링크가 있어 프로토타입 객체 멤버에 접근할 수 있습니다. 그래서 이 프로토타입 링크를 사용자가 정의한 객체에 링크가 참조되도록 설정하면 코드의 재사용과 객체 지향적인 프로그래밍을 할 수 있습니다.




4. 코드의 재사용

코드의 재사용 하면 떠오르는 단어는 바로 상속입니다. 클래스라는 개념이 있는 Java에서는 중복된 코드를 상속받아 코드 재활용을 할 수 있습니다. 하지만 JavaScript에서는 클래스가 없는, 프로토타입 기반 언어입니다. 그래서 프로토타입을 이용하여 코드 재사용을 할 수 있습니다.

이 방법에도 크게 두 가지로 분류할 수 있습니다. classical 방식과 prototypal 방식이 있습니다. classical 방식은 new 연산자를 통해 생성한 객체를 사용하여 코드를 재사용 하는 방법입니다. 마치 Java에서 객체를 생성하는 방법과 유사하여 classical 방식이라고 합니다. prototypal 방식은 리터럴 또는 Object.create()를 이용하여 객체를 생성하고 확장해 가는 방식입니다. 두 가지 방법 중 JavaScript에서는 prototypal 방식을 더 선호합니다. 그 이유는 classical 방식보다 간결하게 구현할 수 있기 때문입니다. 밑의 예제 1 ~ 4번까지는 classical 방식의 코드 재사용 방법이고, 5번은 prototypal 방식인 Object.create()를 사용하여 코드의 재사용을 보여줍니다.

(1) 기본 방법

부모에 해당하는 함수를 이용하여 객체를 생성합니다. 자식에 해당하는 함수의 prototype 속성을 부모 함수를 이용하여 생성한 객체를 참조하는 방법입니다.


[그림 7]
function Person(name) {  
    this.name = name || "혁준"; 
}

Person.prototype.getName = function(){  
    return this.name;
};

function Korean(name){}  
Korean.prototype = new Person();

var kor1 = new Korean();  
console.log(kor1.getName());  // 혁준

var kor2 = new Korean("지수");  
console.log(kor2.getName());  // 혁준  

[소스 7]

위 소스 7을 보면 부모에 해당하는 함수는 Person입니다. 10라인에서 자식 함수인 Korean 함수 안의 prototype 속성을 부모 함수로 생성된 객체로 바꿨습니다. 이제 Korean 함수와 new 연산자를 이용하여 생성된 kor 객체의 __proto__속성이 부모 함수를 이용하여 생성된 객체를 참조합니다. 이 객체가 Korean 함수를 이용하여 생성된 모든 객체의 프로토타입 객체가 됩니다. kor1에는 name과 getName() 이라는 속성이 없지만, 부모에 해당하는 프로토타입객체에 name이 있습니다. 이 프로토타입객체의 부모에 getName()을 가지고 있어 kor1에서 사용할 수 있습니다. 이 방법에도 단점이 있습니다. 부모 객체의 속성과 부모 객체의 프로토타입 속성을 모두 물려받게 됩니다. 대부분의 경우 객체 자신의 속성은 특정 인스턴스에 한정되어 재사용할 수 없어 필요가 없습니다. 또한, 자식 객체를 생성할 때 인자를 넘겨도 부모 객체를 생성할 때 인자를 넘겨주지 못합니다. 그림 7 소스 하단 두 번째 줄에서 kor2 객체를 생성할 때 Korean 함수의 인자로 지수라고 주었습니다. 객체를 생성한 후 getName()을 호출하면 지수라고 출력될 거 같지만, 부모 생성자에 인자를 넘겨주지 않았기 때문에 name에는 default 값인 혁준이 들어있습니다. 객체를 생성할 때마다 부모의 함수를 호출할 수도 있습니다. 하지만 매우 비효율적입니다. 그래서 다음 방법은 이 방법의 문제점을 해결하는 방법을 알아보겠습니다.

(2) 생성자 빌려 쓰기

이 방법은 기본 방법의 문제점인 자식 함수에서 받은 인자를 부모 함수로 인자를 전달하지 못했던 부분을 해결합니다. 부모 함수의 this에 자식 객체를 바인딩하는 방식입니다.

[그림 8]
function Person(name) {  
    this.name = name || "혁준";
}

Person.prototype.getName = function(){  
    return this.name;
};

function Korean(name){  
    Person.apply(this, arguments);
}

var kor1 = new Korean("지수");  
console.log(kor1.name);  // 지수  

[소스 8]

위 소스 8 10라인을 보면 Korean 함수 내부에서 apply 함수를 이용합니다. 

부모객체인 Person 함수 영역의 this를 Korean 함수 안의 this로 바인딩합니다. 
함수를 호출하여 지정된 개체를 함수의 this 값으로 대체하고 지정된 배열을 함수의 인수로 대체합니다.

객체를 생성하고, name을 출력합니다. 객체를 생성할 때 넘겨준 인자를 출력하는 것을 볼 수 있습니다. 기본 방법에서는 부모객체의 멤버를 참조를 통해 물려받았습니다. 하지만 생성자 빌려 쓰기는 부모객체 멤버를 복사하여 자신의 것으로 만들어 버린다는 차이점이 있습니다. 하지만 이 방법은 부모객체의 this로 된 멤버들만 물려받게 되는 단점이 있습니다. 그래서 부모객체의 프로토타입 객체의 멤버들을 물려받지 못합니다. 위 그림 8 그림을 보시면 kor1 객체에서 부모객체의 프로토타입 객체에 대한 링크가 없다는 것을 볼 수 있습니다.


(3) 생성자 빌려 쓰고 프로토타입 지정해주기

이 방법은 방법 1과 방법 2 문제점들을 보완하면서 Java에서 예상할 수 있는 동작 방식과 유사합니다.

[그림 9]
function Person(name) {  
    this.name = name || "혁준"; }

Person.prototype.getName = function(){  
    return this.name;
};

function Korean(name){  
    Person.apply(this, arguments);
}
Korean.prototype = new Person();

var kor1 = new Korean("지수");  
console.log(kor1.getName());  // 지수  

[소스 9]

위 소스 9 9라인에서 부모 함수 this를 자식 함수 this로 바인딩합니다. 11라인에서 자식 함수 prototype 속성을 부모 함수를 사용하여 생성된 객체로 지정했습니다. 부모객체 속성에 대한 참조를 가지는 것이 아닌 복사본을 통해 내 것으로 만듭니다. 동시에 부모객체의 프로토타입 객체에 대한 링크도 참조됩니다. 부모객체의 프로토타입 객체 멤버도 사용할 수 있습니다. 그림 7과 비교했을 때 kor1 객체에 name 멤버가 없는 반면 그림 9에서는 name 멤버를 가지고 있는 것을 확인할 수 있습니다. 그림 8과 비교했을 때는 프로토타입 링크가 부모 함수로 생성한 객체에 대해 참조도 하고 있습니다. 그리고 부모 객체의 프로토타입 객체도 링크로 연결된 것을 볼 수 있습니다. 이 방법에도 문제점이 있습니다. 부모 생성자를 두 번 호출합니다. 생성자 빌려 쓰기 방법과 달리 getName()은 제대로 상속되었지만, name에 대해서는 kor1 객체와 부모 함수를 이용하여 생성한 객체에도 있는 것을 볼 수 있습니다.

(4) 프로토타입공유

이번 방법은 부모 생성자를 한 번도 호출하지 않으면서 프로토타입 객체를 공유하는 방법입니다.

[그림 10]
function Person(name) {  
    this.name = name || "혁준";
}

Person.prototype.getName = function(){  
    return this.name;
};

function Korean(name){  
    this.name = name;
}    
Korean.prototype = Person.prototype;

var kor1 = new Korean("지수");  
console.log(kor1.getName());  // 지수  

[소스 10]

위 소스 10 12라인에서 자식 함수의 prototype 속성을 부모 함수의 prototype 속성이 참조하는 객체로 설정했습니다. 자식 함수를 통해 생성된 객체는 부모 함수를 통해 생성된 객체를 거치지 않고 부모 함수의 프로토타입 객체를 부모로 지정하여 객체를 생성합니다. 부모 함수의 내용을 상속받지 못하므로 상속받으려는 부분을 부모 함수의 프로토타입 객체에 작성해야 사용자가 원하는 결과를 얻게 됩니다. 그림 9와 비교했을 때 중간에 부모 함수로 생성한 객체가 없고 부모 함수의 프로토타입 객체로 링크가 참조되는 것을 볼 수 있습니다.

(5) prototypal한 방식의 재사용

이 방법은 Object.create()를 사용하여 객체를 생성과 동시에 프로토타입객체를 지정합니다. 이 함수는 첫 번째 매개변수는 부모객체로 사용할 객체를 넘겨주고, 두 번째 매개변수는 선택적 매개변수로써 반환되는 자식객체의 속성에 추가되는 부분입니다. 이 함수를 사용함으로 써 객체 생성과 동시에 부모객체를 지정하여 코드의 재활용을 간단하게 구현할 수 있습니다.

var person = {  
    type : "인간",
    getType : function(){
        return this.type;
    },
    getName : function(){
        return this.name;
    }
};

var joon = Object.create(person);  
joon.name = "혁준";

console.log(joon.getType());  // 인간  
console.log(joon.getName());  // 혁준  

[소스 11]

위 소스 1라인에서 부모 객체에 해당하는 person을 객체 리터럴 방식으로 생성했습니다. 그리고 11라인에서 자식 객체 joon은 Object.create() 함수를 이용하여 첫 번째 매개변수로 person을 넘겨받아 joon 객체를 생성하였습니다. 한 줄로 객체를 생성함과 동시에 부모객체의 속성도 모두 물려받았습니다. 위의 1 ~ 4번에 해당하는 classical 방식보다 간단하면서 여러 가지 상황을 생각할 필요도 없습니다. JavaScript에서는 new 연산자와 함수를 통해 생성한 객체를 사용하는 classical 방식보다 prototypal 방식을 더 선호합니다.





자바스크립트의 프로토타입(Prototype) 프로퍼티 란?

모든 함수 객체의 Constructor는 prototype 이란 프로퍼티를 가지고 있다. 이 prototype 프로퍼티는 객체가 생성될 당시 만들어지는 객체 자신의 원형이될 prototype 객체를 가리킨다. 즉 자신을 만든 원형이 아닌 자신을 통해 만들어질 객체들이 원형으로 사용할 객체를 말한다. prototype object는 default로 empty Object 를 가리킨다.

이 말이 매우 어렵게 들릴수도 있다. 하지만 정확히 이해한다면 그리 어려운 말이 아니다. 위에서 분명히 프로토타입은 자기 자신을 생성하게 한 자신의 원형 객체라고 정의했다. 그럼 그 원형객체란 프로토타입은 function A() 함수객체 그 차체일가? 전혀 그렇지 않다.

자바스크립트의 모든 객체는 생성과 동시에 자기자신이 생성될 당시의 정보를 취한 Prototype Object 라는 새로운 객체를 Cloning 하여 만들어낸다. 프로토타입이 객체를 만들어내기위한 원형이라면 이 Prototype Object 는 자기 자신의 분신이며 자신을 원형으로 만들어질 다른 객체가 참조할 프로토타입이 된다. 즉 객체 자신을 이용할 다른 객체들이 프로토타입으로 사용할 객체가 Prototype Object 인 것이다. 즉 위에서 언급한 __proto__라는 prototype 에 대한 link는 상위에서 물려받은 객체의 프로토타입에 대한 정보이며 prototype 프로퍼티는 자신을 원형으로 만들어질 새로운 객체들 즉 하위로 물려줄 연결에 대한 속성이다.

function foo() {}
var foo = new foo();

위 예제코드를 통해 만들어지는 Prototype Link 와 Prototype Property가 가리키는 Prototype Object의 Real Link 에 대한 관계도는 다음과 같다. 관계도1


1
2
3
4
5
6
7
8
9
10
11
12
//#예제 2.
var A = function () { };
A.x=function() {
    console.log('hello');
};
A.prototype.x = function () {
     console.log('world');
};
var B = new A();
var C = new A();
B.x(); // 'world'
C.x(); // 'world'




예제2 에서의 결과가 world 가 되는 이유도 같은 이유다. A.prototype 은 A의 Prototype Object를 참조하는 녀석이기 때문에 A.prototype.x 를 정의한다는 것은 A의 Prototype Object를 직접 이용하게 되는 것이고 그에 따라서 A의 Prototype Object를 프로토타입으로 이용하여 만들어지는 B,C 가 알고 있는 x 는 function () {console.log('world');} 가 되는 것이다.

예제2의 객체 상속 모델을 그림으로 표현하면 아래와 같이 나온다. 




ref : http://www.nextree.co.kr/p7323/

ref : http://insanehong.kr/post/javascript-prototype/

반응형
반응형
객체 생성

객체는 new Object()Object.create() 또는 literal 표기법 (initializer 표기법)을 사용하여 초기화될 수 있습니다. 객체 초기자(object initializer)는 0개 이상인 객체 속성명 및 관련값 쌍 목록입니다, 중괄호({})로 묶인.


1
2
3
4
5
6
7
8
9
10
11
var o = {};
var o = { a: "foo", b: 42, c: {} };
 
var a = "foo", b = 42, c = {};
var o = { a: a, b: b, c: c };
 
var o = {
  property: function ([parameters]) {},
  get property() {},
  set property(value) {},
};

  






설명

객체 초기자는 Object의 초기화를 기술하는 식(expression)입니다. 객체는 속성으로 구성됩니다, 객체를 설명하는 데 사용되는. 객체의 속성값은 primitive 데이터 형 또는 다른 객체를 포함할 수 있습니다.

객체 생성

속성이 없는 빈 객체는 다음과 같이 만들 수 있습니다:

var object = {};

리터럴(literal) 또는 초기자(initializer) 표기법의 이점은, 빠르게 중괄호 내 속성이 있는 객체를 만들 수 있다는 것입니다. 당신은 그저 쉼표로 구분된 키: 값 쌍 목록을 표기합니다. 

다음 코드는 키가 "foo", "age" 및 "baz"인 세 속성이 있는 객체를 만듭니다. 이들 키값은 문자열 "bar", 숫자 42 그리고 세 번째 속성은 그 값으로 다른 객체를 갖습니다.

var object = {
  foo: "bar",
  age: 42,
  baz: { myProp: 12 },
}


javascript : 함수와 객체, new



1
2
3
4
5
6
var n = new Number();
 
var s = 3;
console.log(typeof n); //대문자 Number 는 정수를 담는 객체, typeof 로 확인 되는 Number 타입 문자열은 object
console.log(typeof s); //변수가 숫자로 정의 될때의 타입은 소문자 문자열로 "number"
 


결과


object

number




함수가 생성자가 되는 시점


1
2
3
4
5
6
function Person() {         //Person 함수 이지만 
 
};
 
var p = new Person();       //new 함수명을 쓰게 되면 이때 Person 은 생성자가된다
console.log(p);             //즉 객체를 만든것

//즉 Person 에 인자를 추가 하게 되면 객체 생성시 생성자 인수를 넘길 수 있는 형태가됨
//단 생성자를 통한 초기화가 이뤄짐으로 멤버 변수에 인자 값을 대입하려면
//this.멤버변수 = 매개변수; 의 형태인 this. 이 들어가야한다



일반 함수 앞에 new 를 붙여 생성하면 이 함수가 생성자가 된다

즉 객체를 생성한다는 것이 javascript 에서 custom 형 객체를 생성하는 법인데


javascript 에선 함수 자체에 this 가 들어가 있다는 것 자체가 원래 함수라기 보단 객체라는 점을 내포하고 있다라고 볼 수 있는 부분이기 대문에

함수가 생성자로 취급 되는 대목이 그렇게 생소하게 와닿지는 않는 부분이긴하다








전역객체와 객체지향 프로그래밍







전역 this 는 전역객체 window 와 동일한 객체를 말한다


즉 this.funcThis === window.funcThis 는 true 를 리턴한다




Func() 가 생성자로 호출 될때 funcThis 변수는 o2 에 대한 this 를 담는 것임으로 

funcThis === o2 의 결과는 true 가 된다






그러나 아래의 결과는 false 를 보이는데 전역 왜냐하면 this 와 o2에 대한 this===funcThis 는 서로 다른객체임으로

funcThis === this;

false


이런 결과가 나타남




p.s javascript 가 추구하는 방향을 이해하지 못하는것은 아니지만 그러나 항상 javascript 는 생각 이상으로 이것저것 모아놓은 느낌을 들게한다





일부 ref : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Object_initializer

일부 ref : https://opentutorials.org/module/532/6571

반응형
반응형

Apply 함수


javascript 에서 함수는 일종의 객체인데 이때 apply 라는 내장함수를 포함하고 있어서 apply 함수를 사용 할 수 있음

함수를 apply  로 호출할때 첫번째 인자를 넘겨주게 되는데 이때 넘겨주는 인자는 함수 내에서 this 로 사용되어진다





apply 활용

1
2
3
4
5
6
7
8
9
10
11
12
function sum() {
    var s = 0;
    for (elem in this) { //this 에는 o1 의 내용이 들어 있게 되어 elem 에 하나씩 넘어가게 된다
 
    }
    
    console.log('1');
};
 
o1 = { v1: 10, v2: 20, v3: 30 };
sum.apply(o1); //javascript 에서는 일반 함수에 .apply 가 지원됨
 

 







좀 더 구체적인 예


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
function callMe(arg1, arg2) {
 
    var s = "";
    for (var elem in this) {
        s += this[elem] + ", " ;
    }
 
 
    s += "\n-------------\n";
 
    s += "\nthis value: " + this;
    s += "\n\n";
    s += "\n[[[arguments]]] : \n";
    for (i in callMe.arguments) {
        s += "arguments: " + callMe.arguments[i];
        s += "\n";
    }
 
    return s;
}
 
 
console.log("********************************\n");
 
console.log("Original function: ");
console.log(callMe(12));
 
console.log("\n======================== 1 =============================\n");
 
console.log("Function called with apply: \n");
 
//첫번째 인자는 this 로 사용될 개체 인자
//두번째는 인자는 함수로 넘어갈 인자 집합
 
console.log(callMe.apply(3, [45]));           //정수를 this 로 넘겨주는 형태임으로 for문에서 가져올게 없음
 
 
console.log("\n======================== 2 =============================\n");
 
console.log("객체를 this 로 넘긴다 보면: \n");
var arr = { v1: 10, v2: 20, v3: 30 };
console.log(callMe.apply(arr));
 

  





결과



위 실행에 대한 결과

첫번째 함수에 대한 호출이 callMe안의 this 가 원래의 this 에 관한 내용이 나옴으로 소스코드 형태로 출력결과를 스샷이 아닌 scripter 로 대신함


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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
위 소스코드에 대한 결과
 
Debugger listening on ws://127.0.0.1:22561/46f40b18-616e-4019-a9b5-ee13065adf13
For help see https://nodejs.org/en/docs/inspector
Debugger attached.
(node:10212) [DEP0062] DeprecationWarning: `node --inspect --debug-brk` is deprecated. Please use `node --inspect-brk` instead.
 
 
 
********************************
 
줄이 길어서 간격 조절을 함
//함수 자체 this 에 대한 내용
Original function:
[object Object], function () { [native code] }, function () { [native code] }, 
function () { [native code] }, 
function () { [native code] }, function () { [native code] }, function () { [native code] }, 
function () { [native code] }, function () { [native code] }, function () { [native code] }, 
function () { [native code] }, function () { [native code] }, function () { [native code] }, 
              [object global], [object process], 
 
function Buffer(arg, encodingOrOffset, length
{
  doFlaggedDeprecation();
  // Common case.
  if (typeof arg === 'number') {
    if (typeof encodingOrOffset === 'string') {
      throw new Error(
        'If encoding is specified then the first argument must be a string'
      );
    }
  ....
  ....
  ....
},
-------------
 
this value: [object global]
 
 
[[[arguments]]] :
arguments: 1
arguments: 2
 
 
======================== 1 =============================
 
Function called with apply:
 
 
-------------
 
this value: 3
 
 
[[[arguments]]] :
arguments: 4
arguments: 5
 
 
======================== 2 =============================
 
객체를 this 로 넘긴다 보면:
 
102030,
-------------
 
this value: [object Object]
 
 
[[[arguments]]] :
 
Waiting for the debugger to disconnect...
 
 
 
 






apply 메서드(Function)

 

함수를 호출하여 지정된 개체를 함수의 this 값으로 대체하고 지정된 배열을 함수의 인수로 대체합니다.

apply([thisObj[,argArray]])

thisObj

선택 사항입니다. this 개체로 사용될 개체입니다.

argArray

선택 사항입니다.함수에 전달될 인수 집합입니다.

argArray가 올바른 개체가 아니면 "개체가 필요합니다." 오류가 발생합니다.

argArray나 thisObj가 제공되지 않으면 원래 this 개체가 thisObj로 사용되고 인수는 전달되지 않습니다.

다음 코드에서는 apply 메서드를 사용하는 방법을 보여 줍니다

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
function callMe(arg1, arg2){
    var s = "";
 
    s += "this value: " + this;
    s += "<br />";
    for (i in callMe.arguments) {
        s += "arguments: " + callMe.arguments[i];
        s += "<br />";
    }
    return s;
}
 
document.write("Original function: <br/>");
document.write(callMe(12));
document.write("<br/>");
 
document.write("Function called with apply: <br/>");
document.write(callMe.apply(3, [ 45 ]));
 
// Output: 
// Original function: 
// this value: [object Window]
// arguments: 1
// arguments: 2
 
// Function called with apply: 
// this value: 3
// arguments: 4
// arguments: 5









반응형
반응형


   함수명.length : 함수의 매개변수의 개수


   함수명.argument.length == argument.length : 호출하는 쪽의 인자 개수

 






arguments 개체


설명

현재 실행 중인 함수 및 이 함수를 호출한 함수에 대한 인수를 나타내는 개체입니다.

함수

선택 사항입니다.현재 실행 중인 Function 개체의 이름입니다.

n

필수 요소. Function 개체에 전달되는 인수 값에 대한 인덱스(0부터 시작)입니다.

arguments 개체는 명시적으로 만들 수 없습니다. arguments 개체는 함수가 실행을 시작할 때만 사용할 수 있습니다.함수의 arguments 개체는 배열이 아니지만 배열 요소에 액세스하는 방식과 동일하게 각각의 인수에 액세스할 수 있습니다. n 인덱스는 실제로 arguments 개체의 0n 속성 중 하나에 대한 참조입니다.

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 ArgTest(a, b) {
    var s = "";
 
    s += "Expected Arguments: " + ArgTest.length; // 2 : 함수 인자 개수
    s += "\n";
 
    s += "Expected Function.arguments: " + ArgTest.arguments.length; //4 : 총 매개변수 개수
    s += "\n";
 
    s += "Passed Arguments: " + arguments.length; //4 : 총 매개변수 개수
    s += "\n";
 
    s += "The individual arguments are: "
    for (n = 0; n < arguments.length; n++) {
        s += ArgTest.arguments[n];
        s += " ";
    }
 
    console.log(s);
}
 
ArgTest(12"hello"new Date())
 



[출력 결과]

Expected Arguments: 2

Expected Function.arguments: 4

Passed Arguments: 4

The individual arguments are: 1 2 hello Fri Apr 20 2018 11:23:06 GMT+0900 (대한민국 표준시)





매개변수는 많지만 인자가 적은 경우



 만약 인자의 개수가 1개 즉 ArgTest(1); 로 호출하는 경우  b, c에는 undefined 이 되어 인자의 개수들은

 arguments.length == 1

 ArgTest.arguments.length == 1


즉 함수의 매개변수를 2개 선언했다 할지라도 undefined 은 개수에서 제외 되는 개수를 보이지만


ArgTest.length == 3 의 경우엔 매개변수 개수를 그대로 나타내고 있음을 알 수 있다










반응형
반응형



javascript : 클로저와 private 멤버 유사 처리


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
  
function adds(callback) {
 
 
 
    var ccount = 0;
 
    var state = function() {        //.js 에서는 지역 변수가 fuction 안에 들어 있게 되면 ccount 변수 또한 함께 남게 된다
 
        console.log('=====    ' + ccount);
 
        ccount += 1;
 
    }
 

    state();
 
    callback();
 
    return state;

}
 
 
 
 
 
//rrr 로 받게 되면 인스턴스처럼 메모리에 남게됨
 
var rrr = adds(function () { console.log('inner '); })              //실행 후  ccount = 1 , log 로 찍힌 것은 0
 
 
 
console.log(rrr());              //실행 후  ccount = 2 , log 로 찍힌 것은 1
 
console.log(rrr());              //실행 후  ccount = 3 , log 로 찍힌 것은 2
 
console.log(adds(function () { console.log('inner '); }));
 
console.log(adds(function () { console.log('inner '); }));
 
 
cs



[결과 화면] 


Debugger listening on ws://127.0.0.1:48101/07b14ac8-e1ae-42c5-b370-74ffca833f4d

For help see https://nodejs.org/en/docs/inspector

Debugger attached.

(node:5908) [DEP0062] DeprecationWarning: `node --inspect --debug-brk` is deprecated. Please use `node --inspect-brk` instead.



=====    0

inner

=====    1

undefined

=====    2

undefined

=====    0

inner

[Function: state]

=====    0

inner



[Function: state]

Waiting for the debugger to disconnect...





....  문법이 편리? 하긴 하지만 지역 변수 및 스택 메모리 구조를 이해하고 좀더 OS 적인 체계의 생각이 있는 사람들에게는

지역 변수의 메모리 영역들에서 문법으로 인하여 객체화 된다는 것이 뭔가 억지스러움이 묻어있다고 느낄 수 있는 부분일 수도 있다







클로저의 활용


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
 
//객체를 리턴 하는데 인자로 받은 title 이 캡쳐 됨으로 클로저를 통하여 
//title 은 ghost, matrix 변수에서 각각 독립적으로 남게된다
 
function factory_movie(title) {
    return {
        get_title: function () {
            return title;
        },
        set_title: function (_title) {
            title = _title
        }
    }
}
ghost = factory_movie('first ghost');
matrix = factory_movie('second maxtirx');
 
console.log(ghost.get_title);
console.log(ghost.get_title());
 
console.log(ghost.get_title());
console.log(matrix.get_title());
 
ghost.set_title('ovvvvvvvv');
 
console.log(ghost.get_title());
console.log(matrix.get_title());
 
console.log('\n===========\n');
 
 
//즉시 실행함수 예 
var ssss;
(ssss=function(dd) {
    console.log(dd);
})(10);
 
//즉시 실행함수의 다른 응용 예
ssss(30);
 
console.log('\n===========\n');
 
 
//클로저를 활용한 지역 값 저장 예
var arr = [];
for (var i = 0; i < 5; i++)
{
    arr[i] = function (id) {
                    return function () { return id; }
             }(i);
}
 
for (var index in arr) {
    console.log(arr[index]());
}




결과화면





ghost.get_title() 를 호출하게 되면  ghost private 멤버변수 값인(정확히는 클로저에 묶인 객체안의 함수내의 title 변수)
'first ghost' 을 리턴 받을 수 있게된다






반응형
반응형


javascript 에서 지역 변수는 함수 안에서 선언된 변수만이 지역변수가 된다


그래서 i 와 name 은 전역변수가 된다! ( 함수범위 내에서 선언된 변수만이 지역변수로 생성된다)


1
2
3
4
5
6
7
8
9
10
11
12
 
for (var i = 0; i < 1; i++) {
 
    var name = '11111111111111111111';
 
}
 
console.log(name);
 
console.log(i);
 
 




스크립트 언어는 아무래도 편의성을 위해 제공되는 측면이 있다보니


이런 변수가 전역 변수가 된다는 것은 다른 언어 C++, C# 들과는 확연히 다른 부분들이다




반응형
반응형

typeof 연산자(JavaScript)

 

식의 데이터 형식을 나타내는 문자열을 반환합니다.


expression 인수는 형식 정보를 찾은 식입니다.

typeof 연산자는 형식 정보를 문자열로 반환합니다. typeof"number", "string", "boolean", "object", "function",  "undefined"의 6가지 값을 반환할 수 있습니다.

typeof 구문에서 괄호는 선택 사항입니다.

다음 예제에서는 변수의 데이터 형식을 테스트합니다.

1
2
3
4
5
6
7
var index = 5;
var result = (typeof index === 'number');
// Output: true
 
var description = "abc";
var result = (typeof description === 'string');
// Output: true




다음 예제에서는 선언된 변수와 선언되지 않은 변수의 undefined 데이터 형식을 테스트합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var declared;
var result = (declared === undefined);
// Output: true
 
var result = (typeof declared === 'undefined');
// Output: true
 
var result = (typeof notDeclared === 'undefined')
// Output: true
 
var obj = {};
var result = (typeof obj.propNotDeclared === 'undefined');
// Output: true
 
// An undeclared variable cannot be used in a comparison without
// the typeof operator, so the next line generates an error.
//  var result = (notDeclared === undefined);
cs



ref : https://msdn.microsoft.com/ko-kr/library/259s7zc1(v=vs.94).aspx



반응형
반응형
var 변수에 아무것도 대입하지 않고 선언만 하면 이 변수는 undefined 가 된다(정의 자체가 되지 않았다는 뜻)

그렇지만 null 을 대입하게 되면 이변수는 null 값을 담게 된다(아무것도 참조 하지 않는다 라는 뜻)


그런데 undefined 이든 null 을 갖고 있는 변수든 다음 행에 정수 값을 대입하면 이 변수의 타입은 number 가 된다


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
// A variable that has not been initialized.
 
 
var ss ;
console.log("typeof ss is " + typeof (ss));
 
var ss1 = null;
console.log("typeof ss1 is " + typeof (ss1));
 
 
 
 
var declared;
 
if (declared == undefined)
    console.log("declared 는 값이 주어지지 않았다");
else
    console.log("declared 는 값이 주어졌다");
 
console.log("typeof declared is " + typeof (declared));
 
// An undeclared variable cannot be compared to undefined,
// so the next line would generate an error.
// if (notDeclared == undefined);
 
console.log("typeof notDeclared is " + typeof (notDeclared));
 
 
 
// Output:
// declared has not been given a value
// typeof declared is undefined
// typeof notDeclared is undefined
cs




결과 화면





undefined 상수(JavaScript)

 

초기화되지 않은 변수와 같이 정의되지 않은 값입니다.

undefined 상수는 Global 개체의 멤버이고 스크립팅 엔진이 초기화되면 사용할 수 있습니다.변수가 초기화되지 않고 선언되면 그 값은 undefined입니다.

변수가 선언되지 않으면 undefined와 비교할 수 없지만 변수 유형은 문자열 "undefined"와 비교할 수 있습니다.

undefined 상수는 변수를 명시적으로 테스트하거나 undefined로 설정할 경우 유용합니다.

다음 예제에서는 undefined 상수를 사용하는 방법을 보여 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// A variable that has not been initialized.
var declared;
 
if (declared == undefined)
    document.write("declared has not been given a value <br/>");
else
    document.write("declared has been given a value <br/>");
 
document.write("typeof declared is " + typeof(declared) + "<br/>");
 
// An undeclared variable cannot be compared to undefined,
// so the next line would generate an error.
// if (notDeclared == undefined);
 
document.write("typeof notDeclared is " + typeof(notDeclared));
 
// Output:
// declared has not been given a value
// typeof declared is undefined
// typeof notDeclared is undefined



요구 사항

undefined 속성은 Internet Explorer(Internet Explorer 6보다 오래된 버전)에 도입되었고 Internet Explorer 9 표준 모드에서는 읽기 전용으로 만들어졌습니다.




null은 변수가 유효한 데이터를 참조하지 않음을 나타내는 데 사용됩니다. undefined 상수(JavaScript)과는 다릅니다.



ref : https://msdn.microsoft.com/ko-kr/library/fhcc96d6(v=vs.94).aspx

ref : https://msdn.microsoft.com/ko-kr/library/dae3sbk5(v=vs.94).aspx





반응형
반응형

즉시 실행함수는 함수 형태를 만든다음 ( ) 묶고 바로 인자를 (2) 호출하는 구문을 붙여 주면 즉시 실행 되는 javascript 에서

제공하는 사용되는 함수를 말한다, 익명함수(람다 같은) 또한 마찬가지로 즉시 실행 시킬 수 있다



(function square(x) {
    console.log(x*x);
})  (2);     //즉시 실행 결과 4
 
(function square(x) {
    console.log(x*x);
(2));    //즉시 실행 결과 4




.js 페이지의 함수가 아닌 부분에 선언된 전역변수를 이런 즉시 실행 함수로 묶게 되면 전역변수를 사용하지 않는 형태가 되면서 즉시 실행 함수

내에서 객체를 사용하고 해당 기능만 처리하는 지역변수 형태가 될 수 있다





전역변수를 사용하고 싶지 않다면 아래와 같이 익명함수를 호출함으로서 이러한 목적을 달성할 수 있다.

(function(){
var MYAPP = {}
MYAPP.calculator = {
'left' : null,
'right' : null
}
MYAPP.coordinate = {
'left' : null,
'right' : null
}
MYAPP.calculator.left = 10;
MYAPP.calculator.right = 20;
function sum(){
return MYAPP.calculator.left + MYAPP.calculator.right;
}
document.write(sum());

}())








함수(Function)


1. 함수 선언(Function declaration 혹은 Function statement)

함수 선언(Function declaration)을 MDS에서 밑에와 같이 정의 하였습니다.


문법

1
2
3
function name([param,[, param,[..., param]]]) {
   [statements]
}

name

The function name.


param

The name of an argument to be passed to the function. Maximum number of arguments varies in different engines.


statements

3

     The statements which comprise the body of the function.

0


함수 선언 호이스팅(Function declaration hoisting)

함수 선언은 호이스팅이 됩니다. ([JavaScript] 유효범위(Scope)와 호이스팅(Hoisting) 참고)

1
2
3
4
5
hoisted(); // logs "foo"
 
function hoisted() {
  console.log("foo");
}

함수 선언 호이스팅함수 선언 호이스팅


알게 모르게 저희는 함수 선언 호이스팅을 사용하고 있었습니다. 함수는 호출 먼서 하고, 함수 정의는 나중에 정의하는..


하지만, 다음으로 이야기할 함수 표현은 호이스팅이 되지 않습니다.

1
2
3
4
5
notHoisted(); // TypeError: notHoisted is not a function
 
var notHoisted = function() {
   console.log("bar");
};

함수 표현은 호이스팅이 되지 않는다함수 표현은 호이스팅이 되지 않는다


호이스팅된 코드를 보면 이해하기 쉽습니다.

1
2
3
4
5
6
7
var notHoisted;
 
notHoisted(); // TypeError: notHoisted is not a function
 
notHoisted = function() {
   console.log("bar");
};

정의 되어 있지 않는 변수를 사용하려 하여 에러가 출력되는 것은 당연합니다.



2. 함수 표현(Function expression)

함수 표현(Function expression)을 MDS에서 밑에와 같이 정의 하였습니다.


문법

1
2
3
function [name]([param1[, param2[, ..., paramN]]]) {
   statements
}

name

The function name. Can be omitted, in which case the function is anonymous. The name is only local to the function body.


paramN

The name of an argument to be passed to the function.


statements

The statements which comprise the body of the function.


익명 함수 표현 (Anonymous function expression)

익명 함수 표현의 예를 들어보겠습니다.

1
2
3
4
var x = function(y) {
   return y * y;
};
console.log(x(2)); // 4

익명 함수 표현익명 함수 표현


기명 함수 표현 (Named function expression)

기명 함수 표현의 예를 들어보겠습니다.

1
2
3
4
var x = function square(y) {
   return y * y;
};
console.log(x(2)); // 4

기명 함수 표현기명 함수 표현


여기서 저는 궁금한 점이 하나 생겼습니다. 기명 함수 표현으로 함수의 이름이 있다면 함수 이름으로 함수 실행이 가능 할까..?

1
2
3
4
var x = function square(y) {
   return y * y;
};
square(2);

기명 함수 표현함수이름으로 함수 실행이 되지 않는다


안됩니다.... 그렇다면, 왜 기명 함수 표현을 사용하는 걸까요?


One of the benefit of creating a named function expression is that in case we encounted an error,

the stack trace will contain the name of the function, making it easier to find the origin of the error.


MDS에서는, 장점 하나는 에러가 발생 했을 때, stack trace가 함수의 이름을 포함하여 출력하기 때문에 에러를 찾기 쉽운것이 기명 함수 표현의 장점이라고 이야기 함니다.


MDS에서 함수 정의에 몇가지 방법을 더 이야기 하는데, 이번 포스팅에서 2가지만 이야기하겠습니다.

(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions 참고)



즉시 실행 함수 (Immediately-invoked function expression)



즉시 실행 함수의 기본 형태는 아래와 같습니다.

1
2
3
(function () {
    // statements
})()

함수 표현(Function expression)은 함수를 정의하고, 변수에 함수를 저장하고 실행하는 과정을 거칩니다. 하지만 즉시 실행 함수는 함수를 정의하고 바로 실행하여 이러한 과정을 거치지 않는 특징이 있습니다. 함수를 정의하자마자 바로 호출하는 것을 즉시 실행 함수라고 이해하면 편할 것 같습니다.


Immediately-invoked function expression 영어를 해석하면 즉시-호출 함수 표현 입니다. 즉시 실행 함수(IIFE)는 함수 표현(function expression)과 같이 익명 함수 표현, 기명 함수 표현으로 할 수 있습니다.



1. 즉시 실행 함수 사용법

기명 즉시 실행 함수

1
2
3
4
5
6
7
(function square(x) {
    console.log(x*x);
})(2);
 
(function square(x) {
    console.log(x*x);
}(2));

위의 두가지 예는 괄호의 위치가 조금 다를 뿐 같은 기능의 즉시 실행 함수 입니다.


익명 즉시 실행 함수

1
2
3
4
5
6
7
(function (x) {
    console.log(x*x);
})(2);
 
(function (x) {
    console.log(x*x);
}(2));


변수에 즉시 실행 함수 저장

즉시 실행 함수도 함수이기 때문에, 변수에 즉시 실행 함수 저장이 가능합니다. 예를 들어 보겠습니다.

1
2
3
4
(mySquare = function (x) {
    console.log(x*x);
})(2);
mySquare(3);

변수에 즉시 실행 함수 저장변수에 즉시 실행 함수 저장


함수를 mySquare에 저장하고 이 함수를 바로 실행하게 됩니다. mySquare는 즉시 실행 함수를 저장하고 있기 때문에 재호출이 가능하게 됩니다.


마찬가지로 즉시 실행 함수도 함수이기 때문에, 변수에 즉시 실행 함수의 리턴 값 저장도 가능합니다.

1
2
3
4
var mySquare = (function (x) {
    return x*x;
})(2);
console.log(mySquare)

변수에 즉시실행함수 리턴값 저장변수에 즉시실행함수 리턴값 저장


위의 두가지는 형태가 유사하지만 엄연히 다른 기능입니다. 괄호의 위치에 주의가 필요할 것 같습니다.



2. 즉시 실행 함수를 사용하는 이유

초기화

즉시 실행 함수는 한 번의 실행만 필요로 하는 초기화 코드 부분에 많이 사용됩니다.

그렇다면 왜 초기화 코드 부분에 많이 사용 할까요? 변수를 전역(global scope)으로 선언하는 것을 피하기 위해서 입니다. 전역에 변수를 추가하지 않아도 되기 때문에 코드 충돌 없이 구현 할 수 있어, 플러그인이나 라이브러리 등을 만들 때 많이 사용됩니다.


예를 하나 들어보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
var initText;
 
(function (number) {
    var textList = ["is Odd Text", "is Even Text"];
    if (number % 2 == 0) {
        initText = textList[1];
    } else {
        initText = textList[0];
    }
})(5);
 
console.log(initText);
console.log(textList);

즉시실행함수 이용한 초기화즉시실행함수 이용한 초기화



전역에 textList가 저장되지 않고, initText만 초기화 된 것을 확인 할 수 있습니다. 또한 textList는 지역 변수로, 전역 변수와 충돌없이 초기화 할 수 있게 됩니다.


라이브러리 전역 변수의 충돌

jQuery나 Prototype 라이브러리는 동일한 $라는 전역 변수를 사용합니다. 만약, 이 두개의 라이브러리를 같이 사용한다면 $ 변수 충돌이 생기게 됩니다.

즉시 실행 함수를 사용하여 $ 전역 변수의 충돌을 피할 수 있습니다.

1
2
3
(function ($) {
    // $ 는 jQuery object
})(jQuery);

즉시 실행 함수 안에서 $는 전역변수가 아닌 jQuery object의 지역 변수가 되어, Prototype 라이브러리의 $와 충돌 없이 사용할 수 있습니다.






ref : https://opentutorials.org/module/532/6495

ref : http://beomy.tistory.com/9



반응형
반응형

[javascript : 배열, 객체와 반복문처리]

객체일때 key & value 형태와  배열일때 반복문(for in )에서의 인덱스들이 처리 되는 형태가 다른 프로그램과는 좀 다른 차이가 있습니다

그리고 javascript 에서 특이한 점은 객체를 만들 수있는데 c++ 로 치자면 map 과 유사한 형태로 객체가 만들어진다는 것이고

인스턴스를 하나 만든 이후에 임의의 키를 인스턴시.키명 의 형태로 바로 지정하여 value 를 일괄적인 타입 제한 없이 자유형태로 대입할 

수 있다는 것이 다른 프로그램과는 좀 더 확연하게 차이나는 부분입니다



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
var arr = ['sdfa2323''asdfsadf''c'function () { console.log("tttt"); }];
 
var tt = [{ "s"3 }, { "k"23 }, { "a"30 }];
 
var ob = { "s"3"k"23"a"30 };
 
ob.add = function () {                  // 나중에 객체에 키가 되는 변수와 값을 추가 할 수 있다
 
    console.log('fffffnnnn');
 
    console.log(this.s);                //이때 멤버 변수를 가르킬려면 this. 가 필요함, 없으면 에러
};
 
 
 
console.log('\n==== ob.add() ===\n');
 
ob.add();
 
ob['z'= 10;
 
var ddddd = ob["s"];                    // 이런 형태로 값을 갖어 올 수 있음
 
console.log('\n==== for (var name in ob) ===\n');
 
for (var name in ob) {                          //객체의 경우 for in 으로 호출하게 되면 name 에는 key 값이 들어오지만
 
    console.log(name + "   " + ob[name]);
 
}
 
 
console.log('\n=== for (var name in tt) ====\n');
//!! 배열을 for in 구문으로 불러오면 name 에는 배열읠 인덱스가 문자열 형태로 들어오게 된다
 
for (var name in tt) {                          
 
    console.log(name + "   " + arr[name]);
}
 
 
 
console.log('\n===  forEach(function (item, index)  ====\n');
 
tt.forEach(function (item, index) {             //배열을 foreach 로 호출 할 경우 item 값과 index 값을 받아오는 형태로 작성한다
 
    console.log(item,"     " ,index);
 
});
 
 
console.log('\n=======\n');
 
for (var name in arr) {
    console.log(name + "   " + arr[name]);
}
 
console.log('\n===  console.dir(arr) ====\n');
console.dir(arr);





반응형
반응형

배열과 객체 구분


배열은 var arr = [1,2,3,4];   의 형태로 쓰며 구분자를  [  ] 로 사용하게된다



그렇지만 객체의 경우 { } 중괄호로 구분을 짖고 객체 요소에 대한 명을 지정 할 수 있다


1
var s= { 'first' : 3 }


이렇게 객체를 만들 수 있고 사용은


s.first   와 같이 사용 할 수 있고 이 것이 나타내는 값은 


1
2
3
 



이다




객체를 리턴하는 예









객체의 경우에는 pair 의 표현인  key, value 의 원리와 유사하다



객체의 생성

다음은 객체를 만드는 법이다.

1
var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};

위의 예제에서 egoing은 key가 되고, 10은 value가 된다. 아래는 객체를 만드는 다른 방법이다.

1
2
3
4
var grades = {};
grades['egoing'] = 10;
grades['k8805'] = 6;
grades['sorialgi'] = 80;

아래와 같은 방법으로 객체를 만들수도 있다.

1
2
3
4
var grades = new Object();
grades['egoing'] = 10;
grades['k8805'] = 6;
grades['sorialgi'] = 80;

객체를 만들었으니 이제는 객체에서 필요한 값을 가져와보자. 다음은 sorialgi라는 이름(key)으로 저장된 값을 가져오는 법이다. 결과는 80이다.

1
2
var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};
alert(grades['sorialgi']);

다음 방법으로도 객체의 속성에 접근 할 수 있다.

1
alert(grades.sorialgi);

다음은 객체에 저장된 데이터를 기준으로 반복작업을 하는 방법이다.


ref : https://www.opentutorials.org/course/743/6491


반응형
반응형
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
//url 모듈 불러오기
 
var url = require('url');
 
 
 
//이런 주소를 url 모듈을 사용하면 분해할 수 있음
 
var curUrl = url.parse('https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=NodejsTest');
 
 
 
//protocal : https,  host : www.naver.com, query : ? 이후의 것 
 
 
 
//이때 curUrl 은 객체로 아래 결과와 같은 멤버들을 가지고 있다
console.dir(curUrl);
 
 

 
 
//이 객체를 다시 문자열로 합칠려면 
 
var oriUrl =  url.foramt(curUrl); 을 사용하면 된다
 
 

cs





결과 

Url {

  protocol: 'https:',

  slashes: true,

  auth: null,

  host: 'search.naver.com',

  port: null,

  hostname: 'search.naver.com',

  hash: null,

  search: '?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=NodejsTest',

  query: 'where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=NodejsTest',

  pathname: '/search.naver',

  path: '/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=NodejsTest',

  href: 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=NodejsTest' }




이때 

require('querystring'); 모듈을 로딩하고

querysting.parse(curUrl.query); 를 하게 도면 NodejsTest 만 얻을 수 도 있다






반응형
반응형
자바스크립트 배열 원소 삭제 방법 - delete, shift, pop, splice

delete

 

배열 항목에서 요소를 undefined 로 만든다.(delete 한다고 하여 요소가 삭제되는 것이 아님 아님!! 주의 : 크기는 그대로 3개)

var arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
 
console.log(arr);
delete arr[1];
console.log(arr);

결과




 



shift  

배열에서 첫번째 요소를 제거하고 반환한다. -> 배열 항목에서 요소가 삭제됨

unshift : 첫번째 요소로 추가

 

var arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
 
arr.shift();
 

console.log(arr); 


결과


 



pop

배열에서 마지막 요소를 제거하고 반환한다. -> 배열 항목에서 요소가 삭제됨 

push는 추가

 

var arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
 
arr.pop();
 
console.log(arr);

 



splice  (실제 요소 갯수가 줄어듬)

splice(start, dleeteCount, elem1...);

 

start에서 시작해 deleteCount 만큼 제거한 후 지정된 요소를 삽입하나, elem... 인자를 입력하지 않으면 삭제만 된다.

var arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
arr.push(4);
arr.push(5);
 
arr.splice(22);
 
console.log(arr);

 

결과





그런데 splice( index ,0   ,    )  0 이 오면 


 splice(1,0, 7,7,7);  을 쓰면 1번지에서 부터 숫자 7,7,7 을 추가하겠다는 뜻이 됨

1
2
3
4
5
6
7
var ku = [0,1,2,3,4];
 
ku.splice(1,0,7,7,7);
 

//결과
ku
 
(8) [0, 7, 7, 7, 1, 2, 3, 4]


 


그렇다면 splice( index , 지울 개수, 추가 원소) ?  의 경우에는?

1
2
3
4
5
6
7
8
9
var ku = [0,1,2,3,4];
 
ku.splice(1,1,7,5);
 
//결과
ku
 
(6) [075234]
 
 
cs


1 번지 부터 1개 지운 다음 7,5 를 추가 한다




slice



 ku.slice( 시작 인덱스,  포함되지 않는 끝 인덱스 )  에 해당 하는 배열을 생성해 리턴한다




Slice 구문

stringObj.slice(start, [end]) 

stringObj

필수 요소. String 개체 또는 문자열 리터럴입니다.

start

필수 요소. stringObj에 지정된 부분의 시작을 나타내는 인덱스입니다.

end

선택 사항입니다. stringObj에 지정된 부분의 끝을 나타내는 인덱스입니다.부분 문자열은 end로 표시된 문자 앞까지만 포함합니다.이 값을 지정하지 않으면 stringObj의 끝까지 부분 문자열이 계속됩니다.

slice 메서드는 stringObj의 지정된 부분을 포함하는 String 개체를 반환합니다.

slice 메서드는 end로 표시된 문자 앞까지만 복사하고 해당 문자는 포함하지 않습니다.

start가 음수이면 length + start로 처리됩니다. 여기서 length는 배열의 길이입니다. end가 음수이면 length + end로 처리되고, end를 생략하면 stringObj의 끝까지 계속 복사됩니다. end가 start 앞에 나오면 새로운 문자열에 아무 문자도 복사되지 않습니다.

첫 번째 예제에서 slice 메서드는 전체 문자열을 반환합니다.두 번째 예제에서 slice 메서드는 마지막 문자를 제외하고 전체 문자열을 반환합니다.



var str1 = "all good boys do fine";

var slice1 = str1.slice(0);
var slice2 = str1.slice(0,-1);
var slice3 = str1.slice(4);
var slice4 = str1.slice(4, 8);

document.write(slice1 + "<br/>");
document.write(slice2 + "<br/>");
document.write(slice3 + "<br/>");
document.write(slice4);

// Output:
// all good boys do fine
// all good boys do fin
// good boys do fine
// good



ref : https://msdn.microsoft.com/ko-kr/library/6w1bzf9f(v=vs.94).aspx


ref : https://jissp.com/board/view/1/8/65 및 일부 편집

반응형
반응형

인터넷을 통해 서버와 통신하고 있는 클라이언트의 컴퓨터 네트워크 다이어그램.




서버 사이드(server-side)란 네트워크의 한 방식인 클라이언트-서버 구조의 서버 쪽에서 행해지는 처리를 말한다.



예시

  • HTTP 통신에 있어서 브라우저의 주요 기능 중 하나는 서버에서 HTML 문서를 수신하는 것인데, 브라우저에서 요청한 HTML 문서가 PHP 등의 서버 사이드 스크립트 언어를 포함하고 있으면 서버 쪽에서 이 부분을 처리하여 결과를 브라우저에 송신하게 된다.

    (여기서 브라우저를 클라이언트로 이해 하면 됨)

  • MMORPG(대규모 다중 사용자 온라인 롤플레잉 게임)에서도 클라이언트-서버 구조가 사용된다. 대부분의 게임에서는 게임 캐릭터 정보와 게임 아이템 정보의 위조를 방지하기 위해 이를 서버 사이드로 처리한다.[1]





데이터를 서버 사이드로 처리할 경우의 장단점

(클라이언트 사이드로 처리할 때와 비교하여)

  • 장점: 서버 관리자의 입장에서, 데이터 위조의 가능성을 줄일 수 있다. 서버 쪽의 데이터가 확실한 진위이며 클라이언트 쪽에서 위조해서는 안 되는 민감한 데이터의 경우 서버 사이드로 처리해야 한다. 예로 인터넷 뱅킹의 이체 관련 처리나 MMORPG의 게임 아이템 관련 처리에서는 클라이언트 사이드 처리를 최소화해야 한다. 한편 클라이언트 사용자의 입장에서는 클라이언트 컴퓨터의 처리 부담이 줄어든다.

  • 단점: 서버 관리자의 입장에서, 서버의 처리 부담이 커져 결과적으로 서버 비용이 늘어날 수 있다.








클라이언트 사이드(client-side)란 네트워크의 한 방식인 클라이언트-서버 구조의 클라이언트 쪽에서 행해지는 처리를 말한다.

예시[편집]

  • HTTP 통신에 있어서 브라우저의 주요 기능 중 하나는 서버에서 수신한 HTML 문서를 해석하여 화면에 표시해 주는 것인데, HTML 문서가 동적인 부분을 갖고 있지 않다면 문서 수신이 끝나고부터는 서버와 교신하지 않고 브라우저가 클라이언트 사이드에서 처리하여 화면에 내용을 표시한다.
  • MMORPG(대규모 다중 사용자 온라인 롤플레잉 게임)에서도 클라이언트-서버 구조가 사용된다. 대부분의 MMORPG는 화려한 그래픽 효과를 사용하는데 이를 위해서는 많은 연산이 필요하며 이러한 연산을 서버 쪽에서 모두 부담할 수 없으므로 그래픽 처리나 소리 처리의 대부분을 클라이언트 사이드로 처리한다.

데이터를 클라이언트 사이드로 처리할 경우의 장단점[편집]

(서버 사이드로 처리할 때와 비교하여)

  • 장점
    • 서버 관리자의 입장에서, 서버의 처리 부담을 줄여서 결과적으로 서버 비용을 줄일 수 있다.
    • 처리하는 데이터가 보안에 민감한 경우, 클라이언트 내에서 처리가 가능한 부분에 대해서는 통신에 대비하여 암호화할 필요가 없으므로 암호화 소요가 줄어든다.
  • 단점
    • 서버 관리자의 입장에서, 클라이언트 사이드에서 처리한 결과를 되받아야 하는 경우, 결과의 진위성을 알기 어렵다. 반대로 말하면 클라이언트 쪽에서 데이터를 위조하기 쉽다. 따라서 서버 쪽의 데이터가 확실한 진위이며 클라이언트 쪽에서 위조해서는 안 되는 민감한 데이터의 경우 서버 사이드로 처리해야 한다. 예로 인터넷 뱅킹의 이체 관련 처리나 위의 MMORPG의 게임 아이템 관련 처리에서는 클라이언트 사이드 처리를 최소화해야 한다.
    • 클라이언트 사용자의 입장에서, 클라이언트 컴퓨터의 처리 부담이 많아진다.




ref : https://ko.wikipedia.org/wiki/%EC%84%9C%EB%B2%84_%EC%82%AC%EC%9D%B4%EB%93%9C

ref : https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8_%EC%82%AC%EC%9D%B4%EB%93%9C

반응형

'서버(Server) > 인터넷과 개념' 카테고리의 다른 글

정적 웹 페이지, 동적 웹 페이지  (0) 2018.05.12
호스트(Host) 와 포트(Port)  (0) 2018.05.10
what's JSON?  (0) 2018.05.04
ASP.NET의 정의  (0) 2018.04.16
HTTP vs Socket 통신차이  (0) 2018.04.12
반응형

 ASP.NET의 정의

 

 

 

ASP.NET은 동적 웹 사이트(웹 응용 프로그램)를 만들기 위한 마이크로소프트의 웹 개발 기술이에요.

 

다른 웹 개발기술 언어인 ASP, PHP, JSP는

웹 스크립트 언어(Web Script Language)라고도 불러요.

하지만, ASP.NET은 웹 스크립트 언어라고 부르지 않습니다~

웹 개발 기술이라고 하는 것이 가장 정확하죠!

 

ASP.NET 버전은 다음과 같이 변화되었어요.
ASP.NET 1.0(2000년) → ASP.NET 1.1(2003년) → ASP.NET 2.0 (2005년)


 


 

 

 

여기서 잠깐!

다른 언어들과 달리 ASP.NET을 웹 개발 기술이라고 부르는 이유는?

 

웹기술은 로그인의 처리에서 처럼,

웹서버에서 내부 사용되는 로직을 개발하고 동작되게 해주는 프로그래밍언어를 말해요.

ASP.NET, JSP, PHP, ASP, Perl 등을 모두 웹 기술이라고 할 수 있어요.

또한 웹 스크립트 언어라고도 부를 수 있어요.

 

ASP, JSP, PHP, Perl 등은 그 이름 자체를 스크립트 언어라도고 지칭할 수 있지요.

하지만 ASP.NET 은 언어라고 할 수 없는 것이

ASP.NET을 구현할 수 있는 언어가 C#, VB, J#, C++ 등으로 나뉘어지기 때문에

ASP.NET은 웹 개발 기술이라고만 부릅니다.




ref : 
http://cafe.naver.com/dbgmlzkdlqk/3036

서버-클라이언트 구준

 클라이언트, 서버 나누는 기준 : 웹서버가 설치 되어 있다면 웹서버, 웹 브라우저로 접근한다면 클라이언트


.net 구조

.net 프레임 워크는 마치 자바의 virtual machine 과 유사한 형태로 여기 저기 플랫폼에서 돌아갈 수 있는 기본 환경을 제공을 목표로하며
닷넷 프레임 워크가 있다는 가정하네 C++, C# , VB, JSCRIPT 등이 돌아 갈 수 있게 되고 이것들을 .NET 언어라 하며 어떤 언어이든 간에
공통언어명세(CLS)에 맞게 만들어져있다면 이 언어들은 닷넷 환경에 서 돌아 가는 요구 조건을 갖췄다고 할 수 있다
또한 그림에서 볼 수있듯이 ASP.NET 이 .net framework 안에 들어 가있다는 것은 ASP.NET이 프로그램 랭귀지가 아니고
위에서 설명한것과 마찬가지로 개발기술 이라 한다, 또한 ASP.NET, ADO.NET, CLR 등등이 .net framework 의 구성요소가 된다





ASP.NET의 정의

ASP.NET은 동적 웹 사이트(웹 응용 프로그램)을 만들기 위한 마이크로소프트의 웹 개발 기술이다. 다른 웹 개발기술인 ASP, PHP, JSP는 웹 스크립트 언어(Web Script Language)라고도 부른다. 하지만, ASP.NET은 웹 스크립트 언어라고 부르지 않는다. 웹 개발 기술이라고 하는 것이 가장 정확하다. 이유는 차후에 설명한다.

ASP.NET 버전은 다음과 같이 변화되었다.
ASP.NET 1.0(2000년) → ASP.NET 1.1(2003년) → ASP.NET 2.0 (2005년)

ASP.NET은 .NET Framework에서만 동작한다. ASP.NET 1.X는 .NET Framework 1.1에서 ASP.NET 2.0은 .NET Framework 2.0에서 동작한다. 그리고 .NET Framework의 포괄적인 개념은 .NET이다. 따라서 다음과 같은 포함관계가 성립한다.

.NET > .NET Framework > ASP.NET

물론 윈도우 응용프로그램이라면 다음과 같은 포함관계도 성립한다.

.NET > .NET Framework > Windows Programming based C#

웹기술은 로그인의 처리에서 처럼, 웹서버에서 내부 사용되는 로직을 개발하고 동작되게 해주는 프로그래밍언어를 뜻한다. ASP.NET, JSP, PHP, ASP, Perl 등을 모두 웹 기술이라고 할 수 있다. 또한 웹 스크립트 언어라고도 부를 수 있다. ASP, JSP, PHP, Perl 등은 그 이름 자체를 스크립트 언어라도고 지칭할 수 있다. 하지만 ASP.NET 은 언어라고 할 수 없는 것이 ASP.NET을 구현할 수 있는 언어가 C#, VB, J#, C++ 등으로 나뉘어지기 때문에 ASP.NET은 웹 개발 기술이라고만 부른다.

ASP.NET의 장점은 다음과 같다.

  • 강력한 캐싱 기능
  • 강력한 개발도구 TOOL 제공
    Visual Studio는 웹, Windows, 콘솔 및 모바일 응용 프로그램까지 개발 할 수 있는 통합 개발 환경(IDE, Integrated Development Environment)이다. 각 ASP.NET의 버전별로 Visual Studio역시 다른 버전이 사용되고 있다.
    ASP.NET 1.0 → Visual Studio .NET 2002
    ASP.NET 1.1 → Visual Studio .NET 2003
    ASP.NET 2.0 → Visual Studio 2005 / Visual Studio 2008
  • 유연성 : 웹사이트에의 개발 및 실행 시 발생될 수 있는 모든 문제에 대한 대처기능 제공되어있다.
  • 언어독립적 협업 : 언어가 무엇이든 상관없는 것이 특징이다. 일부는 VB로 일부는 C#으로 구현하여 하나의 웹사이트로 동작시킬 수 있다.
  • 개발의 단순성 : 인터페이스를 서버콘트롤로 제공, 도구상자이용
  • 사이트 관리의 용이성
    Machine.config / Web.config 등으로 사이트를 쉽게 관리할 수 있다.
  • 뛰어난 확장성 : 서버콘트롤을 상속받아 자신의 콘트롤을 만들어 서버콘트롤처럼 사용가능
  • 보안기능
    인증(Authentication) / 권한 부여(Authorization) 를 쉽게할 수 있도록 도와준다. 이 역시 web.config를 사용하는 경우도 있다.


ASP.NET 구현환경

ASP.NET 1.x에서는 개발자들이 자신의 PC에 IIS 탑재가 가능한 Windows 또는 서버 급 Windows를 설치했다. VS 2005에서는 ASP.NET Development Server라는 내장 웹 서버를 제공하기 때문에 개발 PC의 Windows에 반드시 IIS가 탑재되어 있지 않아도 된다.




ASP.NET의 동작 원리

ASP.NET은 다음과 같이 동작한다.


웹 프로그래밍에서 가장 기본적인 구동 원리는 Request & Response이다.


ref : http://7day.tistory.com/38

반응형
반응형

가용구역이란? 한 Region 내에 있는 서버들의 구역이라고 볼 수 있는데 한 Region 에 있는 서버들끼리는 전용 회선으로 연결되어 있어 일반 연결 보다


데이터 전송이 빠른 구역을 말한다, 그렇지만 다른 가용 구역끼리의 연결은 전용회선으로는 연결되어 있지 않아 일반 인터넷으로 데이터를 주고 받아야한다

RDS 는 Database를 생성 및 빽업 하는 AWS 서비스를 말하는데 기능 중 자동 빽업/복원을 설정 할 수 있다


빽업 기간이 길어질 수록 비용이 올라간다


DB 생성옵션 중 MultiAZ(다중 가용 구역) 를 yes 로 해놓을 경우 다른 가용구역(건물이 다른곳에 있는DB)과 연결 관계가 형성이 되면서


저장할 정보를 가용구역의 DB에도 자동으로 저장시킨다


이것의 장점은 한곳의 가용 구역이 먹통(고장)이 됐을때 다른 가용구역의 DB를 사용하면 된다는 장점이 있음



예약이나 특정 시점에서 수동으로 빽업 또한 가능





RDS 에서 도 스케일 Up 또 한 가능하다(특정 시간이나 즉시 옵션중에 선택하여 복사하는 형태로 진행)





=> 스케일 아웃도 가능한데 이럴때는 먼저


  1. 한대의 컴퓨터를 만들어 놓는다 이것을 Master 라 함

  2. 나머지 서버를 Slave n 로 만든다(Replica 들) (DB 인스턴스 생성)

  3. 그 후 Master 와 Slave 들간의 동기화를 한다



=> 이렇게 설정 된 이후


  • 쓰기 작업을 할때는 Master 에 쓰기 작업이 들어가면 나머지 Slave 들에서 최근 쓰여진 정보를 읽어 동기화를 한다

  • 읽기 작업을 할때는 각 Slave 를 대상으로만 읽도록 처리하여 부하를 줄인다



[이때 master 에 과부하가 일어 날 수 있다]

  • 이때 이런 기술은 RDS 가 알아서 해주지 않는데 이를 해결 하기 위한 방법 중 sharding 이라는 기술로 슬레이브 모두가 
    가져가는 것이 아니고 예를 들어 인덱스로 나누어서
    데이터가 쓰여질 슬레이브에 대한 인덱스를 계산해 관련 슬레이스에서만 쓰기가 일어나도록 할 수 있다







Amazon Relational Database Service(RDS)를 사용하면 클라우드에서 관계형 데이터베이스를 더욱 간편하게 설정, 운영 및 확장할 수 있습니다. 하드웨어 프로비저닝, 데이터베이스 설정, 패치 및 백업과 같은 시간 소모적인 관리 작업을 자동화하면서 비용 효율적이고 크기 조정 가능한 용량을 제공합니다. 애플리케이션에 집중하여 애플리케이션에 필요한 빠른 성능, 고가용성, 보안 및 호환성을 제공할 수 있도록 지원합니다.

Amazon RDS는 여러 데이터베이스 인스턴스 유형(메모리, 성능 또는 I/O 최적화)으로 제공되며 Amazon AuroraPostgreSQLMySQLMariaDBOracleMicrosoft SQL Server를 비롯하여 6개의 익숙한 데이터베이스 엔진 중에서 선택할 수 있습니다. AWS Database Migration Service를 사용하여 기존 데이터베이스를 Amazon RDS로 손쉽게 마이그레이션 또는 복제할 수 있습니다.





Amazon RDS의 자동 백업 기능은 기본적으로 활성화되어 있으며, 이를 통해 데이터베이스 인스턴스를 특정 시점으로 복구할 수 있습니다. Amazon RDS는 데이터베이스와 트랜잭션 로그를 백업하고 이 둘을 모두 사용자가 지정한 보존 기간 동안 저장합니다. 이를 통해 데이터베이스를 보존 기간 중 어느 시점(초 단위)으로나 복원할 수 있습니다(최근 5분 전까지 가능). 자동 백업 보존 기간은 최대 35일로 구성할 수 있습니다.



ref : https://aws.amazon.com/ko/rds/details/

반응형
반응형





한 서버로 트래픽이 몰리게 되면 한 서버에 부하가 커짐으로 여러 인스턴스를 만들어 놓고 각 서버로 트래픽을 분산하는 처리를 할 수 있는데


이때 분산해주는 서버를 ELB(Elastic Load Balancer)라 한다



ELB 를 사용하게 되면 사용자들이  처음 만나는 서버가 기존 서버가 아닌 ELB를 처음 만나 미리 분산해 놓은 서버중 한곳으로 가게된다


ELB는 오토스케일링과 같이 접목 될 수 있는 기술이라 볼 수 있겠다







ELB : Elastic Load Balancing은 들어오는 애플리케이션 트래픽을 Amazon EC2 인스턴스, 컨테이너, IP 주소와 같은

여러 대상에 자동으로 분산시킵니다. 


Elastic Load Balancing은 단일 가용 영역 또는 여러 가용 영역에서 다양한 애플리케이션 부하를 처리할 수 있습니다. 


Elastic Load Balancing이 제공하는 세 가지 로드 밸런서는 모두 애플리케이션의 내결함성에 필요한 고가용성, 자동 확장/축소, 강력한 보안을 갖추고 있습니다.






AWS 에서 제공하는 제품들은 다음과 같은것들이 있음



Application Load Balancer

Application Load Balancer는 HTTP 및 HTTPS 트래픽의 로드 밸런싱에 가장 적합하며, 마이크로서비스와 컨테이너 등 최신 애플리케이션 아키텍처 전달을 위한 고급 요청 라우팅 기능을 제공합니다. 개별 요청 수준(레이어 7)에서 작동하는 Application Load Balancer는 요청의 콘텐츠를 기반으로 Amazon Virtual Private Cloud(Amazon VPC) 내의 대상으로 트래픽을 라우팅합니다.







Network Load Balancer

Network Load Balancer는 극한의 성능이 요구되는 TCP 트래픽의 로드 밸런싱에 가장 적합합니다. 연결 수준(레이어 4)에서 작동하는 Network Load Balancer는 Amazon Virtual Private Cloud(Amazon VPC) 내의 대상으로 트래픽을 라우팅하며, 초당 수백만 개의 요청을 처리하면서 극히 낮은 지연 시간을 유지할 수 있습니다. Network Load Balancer는 갑작스러운 일시적 트래픽 패턴 처리에도 최적화되어 있습니다.






Classic Load Balancer

Classic Load Balancer는 여러 Amazon EC2 인스턴스에서 기본적인 로드 밸런싱을 제공하며, 요청 수준 및 연결 수준에서 작동합니다. Classic Load Balancer는 EC2-Classic 네트워크 내에 구축된 애플리케이션용입니다.








장점



고가용성

Elastic Load Balancing은 들어오는 트래픽을 여러 가용 영역에 있는 여러 대상(Amazon EC2 인스턴스, 컨테이너, IP 주소)에 자동으로 분산시키고 정상 상태인 대상만 트래픽을 수신하도록 합니다. Elastic Load Balancing은 리전에 걸친 로드 밸런싱을 통해 서로 다른 가용 영역에 있는 정상 상태의 대상으로 트래픽을 라우팅할 수도 있습니다.



탄력성

Elastic Load Balancing은 네트워크 트래픽 패턴의 빠른 변화에 대처할 수 있습니다. 또한 Auto Scaling과의 완벽한 통합을 통해 수동 개입의 필요성 없이 다양한 수준의 애플리케이션 부하를 충족하기에 충분한 애플리케이션 용량을 확보합니다.                                                                 


이외에 보안성 , 유연성,, 모니터링 감사로 성능 병목 파악등의 장점 등이ㅣ 있다





ref : https://aws.amazon.com/ko/elasticloadbalancing/



반응형
반응형
[스케일 in, out 을 하기 위한 사전 조건]

인스턴스를 만들기위한 이미지가  AMI(Amazon Machine Image :  .iso 같은 파일) 하나가 존재해야한다


scale out  :  인스턴스를 이미지 파일에 기반하여 지정된 개수 만큼 생성(늘린)한다

scale in : 생성되어 있는 인스턴스를 내린다


오토 스케일이란 : 유저가 몰릴 경우나 유저들이 빠져나갈때에 대한 기준(ex : CPU 부하 %)을 만들어 놓고 그에 따라 스케일 in ,out 이 자동적으로

이루어지도록 하는 것을 말함 (이 것이 클라우드의 매력이랄까..)

요금은 사용한 만큼 올라가고 사용하지 않은 만큼 내려가긴 하지만 거진 오토스케일링 자체를 사용하지 않을 경우 관련하여 함께 켜진 기능들을

구석 구석 다 꺼주어야 비용절감을 할수 있다





Amazon EC2 Auto Scaling이란 무엇입니까?

Amazon EC2 Auto Scaling을 통해 애플리케이션의 로드를 처리할 수 있는 정확한 수의 Amazon EC2 인스턴스를 보유하도록 보장할 수 있습니다. 


Auto Scaling 그룹이라는 EC2 인스턴스 모음을 생성합니다. 


각 Auto Scaling 그룹의 최소 인스턴스 수를 지정할 수 있으며, Auto Scaling에서는 그룹의 크기가 이 값 아래로 내려가지 않습니다. 


각 Auto Scaling 그룹의 최대 인스턴스 수를 지정할 수 있으며, Auto Scaling에서는 그룹의 크기가 이 값을 넘지 않습니다. 


원하는 용량을 지정한 경우 그룹을 생성한 다음에는 언제든지 Auto Scaling에서 해당 그룹에서 이만큼의 인스턴스를 보유할 수 있습니다.


 조정 정책을 지정했다면 Auto Scaling에서는 애플리케이션의 늘어나거나 줄어드는 수요에 따라 인스턴스를 시작하거나 종료할 수 있습니다.


예를 들어, 다음 Auto Scaling 그룹의 경우 최소 인스턴스 수 1개, 원하는 인스턴스 용량 2개, 최대 인스턴스 수 4개가 됩니다. 사용자가 정의한 조정 정책에 따라 인스턴스 수가 최소 및 최대 인스턴스 수 내에서 지정하는 조건에 따라 조절됩니다.



Auto Scaling의 이점에 대한 자세한 내용은 Auto Scaling의 이점을 참조하십시오.






Auto Scaling 수명 주기

Auto Scaling 그룹의 EC2 인스턴스에는 다른 EC2 인스턴스와는 다른 경로, 즉 수명 주기가 있습니다. 수명 주기는 Auto Scaling 그룹이 인스턴스를 시작하고 서비스에 들어갈 때 시작됩니다. 수명 주기는 인스턴스를 종료하거나 Auto Scaling 그룹이 인스턴스를 서비스에서 제외시키고 이를 종료할 때 끝납니다.

참고

인스턴스가 시작되는 즉시 인스턴스에 대한 요금이 청구되며, 아직 서비스되지 않는 시간도 포함됩니다.

다음 그림에서는 Auto Scaling 수명 주기에서 인스턴스 상태 간 전환을 보여 줍니다.






보류(Pending)

Auto Scaling에서 확장 이벤트에 응답하면 하나 이상의 인스턴스를 시작합니다. 이러한 인스턴스는 Pending 상태에서 시작됩니다.


확장(Scale Out)

다음 확장 이벤트는 Auto Scaling 그룹에 EC2 인스턴스를 시작하고 이를 그룹에 연결하라고 지시합니다.

  • 그룹의 크기를 수동으로 늘립니다. 자세한 내용은 수동 조정 단원을 참조하십시오.

  • 지정된 수요 증가에 따라 그룹의 크기를 자동으로 늘리는 조정 정책을 만듭니다. 자세한 내용은 동적 조정 단원을 참조하십시오.

  • 특정 시간에 그룹의 크기를 늘리도록 조정을 일정 기반으로 설정합니다. 자세한 내용은 예약된 조정 단원을 참조하십시오.

확장 이벤트가 발생하면 Auto Scaling 그룹이 할당된 시작 구성을 사용하여 필요한 수의 EC2 인스턴스를 시작합니다. 이러한 인스턴스는 Pending 상태에서 시작됩니다. Auto Scaling 그룹에 수명 주기 후크를 추가하면 여기에서 사용자 지정 작업을 수행할 수 있습니다. 자세한 내용은 수명 주기 후크 단원을 참조하십시오.

각 인스턴스가 완전히 구성되고 Amazon EC2 상태 확인을 통과하면, Auto Scaling 그룹에 연결되고 InService 상태에 들어갑니다. 이 인스턴스는 원하는 Auto Scaling 그룹 용량에서 감산됩니다.

서비스 상태의 인스턴스(Instances In Service)

인스턴스는 다음 중 하나가 발생할 때까지 InService(서비스중) 상태로 유지됩니다.

  • 축소 이벤트가 발생하면 Auto Scaling은 Auto Scaling 그룹의 크기를 줄이기 위해 이 인스턴스를 종료합니다. 자세한 내용은 축소 시 Auto Scaling 인스턴스 종료 제어단원을 참조하십시오.

  • 인스턴스를 Standby 상태로 설정하는 경우 자세한 내용은 대기 모드 시작 및 종료 단원을 참조하십시오.

  • Auto Scaling 그룹에서 인스턴스를 분리합니다. 자세한 내용은 인스턴스 분리 단원을 참조하십시오.

  • 인스턴스가 필요한 수의 상태 확인에 실패한 경우, Auto Scaling 그룹에서 제거, 종료 및 교체됩니다. 자세한 내용은 Auto Scaling 인스턴스 상태 확인 단원을 참조하십시오.

축소(Scale In)

생성한 확장 이벤트 각각에 대해 축소 이벤트를 생성하는 것이 중요합니다. 이렇게 하면 애플리케이션에 할당된 리소스와 그러한 리소스의 수요를 가능한 한 가깝게 일치시킬 수 있습니다.

다음 축소 이벤트는 Auto Scaling 그룹이 그룹에서 EC2 인스턴스를 분리하고 이를 종료하라고 지시합니다.

  • 그룹의 크기를 수동으로 줄입니다.

  • 지정된 수요 감소에 따라 그룹의 크기를 자동으로 줄이는 조정 정책을 만듭니다.

  • 특정 시간에 그룹의 크기를 줄이도록 조정을 일정 기반으로 설정합니다.

축소 이벤트가 발생하면 Auto Scaling 그룹에서 하나 이상의 인스턴스를 분리합니다. Auto Scaling 그룹이 종료 정책을 사용하여 종료할 인스턴스를 결정합니다. Auto Scaling 그룹에서 분리되어 종료 중인 인스턴스는 Terminating 상태로 들어가며, 다시 서비스 상태로 돌아갈 수 없습니다. Auto Scaling 그룹에 수명 주기 후크를 추가하면 여기에서 사용자 지정 작업을 수행할 수 있습니다. 마지막으로 인스턴스가 완전히 종료되고 Terminated 상태로 들어갑니다.

인스턴스 연결(Attach an Instance)

Auto Scaling 그룹에 특정 기준을 충족하는 실행 중인 EC2 인스턴스를 연결할 수 있습니다. 인스턴스가 연결되면 Auto Scaling 그룹의 일부로 관리됩니다.

자세한 내용은 Auto Scaling 그룹에 EC2 인스턴스 연결 단원을 참조하십시오.

인스턴스 분리(Detach an Instance)

Auto Scaling 그룹에서 인스턴스를 분리할 수 있습니다. 인스턴스를 분리한 후에는 이를 Auto Scaling 그룹과 별도로 관리하거나 다른 Auto Scaling 그룹에 연결할 수 있습니다.

자세한 내용은 Auto Scaling 그룹에서 EC2 인스턴스 분리 단원을 참조하십시오.

수명 주기 후크(Lifecycle Hooks)

인스턴스를 시작하거나 종료할 때 사용자 지정 작업을 수행할 수 있도록 Auto Scaling 그룹에 수명 주기 후크를 추가할 수 있습니다.

Auto Scaling에서 확장 이벤트에 응답하면 하나 이상의 인스턴스를 시작합니다. 이러한 인스턴스는 Pending 상태에서 시작됩니다. Auto Scaling 그룹에 autoscaling:EC2_INSTANCE_LAUNCHING 수명 주기 후크를 추가한 경우, 인스턴스가 Pending 상태에서 Pending:Wait 상태로 이동합니다. 수명 주기 작업을 완료하면 인스턴스가 Pending:Proceed 상태로 들어갑니다. 인스턴스가 완전히 구성되면 Auto Scaling 그룹에 연결되고 InService 상태로 들어갑니다.

Auto Scaling에서 축소 이벤트에 응답하면 하나 이상의 인스턴스를 종료합니다. Auto Scaling 그룹에서 이러한 인스턴스가 분리되고 Terminating 상태로 들어갑니다. Auto Scaling 그룹에 autoscaling:EC2_INSTANCE_TERMINATING 수명 주기 후크를 추가한 경우, 인스턴스가 Terminating 상태에서 Terminating:Wait 상태로 이동합니다. 수명 주기 작업을 완료하면 인스턴스가 Terminating:Proceed 상태로 들어갑니다. 인스턴스가 완전히 종료되면 Terminated 상태로 들어갑니다.

자세한 내용은 Amazon EC2 Auto Scaling 수명 주기 후크 단원을 참조하십시오.



Auto Scaling 구성 요소

다음 표는 Auto Scaling의 핵심 구성 요소가 나와 있습니다.



그룹

EC2 인스턴스는 그룹에 정리되어 조정 및 관리 목적의 논리적 단위로 처리할 수 있습니다. 그룹을 생성할 때 EC2 인스턴스의 최소 및 최대 인스턴스 수와 원하는 인스턴스 수를 지정할 수 있습니다. 자세한 내용은 Auto Scaling 그룹 단원을 참조하십시오.



시작 구성

그룹에서는 시작 구성을 그룹의 EC2 인스턴스용 템플릿으로 사용합니다. 시작 구성을 생성할 때 인스턴스의 AMI ID, 인스턴스 유형, 키 페어, 보안 그룹, 블록 디바이스 매핑 등의 정보를 지정할 수 있습니다. 자세한 내용은 시작 구성 단원을 참조하십시오.



확장 계획

확장 계획은 Auto Scaling에 확장을 수행하는 시기와 방식을 전달합니다. 예를 들어, 지정한 조건의 발생(동적 확장) 또는 일정에 따른 확장 계획을 수립할 수 있습니다. 자세한 내용은 조정 옵션 단원을 참조하십시오.

시작하기



ref : https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html

반응형
반응형


AWS 내에서 인스턴스가 ip 를 할당 받은 다음 껏다 다시 키게 되면 ip 를 새로 받게 된다(즉 고정이 아니다)


이를 고정으로 하기 위햇 AWS 내부에서 제공하는 서비스인 Elastic IP 를 사용하면 고정으로 사용 가능하다

고정 IP 이면서 사용하고 있다면 무료로 하나까지 제공이 되는데 이 아이피를 어떤 하나의 인스턴스에서도 사용하지 않거나

2개 이상을 사용한다면 추가 과금이 된다




Elastic IP 를 사용하게 되면 Public IP 와 Elastic IP 라는 두개의 아이피가 인스턴스에 주어지는 것을 확인 할 수 있는데

이때 Elastic IP 가 고정 IP 가 된다







AWS EC2를 오랫동안 껐다가 다시 켜거나 혹은 재부팅만 해도 IP가 변경되는 경우가 있습니다. 유동IP이기 때문인데요.
고정으로 바꾸려면 ‘Elastic IP’를 이용하면 됩니다. ‘Elastic IP’의 뜻이 ‘유동 IP’지만 헷갈리지 마세요.

* 주의!! ‘Elastic IP’는 생성하고 사용하면 무료지만, 쓰지 않으면 비용이 발생합니다. 얼마인지는 모르겠네요. 안 쓰는 경우 삭제하세요.

1. EC2 대시보드에서 ‘Elastic IP’를 클릭합니다.

2. 아래 버튼을 클릭합니다. (EC2 대시보드에서요. =_=)

Yes를 누르면 생성됩니다.

3. IP위를 마우스 우측 클릭하면 아래와 같은 메뉴가 뜹니다.

– Allocate New Address: 새 IP를 생성합니다.
– Release Addresses: IP를 제거합니다.
– Associate Address: EC2 인스턴스에 연결합니다.
– Disassociate Address: EC2 인스턴스의 연결을 끊습니다.

4. ‘Associate Address’를 선택해서 연결할 인스턴스를 선택합니다.

– Reassociation: 체크하면, 해당 IP가 다른 곳에 연결되어 있을 경우 끊고 연결합니다.

5. 인스턴스의 Description에 ‘Elastic IP’가 들어가 있으면 성공. (-:


ref : https://blog.wonhada.com/?p=1581

반응형
반응형


스케일 업(Scale up) : 인스턴스의 부품을 즉 해당 임대한 컴퓨터의 CPU 나 각종 성능 관련 부품을 업그레이드 하는것 ( 비용 발생)

스케일 다운(Scale down) : 인스턴스의 부품을 즉 해당 임대한 컴퓨터의 CPU 나 각종 성능 관련 부품을 다운 그레이드 하는것 (비용 감소)


  1. 스케일 업 다운을 할때는 우선 현재 서버의 내용을 이미지화시켜 만든다
  2. 이미지를 만들었다면 스케일업 하기 원하는 인슽턴스를 내린다
  3. 더 좋은 부품 세팅으로 인스턴스를 구성하여 만든다
  4. 이미지를 새로 생성한 인스턴스에 올린다









아래 처럼 인스턴스의 사양을 변경 할 수 있다(스케일 업 or down)



ref : https://www.slideshare.net/awskorea/10-aws-microsoft-sql-server


반응형
반응형

AMI : 이미지화 시킨다는 말은 현재 컴퓨터(윈도우일경우)의 OS/소프트웨어들 포함 복사본을 만들어 이것을 파일 형태로 만들어 놓는데
        이 파일을 이미라 부름(.iso 파일 같은 느낌)으로 AWS 에서는 이 이미지들을 유니티의 에셋스토어에서 처럼 사람들이 만들어 놓고
        이미지들에 대한 공유/판매가 이뤄진다




인스턴스 및 AMI

Amazon 머신 이미지(AMI)은 필요한 소프트웨어가 이미 구성되어 있는 템플릿입니다(예: 운영 체제, 애플리케이션 서버, 애플리케이션). AMI에서 인스턴스를 바로 시작하실 수 있는데, 이 인스턴스는 AMI의 사본으로, 클라우드에서 실행되는 가상 서버입니다. 다음 그림과 같이, 한 AMI로 여러 인스턴스를 실행할 수 있습니다.





중지하거나 종료할 때까지 또는 실패하기 전까지 인스턴스는 계속 실행됩니다. 인스턴스가 실패하면 AMI에서 새로 실행할 수 있습니다.




AMI

Amazon Web Services(AWS)에서는 자주 사용되는 소프트웨어 구성을 포함하는 다양한 Amazon 머신 이미지(AMI)가 공개 게시하고 있습니다. 그 뿐 아니라 AWS 개발자 커뮤니티 회원들이 올린 자체 구성 AMI도 게시되어 있습니다. 또한 얼마든지 사용자 정의된 AMI을 생성할 수 있어서, 고객님께서 필요하신 기능을 모두 갖춘 새로운 인스턴스를 쉽고 빠르게 시작할 수 있습니다. 예를 들어 고객님의 애플리케이션이 웹사이트나 웹 서비스인 경우, 웹 서버와 관련 고정 콘텐츠, 그리고 동적 페이지에 사용할 코드가 포함된 AMI를 정의해 만드실 수 있습니다. 그래서, 이 AMI에서 인스턴스가 시작이 되면, 고객님의 웹 서버가 자동으로 시작되고 애플리케이션은 바로 Request를 처리할 수 있습니다.

모든 인스턴스는 Amazon EBS 기반(AMI의 인스턴스가 실행되는 루트 디바이스가 Amazon EBS 볼륨인 경우) 또는 인스턴스 스토어 기반(AMI의 인스턴스가 실행되는 루트 디바이스가 Amazon S3에 저장된 템플릿에서 생성된 인스턴스 스토어 볼륨인 경우) 중 하나에 해당됩니다.

AMI에대한 설명을 보시면, 그 인스턴스의 루트디바이스가 ebs 인지 instance store인지 알수 있습니다. 각 AMI 유형별로 수행할 수 있는 작업이나 기능이 달라지기 때문에 이 차이점을 아는 것이 중요합니다. 해당 차이점에 대한 자세한 내용은 루트 디바이스 스토리지 단원을 참조하십시오.



ref : https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ec2-instances-and-amis.html


반응형
반응형


인스턴스 : 컴퓨터 한대를 AWS 에서 만든것이라는 개념으로 하드웨어 사양등을 선택하여 인스턴스를 구성할 수 있음

인스턴스

동일한 AMI에서 다른 유형의 인스턴스를 실행할 수 있습니다. 인스턴스 유형에 따라 인스턴스에 사용되는 호스트 컴퓨터의 하드웨어가 결정됩니다. 각 인스턴스 유형은 서로 다른 컴퓨팅 및 메모리 기능을 제공합니다. 인스턴스에서 실행하려는 애플리케이션 또는 소프트웨어에 필요한 메모리 양과 컴퓨팅 파워를 기준으로 인스턴스 유형을 선택하십시오. Amazon EC2 인스턴스 유형별 하드웨어 사양에 대한 자세한 내용은 Amazon EC2 인스턴스 유형 단원을 참조하십시오.

일단 인스턴스가 시작되면, 인스턴스는 다른 컴퓨터와 다를 것이 없고, 어느 컴퓨터와 동일한 방식으로 다루시면 됩니다. 인스턴스의 완벽한 통제가 가능하며, 루트 권한이 필요한 명령어는 sudo를 사용해 실행할 수 있습니다.

AWS 계정당 동시 수행할 수 있는 인스턴스 수는 제한됩니다. 해당 제한 및 추가 요청 방법에 대한 자세한 내용은 Amazon EC2의 실행 인스턴스 한도(종합 FAQ의 Amazon EC2) 단원을 참조하십시오.

인스턴스 스토리지

인스턴스의 루트 디바이스에는 인스턴스 부팅에 사용되는 이미지가 포함되어 있습니다. 자세한 내용은 Amazon EC2 루트 디바이스 볼륨 단원을 참조하십시오.

인스턴스에는 로컬 스토리지 볼륨이 포함될 수 있는데 이것을 인스턴스 스토어 볼륨이라고 하며, 인스턴스 실행 시 블록 디바이스 매핑으로 구성할 수 있습니다. 자세한 내용은 블록 디바이스 매핑 단원을 참조하십시오. 고객님의 인스턴스용 볼륨 추가와 매핑이 완료되면, 마운트하여 사용할 수 있습니다. 인스턴스 오류가 발생하거나 중지 혹은 종료된 경우, 해당 볼륨에 저장된 데이터는 손실되기 때문에 이런 볼륨은 임시 데이터 작성에 사용하는 것이 가장 좋습니다. 중요한 데이터는 여러 인스턴스를 연결하는 복제 방법을 사용하여 데이터를 보호하거나 지속적인 보관이 필요한 데이터를 Amazon S3 또는 Amazon EBS 볼륨에 저장하는 방법이 있습니다. 자세한 내용은 스토리지 단원을 참조하십시오.

보안 구현 모범 사례

  • AWS Identity and Access Management(IAM)을 사용하여 고객님의 인스턴스를 비롯한 AWS 리소스의 액세스를 제어할 수 있습니다. AWS 계정으로 IAM 사용자와 그룹을 생성하고 사용자나 그룹별로 보안 자격 증명을 할당하고 AWS 서비스 및 리소스에 대한 액세스 권한을 부여할 수 있습니다. 자세한 내용은 Amazon EC2 리소스에 대한 액세스 제어을 참조하십시오.

  • 신뢰할 수 있는 호스트나 네트워크만 인스턴스 포트에 액세스할 수 있도록 제한할 수 있습니다. 예를 들어 22번 포트의 유입 트래픽을 제한하면 SSH 액세스 제한이 가능합니다. 자세한 내용은 Linux 인스턴스에 대한 Amazon EC2 보안 그룹 단원을 참조하십시오.

  • 보안 그룹의 규칙을 정기적으로 검토하고 최소 권한 부여—라는 개념을 항상 적용하고 필요한 경우 필요한 권한만 허가하십시오. 보안 요구 사항이 다른 각 인스턴트를 처리하기 위해 서로 다른 보안 그룹을 생성할 수도 있습니다. 외부 로그인을 허용하는 접속 보안 그룹을 생성하고 여기에 해당되지 않는 나머지 인스턴스는 외부 로그인을 허용하지 않는 그룹으로 할당하는 것도 생각해 볼 수 있습니다.

  • AMI 실행 인스턴스는 비밀번호를 사용한 로그인을 비활성화합니다. 비밀번호는 유출이나 해킹이 가능해 보안 위험이 됩니다. 자세한 내용은 루트 사용자의 암호 방식 원격 로그인 비활성화 단원을 참조하십시오. 안전한 AMI 공유에 대한 자세한 내용은 공유 AMI 단원을 참조하십시오.

인스턴스 중지, 시작 및 종료

인스턴스 중지

인스턴스를 중단하면 정상적인 실행종료 과정이 이루어지고 stopped 상태가 됩니다. 인스턴스의 모든 Amazon EBS 볼륨이 연결된 상태로 유지되므로 나중에 언제든지 다시 시작할 수 있습니다.

인스턴스가 중지됨 상태에 있는 동안에는 추가 인스턴스 사용량에 대한 요금이 부과되지 않습니다. 중지됨 상태에서 실행 중 상태로 전환할 때마다 최소 1분의 요금이 부과되며. 인스턴스가 중지된 상태에서 인스턴스 유형을 변경하면, 다음에 인스턴스가 시작된 후 신규 인스턴스 유형에 대한 요금이 부과됩니다. 모든 연결 Amazon EBS 루트 디바이스 사용을 비롯한 인스턴스 사용에 관련된 비용은 일반 Amazon EBS 요금이 적용됩니다.

인스턴스가 중지 상태인 경우 인스턴스에 Amazon EBS 볼륨을 연결하거나 분리할 수 있습니다. 또한 인스턴스로부터 AMI를 만들수도 있으며, 커널, 램 디스크, 인스턴스 유형을 변경할 수 있습니다.

인스턴스 종료

인스턴스가 종료될 때 인스턴스는 일반 종료를 수행합니다. 루트 디바이스 볼륨은 기본적으로 삭제되지만 모든 연결된 Amazon EBS 볼륨은 기본적으로 유지됩니다. 이는 각 볼륨의 deleteOnTermination속성 설정에 따라 결정됩니다. 인스턴트 자체도 삭제되므로 나중에 다시 시작할 수 없게 됩니다.

인스턴스 종료를 비활성화하면 실수로 인스턴스를 종료하는 일을 방지할 수 있습니다. 이 경우에는 해당 인스턴스에 관련된 disableApiTermination 속성을 true로 설정했는지 확인하십시오. Linux의 shutdown -h 및 Windows의 shutdown 같은 인스턴스 실행종료 동작을 제어하려면 instanceInitiatedShutdownBehavior 인스턴스 속성을 stop이나 terminate로 적절히 설정하십시오. 기본 설정은 인스턴스 실행종료 시 Amazon EBS 볼륨을 루트 디바이스로 사용하는 인스턴스는 stop 상태, 인스턴스 스토어를 루트 디바이스로 사용하는 인스턴스는 항상 종료 상태로 변경됩니다.

자세한 내용은 인스턴스 수명 주기 단원을 참조하십시오.


ref : https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ec2-instances-and-amis.html

반응형
반응형

Amazon EC2는 웹 서비스 인터페이스를 사용해 다양한 운영 체제로 인스턴스를 시작하고, 이를 사용자 정의 애플리케이션 환경으로 로드하며, 네트워크의 액세스 권한을 관리하고, 원하는 수의 시스템을 사용해 이미지를 실행할 수 있는 진정한 가상 컴퓨팅 환경을 제공합니다.

Amazon EC2를 사용하려면 다음을 수행하면 됩니다.

  • 즉시 가져와서 실행할 수 있도록 미리 구성된 템플릿 기반의 Amazon 머신 이미지(AMI)를 선택합니다. 또는 애플리케이션, 라이브러리, 데이터 및 관련 구성 설정을 포함하는 AMI를 만듭니다.
  • Amazon EC2 인스턴스에 대한 보안 및 네트워크 액세스를 구성합니다.
  • 원하는 인스턴스 유형을 선택한 다음 웹 서비스 API 또는 제공된 다양한 관리 도구를 사용하여 AMI 인스턴스를 필요한 수만큼 시작, 종료, 모니터링합니다.
  • 여러 위치에서 실행할지, 고정 IP 끝점을 사용할지, 인스턴스에 영구 블록 스토리지를 추가할지 여부를 결정합니다.
  • 인스턴스 시간 또는 데이터 전송과 같은 실제로 소비한 리소스에 대해서만 비용을 지불합니다.



























Amazon EC2는 확장 가능하고 오류 복원력이 뛰어난 엔터프라이즈급 애플리케이션을 구축할 수 있는 여러 가지 강력한 기능을 제공합니다.



대규모 부동 소수점 처리 능력이 필요한 고객은 최대 8개의 NVIDIA Volta GV100 GPU가 탑재된 AWS의 차세대 범용 GPU 컴퓨팅 인스턴스인 Amazon EC2 P3 인스턴스의 이점을 활용할 수 있습니다. P3 인스턴스는 최대 1페타플롭스의 혼합 정밀도, 125테라플롭스의 단정밀도, 62테라플롭스의 배정밀도 부동 소수점 성능을 제공합니다. 초당 300GB의 2세대 NVLink interconnect는 빠른 속도와 짧은 지연 시간으로 GPU 대 GPU 통신을 지원합니다. 또한 P3 인스턴스는 사용자 지정 인텔 제온 E5(코드명 Broadwell) 프로세서를 기반으로 하는 최대 64개의 vCPU와 488GB의 DRM을 제공하며, Elastic Network Adapter(ENA)를 사용하여 초당 25GB의 전용 집계 네트워크 대역폭을 제공합니다. P3 인스턴스는 기계 학습, 고성능 컴퓨팅, 전산 유체 역학, 컴퓨팅 금융, 내진 해석, 분자 모델링, 유전체학 및 렌더링 워크로드에 매우 적합합니다.



뛰어난 그래픽 성능이 필요한 고객은 GPU 그래픽 인스턴스의 이점을 활용할 수 있습니다. 현재 세대 GPU 그래픽 인스턴스인 G3 인스턴스는 NVIDIA Tesla M60 GPU에 대한 액세스를 제공하며, GPU당 최대 2,048개의 병렬 처리 코어, 8GiB의 GPU 메모리, 최대 10개의 H.265(HEVC) 1080p30 스트림 및 최대 18개의 H.264 1080p30 스트림을 지원하는 하드웨어 인코더를 지원합니다. 최신 드라이버 릴리스를 설치하면 이러한 GPU가 OpenGL, DirectX, CUDA, OpenCL 및 Capture SDK(GRID SDK라고도 함)에 대한 지원을 제공합니다. GPU 그래픽 인스턴스는 3D 시각화, 그래픽 집약적 원격 워크스테이션, 3D 렌더링, 애플리케이션 스트리밍, 비디오 인코딩 및 기타 서버 측 그래픽 워크로드에 적합합니다.


지연 시간은 최소화하면서 데이터에 대한 높은 랜덤 I/O 액세스가 필요한 고객에게는 높은 I/O 인스턴스가 도움이 될 수 있습니다. 높은 I/O 인스턴스는 고객에게 3백만 이상의 임의 I/O 속도를 제공할 수 있는 Amazon EC2 인스턴스 유형입니다. 높은 I/O I3 인스턴스는 NVMe(Non-Volatile Memory Express) SSD를 기반으로 하며, 매우 높은 성능의 NoSQL 데이터베이스, 트랜잭션 시스템 및 Elasticsearch 워크로드를 실행하는 고객에게 매우 적합합니다. 또한, 높은 I/O 인스턴스는 최대 16GB/초의 순차 디스크 처리량을 제공하므로 분석 워크로드에도 적합합니다.

높은 I/O 인스턴스에 대한 자세한 내용은 Amazon EC2 인스턴스 유형을 참조하십시오.


인스턴스당 매우 높은 스토리지 밀도와 MPP(대량 병렬 처리: Massively Parallel Processing) 데이터 웨어하우스, MapReduce 및 하둡 분산 컴퓨팅, 로그 및 데이터 프로세싱과 같은 데이터 집약적인 애플리케이션을 위한 높은 순차적 I/O를 필요로 하는 고객은 고밀도 스토리지 인스턴스를 활용하여 도움을 받을 수 있습니다. Dense Storage 인스턴스는 Amazon EC2 인스턴스 유형으로, 최대 3.9GB/s의 순차 I/O 처리량 및 24개 하드 디스크 드라이브 전체에 최대 48TB의 인스턴스 스토리지 용량을 제공합니다. 또한 ENA 기반 네트워킹으로 vCPU당 스토리지 및 메모리를 줄여 배치 그룹 내에서 최대 25Gbps의 네트워크 대역폭을 제공합니다. 고밀도 스토리지 인스턴스에 대한 자세한 내용은 Amazon EC2 인스턴스 유형을 참조하십시오.


다양한 Amazon EC2 워크로드마다 스토리지 요구 사항이 상당히 다를 수 있습니다. 내장된 인스턴스 스토리지 외에도 다른 클라우드 스토리지 워크로드 요구 사항에 부합하도록 Amazon Elastic Block Store(EBS) 및 Amazon Elastic File System(EFS)를 제공합니다.

Amazon EBS는 Amazon EC2 인스턴스에서 사용할 수 있는 일관되고, 가용성이 뛰어나며, 지연 시간이 짧은 영구 블록 스토리지 볼륨을 제공합니다. 각 Amazon EBS 볼륨은 가용 영역 내에 자동으로 복제되어 구성요소 장애로부터 보호하고, 뛰어난 가용성 및 내구성을 제공합니다. 용량, 성능 및 비용에 따라 워크로드를 조정해야 하는 애플리케이션 관리자를 위해 설계되었습니다.

Amazon EFS는 공유 액세스를 위한 간단하고 확장 가능한 완전관리형 영구 클라우드 파일 스토리지를 제공합니다. 여러 가용 영역에 걸쳐 뛰어난 가용성과 내구성을 제공하도록 설계된 Amazon EFS는 표준 파일 시스템 액세스 의미 체계를 지원하는 파일 시스템 인터페이스를 제공하고, 용량을 자동으로 증가 및 축소하며, 애플리케이션 관리자에게 페타바이트 규모에서 높은 처리량과 일관되게 짧은 지연 시간을 제공합니다. 


매달 말에 실제로 사용한 EC2 리소스에 대한 요금이 청구됩니다.

예를 들어, 특정 시점에 시간당 비용이 0.085 USD인 스몰 유형 인스턴스 20개를 시작한다고 가정해 보겠습니다. 인스턴스는 즉시 부팅을 시작하지만 모든 인스턴스가 항상 동시에 시작되는 것은 아닙니다. 각 인스턴스는 실제 시작 시간을 저장합니다. 그 후에 각 인스턴스가 시작된 시간을 기준으로 매시간이 시작될 때 실행 시간(0.085 USD/시간)에 대한 요금이 부과됩니다. 각 인스턴스는 사용자가 TerminateInstances API 호출(또는 이에 상응하는 도구)을 사용해 인스턴스를 종료하거나, 인스턴스가 저절로 종료(예: UNIX “shutdown” 명령)되거나, 소프트웨어 또는 하드웨어 오류로 인해 호스트가 종료될 때까지 실행됩니다. 인스턴스를 1시간 미만으로 사용한 경우에도 1시간을 사용한 것으로 청구됩니다.


Amazon EC2는 인스턴스를 여러 위치에 배치할 수 있는 기능을 제공합니다. Amazon EC2 위치는 리전과 가용 영역으로 구성됩니다. 가용 영역은 다른 가용 영역에 오류가 발생할 경우 오류 지점으로부터 분리되도록 설계된 별개의 위치로, 동일 지역의 다른 가용 영역에 저렴하고 지연 시간이 낮은 네트워크 연결을 제공합니다. 별도의 가용 영역에서 인스턴스를 실행함으로써 단일 위치에서 오류가 발생할 경우 애플리케이션을 보호할 수 있습니다. 리전은 하나 이상의 가용 영역으로 구성되고, 지리적으로 분산되어 있으며, 분리된 지리적 영역 또는 국가에 위치합니다. Amazon EC2 서비스 수준 계약은 각 Amazon EC2 리전에 99.95%의 가용성을 보장합니다. AWS 제품 및 서비스의 리전별 가용성은 리전별 제품 및 서비스를 참조하십시오.


엘라스틱 IP 주소는 동적 클라우드 컴퓨팅에 적합하게 설계된 고정 IP 주소입니다. 엘라스틱 IP 주소는 특정 인스턴스가 아닌 사용자의 계정과 연결되며 사용자는 명시적으로 해제할 때까지 해당 주소를 제어합니다. 그러나 기존의 고정 IP 주소와는 달리 엘라스틱 IP 주소를 사용하면 공인 IP 주소를 계정의 인스턴스에 프로그래밍 방식으로 다시 매핑하여 인스턴스 또는 가용 영역 장애를 마스킹할 수 있습니다. Amazon EC2를 사용하면 데이터 기술자가 호스트를 재구성하거나 교체할 때까지 기다리거나 DNS 정보가 모든 고객에게 적용될 때까지 기다리지 않고 엘라스틱 IP 주소를 교체 인스턴스에 빠르게 다시 매핑하여 인스턴스 또는 소프트웨어 문제를 해결할 수 있습니다. 또한 이 양식을 작성하여 엘라스틱 IP 주소의 역방향 DNS 레코드를 구성할 수도 있습니다.


Amazon EC2 Auto Scaling을 사용하면 정의한 조건에 따라 Amazon EC2 용량을 자동으로 확장하거나 축소할 수 있습니다. EC2 Auto Scaling은 용량에 대한 수요가 급증할 경우에는 사용 중인 Amazon EC2 인스턴스 수를 자동으로 늘려 성능을 유지할 수 있게 하고, 수요가 감소할 경우에는 인스턴스 수를 자동으로 줄여 비용을 최소화할 수 있게 합니다. EC2 Auto Scaling은 사용량이 시간, 일 또는 주 단위로 바뀌는 애플리케이션에 특히 적합하고 EC2 Auto Scaling은 Amazon CloudWatch를 통해 활성화되며 Amazon CloudWatch 요금 외에 추가 비용이 발생하지 않습니다. 자세한 내용은 Amazon EC2 Auto Scaling을 참조하십시오. EC2뿐만 아니라 다른 서비스의 크기도 조정하려면 AWS Auto Scaling을 사용하면 됩니다.


긴밀하게 연결된 병렬 처리와 같은 복잡한 연산 워크로드 또는 네트워크 성능에 민감한 애플리케이션을 사용하는 고객은 Amazon EC2의 탄력성, 유연성 및 비용 이점을 활용하는 동시에 사용자 구성 인프라가 제공하는 것과 동일한 뛰어난 컴퓨팅 및 네트워크 성능을 실현할 수 있습니다. 클러스터 컴퓨팅, 클러스터 GPU 및 고용량 메모리 클러스터 인스턴스는 고성능 네트워크 기능을 제공하도록 특별히 설계되었으며, 프로그래밍 방식을 통해 클러스터에 실행할 수 있으므로, 긴밀하게 연결된 노드 간 통신에 필요한 지연 시간이 짧은 네트워크 성능을 애플리케이션에 제공할 수 있습니다. 클러스터 인스턴스는 처리 속도를 크게 향상하므로 네트워크 집약적 작업을 수행해야 하는 고객 애플리케이션에도 적합합니다. Amazon EC2 및 다른 AWS 서비스를 HPC 애플리케이션에 사용할 수 있는 방법에 대해 자세히 알아보십시오.


향상된 네트워킹을 사용하면 PPS(Packet Per Second) 성능이 크게 높아지고, 네트워크 지터 및 지연 시간이 낮아집니다. 이 기능은 일반 구현에 비해 높은 I/O 성능 및 낮은 CPU 사용률을 제공하는 새로운 네트워크 가상화 스택을 사용합니다. 향상된 네트워킹을 이용하려면 VPC에서 HVM AMI를 시작하고 적절한 드라이버를 설치해야 합니다. EC2 인스턴스에서 향상된 네트워킹 기능을 활성화하는 방법에 대해 알아보려면 지원 Linux 인스턴스에서 향상된 네트워킹 기능 사용 및 지원 Windows 인스턴스에서 향상된 네트워킹 기능 사용 자습서를 참조하십시오. 이 기능의 인스턴스별 가용성이나 자세한 내용을 알아보려면 향상된 네트워킹 FAQ 섹션을 참조하십시오.


고객은 Amazon Virtual Private Cloud(VPC) 또는 AWS Direct Connect를 통해 Amazon EC2 API에 비공개로 액세스할 수 있으며, 퍼블릭 IP를 사용하거나 트래픽이 인터넷을 통과할 필요가 없습니다. AWS PrivateLink는 고객이 AWS 네트워크 내에 모든 네트워크 트래픽을 유지하면서 가용성과 확장성이 뛰어난 방식으로 Amazon 서비스에 액세스할 수 있도록 특별히 개발된 기술입니다. AWS PrivateLink로 Amazon EC2를 사용하려면 VPC에 EC2용 엔드포인트를 생성해야 합니다. 이 엔드포인트로 향하는 모든 트래픽이 비공개로 EC2 서비스로 라우팅됩니다. AWS PrivateLink에 대해 자세히 알아보려면 PrivateLink 설명서를 참조하십시오.


Amazon Time Sync Service는 EC2 인스턴스를 포함하여 AWS 서비스에 매우 정확하고 안정적이며 가용성이 뛰어난 시간 소스를 제공합니다. VPC에서 실행 중인 모든 인스턴스는 범용적으로 연결 가능한 IP 주소에서 서비스를 액세스할 수 있습니다. 서비스는 AWS 리전에서 일련의 예비 위성 연결 및 원자 기준 시계를 사용하여 UTC(Coordinated Universal Time) 글로벌 표준을 준수하는 매우 정확하고 신뢰할 수 있는 현재 시간 판독값을 제공합니다. 서비스를 액세스하는 방법에 대한 지침은 Linux  Windows 사용자 설명서의 시간 설정 섹션을 참조합니다.


ref : https://aws.amazon.com/ko/ec2/details/



반응형
반응형


요즈음 유니티 게임 포스팅만 하느라 안드로이드 강좌는 한참 손을 놓고 있었습니다.


이 강좌는 안드로이드 단말기와 서버와의 자료 및 정보 교환을 하는 방법에 대한 것이므로 잘 배워두면 곧바로 실무에 적용할 수 있을 것입니다.


단말기와 웹서버와 통신 방식은 다음과 같이 크게 두 가지로 구분할 수 있습니다. 


    ① HTTP 통신

    ② Socket 통신


HTTP와 Socket의 가장 큰 차이점은 접속(Connection)을 유지하는지의 여부입니다. 물론 파일 전송만을 전문으로 처리하는 FTP도 있지만 이것은 HTTP를 확장한 개념이므로 HTTP에 포함시키겠습니다.



1. HTTP 통신


HTTP 통신은 웹브라우저에 정보를 표시하는 것과 같이 클라이언트의 요청이 있을 때 서버가 해당 페이지에 대한 자료를 전송하고 곧바로 연결을 끊는 방식입니다. 현재 여러분이 제 블로그를 보고 있지만 맨 처음 이 페이지가 보여지는 순간만 서버와 연결되고 현재는 서버와 접속이 끊어진 상태입니다. 이 상태에서 F5 키를 눌러 새로고침을 하거나 다른 페이지로 이동하면 그때 다시 서버에 연결이 될 것입니다.


이렇게 하는 이유는 단 한가지. 서버의 부하를 줄여서 다른 접속을 원활하게 처리하기 위해서입니다. 여러분이 F5 키를 계속 누르거나 아예 F5 키에 연필을 꽂아서 클라이언트가 서버를 계속해서 물고 늘어지면 서버는 이 클라이언트의 연결을 유지하느라 다른 컴퓨터의 응답이 늦어질 것입니다. 이런 방식으로 여러 대의 PC가 서버를 붙잡고 늘어져서 서버가 다른 일을 하지 못하도록 하는 것을 DDOS 공격이라고 하죠...



2. Socket 통신


Socket 통신은 클라이언트가 서버와 접속이 되면 서버나 클라이언트에서 강제로 접속을 해제할 때까지는 계속해서 접속이 유지됩니다. 따라서 서버의 능력이 무한대가 아닌 이상 동시에 접속할 수 있는 클라이언트의 수가 제한이 될 수 밖에 없겠죠. 



Socket 통신은 실시간으로 정보 교환이 필요하는 채팅이나 온라인 게임, 실시간 동영상 강좌 등에 사용됩니다. 따라서 이와 같은 경우가 아니라면 서버와의 통신은 HTTP를 사용하는 것이 시스템의 자원을 보다 효과적으로 사용할 수 있습니다.



3. 시스템의 구성


단말기가 서버에 접속하기 위해서는 서버에 단말기의 응답을 처리하는 별도의 프로그램이 있어야 합니다. 저는 이것을 서버 모듈이라고 부르겠습니다. 서버 모듈은 C, PHP, Java, ASP 등 다양한 언어로 작성될 수 있을 것지만, 제가 사용하는 서버가 아파치 웹서버를 사용하므로 PHP로 구성하기로 합니다. 서버와 통신하기 위한 시스템의 구성은 다음 그림과 같습니다.






기본적인 개념을 세웠으므로 다음 강좌에서는 단말기 모듈과 서버 모듈을 설계하는 과정에 대해 알아보기로 하고 이번 강좌는 간단히 마무리합니다.




ref : http://foxmann.blog.me/90140923533



반응형

+ Recent posts