1. 복제의 개념과 동작 원리

* 복제

: 고성능 DB에서 가장 핵심이 되는 기능

: 같은 데이터를 가지는 여러개의 MongoDB서버를 설계하는 과정

: Master/Slave Replication

: 자동 장애 조치 불가능(수동으로 대체 가능)

: 13개 노드까지 구성 가능

: 후에 배울 Replica Set은 자동으로 복구 가능

* 복제의 용도

: 데이터의 일관성, 읽기 분산, 운영중 백업, 오프라인 일괄 작업용 데이터 소스

* MongoDB 복제 동작 원리

: Master는 쓰기 연산을 담당

: 쓰기 연산이 실행되면 데이터 저장소와 Oplog 영역에 저장

- 데이터 저장소 : B+ 트리로 구성되어 쓰기 연산을 수행한 결과 저장

- Oplog : 연산수행과 관련된 명령 자체를 타임스탬프와 함께 저장

: Slave는 주기적으로 Master에게 Oplog를 요청한다.

: 데이터를 복사하는 것이 아니라, 동일한 명령어를 복사하는 것.

2. 복제 시스템 구성

* 저장공간 생성

: 슬레이브 저장공간 생성

> mkdir var2

> mkdir var3

* 서버 실행

: 마스터 서버 실행

> mongod -dbpath 경로 -port 포트번호 -master

: 슬레이브 서버 실행

> mongod -dbpath 경로 -port 포트번호 -slave -source 마스터URL

> mongod -dbpath 경로 -port 포트번호 -slave -source localhost:10000

* 데이터 저장

> mongo localhost:10000    //    마스터에 접속

데이터 입력 후

* 데이터 확인

> mongo localhost:10001    //    슬레이브 접속

저장 데이터 확인하기


'프로그래밍 > NoSQL - MongoDB' 카테고리의 다른 글

MapReduce  (0) 2017.04.04
mongoDB 리플리카 셋으로 장애 대응방법 배우기  (0) 2017.04.04
MongoDB 샤딩  (1) 2017.04.03
MongoDB Index기능  (0) 2017.04.03
MongoDB 명령어  (0) 2017.04.03

1. 샤딩의 개념과 정의

* 샤딩의 목적

: 데이터의 분산 저장

: 한대의 서버에 빅 데이터를 저장하는 것은 불가능하다.

: 서비스의 성능저하, 하드웨어의 한계

: 데이터를 분산하여 순차적으로 저장한다면, 부하를 분산할 수 있다.

: 백업과 복구 전략

: 시스템 성능 향상, 데이터 유실 가능성으로부터 보호

: 미리 분산하여 안정적이고 효과적인 시스템 운영을 한다.

: 여러 독립된 프로세스로 병렬 작업을 하기 때문에 빠른 처리 성능을 보인다.

: 3대 이상의 서버를 샤드로 활용하는 것을 추천한다. (최소 2대)

: 기존 한대일때보다 20~30%더 메모리를 사용한다.

* config 서버

: 샤드 서버의 인덱스를 찾는데 필요

: 샤드 시스템에 대한 메타 데이터 저장/관리 역할

: 샤드와 별도 서버에 구축

: 최소 3대 이상 사용(최소1대)

: 저사양 서버 사용 가능

* mongos 서버

: 하나 이상의 프로세스를 사용

: config 서버의 meta-data를 캐시한다

: 빅데이터를 샤드 서버로 분산해주는 프로세스

: mongs 서버를 통해 데이터를 쓰고 읽는 작업을 한다.

* 샤딩 시스템 계층

: 중개자 계층은 샤딩 시스템의 핵심적인 부분 (mongos 부분)

* Shard Key 구성

: Shard Key는 여러개의 Shard 서버로 분할 될 기준필드를 가리킨다.

: partition 과 load balancing에 기준이 되며, mongodb 데이터 저장과 성능에 절대적인 영향을 미친다

: 데이터 분포가 낮으면 Low Cardinality라고 한다.

: Chunk Migration의 횟수와 빈도를 결정한다.

- migration : 데이터의 이동, 서버에 균등하게 데이터를 재조정하는 과정

- Chunk : 일정한 데이터양에 도달했을 때 서버로 분할하는 단위

2. 샤딩 시스템 구성

* 데이터 저장 공간 생성

> mkdir shard1    //    저장공간 만들기

> mkdir shard2    //    저장공간 만들기

> mkdir shard3    //    저장공간 만들기

* config 서버용 저장 공간 생성

> mkdir config1    // config 서버용 저장공간 생성

* 서버 실행

> Mongod -shardsvr -dbpath 경로 -port 40001    //    샤드 서버 실행 , 포트는 다른 컴퓨터면 같아도됨

> Mongod -shardsvr -dbpath 경로 -port 40002    //    샤드 서버 실행

> Mongod -shardsvr -dbpath 경로 -port 40003    //    샤드 서버 실행

> mongod -configsvr -dbpath 경로 -port 50001   //    config 서버 실행

* mongos 서버 실행

> mongos -configdb localhost:50001 -port 27017 -chunkSize 1    //    mongo 명령어를 통해 shell 진입시 해당 포트를 입력해야 한다.

* 샤드 서버 추가

> db.runCommand({addshard:"localhost:40001"})    //    Shard를 런 타임중에 추가할 수 있음

> db.runCommand({addshard:"localhost:40002"})

> db.runCommand({addshard:"localhost:40003"})

* 샤드 키 지정

> db.runCommand({enablesharding:"person"})    //    Shard DB지정

> db.runCommand({shardcollection:"person.users",key:{_id:1}})    //    Shard Collection과 index지정

* 현재 샤드 상태 조회

> printShardingStatus();

* 데이터 확인

> mongo localhost:40001

> use person

> db.users.count()

* 샤드 삭제

> db.runCommand({removeshard:"localhost:40000"})

3. 샤딩의 한계

: 샤드 노드의 개수를 약 100개정도로 한정하고 있다

: 마스터 서버가 fail되어도 mongos는 여전히 fail된 mongod를 마스터로 간주할 수 있다.

: 중요한 데이터는 RDBMS에 저장하자


1. Index 기본 개념

* 개념

: DB의 검색을 빠르게 하기 위해 미리 데이터의 순서를 정리해두는 과정

: index를 잘 설계해야 최대의 효율이 가능

: 고유 index, 희소 index, 다중키 index // 복합 index, 단일 index 지원

: 쿼리해오기 위한 작업량을 줄임 <- 모든 도큐먼트를 스캔해야되는 비효율성을 줄임

: 한 쿼리당 하나의 index만 유효

: 두개의 index가 필요하다면 복합 index를 사용하면 됨.

: 복합 index에서는 키의 순서가 중요

: _id는 기본적으로 생성되는 index로 도큐먼트를 가리키는 유일한 키값이다.

: 도큐먼트에 빠르게 접근할 때에 사용한다.

* Index 효율

: 모든 index에는 유지비가 소요되기 때문에 무한히 만드는 것은 의미가 없다.

: index는 읽기 위주의 어플리케이션에서 유용하다.

: 쓰기가 많다면 index를 포기하거나 컬렉션을 따로 운영해야 한다.

: Mongodb는 실행시 모든 데이터 파일을 메모리에 매핑한다.

: 모든 도큐먼트, 컬렉션, 인덱스를 포함하는 데이터 파일이 램에 적재

: 모든 데이터를 수용하지 못하면 운영체제가 디스크를 빈번하게 액세스하게 되고 읽기/쓰기 연산에 지연이 발생한다.

: Thrashing(쓰레싱) : 모든 데이터를 디스크에서 액세스해야 하는 경우 // 굉장한 성능저하 발생

: 복합인덱스는 더 많은 공간을 필요로 한다.

* B트리

: 내부적으로 B-Tree 알고리즘을 이용하여 인덱스를 구성한다.

: 트리에서 각 노드는 여러개의 키를 갖는 것이 가능

2. MongoDB index

* 인덱스 확인

> db.person.getIndexes()    //    Collection의 인덱스 확인

* 인덱스 생성

> db.person.ensureIndex({name:1})    //    1이면 오름차순, -1 이면 내림차순

* 인덱스 생성(백그라운드에서 생성, 비동기방식)

> db.person.ensureIndex({name:1},{background:true})

* 인덱스 생성( 고유인덱스 ) 

> db.person.ensureIndex({name:1},{unique:true})    //    unique 속성을 지정해서 중복데이터가 저장되지 못하게 하여, 데이터 저장과 검색속도를 늘린다.

* 인덱스 생성( 중복데이터 삭제 )

> db.person.ensureIndex({name:1},{unique:true, dropDups:true})    //    Unique 하게 했을 때 이미 중복된 데이터가 있을 경우 중복되는 데이터는 삭제하고 인덱스를 저장한다.

* 인덱스 삭제 ( 특정 필드 )

> db.person.dropIndex({name:1})    //    해당 인덱스 제거

* 인덱스 삭제( 모든 인덱스)

> db.person.dropIndexes()    //    _id를 제외한 모든 인덱스 제거

3. MongoDB Index 사용법

* 특정 사용자 정보를 가진 문서 찾기

> db.users.find({username:"user101"}).explain()    //    검색에 대한 상세 정보 출력

* 사용시 주의할 점

: 모든 인덱스를 갱신해야 하기 떄문에 모든 쓰기 작업은 인덱스 때문에 더 오래 걸림

: Collection 당 최대 64개까지 인덱스를 지닐수있지만, 2~3개만 지니는게 좋다.

: 몽고디비의 인덱스는 RDBMS와 유사하게 작동함

: 인덱스 구축시 background 옵션을 사용하면, 비동기로 작업이 가능하긴하지만 느리다.



인덱스

6. MongoDB 쉘을 이용하여 데이터 저장하고 조회하기


6. MongoDB 쉘을 이용하여 데이터 저장하고 조회하기

: db나 테이블을 따로 만들지 않고 명령어를 수행하면 자동으로 DB와 테이블을 만들어주는 듯하다.

1. MongoDB 실행 

mongod - dbpath 경로    //    서버 실행

> mongo        //    MongoDB Shell 실행

> use admin

> db.shutdownServer()    //    Server 종료

* MongoDB 조회

> show dbs;     //     database 조회

> use test       //     test DB를 만들고 사용한다.

> show collections      //     현재 db의 collection list를 출력한다.

: RDBMS는 스키마에 따란 데이터만 저장할 수 있었다면, MongoDB는 다 저장할 수 있다.

* Javascript 명령

> var a = {age:25}  //  이런식으로 넣어줄 수 있다.

: javascript의 명령과 동일한 형태를 가진다

2. MongoDB 데이터 저

> db.scores.save({a:99});    //    데이터 저장

> db.scores.find();    //    해당 테이블을 출력

> for(i=0;i<10;i++){db.scores.save({a:i, exam:i})}    //    이런 것도 가능하다.

3. MongoDB 데이터 조회

> db.scores.find({a:2});    //    모든 입력매개체는 JSON형태를 따라야 한다.

: a가 2인 도큐먼트만 찾는다라는 뜻.

> db.score.find({a:{'$gt':15}});    //    a가 15보다 큰 도큐먼트만 찾는다.

> db.scores.find({a:{'$gte':2, '$lte':4}})    //    2보다 같거나 크고 4보다 작거나 같은 것들을 출력한다. (AND)

> db.scores.find({a:'{$in':[2,3,4]}})    //    $in 뒤에는 무조건 배열이다. 2,3,4 에 속하는 결과를 출력한다.

> db.scores.find{$or:[{'a':{$lt:1}, {'a':{'$gt':9}}]}    //    OR 연산

> db.score.find([컬럼:{'$exists':true}])    //    해당 컬럼이 존재하는 도큐먼트만 출력

> db.score.find({조건},{a:1,exam:1,_id:0})    //    조건에 해당하는 a, exam 컬럼만 출력

- 비교연산자

: $gt : '>', $lt : '<', $gte : '>=', $lte : '<=', $ne : '!='

: $in : is in array, $nin : ! in array


7. MongoDB 쉘을 이용하여 저장된 데이터를 수정하거나 삭제하기

1. 데이터 수정 UPDATE

* 전체 수정

> db.user.update({name:'Johnny'},{name:'Cash',languages:['english']})    //    해당 데이터의 도큐먼트가 _id를 제외하고 모두 바뀐다.

* 일부 수정

> db.user.update({name:'Cash'},{$set:{age:50}});    //    해당 도큐먼트에 age가 있으면 50로 변경하고 없으면 age를 50으로 추가한다.

* 일부 삭제

> db.user.update({name:'Cash'},{$unset:{age:50}})    //    age를 삭제한다. 뒤의 값은 상관이 없는것같다.

* 배열 값 삭제

> db.use.update({name:'Sue'},{$pull:{languages:'scala'}});    //    해당 도큐먼트의 배열에서 해당 값만 사라진다.

* 배열 값 추가

> db.use.update({name:'Sue'},{$push:{languages:'scala'}});    //    해당 도큐먼트의 배열에 해당 값이 추가된다.

2. MongoDB 삭제

* Document 삭제

> db.users.remove({name:'Sue'})    //    해당 도큐먼트를 삭제한다.

> db.users.remove({})    //    도큐먼트만 전체 삭제한다.

* Collection 삭제

> db.users.drop()


카테고리

1. 클라우드/빅데이터란 무엇인가?

2. NoSQL의 특징

3. NoSQL 데이터 모델링 기법 살펴보기

4. MongoDB의 기본 개념에 대해 알아보기

5. MongoDB와 Node.js의 동작방식 배우기


1. 클라우드/빅데이터란 무엇인가?

1. 클라우드 개념

: 물리적인 서버를 논리적인 서버로 추상화하나 개념

: 클라우드 컴퓨팅

: 인터넷 기반 컴퓨팅 기술

: 개인 단말기는 입/출력에만 사용하고, 정보관리 등 작업등은 클라우드 컴퓨터에서 진행

: 장점

: 휴대성, 다양한 기기를 단말기로 사용, 일관성있는 사용자환경, 안정성 등등..

: 단점

: 서버가 공격당하면 개인정보가 유출, 앱설치 제약, 열악한 통신환경에서 이용제약

2. 빅데이터 개요

: 빅데이터 정의

: 그 전에는 분석이 불가능 했지만, IT가 발전하면서 다룰수 있게된 방대한 양의 데이터

: 아이폰 즉, 스마트 폰을 기점으로 트래픽 량이 폭발적으로 증가함에 따라 데이터의 규모가 증가하였다.

: 빅데이터 특징

: 데이터의 양, 생성속도, 다양성

: 정형적인 데이터가 아니라, 비정형적인 자료임.

: 비정형데이터, 문자, 영상, 위칯 데이터 등등...

: 클라우드 컴퓨터 사용

: 오픈소스 무료 소프트웨어, 텍스트마이닝, 감성분석 등등... 

3. 빅데이터 활용사례

: ZARA의 SCA(Supply Chain Analytics)

: 미국 국세청

: 구글의 독감동향서비스, 번역기 등등...

: 서울시 심야버스

<T아카데미 "NoSQL 온라인 강의" 필기 내용입니다.>


2. NoSQL의 특징

1. NoSQL 특징

: 등장배경

기존

: 기업 업무를 자동화하고 효율화 하는 목적

: 데이터양의 한계

NoSQL등장

: 대규모 데이터를 생산

: 기존 기업 데이터에 비해 단순한 형태를 지님

: 복잡성이 높은 데이터에서 대량의 단순한 데이터가 생산됨

: 새로운 저장 기술이 필요해짐

: 구글과, 아마존에 의해 Bingtable,, Dynamo라는 논문이 발표

: 이후 RDBMS 시장에 NoSQL이 등장하게됨

: 특징

: NoSQL(Not Only SQL)으로 RDBMS의 단점을 보완해준다.

: RDBMS가 데이터의 관계를 Foreign Key 등으로 정의하고 Join 등 관계형 연상르 하지만 NoSQL은 관계를 정의하지 않음.

: 대용량 데이터 저장을 한다.

: 분산형 구조를 통해 여러대의 서버에 분산하여 저장하고 상호복제하여 데이터 유실이나 서비스 중지에 대비함.

: 스키마가 유동적임

: mandatory 필드로 지정하면 ID부분만 타입이 동일하고 다른 칼럼은 데이터 형태가 동일하지 않아도 괜찮다.

: CAP(일관성, 가용성, 부분결함용인) 이론을 따름. (Database에서도 다루었음.)

2. NoSQL종류

* Key/Value Store

: 대부분의 NoSQL은 Key/Value 개념을 지원

: Unique Key하나에 Value를 지님

: Redis가 대표적인 솔루션임

* Ordered Key/Value Store

: 데이터가 내부적으로 Key를 순서로 Sorting되어 저장됨

: Hbase, Cassandra가 대표적인 솔루션

* Document Key/Value Store

: Key/Value Stroe의 확장된 형태

: Value타입으로 Document라는 구조화된 데이터 타입을 사용 (JSON, XML, YAML) 등등

: 복잡한 데이터 구조 사용가능

* 인기도

: MongoDB, Cassandra, Hbase, Redis 순임.

3. NoSQL 장점/단점

* Relational modeling

: 데이터 모델 정의후, 어플리케이션에 맞는 쿼리 개발

* NoSQL Data Modeling

: 어플리케이션에 필요한 쿼리와 성능을 정의한 후, 요구사항에 부합하게 데이터 모델을 구성

: RDBMS보다 더 깊은 데이터구조 및 접근 알고리즘에 대한 이해가 필요

: NoSQL쿼리가 실제 몇개의 물리 노드에 걸쳐서 수행되는지에 대한 이해가 있어야 제대로된 쿼리 디자인이 가능

: DB와 어플리케이션 뿐만아니라 인프라(네트워크, 디스크)에 대한 디자인을 함께해야함

: 인증이나 인가체계가 없어서 보안이 매우 취약하기 때문에 별도의 보안체계를 마련해야함(방화벽이나 Reverse Proxy등)

* RDBMS 장점

: 범용적 고성능

: 대부분의 경우 가장 안정적

: 데이터의 일관성(트랜잭션)

: 정규화, 중복의 삭제

: 복잡한 쿼리도 가능(join)

: 성숙된 기술

* RDBMS 단점

: 대량의 데이터 입력을 처리하기 어려움

: 테이블의 인덱스 생성이나 스키마 변경시 리스크가 크다

: 개발/운영시 컬럼을 확정시키기 어려운경우 사용하기 힘들다

* NoSQL 장점

: 특정용도로 특화되어 있음

: 데이터 분산에 용이

: join연산은 대부분 불가능

: 데이터에 대한 캐시가 필요한 경우

: 배열 형식의 데이터를 고속으로 처리할 경우

* NoSQL 단점

: 각 솔루션의 특징을 이해해야함

: 아직 새로운 기술로 운영 노하우 필요

: 버그가 상대적으로 많음

: 업체마다 NoSQL을 개발하기 때문에 새로운 솔루션이 계속 출시가 됨

<T아카데미 "NoSQL 온라인 강의" 필기 내용입니다.>


3. NoSQL 데이터 모델링 기법 살펴보기

1. NoSQL 데이터 모델링 개념

* Denormalization (비정규화)

: 비정규화 = 데이터 중복 허용

: 쿼리프로세싱을 간단하게 하거나 사용자의 데이터를 특정 데이터 모델에 맞추기 위함.

: 비정규화로 인한 트레이드-오프

: 쿼리 사이즈는 작아지지만, 전체 데이터 사이즈가 증가하는 단점

: 복잡도는 작아지지만, 데이터 사이즈가 증가하는 단점

: 데이터를 많이 가질 수 있기 때문에 단점에 대해서 관대함.

: 데이터를 한곳에 모아 놓기 때문에 쿼리 수행을 위한 I/O 숫자를 줄여 성능을 향상시킨다

: 시스템과 데이터 사이즈가 큰 분산환경에서는 성능이 더 좋다.

* Aggregates(유연한 스키마)

: 유연한 스키마는 복잡하고 다양한 구조의 데이터 클래스를 구성할수있게함.

: JOIN연산을 줄임.(수행시간 단축, 저렴한 비용의 대용량 데이터 지원)

: 복잡한 비즈니스 요소를 담을 수 잇음

* Application Side Joins

: Join 대상 데이터가 N:M의 관계를 가질때

: Join 대상 데이터가 수시로 변동할 때 필요하다.

: RDBMS 상에서 하던가, 어플케이션단으로 데이터를 추출해서 해야한다.

2. 주요 NoSQL 데이터 모델링 기법

* Composite Key

: 하나이상의 필드를 Deliminator(:)를 이용하여 구분지어 사용

: Ordered KV 를 사용하여 그룹핑된 키-벨류를 구성할 수 있음

* Inverted Search Index

: Value의 내용을 Key로 하고, Key의 내용을 반대로 Value로 하는 패턴

: 검색엔진이 주로 사용

* 계층 데이터 구조 모델링 패턴

: 기본적으로 Row,Column을 가지고 있는 테이블 구조의 저장구조를 갖음

: Tree와 같은 계층형 데이터 구조를 저장할 경우에는 쉽지 않음

: RDBMS를 참고하여 NoSQL에서도 구현해놓았음.

* Tree Aggregation

: Tree 구조자체를 하나의 Value에 저장하는 방식

* Materialized Path

: Tree 구조를 테이블에 저장할 때, root부터 현재 노드까지의 전체경로를 Key로 저장하는 방법

: 노력에 비해 효율적인 방식

: 다양한 쿼리가 가능

3. NoSQL 데이터 모델링 예시

* 도메인 모델 파악

: 어떤 데이터 개체가 있는지, 개체간의 관계를 분석

: ERD를 그려 도식화

: RDBMS 모델링 접근 방법이긴하지만, NoSQL에서도 저장할 데이터를 명확하게 이해하기 위해 필수

* 쿼리 결과(데이터 출력 형태) 디자인

: 도메인 모델 기반으로 어플리케이션에서 쿼리가 수행되는 결과값을 먼저 정함

: 출력형식을 기반으로 필요한 쿼리 정의

: 테이블 추출

* 패턴을 이용한 데이터 모델링

: Sorting, Grouping, join이 안되기 때문에, get, put으로만 해결할 수 있도록 수정

* 기능 최적화

: 분류에 따른 포스팅 출력

* NoSQL 선정 및 테스트

: 모델링한 데이터 구조를 효과적으로 실행할 수 있는 NoSQL검토

: NoSQL 특성 분석 및 부하테스트, 안정성/확장성 테스트 수행

: 경우에 따라서는 여러개의 NoSQL을 복함하여 사용거나 RDBMS와 혼용하는 것이 좋음.

* 선정된 NoSQL에 최적화 및 하드웨어 디자인

: 선정된 NoSQL에 맞는 데이터 구조화

: 해당 NoSQL에 맞는 어플리케이션 인터페이스 설계

: 구동시킬 하드웨어 디자인 

* 결론

: NoSQL 시스템 개발시, 데이터 모델리이 80%이상 차지함

<T아카데미 "NoSQL 온라인 강의" 필기 내용입니다.>


4. MongoDB의 기본 개념에 대해 알아보기

1. MongoDB 특징

: 10gen 사에서 개발한 솔루션(C++)

: 범용적이고 스키마를 고정하지 않는다.(json)(key-value)

: join이 불가능하기 때문에 join이 필요없도록 데이터 구조화 필요

: 메모리 맵 형태의 파일 엔진 DB이기 때문에 메모리에 의존적

: 메모리 크기가 성능을 좌우

: 쌓아놓고 삭제가 없는 경우가 적함

: 로그데이터, 이벤트 참여내역, 세션

: 트랜잭션이 필요한 금융, 결제, 빌링, 회원정보등에는 부적합(RDBMS필요)

* 도큐먼트 데이터 모델

: Key-Value

: 문자열이나 숫자, 날짜 가능

: 배열 또는 다른 도큐먼트를 지정도 가능

: one query로 모두 해결할 수 있도록 collection model 설계를 해야함.

: 하나의 document에 필요한 모든 정보를 담아 join이 필요없도록 해야한다.

* JSON

: JavaScript Object Notation

: Lightweight data 교환방식

: 사람이 읽고쓰기쉽고, 기계가 파싱하고 생성하기 좋음

: Javascript의 Array문법

: 클라이언트에서 처리 퍼포먼스가 높음

: 송수신시 XML보다 빠르고 간편하며 XML이 표현하는 것을 모두 표현할 수 있다.

* JSON 표기법

: 각 객체는 {} 로 시작하고 끝남

: 각 멤버는 콤마(,)로구분

: 값은 object, string, number, array, true, false, null 사용가능

: 문자의 경우 따움표, 숫자의 경우 필요없음

2. MongoDB 장/단점

* MongoDB 장점

: Schema-less 구조 - 다양한 형태 데이터 저장, 유연한 변화 가능

: Read/Write 성능이 좋음

: Scale out 구조, JSON 구조

* MongoDB 단점

: 데이터 업데이트 중 장애 발생 시, 데이터 손실 가능성

: 충분한 메모리 확보 필요, 데이터 공간소모 많음.

* 빅 데이터 처리 특화

: Memory Mapped 사용 - 메모리가 커야함

: 데이터의 양이 많을 경우 손실가능성 존재

: 샤딩, 레플리카 프로세스의 비정상 동작 가능성

* MongoDB vs MySQL

: CRUD의 결과는 대부분 MongoDB가 빠름

: MongoDB를 사용할 때 Single Node와 Multi Node 간 성능차이가 거이 없다고함.

3. MongoDB 주요기능

* MongoDB Query

- CREATE : db.person.save({'name':'john'});

- READ : db.person.find();

- UPDATE : db.users.update({name:'johnny'},{name:'Cash',languages:['english']});

- DELETE : db.users.remove({name:'Sue'});

: JSON 형태로 입출력해야함.

* MongoDB 인덱스

: 다수 인덱스 설정가능

: 복합 인덱스 지원, 빠른검색지원

: 메모리가 부족한 시스템에서 검색속도 저하

* MongoDB 복제

: Master-Slave 구조 구성

: 데이터 복사본을 Slave에 배치

: Master 장애에 따른 데이터 손실 없이 Slave 데이터 사용가능

* MongoDB 샤딩

: 대용량의 데이터를 저장하기 위한 방법

: 소프트웨어 적으로 데이터 베이스를 분산시켜 처리하는 구조

: 샤딩방식

: 데이터 베이스가 저장하고 있는 테이블을 테이블 단위로 분리하는 방법

: 분산 데이터베이스의 전통적인 분할 3계층 구조 지원

: 응용계층, 중개자 계층, 데이터 계층

* MongoDB 맵리듀스

: 대용량의 데이터를 안전하고 빠르게 처리하기 위한 방법

: 데이터를 분산하여 연산하고 다시 합치는 기술

: 맵과 리듀스 단계로 나뉘며 사용자가 임의 코딩 가능

: 한대 이상의 하드웨어를 활용하는 분산프로그래밍 모델

: 대용량 파일에 대한 로그분석, 색인 구축 검색 등에 활용

: 일괄처리 방식으로 전체 데이터 셋을 분석할 필요가 있는 문제에 적합

<T아카데미 "NoSQL 온라인 강의" 필기 내용입니다.>


5. MongoDB와 Node.js의 동작방식 배우기

1. MongoDB 기본동작 원리

* MongoDB 구성

: 수평적 확장, 한대 이상의 서버로 구성, 독립된 서버에서 실행 권장

: mongod라는 실행파일 단위로 실행, 보통 3개의 Replica단위로 구성하여 데이터 복제

: mongos 서버를 통해 한대의 데이터베이스 서버처럼 사용가능

2. MongoDB 실행/종료

* MongoDB 설치

: 4개의 운영체제 지원(대부분의 유저가 리눅스 사용 90%)

: 비용이 적기 때문

: MongoDB의 철학 '메모리 관리는 운영체제에 맡기자'

: 상대적으로 메모리 관리에 뛰어난 unix베이스의 운영체제 선택

: 교육은 윈도우가 편함

: 지원언어

: Java / Java Script

: Perl / Php / Python

: Ruby / Scala / Erlang / Haskell

* 리눅스의 경우

sudo apt-cache search mongodb

  mongodb 검색 후

 sudo apt-get install mongodb

 mongo db 설치

* MongoDB 실행

mongod - dbpath 경로

 MongoDB 경로 지정하여 서버 실행

: mongod : MongoDB의 서버프로그램(Daemon의 약자 d)

 mongo

MongoDB Shell 실행 - 기본 27017포트에서 서버가 돌고있음


* MongoDB 서비스로 돌리기 (윈도우)

 mongod -config c:\mongodb\mongodb.conf-install

 c:\mongodb\mongodb.conf 파일을 미리 만들어둔다. 안의 내용은 검색해보자. 

* 종료

 user admin

db선택 

 db.shutdownServer() 

db 종료 

3. Node.js 개요

: 손쉽고 간단하게 HTTP 처리와 URL처리가 가능

: MongoDB 입출력시 JSON 처리 용이, 찰떡궁합임.

: 구글 크롬웹브라우저에서 사용하는 자바스크립트엔진(V8)을 사용하여 앱을 구축할수있게 해주는 프레임 워크

* Event-driven

: 사용자 또는 외부환경이 만들어낸 사건을 기반으로 어떤 처리를 할지 지정해주는 개발방식

* Non-Blocking

: Blocking I/O 

: 쓰기/읽기 이벤트가 발생시 해당 모듈을 이벤트가 끝날때까지 점유

: 메모리 낭비도 심함

: Non-Blocking I/O

: 쓰기/읽기 이벤트가 시작되어도 모듈을 반환

: 다른 작업이 가능한 준비상태로 전환

: 동기식보다 빠르고 메모리도 적게 차지

<T아카데미 "NoSQL 온라인 강의" 필기 내용입니다.>


<T아카데미 "NoSQL 온라인 강의" 필기 내용입니다.>


'프로그래밍 > NoSQL - MongoDB' 카테고리의 다른 글

mongoDB 리플리카 셋으로 장애 대응방법 배우기  (0) 2017.04.04
MongoDB를 이용한 복제 방법 살펴보기  (0) 2017.04.04
MongoDB 샤딩  (1) 2017.04.03
MongoDB Index기능  (0) 2017.04.03
MongoDB 명령어  (0) 2017.04.03

오리엔테이션

: 자바스크립트는 브라우어 위에서 돌아가는 웹브라우저를 제어하기 위한 언어이다.

: 그런데 탈 웹브라우저 흐름을 통해 자바스크립트와 브라우저를 분리하여 생각할 수 있게 되었다.

: 자바스크립트는 웹서버에서 돌아갈 수 있게 되었고 이러한 기능을 하는 node js 가 있다.

: 원래 웹서버는 PHP, JAVA, PYTHON...을 보통 사용했었다.

: Node js를 통해 자바스크립트가 서버에서 사용됩에 따라 탈웹이 가능하게 되었다,

: Google Apps Script가 그 예이다.

: 언어란 무엇인가?

: 의사소통을 위한 약속

: 사용자 - 컴퓨터 간의 문법

: 환경이란?

: 언어를 사용하는 대상이 환경이다.

: 환경(웹부라우저, Node.js, SpreadSheet...)에 따라 명령어가 달라진다.

: 환경에 따라 할수있는 일이 다르고 명령어가 달라진다.


실행과 실습

: 환경으로는 크롬 웹브라우저를 사용할 것이다.

1. html 파일을 실행시켜 실행시키는 방법

: 브라우저에서는 html위에서 자바스크립트가 돌아간다.

2. 크롬에서 F12 개발자 도구로 들어간다.  이 Console 창에서 간단한게 한줄로 실행시키는 것들을 실행해볼 수 있다.

: 도구(tool)의 선택

: Sublime Text를 사용할 것이다.

: IDE는 통합개발도구이다. Sublime Text는 텍스트 에디터이다.

: 좋은 도구를 선택하는 것은 중요하다.

: 공사를 할 때 포크레인을 쓸것인지, 삽을 쓸것인지를 생각해야 한다.

: 신경쓰지않으면 모른다.

: 상황에 따라 다른 도구를 사용해야 한다.


숫자와 문자

: 따음표 안에 있지 않는 숫자는 숫자로 생각한다.

: 문자를 표현할 떄 작은 따음표 사이 혹은 큰 따음표 사이에 표현해야 한다.

: \' 혹은 \" 은 '와 "를 나타내는 문자이다.

: \ 뒤에 나오는 문자하나는 특수기호가 아니라 그냥 정보로 취급된다. (escape)


typeof 변수  : 타입을 출력하는 함수

문자열.indexOf(문자) : 해당 문자가 문자열에서 몇번째 인덱스인지 출력한다


변수

<var 변수명> 을 통해 선언한다.

주석

: 두가지 표시 방법이 있다.

// 내용

/* 내용 */

줄바꿈과 여백

 ;(세미콜론) 은 명령어의 끝을 나타낸다.

비교

== 동등연산자이다.

: 1=="1" true

: 버그가 발생될 여지가 많다.

: 1을 true로 본다.

=== 엄격한 동등 연산자이다.

: 1==="1" false

: 이것을 사용하자!

: 1을 true로 보지 않는다.

: 무조건 같은것만 같다

* undefined : 값이 없다

: 프로그래머가 의도하지않은 상황

: false 이다

* null : 값이 없다

: 프로그래머가 의도적으로 설정한 상황

: false 이다


조건문

if(조건){
    내용
} else if(조건){
} else{
}


반복문

while(조건){
    내용
}

for( var i =0 ; i< 10; i++){
    내용
    break; 혹은 continue가 사용됨
}


함수

1. 함수정의

function 함수명 ( [인자...[,인자]] ){
    코드
    return 반환값
}

함수명()

2. 함수변수정의

변수명 = function 함수명 ( [인자...[,인자]] ){
    코드
    return 반환값
}

변수명()

3. 익명함수

(function 함수명 ( [인자...[,인자]] ){
    코드
    return 반환값
})()


배열

정의

var 변수명 = [맴버,맴버...];

맴버 호출

변수명[0] 변수명[1] ...

추가

하나 넣기

 변수명.push(맴버)

 배열 넣기

 변수명.concat([맴버,맴버...])

 첫번째 원소로 넣기

 변수명.unshift(맴버)

 제거 후 넣기

 변수명.splice(Index, Index부터 삭제할 수, 맴버,맴버...)

제거

변수명.pop()

정렬

변수명.sort()
변수명.reverse()


객체

: 데이터를 담아내는 컨테이너로써의 객체를 설명함

선언

var 변수명 = [key:value, key:value...]

호출

1. 변수[key]

2. 변수.key

반복문

: 배열과 달리 순서가 없다고 생각해야함.

for(key in 변수명){

내용 ex) 변수명[key]
}

객체

: 다양한 것들을 넣을 수도 있음

var 변수명 = {

변수1 : {key:value,key:value...},

변수2 : function(){

this.변수1 // 변수1을 가리키게됨.

}

}


모듈

: 프로그램을 구성하는 로직을 재사용 할 수 있는 단위로 재구성해서 띄어내는 것

: 부품화 하는 것을 모듈화라고 함.

: 방법중 하나가 별도의 파일로 만드는 것이다.

: 순수한 자바스크립트에서는 모듈이라는 개념이 분명하게 존재하지 않는다.

: 환경마다 모듈화 하는 방법이 다르게 제공되고 있다.

웹환경 ex)

<head>

<script src="greeting.js"></script>

</head>

Node.js

var circle = require(URL);

라이브러리

: 자주 사용되는 로직을 재사용하기 편리하도록 잘 정리한 일련의 코드 집합

: 좋은 라이브러리를 사용하는 것은 중요하다


정규표현식 in js

: 크게 두가지의 사용 단계로 이루어진다

1. 컴파일 : 패턴을 찾는 것

2. 실행 : 구체적인 작업을 하는 것

컴파일

1. 정규표현식 리터럴 (아래 두가지 모두 같은 방법이다.)

var pattern = /a/;

=> /문자/ 가 내가 원하는 문자라는 것을 알려줌

var pattern = /a./;

=> a+문자 하나를 찾는 것임.

2. 정규표현식 객체 생성자

var pattern = new RegExp('a');

=> a 가 내가 원하는 문자라는 것을 알려줌

실행

: 추출할 때 사용한다 (추출)

: 존재하는지 확인할 때 사용한다 (test)

: 치환할 떄 사욯안다. (치환)

추출 : RegExp.exec()  

pattern.exec(문자열) : pattern에 설정된 문자를 찾아줌

Test : RegExp.test()

pattern.test문자열) : pattern에 설정된 문자가 있으면 true, 없으면 false

치환

String.match(패턴) : 패턴에 해당하는 것이 있으면 문자열 반환, 없으면 null

String.replace(패턴,문자열) : 패턴에 해당하는 문자열만 설정한 문자열로 치환

정규표현식 옵션

: 중복가능하다 ex) /a/ig

i : 대소문자를 구분하지 않음

Ex) var pattern = /a/i

g : 패턴에 해당되는 중복된 모든 문자열 반환

Ex) var pattern = /a/g


ex)

 var pattern = /(\w+)\s(\w+)/g

    \w는 a-z,A-Z,0-9 를 나타내고 +는 한글자 이상, \s는 스페이스

str.replace(pattern, "$2, $1")

2번째 괄호와 첫번쨰 괄호를 바꾼뒤 치환한다라는 뜻


함수

유효범위

function(){
}

: 위의 중괄호안에서만 지역변수이고

if(){} 나 for(){}

: 의 중괄호는 변수의 유효범위를 가르지 못한다.

유효범위 시점

: 해당 함수가 정의될 때의 변수 기준으로 변수를 책정한다


값으로서 함수와 콜백

: js에서는 함수도 객체이다. 즉 일종의 값이다. 

: 변수, 매개변수, 리턴값 으로 사용되어질 수 있다.

: 객체의 속성값으로 담겨진 함수를 메소드(method)라고 부른다

a={

b : function (){}    // Method

}

: 함수를 다른 함수의 인자로 전달할 수 도있다.

: 함수는 함수의 리턴 값으로도 사용될 수 있다.

함수의 인자,리턴

function cal(mode){

var func = {

'plus' : function(){},

'minus' : function(){}

}

return func[mode]

}

cal('plus')()

함수의 배열

var proccess={

function(input){},

function(input){},

function(input){}

}

for(var i =0; i< process.length ; i++){ proccess[i](input) }

콜백

: 함수를 값으로 전달할 수 있기 때문에 sort(콜백함수)를 실행시킴으로써 함수의 기능을 바꿈

ajax 

: 비동기방식으로 동작한다

: 웹과 서버가 통신하는 방식

: 콜백함수를 통해 결과값을 바꿀수 있다.


클로저

: 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 가리킨다.

: 자바스크립트를 이용한 고난이도의 테크닉을 구사하는데 필수적인 개념으로 활용된다.

ex)

function outter(){

var title = 'coding everybody';

return funcction(){alert(title)};

}

inner = outter();

inner();

: inner가 호출되었을 때 outter함수의 title을 출력하게 된다.

: 이것이 클로저의 독특함이다.

: 외부함수가 종료된 이후에도 외부함수 내부의 변수를 호출할 수 있다.

ex)

function factory_movie(title){

return {

get_title : function(){ return title; },

set_title : function(_title){ title=_title; }

}

}

ghost = factory_movie();

matrix = factory_movie();

: 위의 두 객체는 다른 내부 변수를 가진다

: 이때 내부 변수는 외부에서 바꿀 수 없으며, 오직 set_title, 즉 함수를 통해서만 변화시킬수있다.

: private한 변수이다.

: 안전한 변수이다.


Arguments

: 함수에는 arguments라는 변수에 담긴 숨겨진 유사배열이 있다.

: 이 배열에는 함수를 호출할 때 입력한 인자가 담겨있다.

: 함수가 받는 매개변수가 없더라도, 인자를 많이 넣어도 에러가 나지 않는다.

: arguments를 통해 인자에 접근할 수 있다.

Argument 활용

function sum(){

var _sum=0;

for(var i =0 ; i<arguments.length ; i++){

_sum += arguments[i] ; 

}

return _sum;

}

document.write(sum(1,2,3,4));

함수와 객체의 Arguments

function one(arg){

one.length // 1을 반환

arguments.length // 2를 반환

}

one(arg1,arg2);


함수의 호출

: 함수의 호출하는 방법을 알아볼 것이다

: 자바스크립트에서는 함수가 일종의 객체이다

: 객체는 속성을 가지고 있다.

: 객체 안의 함수는 Method라고 한다.

기본

function func(){

}

func()

apply

o1={var1:1, var2:2, var3:3}

function sum(){

var _sum = 0;

for( name in this){

_sum += this[name];

}

return _sum;

}

sum.apply(o1);

: 함수의 this 값을 apply안에 있는 객체로 한다.


객체지향 프로그래밍

: OOP (Object Oriented Programming) 객체 지향 프로그래밍

: 로직을 상태와 행위로 이루어진 객체로 만드는 것이다.

:  객체지향 프로그래밍 교육은 크게 두가지로 구분된다.

1. 문법

: 언어가 제공하는 기능을 익히는 것이다.

2. 설계

: 좋은 객체를 만드는 것이다, 현실을 잘 반영하는 것이다.

: 추상화 하는 과정이다.

: 객체지향은 부품화의 정점이라고 볼 수 있다.

: 상황에 따라 적합하게 사용해야 한다.

: 은닉화, 캡슐화

: 인터페이스


생성자와 new

: 자바스크립트는 Prototype-based programming에 속한다

객체

: 객체란 서로 연관된 변수와 함수를 그룹핑한 그릇이라고 할 수 있다.

: 객체내의 변수를 Property, 함수를 Method라고 부른다.

객체 생성

var person = {

'name' : 'hello',

'func' : function(){return this.name;}

}

생성자

: 생성자는 객체를 만드는 역할을 하는 함수이다.

: 자바스크립트에서 함수는 재사용 가능한 로직의 묶음이 아니라 객체를 만드는 창조자라고 할수있다.

객체의 생성자

: 자바스크립트에서는 Class가 존재하지 않는다.

function Person(){};

var p = new Person()

: new라는 생성자는 객체의 초기화 역할을 한다. 


전역객체

: 제일 밖에 선언한 함수는 전역 객체 의 property 이다.

: window.함수명() 에서 window가 전역객체이다.

: 전역객체의 유용한 API가 존재한다.


this

: this는 함수 내에서의 함수 호출 맥락을 의미한다. 맥락이라는 것은 상황에 따라서 달라진다는 의미이다.

: 함수를 어떻게 호출하느냐에 따라서 this가 가리키는 대상이 달라진다.

: 함수와 객체의 관계가 느슨한 JS에서 this는 이 둘을 연결시켜주는 연결점의 역할을 한다.

window의 this

function func() {

if(windows===this) return true;

}

func() // true가 리턴된다.

: func()는 윈도우의 Method로써 호출되기 떄문에 true이다

method의 this

var o = {

func : function(){

if(o === this){ return true; }  

}

}

o.func()  // true

: o의 Method로써 호출되기 때문에 true이다.

생성자와 this

function Func(){}

var o1 = Func(); // 여기서 Func의 this는 window이다

var o2 = new Func() // 여기서 Func의 this는 o2이다.

apply와 this

func.apply(o)  // func의 this는 o 이다.


상속

: 상속받은 개체가 부모의 로직을 재활용하면서 수정이 가능하다.

생성자를 통한 객체 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
function Person(name){
 
this.name = name;
 
this.introduce = function(){
 
return 'My name is ' + this.name;
 
}
 
}
 
var p1 = new Person('hello');
cs

상속

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Person(name){
 
this.name = name;
 
}
// Person라는 객체에 prototype이라는 특수한 property에 name이라는 property를 준것임.
Person.prototype.name=null
// 같은 방법으로 method도 설정할 수 있음
Person.prototype.introduce=function(){
 
return 'My name is ' + this.name;
 
}
 
var p1 = new Person('hello');
    cs

상속의 사용방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Person(name){
    this.name = name;
}
// Person라는 객체에 prototype이라는 특수한 property에 name이라는 property를 준것임.
Person.prototype.name=null
// 같은 방법으로 method도 설정할 수 있음
Person.prototype.introduce=function(){
    return 'My name is ' + this.name;
}
 
function Programmer(name){
    this.name = name;
}
// Person 객체를 상속받는다.
Programmer.prototype = new Person();
var p1 = new Programmer('hello');
// 상속받았기 때문에 introduce를 사용할 수 있다.
p1.introduce();
cs


: 이러한 이유때문에 Prototype based Language라고 불린다.


prototype

: 객체의 원형이라고 할 수 있다.

: 객체는 prototype이라는 프로퍼티를 가지는데 특수한 용도로 사용되도록 약속된 프로퍼티이다.

: 여기에 저장된 속성들은 (new)생성자를 통해서 객체가 만들어질때 그 객체에 연결된다.

: sub.prototype = new Super() 와 같이 꼭 생성자를 통해 객체를 넣어주어야 한다.


표준 내장 객체의 확장

: 자바스크립트가 기본적으로 가지고 있는 객체들을 의미한다.

: 내장 객체가 중용한 이유는 프로그래밍을 하는데 기본적으로 필요한 도구들이기 때문이다.

Object
Function
Array
String
Boolean
Number
Math
Date
RegExp

: 가 있다.

내장 객체 확장

: 배열 확장

Array.prototype.random = function(){};

arr.random()


데이터 타입

: 데이터 타입은 크게 두가지로 구분된다.

1. 원시 데이터 타입 (기본 데이터 타입)

: 숫자, 문자열, 불리언, null, undefined

: 객체가 아닌것들

: 문자열과 관련된 일을 할때에는 임시로 문자열 객체를 만들고 사용이 끝나면 제거한다.

: ex) 'coding'.length

: 따라서 원시 데이터 타입에 무언가를 저장하고 부르면 undefined가 된다.

2. 객체 데이터 타입 (참조 데이터 타입)


참조

복제  

1
2
3
4
5
6
7
var a =1;
 
var b = a;
 
= 2
 
a? // 1이다.

cs

: 원시 데이터 타입의 경우 복제가 된다,

참조

1
2
3
4
5
6
7
var a = {'id':1};
 
var b = a;
 
b.id = 2;
 
a.id?  // 2
cs

: 객체의 경우에는 주소값이 복사가 된다.

함수와 참조

원시데이터의 경우 인자값으로 들어온 변수의 값을 함수내부에서 바꿀 수 없다.

객체의 경우 인자값으로 들어온 변수의 값을 함수내부에서 변화시킨다.


기타

document.write() : html문서에 글쓰기

: 자바스크립트의 자료형이 제한되어있음에 따라 나타나는 문제점은 무엇일까?

<생활코딩 JavaScript 를 필기한 내용입니다.>

* 버전관리 시스템

: 의미있는 변화들

: 기능의 개선이나 버그 수정 등

: 이러한 변화를 관리하는 것


GIT 기본 명령어 

git init : 깃 초기화하기

git init 폴더명 :  해당 폴더명을 가지는 git저장소 생성

git status : 버전관리 중인 파일 상태 확인

git add 파일 : 해당파일을 버전관리 시작해라(처음 만든파일이나 수정한 파일)
    : 선택적으로 업로드할 수 있어 버전관리에 용이함.


* 처음 git을 시작할 떄에는 설정을 해야함

git config --global user.name 사용자이름

git config --global user.email 사용자이메일


git commit : 최상단에 현재 버전의 메시지를 담자

git commit -a : 전체 add해줌 (한번도 add하지 않은 파일은 안됨)

git commit -m : 바로 메세지를 쓸수있음

git log : 버전이 업로드 됬는지 확인

git log -p : 수정사항을 보여줌

git log [COMMIT_CODE] : 해당 내역을 보여줌

git diff [COMMIT_CODE]..[COMMIT_CODE] : 두 수정사항의 차이를 보여줌

git diff 현재 수정사항과 이전 버전과의 차이를 보여준다.


git reset [COMMIT_CODE] --hard : 해당 버전으로 돌아가고 그 이후에 버전은 삭제됨(사실 남아있는데 눈에 보이지 않음)

git revert :


Branch

: 작업이 필요에 의해 분기되는 것 (고객용, 내부용)

: 기존의 것이 필요없어지고 다른 방향으로 나갈때

: Test용과 Main 용으로 분리할 때


git branch : 현재 branch명을 출력

git branch 이름 : 이름에 해당하는 새로운 branch 생성 (생성당시 master의 log를 따름)

git checkout 이름 : 해당 branch로 이동

git log --branches --decorate : 모든 branch의 수정사항을 출력

git log --branches --decorate -- graph : 분기사항들을 보여줌

git log --branches --decorate -- graph --oneline : 한줄로 보여줌

git log [BRANCH이름]..[BRANCH이름] : 둘의 차이점을 보여줌

git log [BRANCH이름]..[BRANCH이름] -p : 차이점의 상세를 보여줌

git diff [BRANCH이름]..[BRANCH이름] : 둘의 차이점을 보여줌 (working directory와 index를 비교)


git merge 브런치이름 : 브런치의 내용을 현재 브런치로 가져옴(현재 설정된 브런치로 가져와지는것)


stash

: 감추다, 숨겨두다

: Branch를 가지고 작업할 때, 작업이 끝나지 않았을 때 다른 브런치에서 작업을 해야하는 순간 변경사항이 겹칠수있음.

: 현재의 작업을 숨겨둔다


git stash : 작업중인 변경사항들이 저장됨 (한번은 add됐던 파일만 저장(tracked되는 파일))

git stash apply : 불러움 (리스트에 있는 이상 여러번 가능)

git stash list : stash 리스트를 불러온다 (위에 있을수록 최신)

git stash drop : 최신 리스트 하나를 제거한다.

git stash pop : apply와 drop을 같이 실행한다


복구

: git reflog 를 사용해 복구할수있는 주소를 알 수 있다.

: git reset [COMMIT_CODE] --hard 을 통해 복구

: 아래는 각 옵션에 따른 취소 범위를 나타낸다

: working directory => 현재 작업중인내용

: index => add한 내용

: repository => commit한 내용

: 따라서 보통 hard를 많이 사용함


Merge&Conflict

: Branch를 Merge할때 같은 부분을 수정했을 경우 Conflict가 나타난다.

: kdiff3과 같은 병합 툴을 가지고 병합을 전문적으로 수행할 수 있다.(따로 설치해야함)

: git config --global merge.tool kdiff3  :  병합툴 설정

: git mergetool    :    툴확인


: git의 병합기법(3 way merge)

: Base에서 나, 다른사람이 Branch되어있을 때 나,다른사람만 고려하면 2 way merge방법이다.

: base, 나, 다른사람에서 Base를 기준으로 병합하게됨.

: 3 way merge가 더 높은 정확성을 지니게 된다.


원격저장소

: 소스를 백업한다.

: 다른 사람들과 협업을 한다.


git init --bare :     작업을 할 수 없고 저장소의 기능만 있는 저장소 생성

git remote :    원격저장소 출력

git remote add 원격저장소이름 URL:     원격저장소와 연결

git remote remove 저장소이름 경로 :     원격저장소와 연결을 끊음

git config --global push.default simple :     git의 push방식을 simple방식으로 변경

git push 저장소이름 브런치이름 :    원격저장소 해당 브런치에 push한다

git push --set-upstream 저장소이름 브런치이름 : 현재 브런치에서 push할 경우 자동으로 해당 저장소의 브런치로 push한다.


Github

: 원격저장소를 자신의 서버가 아니라 클라우드 서비스로 제공하는 곳 Github를 제외하고 다른 곳들도 있음

: 관리가 더 편함.

: 원격저장소의 필수가 아니라 서비스형 저장소일 뿐이다.

: 우리가 만들 수도 있다.

: Fork라는 기능을 사용하면 다른 사용자의 프로젝트를 그대로 내 폴더로 가져온다.

: Fork는 개발자의 평가 지표일정도로 멋있는 지수이다.


Http 방식

git clone URL 디렉토리 :    해당 URL의 소스코드를 새로운 디렉토리를 만들어 다운로드 한다.(.은 현대 디렉토리를 나타낸다.)

git remote add 저장소이름 URL : 보통 저장소이름은 origin으로 하는 것이 관례이다.

git push -u origin master : origin의 master 브런치에 업로드경로를 연결해둔다.

git push : 위의 설정이후 시작하면 자동으로 업로드 해준다.


* 동기화방법 : push 이후의 내용은 수정을 하기 힘들다

git pull : 원격저장소의 내용을 로컬저장소로 가져온다.

git push : 원격저장소로 내보낸다.


SSH 방식

1. ssh-keygen : 비밀번호를 만드는 명령어

: 기계적으로 굉장히 복잡하기 때문에 보안을 뚫기 힘들다

: 만들어지는 부산물

- id_rsa : private key // 클라이언트가 가지고 있어야함, 노출되면안됨

- id_rsa.pub : public key // 서버가 가지고 있어야함


2. SSH key를 Github에 설정하는 곳이 있는데 넣는다.

3. 

- git clone SSHURL : 접속하기

- 수정후 push할 때 성공이 된다면, 잘 된 것이다.


My Server

: ssh통신을 사용할 것이다.

1. 서버 컴퓨터에 git init --bare 방식으로 repository를 생성한다

2. 클라이언트에서 다음과 같은 예를 참고하여 한다.

git remote add origin ssh://git@13.124.42.13/home/git/git/remote/  <== 끝에 / 붙이기 : 연결할 저장소를 추가한다.

git remote -v : 추가가 잘 됐는지 확인한다.

git push --set-upstream origin master : push할 시에 자동으로 연결설정을 해둔다.


: 자주 push와 pull을 하여 서로 동기화를 하도록 한다.


자동로그인

: SSH 방식을 사용할 것이다

: 클라이언트에서 다음과 같이 실행한다.

ssh-keygen -t rsa : 키만들기

: 서버 쪽 컴퓨터에 1번 혹은 2번 방법을 실행한다.(둘중하나)

1. id_rsa.pub 파일을 ~/.ssh/authorized_keys 파일을 만들어 내용을 복사한다.

2. ssh-copy-id git@13.124.42.13    : 자동으로 복사해넘겨준다.


Tag

: 버전에 대한 태그를 달아주는 것

: Versioning 관련 문서

git tag : 태그 목록


light wegith tag : 가볍게 만드는 태그

git tag 버전명(ex 1.0.0) [Branch 혹은 CommitCode 혹은 Default는 현재Branch]

git checkout 태그명  :     해당 태그로 돌아갈 수 있음


annotated tag : 상세 태그

ex)  git tag -a 1.1.0 -m "bug fix"


git push --tags : 태그를 서버에 올릴때 사용

git tag -d 버전명 : 태그를 삭제


Rebase

: Merge와 비슷한 것

: 아직 몰라도 괜찮은 것같다. 나중에 찾아보자



Git을 이용한 프로젝트 흐름











<생활코딩 "지옥에서 온 Git" 필기내용입니다.>

생활코딩 강의

https://opentutorials.org/course/62/240


세션 만료

session_start();

session_cache_limiter("private"); 
ini_set("session.cookie_lifetime", 3600); 
ini_set("session.cache_expire", 3600); 
ini_set("session.gc_maxlifetime", 3600);



출처: http://unabated.tistory.com/entry/PHP-세션-만료-시간 [랄라라]

'프로그래밍 > Web개발' 카테고리의 다른 글

탬플릿 엔진  (0) 2017.04.04

: 데이터가 계속 늘어남에 따라 한대의 DBMS서버로는 처리능력의 한계가 옴.

: VLDE(Very Large DBMS)

: 샤딩(Sharding)

: DBMS 내용 분할(DB/테이블)

: 쓰기(Write) 성능 향상

: 복제(Replication)

: 동일한 DBMS를 여러개 유지(마스터/슬레이브)

: 읽기(Read) 성능 향상

* 스케일업

* 스케일 아웃


* NoSQL

: Not Only SQL

: 일반 RDBMS가 주로 읽기/검색 성능에 최적화

: 쓰기성능이 중요한 응용의 경우 좋은 성능을 보이는 경우가 많음

: 일련의 제품군을 일컫는 말

: RDBMS를 대체하기보다는 보완하는 역할

* CAP이론을 이용한 NoSQL 시스템 분류

: C(일관성:Consistency)

: 어떤 노드를 접근하더라도 데이터값이 동일해야 한다

: A(가용성:Availability)

: 노드 일부가 Fail되더라도 서비스가 중단이 안되어야 한다.

: P(파티션 내장 : Partition Tolerance)

: 노드간 통신에 장애가 생겨도 문제가 없어야 한다.

: 어떤 시스템도 3가지모두 만족할 수 없음.

: CA(일반 RDBMS)

: CP(Hbase, MongoDB, Redis)

: AP(Cassandra)

* 저장 형태에 따른 분류

: 키/벨류(Key/Value)

: JSON과 유사한 형태 (Redis)

: 정렬된 키/벨류(Ordered Key/Value)

: 키값으로 정렬되는 형태 ( Hadoop, Cassandra, HBase)

: 도큐먼트 형태(Document based)

: 벨류값이 JSON/XML 문서인 형태(MongoDB)

* 스키마리스 (Schemaless)

: 스키마(DDL) 기반이 아니라 필요하면 새로운 컬럼을 추가하면된다.

: 전체적으로 동일한 구조가 아닐수 있음.

: RDBMS - 정규형 데이터

: NoSQL - 반(semi)정규형 데이터

: 검색엔진 - 비정규형(Plain Text) 데이터


'프로그래밍 > RDBMS - MySQL' 카테고리의 다른 글

저장 프로시저(Stored Procedure) / 트리거(Trigger)  (0) 2017.03.29
Transaction/Lock/Isolation  (0) 2017.03.29
Bulk Insert  (0) 2017.03.29
Full Text Search  (0) 2017.03.29
데이터베이스 백업/파티셔닝/샤딩  (0) 2017.03.29

저장 프로시저

: SQL을 함수형태로 저장하고 사용하는 방법 (RETURN 이 있으면 함수고 없으면 프로시져)

CREATE PROCEDURE 프로시저명(인자 인자형,...)
BEGIN
     SQL 문장들
END

 저장 프로시저 정의

 CALL 프로시저명

 저장프로시저 호출

 DROP PROCEDURE 프로시저명;

 저장 프로시저 삭제


저장 함수

: SQL을 함수형태로 저장하고 사용하는 방법(RETURN 이 있으면 함수고 없으면 프로시져)

CREATE FUNCTION 함수명(인자 인자형,...) RETURNS 타입
BEGIN
     SQL문장들
END

함수정의 

함수명(인자) 

함수호출 

DROP FUNCTION 프로시져명 

함수 삭제 


EX)

DELIMITER //
CREATE FUNCTION CountLines() RETURNS INTEGER
BEGIN
    DECLARE LINE_COUNT INTEGER;        // 변수선언
    SELECT COUNT(*) INTO LINE_COUNT FROM 테이블;
    RETURN LINE_COUNT;
END
//

DELIMITER;

CountLine()


* 트리거

: 특정 조건이 되면 자동으로 호출(Callback)되는 저장 프로시져

: 레코드가 삭제되면 자동으로 참조무결성을 체크하는 트리거


CREATE TRIGGER 트리거명 BEFORE(또는 AFTER) CRUD선택 ON 테이블명
     FOR EACH ROW
BEGIN
     변경 전 (OLD.칼럼명) 또는 변경후(NEW.칼럼명)을 이용한처리
END 

트리거 정의 

 DROP PROCEDURE 트리거명

저장프로시저 삭제 

EX)

DELIMITER $
CREATE TRIGGER 함수명 AFTER INSERT ON 테이블명
    FOR EACH ROW
BEGIN
    INSERT INTO 테이블명 VALUES (값,값...);
END$
DELIMITER;




'프로그래밍 > RDBMS - MySQL' 카테고리의 다른 글

대형 데이터베이스 구축/NoSQL  (0) 2017.03.29
Transaction/Lock/Isolation  (0) 2017.03.29
Bulk Insert  (0) 2017.03.29
Full Text Search  (0) 2017.03.29
데이터베이스 백업/파티셔닝/샤딩  (0) 2017.03.29

+ Recent posts