JavaScript는 클래스라는 개념이 없다. 그래서 기존의 객체를 복사하여(cloning) 새로운 객체를 생성하는 프로토타입 기반의 언어이다. 프로토타입 기반 언어는 객체 원형인 프로토타입을 이용하여 새로운 객체를 만들어낸다. 이렇게 생성된 객체 역시 또 다른 객체의 원형이 될 수 있다. 프로토타입은 객체를 확장하고 객체 지향적인 프로그래밍을 할 수 있게 된다. 프로토타입은 크게 두 가지로 해석할 수 있다. 프로토타입 객체를 참조하는 prototype 속성과 객체 멤버인 proto 속성이 참조하는 숨은 링크가 있다. 이 둘의 차이점을 이해하기 위해서는 JavaScript 함수와 객체의 내부적인 구조를 이해 해야한다.
// prototype 은 공유하는 객체
function Car(){ }
var myCar1 = new Car();
var myCar2 = new Car();
Car.prototype.color ="red";
console.log(myCar1.color);
console.log(myCar2.color);
Car.prototype.color ="blue";
console.log(myCar1.color);
console.log(myCar2.color);
function Car(){}
var myCar1 = new Car(); //Car의 prototype을 참조함
var myCar2 = new Car(); //Car의 prototype을 참조함
var myCar3 = new Car(); //Car의 prototype을 참조함
Car.prototype.color = "red";
console.log(myCar1.color);
console.log(myCar2.color);
console.log(myCar3.color);
//myCar1, myCar2, myCar3이 같은 protype을 참조하므로
red 출력
// new 또는 객체가 생성 될 때 참조할 수 있다.
var test = { aa : 111 }; //리터럴로 객체생성
test.prototype.bb = 222; //문법에러
console.log(test.bb);
// property 출력해보기
function Car(){
this.name = "첫번째";
this.title = "타이틀"
}
Car.prototype.pro1 = "val1";
Car.prototype.pro2 = "val2";
var myCar = new Car();
var myCar = new Car();
var prop;
for(prop in myCar){
if(myCar.hasOwnProperty(prop)){
console.log(prop + " = "+ myCar[prop]);
}
}
// Brower support IE8이하
if (!Object.create) {
Object.create = function (o){
function F() {}
F.prototype = o;
return new F();
}
}
// 변수 접근
function Car(){
this.name = "내차";
this.title = "타이틀"
}
Car.prototype.move = function(){
console.log(this.name + " 이동" );
};
var myCar = Object.create(Car.prototype);
myCar.move(); //undefined
// Object.create로 생성시 prototype공유하고 필드로 접근가능
// 두번째 인자에 접근 가능하게 설정
function Person(){
this.name = "hello";
}
Person.prototype.speack = function(){
console.log(this.name + " speack");
};
var myMan = Object.create(Person.prototype , {
name : {
value : "myMan", //초기 값 설정
writable : true //쓰기가능 속성설정
}
});
myMan.speack();
var myMan = Object.create(Person.prototype);
Object.defineProperties(myMan ,{
name : {
value : "myMan",
writable : true
}
});
myMan.speack();
Object.defineProperty = 단일 속성 설정
Object.defineProperties = 복수 속성 설정
MongoDB 란?
json-style의 document형태로 저장하는 오픈소스 NoSQL 데이터 베이스 (C++로 작성)
문서지향 데이터베이스
행 개념 대신에 보다 유연한 모델인 문서를 이용하는데, 내장 문서와 배열따위의 표현이 가능해서 복잡한 객체의 계층 관계를 하나의 레코드(열)로 표현할 수 있다. 이것은 자바나 파이썬 같은 최신 객체지향 언어들을 사용하는 개발자에 매우 편리함을 가져다 준다.
스키마
몽고 디비의 특징 중 가장 유명한 것은 스키마가 없다는 것이다. 이것은 필요할 때 마다 필드를 추가하거나 제거하는 것이 매우 쉬워졌음을 의미한다. 사실은 필드라는게 없는거나 마찬가지니까. 따라서 개발 과정이 매우 단순해지고 빠르게 개발이 가능하게 된다.
RDB와 비교
RDBMS
MongoDB
Database
Database
Table
Collection
Tuple / Row
Document
Column
Key/Field
Table Join
Embedded Documents
Primary Key
ObjectID
빅데이터 처리 특화
Memory Mapped(데이터 쓰기 시에 OS의 가상 메모리에 데이터를 넣은 후 비동기로 디스크에 기록하는 방식)를 사용하기 때문에 방대한 데이터를 빠르게 처리할 수 있다. 하지만 OS의 메모리를 활용하는 만큼, 메모리가 가득 찰 시 하드디스크로부터 데이터를 처리하게 되어 속도가 급격히 느려지게 된다.
쿼리 지원
기존의 NO-SQL들이 key,value의 형태만 제공하는 것과 달리 RDB와 같이 쿼리를 사용할 수 있습니다. 이를 통해 효과적으로 데이터를 추출해낼 수 있고, 기존의 관계형 데이터베이스로부터의 이전이 쉽습니다.
대규모 분산 시스템 구성 지원
관계형데이터베이스에 비해 대규모 분산 시스템 구성을 쉽게 할 수 있도록 연결되지 않은 데이터들이 동시 병렬 처리가 가능한 MapReduce 자동으로 데이터를 여러서버에 분할시켜주는 Auto-Sharding 데이터 유실을 대비한 Replica 기능을 제공합니다.
단점
key 중복 입력의 비효율성
birthday key에 해당하는 데이터를 10000개를 넣을 경우, DB에는 10000번의 "birthday"가 함께 저장된다.
{birthday:19920101} {birthday:19000202} {birthday: 18880303} 중복된 key값이 계속 들어가기 때문에, 비효율적인 저장이 될 수 밖에 없다.
Memory Mapped의 메모리 제약 (빅데이터 처리 특화 참조)
불안전함
데이터의 양이 많을 경우 몇몇 데이터가 날아간다던가, 샤딩이 정상적으로 동작을 하지 않는다던가.. 레플리카 프로세스가 좀비가 된다던가.. 등등의 다양한 에러가 존재한다.