URI와 URL 차이점

URI(Uniform Resource Identifier)URL(Uniform Resource Locator)URN(Uniform Resource Name)을 포함하는 개념이다.

URL은 실제의 네트워크 경로를 가리키며, 네트워크 상의 리소스 접근기에 사용된다. URL의 첫 번째 부분은 다음과 같은 프로토콜을 명시하는데, http, ftp 등이 있다. URL프로토콜 부분을 scheme이라고 한다. Scheme 뒤에는 콜론(:)이 따라오며 그 뒤에 식별된 자원의 경로가 나타난다.

 

 http://www.xmlgo.net/document/editor/editor.html

URLwww.xmlgo.net이라는 이름의 인터넷 상에 있는 서버로 부터 /document/editor/editor.html이라는 파일을 검색하기 위한 경로(PATH)이다. 파일 editor.html/document/editor라는 디렉토리에 있으며, HTTP 프로토콜에 의해 검색되어야 한다.

URN은 자원에 대하여 영속적(persistent)이고 유일하다. 위치에 독립적인 이름을 제공하기 위하여 존재한다. 이것은 RFC 2141 (http://www.ietf.org/rfc/rfc2141.txt) 에 정의되어 있다. iURN은 문자열 “urn” 혹은 “URN”, NID(Namespace Identifier), 그리고 NSS(Namespace Specific String)로 구성되어 있으며 각 구성 엘리먼트 간에 콜론(:)을 위치시킨다. NIDURN의 형태를 나타내는데, 예를 들어 차후 XMLgo.net에서 ebXML문서의 형태로 각 회사의 정보를 기억해 두는 저장소를 URN으로 가리키고, NSS는 유일하고 영속적이어야 하며, 여기서는 registry1이라고 칭하였다.

 urn:xmlgo:registry1

좀 더 현실적인 예를 들어 본다면

한국인을 위한 URN을 만들기 위하여 한국시민 이라고 선언할 수 있다. NSS로는 유일한 번호, 주민등록번호를 표현하도록 한다면 000000-0000000이 된다.

 urn:한국시민:000000-0000000

 지금까지의 내용을 종합해 보면, Namespace를 지정할 때 URI로 지정한다. URI로는 현재 널리 사용하는 웹주소, URL방식과 URN방식이 포함되어 있다. 일반적으로 URL을 많이 사용하나 URN도 널리 사용 될 것이다. URL에서는 도메인 주소와 거기에 위치한 물리적인 경로가 자원을 찾기 위한 중요한 정보가 되지만, URN은 자원에 부여된 고유한 이름으로 그 자원의 위치와는 무관하게 부여된 이름이다.

이를 구체적으로 예를 들면 , 인천 광역시 남구 용현동에 인하대학교가 있지만, 인하대학교는 새로운 부지로 이사를 갈 수도 있을 것이다. 인하대학교가 어디에 있는지는 URL(주소)로 표현 할 수 있지만, 인하대학교가 다른 곳으로 가더라도 URN을 가지고 그 리소스(인하대학교)을 식별할 수 있다. 이사를 가고 나서 인천광역시 남구 용현동의 인하대학교라는 기존의 주소를 가지고는 인하대학교를 찾을 수 없다. 하지만 인하대학교란 고유한 이름은 변함이 없을 것이다.

출처 http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10801&docId=72559987&qb=dXJsIHVyaSDssKjsnbTsoJA=&enc=utf8&section=kin&rank=1&search_sort=0&spq=1&pid=SLoJSdpySENssaogb8osssssssZ-174331&sid=VNo6WgpyVooAAB1CGLs

RESTful

 

RESTful 웹서비스
작성자 : 김문규

rest-api

인터넷 업계는 OpenAPI의 열풍이 불고 있다. 너도나도 OpenAPI를 공개하고 있고 사용자들에게 다양한 방식의 사용을 기대하고 있다. 최근 이 OpenAPI와 함께 거론되는 기술을 당연 REST이다. 구글, 아마존, 네이버 모두가 OpenAPI를 REST 방식으로 지원한다. (물론 기존의 SOAP 방식도 지원한다.)
그렇다면 REST란 과연 어떤것일까? W3C 표준이 아님에도 불구하고 업계의 사랑을 받는 이유는 무엇일까? 이 궁금증을 풀기위해 본 포스트를 작성하고자 한다.

1) 정의
REST는 ROA를 따르는 웹 서비스 디자인 표준이다.
 – ROA : Resource Oriented Architecture

2) 주요 특징
+ REST 방식의 웹서비스는 잘 정의된 Cool URI로 리소스를 표현한다.
무분별한 파라미터의 남발이 아니라, 마치 오브젝트의 멤버변수를 따라가듯이~
예를 들면 아래와 같다.
http://www.iamcorean.net/user/mk/age/32
기존의 서블릿을 이용한 URI는 대부분 이랬다.
http://www.iamcorean.net/finduser.jsp?user=mk&age=32
차이가 보이는가?

+ REST 방식의 웹서비스는 세션을 쓰지 않는다는 거다.
기존의 서블릿 개발에서는 세션을 이용해서 인증 정보들을 가지고 다닌다. 개발자의 개념(?)에 따라서는 파라미터까지 마구마구 집어넣어서 사용하기도 한다. 이 때문에 요청 처리가 너무너무 무거워진다.
또한 요청간의 전후 관련성이 생기기 때문에 한 세션의 일련의 요청은 무조건 하나의 서버가 처리해야 한다. 그래서 로드발란싱을 위해 고가의 로드발란싱 서버가 필요하게 된다.
하지만 REST는 세션을 사용하지 않기 때문에 각각의 요청을 완벽하게 독립적이다. 따라서 각각의 요청은 이전 요청과는 무관하게 어떠한 서버라도 처리할 수 있게 된다. 즉! 로드발란싱이 간단해 질 것이라는 것이 느낌이 오는가? (물론 인증 관련해서는 복잡한 문제가 생긴다.)

3) ROA의 정의
+ ROA는
– 웹의 모든 리소스를 URI로 표현하고
– 모든 리소스를 구조적이고 유기적으로 연결하여
– 비 상태 지향적인 방법으로
– 정해진 method만을 사용하여 리소스를 사용하는
아키텍쳐 이다.

+ 이는 4가지의 고유한 속성과 연관되어 진다.
– Addressablilty
– Connectedness
– Statelessness
– 
Homogeneous Interface

+ 여기서 잠깐! 정리하자면 REST란 위에 언급한 4가지 속성을 지향하는 웹서비스 디자인 표준이다.

4) RESTful 웹 서비스 속성 (ROA 속성)
+ Addressablilty (주소로 표현 가능함)
 – 제공하는 모든 정보를 URI로 표시할 수 있어야 한다.
– 직접 URI로 접근할 수 없고 HyperLink를 따라서만 해당 리소스에 접근할 수 있다면 이는 RESTful하지 않은 웹서비스이다.
– 예를 들면, GMail은 모든 메일 리소스는 하나의 URI와 연결되어 있다. (http://mail.google.com/mail/?hl=ko#sent/1036854d04d6de9e) 하지만 코리아닷컴의 경우에는 http://mbox07.korea.com/mail/mailView.crd 라는 주소에 접근한 후에 페이지에 표시된 메일의 링크를 통해서만 접근이 가능하다. (특정 회사를 지칭해서 유감입니다. 관계자 분들은 이해 부탁드립니다.) 둘 간의 차이가 이해가 되십니까?

+ Connectedness (연결됨)
 – 일반 웹 페이지처럼 하나의 리소스들은 서로 주변의 연관 리소스들과 연결되어 표현(Presentation)되어야 한다.
– 예를 들면,
<user>
<name>MK</name>
</user> 는 연결되지 않은 독립적인 리소스이다.
<user>
<name>MK</name>
<home>MK/home/</home>
<office>MK/office</office>
</user> 는 관련 리소스(home, office)가 잘 연결된 리소스의 표현이다.

+ Statelessness (상태 없음)
 – 현재 클라이언트의 상태를 절대로 서버에서 관리하지 않아야 한다.
– 모든 요청은 일회성의 성격을 가지며 이전의 요청에 영향을 받지 말아야 한다.
– 다시 또 코리아닷컴의 예를 들면 메일을 확인하기 위해 꼭 ‘..코리아닷컴../mailView.crd’에 접근하여 해당 세션을 유지한 상태에서 메일 리소스에 접근해야 한다. 이것이 바로 Statelessness가 없는 예이다.
– 세션을 유지 하지 않기 때문에 서버 로드 발란싱이 매우 유리하다.
– URI에 현재 state를 표현할 수 있어야 한다. (권장사항)

+ Homogeneous Interface (동일한 인터페이스)
– HTTP에서 제공하는 기본적인 4가지의 method와 추가적인 2가지의 method를 이용해서 리소스의 모든 동작을 정의한다.
– 리소스 조회 : GET
– 새로운 리소스 생성 : PUT, POST (새로운 리소스의 URI를 생성하는 주체가 서버이면 POST를 사용)
– 존재하는 리소스 변경 : PUT
– 존재하는 리소스 삭제 : DELETE
– 존재하는 리소스 메타데이터 보기 : HEAD
– 존재하는 리소스의 지원 method 체크 : OPTION
– 대부분의 리소스 조작은 위의 method를 이용하여 대부분 처리 가능하다. 만일 이것들로만 절대로 불가능한 액션이 필요할 경우에는 POST를 이용하여 추가 액션을 정의할 수 있다. (되도록 지양하자)

5) 정리
REST는 . 웹의 모든 리소스를 URI로 표현하고 . 이를 구조적이고 유기적으로 연결하여 . 비 상태 지향적인 방법으로 . 일관된 method를 사용하여 리소스를 사용하는 웹 서비스 디자인 표준이다.

6) SOAP과 비교 

 

SOAP은 SOAP메세지를 이용하여 특정한 서비스를 요청한다. SOAP 메세지를 사용해야 하기 때문에 무겁다고 말하고 서비스를 요청하기 때문에 SOA와 가깝다.
REST는 URI를 이용해서 리소스를 요청한다. URI를 사용하기 때문에 가볍다고 말하고 리소스를 요청하기 때문에 ROA와 가깝다.
SOA와 ROA에 대한 관점은 시각에 따라 다를 수 있지만 극명하게 대조하기 위해서는 위와 같이 차이점을 이해하는 것이 가장 좋다고 생각된다.

7) 맺음말
최대한 쉽게 작성하고자 했지만 여전히 MK 본인에게도 설명하기 어려운 것은 사실이다. 하지만 중요한 것은 REST는 아키텍쳐가 아니라는 사실이다. ROA라는 아키텍쳐를 반영한 디자인 철학이다. ROA의 4가지 중요한 속성을 잘 이해한 후 이를 가슴에 깊이 새기고 이를 어기지 않고 웹 서비스를 디자인하면 이것이 바로 RESTful 한 웹 서비스가 될 것이라는 것이다.
 다음 포스트에서는 REST 구현체들에 대해 생각해 볼 예정이다. .net, java, ruby on rails에서 각각의 접근 방식에 대해서 좀 더 구체적으로 알아보도록 하자.

출처 http://www.iamcorean.net/22

Hypervisor/Full-Virtualization, Para-Virtualization

VMware가 hypervisor의 일종

프로세서나 메모리와 같은 다양한 컴퓨터 자원에 서로 다른 각종 운영 체계의 접근 방법을 통제하는 얇은 계층의 소프트웨어.

다수의 OS를 하나의 컴퓨터 시스템에서 가동할 수 있게 하는 소프트웨어

CPU와 OS사이에 일종의 중간 웨어

하나의 컴퓨터에서 서로 다른 OS를 사용하는 가상 컴퓨터를 만들 수 있는 효과적인 가상화 엔진.

네이버 IT용어사전

golang, erlang

둘다 차세대 언어

golang은 구글 드림팀에 의해 개발된 언어.

golang은 구글 엔터프라이즈 앱 엔진에 탑재될 정도로 구글의 메인 언어.

erlang은 Ericsoon(http://www.ericsson.com/)에서 만든 언어

병행성 분야에서는 주류언어에 속한다. CouchDB, SimpleDB, Riak 등 NoSQL DB에서 맵리듀스의 구현 혹은 DBMS의 전체 구현을 위해 많이 사용되며, 채팅과 메시징, WhatsApp서버, 리그오브레전드 서버, 금융시스템, 게임서버[11]와 같은 분야에 이용된다. 이 중 WhatsApp의 사용 사례가 유명한데, 12코어(24 논리코어) 프로세서, 100GB 메모리의 하드웨어로 실 서비스에서 서버당 200만건 이상의 연결을 받고 있다.

Ericsson은 스웨덴 무선통신 전문 업체

 

주된 차이

Erlang Golang
언어의 분류 함수형 절차형
동적 형(dialyzer에 의한 형 검사 있음) 정적 형
변수 immutable mutable
예외에 관한 사상 Let it crash Defensive Programming
병행 처리 모델 Message Passing
(Actor Model)
Message Passing
(CSP/π caluculus)

각각의 프로세스 차이

Erlang Golang
워커 쓰레드 수 default로 CPU 코어 개수 default로 1
(기본적으로는 CPU 코어 개수로 지정)
초기 스택 309 words
(1words≒ 64bit)
8k bytes
프로세스 간 메모리 공유 없음 있다(global변수)
프로세스 수 상한 디폴트 32768
최대 268435456
몇 10만 가능
프로세스 실행 워커 스레드와 바인드 하지 않는다
(고정하는 것도 가능)
워커 스레드와 바인드 하지 않는다

 

※ 프로세스(Erlang Process/goroutine  )

병행 처리 모델의 차이

이 부분을 쓰는데 arild씨의 슬라이드를 참고하였다. 그림이 매우 알기 쉬우므로 이쪽도 참조해 주길 바란다.

Erlang: Actor model

Process(Actor)가 Mailbox를 1개 가진다

통신은 어느 Process로 보낼지 명확

블록

수신 측: Mailbox가 빈 경우 블록

송신 측: 블록 하지 않는다

Golang: CSP (Communication Sequential Processes)

Channel을 공유하고 통신을 한다

Channel과 Process는 다 vs다 관계(어떤 프로세스가 받을지 모른다.)

블록

송신 측과 수신 측이 갖추어지지 않으면 안 된다

※Golang은 Channel사이즈를 지정할 수 있기 때문에 사이즈>0의 경우는 Channel이 비거나/다 찬 경우에만 차단

스케쥴러

대량으로 Process를 실행하는 경우 어떻게 실행되느냐에 차이가 있다.
Erlang
  모든 Process를 균등하게 실행하려고 한다.
Golang
  일정 시간까지는 1개(코어 수 만큼)의 Process를 실행한다(ver1.2까지는 Process가 sleep/종료까지 계속 실행하였다)

프로세스 관리 방법

Erlang

프로세스 트리를 구성한다

Golang

관리하지 않는다

결과를 기다리는 쪽에서 데몬화를 막는다

예외 처리

Erlang

기본적인 예외 처리

예외를 catch 하지 않고 프로세스 자체를 크래시 시킨다

수퍼바이저(관리 프로세스)가 프로세스의 비정상 종료를 검지

재 기동 전략에 따라 프로세스를 다시 실행한다

재 기동

개요
one_for_one 떨어진 프로세스만 재 기동한다
one_for_all 모든 자식 프로세스를 재 시작 한다
rest_for_one 자식 프로세스에 의존 관계가 있는 경우에 사용한다
simple_one_for_one 자식 프로세스를 동적으로 기동하고 싶은 경우에 사용한다

 

이 부분은 learn you some Erlang 에 자세히 

Golang

함수의 반환 값으로 error가 어떤지 반환한다.

에러 처리를 써 주게 되어 있다

  모든 변수는 unused로 컴파일 시에 에러가 나온다(공백 변수/재 대입하면 처리를 깜박해도 오류가 나지 않지만……)

code1

보충 1: panic/recover의 용도

recover를 표준 라이브러리 내에서 사용하고 있는 것에 대해 ruiu 씨가 이 글에 적고 있다

  깊은 네이스트에서 최고 레벨 함수로 한꺼번에 돌아온다

  런타임 오류를 catch하고 함수의 반환 값으로 되돌려준다

  프로세스 전체가 떨어지지 않게 하기 위해

요악하면 위 3가지 용도로 사용되고 있다.

code2

보충 2: goroutine 내에서 panic

  panic이 발생하면 모든 프로세스를 종료한다

  goroutine내 panic는 다른 process에서는 처리할 수 없다

 

정리

Erlang/Golang을 어떤 때 선택하면 좋은가에 대해 개인적인 생각을 정리.

Erlang

 Process가 독립하고 있는 경우(Read/Write가 같은 I/F에 못할 경우 등)

 분산 프로그램이 되는 경우(이번에는 언급하고 있지 않지만……)

 Process를 대량으로 동시에 실행하는 경우(echo Server)

 Process를 떨어뜨리고 싶지 않은 경우

Golang

 복수의 Process가 1개의 Queue를 공유하고 싶은 경우 

 문자열 처리/계산을 다루는 경우

Process가 떨어지더라도 그 Process를 재 기동할 필요가 없는 경우

참고 http://jacking.tistory.com/1283

 

MeetUp

Meetup is the world’s largest network of local groups. Meetup makes it easy for anyone to organize a local group or find one of the thousands already meeting up face-to-face. More than 9,000 groups get together in local communities each day, each one with the goal of improving themselves or their communities.

Meetup’s mission is to revitalize local community and help people around the world self-organize. Meetup believes that people can change their personal world, or the whole world, by organizing themselves into groups that are powerful enough to make a difference.

클럽, 동아리와 같은 local groups들을 쉽게 접하게 해주는 사이트.

쉽게 organize할 수 있으며 참여또한 쉽다.

  • Members
    20.65 million
  • Meetup Groups
    190,433
  • Countries
    183
  • Monthly
    Meetups
    495,106
  • Monthly
    RSVPs
    3.53 million

 

Redis

1. Redis란? 

  • Remote Dictionary System 약자
  • 메모리 기반의 Key / Value Store
  • 메모리에 저장된 내용을 지속시키기 위해 파일을 동기화하는 기능 제공

2. Redis 특징

  • 메모리 기반이기 떄문에 휘발성, 전원이 꺼지면 모든 데이터가 사라짐
    • 파일에 메모리상의 데이터를 저장해두고 redis 서버의 실행 시 다시 그 파일에서 데이터를 읽어와 메모리상에 올리는 방법이용
    • 데이터 크기가 메모리에 제한 되므로 메모리 크기 이상의 데이터를 저장하기 위해서 redis Cluster를 추가해야함
    • MySQL보다 10대 빠르다고함

  • Redis는 2가지의 RDB와 AOF의 지속성을 제공
    • 두가지 지속성중에 1개만 선택하는 것이 아닌 두가지 모두 사용 가능
    • 두가지 지속성 모두 사용하도록 설정한 상태에서 Redis-server를 실행하면 AOF를 이용, 메모리에 데이터를 올림

 

3. Redis 데이터 타입

  • String
    • Max 512MB의 문자 저장 가능, 문자 뿐만 아니라 이진 데이터도 저장 가능
  • Lists
    • Redis의 Lists는 String형의 Lists, LPUSH와 RPUSH로 나뉨 (후입선출,선입선출)
  • Sets
    • 순서를 보장하지 않는 String Collection(테이블),한 Key에 중복된 데이터 존재 불가
  • Hashes
    • String Field와 String Values 사이의 맵 , 객체를 나타내는데 사용 가능한 데이터형
  • Sorted sets
    • Sets와 유사하고, 비반복 String Collection,Score 순서를 보장해주는 Collection

      [출처] Redis 개요|작성자 군고구마

       

참고 http://blog.naver.com/fltltmxjs/80195023188

http://blog.naver.com/waws01/60196621306

http://www.redis.io/

웹 개발

boot strap(홈페이지 이쁘게 꾸며줌)

222

222

워드프레스(WordPress) PHP언어로 구성

거대한 플랫폼의 효과 
 20140530_133614

워드프레스는 HTML에 대한 지식 없이도 워드프레스에서 제공하는 매뉴얼만 익히면 쉽게 홈페이지를 구축하실 수 있습니다. 키워드 검색은 블로그에서도 가능한데 굳이 홈페이지 구축을 해야하냐고 생각하실 수 있지만 워드프레스는 ‘플러그인’으로 회원가입, 소셜 연동, 이벤트, 갤러리, 방문자 통계, 게시판 등 다양한 홈페이지 테마를 제공 받을 수 있습니다. 광고를 해야할 때 드는 추가적 비용과 과정 없이 구글 등 전세계의 검색엔진에 자동으로 노출됩니다. 

 

매뉴얼과 초기 홈페이지 설치하는데 드는 시간을 제외하고 블로그 운영에서 광고에 드는 시간 비용 등을 비교한다면 워드프레스가 절약˙단축된 자원으로 큰 효과를 볼 수 있습니다.

실제로 하버드 대학, 내셔널 지오그래피의 홈페이지는 워드프레스로 만들었으며, 현재 우리나라의 S사와 L사 역시 워드프레스로 홈페이지를 구축했습니다.

약간의 시간 투자로 얻을 수 있는 다른 장점들을 생각하면 워드프레스를 무시할 수 없는 것 같습니다.

참고 http://blog.naver.com/avivad/220015329131

Prezi

화려한 프레젠테이션 프로그램

처음 봤을 때 거의 신세계였다..

하지만 좋은 기술이라고 막 쓰면 안됨.

아직 우리나라애서 일하시는 연배가 좀 되시는 분들은 아직 Power Point가 익숙하다.

그 분들이 대기업, 나라를 이끄시는 분들이고 우리가 그 분들에게 맞춰야 하는 입장이다.

너무 나대면 안됨.

Docker

(잘 이해 안되지만.. 가장 설명이 잘 되있다.)

docker 란 무엇인가

사설이 길었네요. 이제부터가 본론입니다. 제가 오늘 소개할 녀석은 클라우드 컴퓨팅에 있어 “자르는” 축을 담당하는 가상화의 떠오르는 아이돌, LXC를 사용한 docker 입니다. LXC가 무엇인지는 여기서 중요하지 않습니다#2. 그냥 업계의 떠오르는 아이돌 정도로 해 둡시다. 그러니까 아이유 같은 존재죠.

docker가 등장한 배경을 설명하자면 이렇습니다. Heroku와 함께 PaaS계에서 끗발을 날렸던 dotCloud는 어느 날 갑자기 충격적인 발표를 합니다. 자기네들이 쓰는 가상화 및 애플리케이션 플랫폼을 공개해 ‘오픈 소스로’ 제공하겠다는 것이죠. 아니, 이럴 수가! 이러시면… 이러시면 정말 감사합니다#3!

docker의 가장 큰 특징은 다음과 같이 요약할 수 있습니다.

image 관리의 간편화와 container 관리 간편화

어떤 서비스를 돌리기 위해서는 필요한 서버들이 있습니다. 데이터베이스 서버, 웹 서버, 캐시 서버, 워커 서버 따위의 것들이죠. 이 모든 걸 한 군데로 퉁쳐서 모을 수도 있겠지만 그렇게 되면 데이터베이스, 웹, 캐시, 비동기 업무를 위한 설정과 프로그램들을 한 군데로 모아 관리해야 합니다. 그렇게 되면 설정이 복잡해지거나 애플리케이션이 거대해지거나 필요할 때 횡적인 확장을 하기가 어려워집니다.

예를 들어 웹서버에서는 A라는 라이브러리의 1버전을 필요로 하는데 데이터베이스 서버에서는 2버전을 필요로 한다던지, 이벤트 하느라 접속자가 너무 증가했는데 다른 웹서버가 한시간 정도만 필요한 일을 그럴 수 없어서 서버를 통째로 하나 사야 한다던지 하는 일들이죠. docker는 그런 상황에 유연하게 대응하기 위해 서버 설정과 필요한 프로그램들을 따로 관리할 수 있는 환경을 제공합니다.

docker는 이렇게 분리된 환경을 image라고 부르며, 이 image를 기반으로 여러 개의 container를 생성할 수 있습니다. 음… 이렇게 이해하시면 편할 것 같습니다. image는 유전자 설계도고, container는 그 유전자 지도에서 만들어진 생물체라고나 할까?

즉, 이 설계도를 관리하면 필요할 때 목적에 적합하게 만들어진 생물체를 얼마든지 만들어낼 수 있게 되죠. 필요할 때는 설계도의 설계를 바꿔서 새로운 생물체를 만들어낼 수도 있습니다. 단순하지만 docker의 가장 커다란 컨셉이고 강력하기까지 합니다. 이렇게 단순하고 간편한 환경은 여러 가지 시도를 가능하게 합니다.

  • 오토스케일링(웹서버가 필요할 때 웹서버를 막 찍어낸다던가!)
  • 유연한 배포 정책(서버를 최신 버전으로 업데이트했는데 버그가 있어서 재빨리 옛날 버전으로 돌아가야 한다던가!)
  • 자원의 효율적인 활용(이 쪽 서버가 놀고 있으니까 여긴 웹서버 두개 정도 더 띄운다던지)

거기다 수고를 좀 더 들이면, docker의 API를 활용해 Heroku 부럽지 않은 웹 GUI PaaS 서비스를 만들 수 있을지도 모릅니다(만들어 주시면 감사히 쓰겠습니다).

참고 https://spoqa.github.io/2013/11/22/docker-the-cloud.html

node.js

node.js는 2009년 라이언 달(RyanDahl)이 개발한 서버개발 환경이며 대규모 네트워크 애플리케이션을 개발하고자 만들어졌음.

 

아래 영상은 개발자 라이언 달(RyanDahl)의 Node.js에 대한 소개 영상입니다.

 

 

1. 기존의 네트워크 프로그래밍과 Node.js의 차이점

 

1) 기존의 네트워크 프로그래밍은 스레드 기반의 동기방식

처리량이 많아지면 스레드를 늘려서 동시에 일처리 하기 때문에 많은 양의 일을 처리에 대한 좋은 해결방법이지만 스레드를 여러 개 만들어 동시에 처리해야하기 때문에 메모리리 사용량이 많다.

 

2)  Node.js는 이벤트 기반의 비동기 방식 (Single thread / Event loop)

스레드는 한개만 생성하며 이벤트 사용으로써 빠른 일처리를 합니다. 처리량이 많더라도 스레드가 한개이기 때문에 메모리 사용량과 같은 시스템 리소스 사용량에는 거의 변화가 없다.

 

 

2. Node.js의 장단점

 

1) 장점

 

– 웹개발자들 대부분이 사용할 수 있는 자바스크립트 언어기반으로 기존 웹 개발자들의 접근이 용이하다.

– Google에서 V8 자바스크립트 엔진의 속도를 지속적으로 향상시키고 있는만큼 V8엔진을 사용하는 Node.js의 속도도 계속 향상 될 것.

– C++을 사용하여 기능확장이 용이하다.

 

 

2) 단점

 

– V8 자바스크립트 엔진이 아무리 빨라도 C언어 또는 C++ 언어로 개발된 서버보다는 느리다.

– 1.0 버전 조차 공개되지 못한 신생 개발환경이다. (포스팅 기준 – 버전 0.8.15)

– 많은 개발자들이 동기처리 방식에 익숙해 져있기때문에 비동기 처리 하려면 무엇을 바꿔야 할지에 대한 혼란이 올 수 있다.

– 동기 처리구조의 코드는 일 처리의 순서대로 적은 코드 이기 때문에 직관적이지만 비동기 처리구조의 코드는 결과처리에 대한 코드가

언제 호출 될지 알 수 없다.

1. node.js 는 무엇인가

node.js 크롬에 내장된 javascript 런타임으로서 쉽고 확장가능한 네트웍 어플리케이션을

만들 수 있고 무엇보다도 중요한 것은 블로킹(request/response 사이에 대기)되지 않는

I/O모델이다

 

예를 들면 어떤 목적으로 수많은 웹페이지를 긁어 올 때  어떤 사이트에 요청을 날리고

응답이 올때까지 기다려야 한다면, 각 사이트의 응답속도가 다르기 때문에 엄청난 시간적

손실이 발생하지만 nodejs는 요청만 날리고 계속해서 사이트에 또 요청을 보내기만 한다.

그럼 응답은?  nodejs는 응답이 도착하면  그때이벤트(Event)를 날려 주어 필요한 처리를

그때 처리하면 된다. 마치 여타 OS의 비동기 Message / Event 방식과 동일하다.

 

웹서버 처럼 많은 수많은 정보를 처리하지 않는 API Call 같은 간단한 통신에 적합하며

또한 수많은 장치(Device)로 부터의 요청을 처리할 때  효과적이다.

http://www.zdnet.com/how-replacing-java-with-javascript-is-paying-off-for-paypal-7000023697/

Paypal이 Java를 버리고, node.js로 서버를 변경했다고 합니다. 기사에 링크된 페이팔 블로그 링크에 옮겨간 이유가 나옵니다. 여러 이유가 있겠지만, 서버에서 프론트까지 같은 언어로 커뮤니케이션하는 것이 좋다고 판단했다는 이유가 눈에 띕니다.

“It unifies our engineering specialties into one team which allows us to understand and react to our users’ needs at any level in the technology stack.”

from: https://www.paypal-engineering.com/2013/11/22/node-js-at-paypal/

오래 전부터 프로토타이핑을 해왔고, 올해부터 서비스에 적용했다고 합니다. 웹 애플리케이션 프레임워크로 express를 쓰고, Grunt 작업 실행기와 설정을 위해서 nconf를 사용했다고 zdnet이 전합니다.

왜 Node 인가?

 

이벤트 중심인 Node.js 또는 Node는 프로그래머가 Evetned, non-blocking I/O 주도 접근법을 사용하여 웹 어플리케이선의 코드를 작성할 수 있게 해준다.  Node는 구글의 엄청나게 빠른 V8 자바스크립트 엔진을 기반으로 만들어졌다. 이 자바스크립트 엔진은 매우 빠른 동적 프로퍼티 접근머신코드의 동적 생성고효율 가비지 컬렉션으로 잘 알려져 있다.  이 자바스크립트 엔진은 Node.js가 끔찍하게 빠른 속도로 실행될수 있게 한다. 그러므로, Node는 비동기 입출력을 수행하는데 정말로 빠르다(네트워크, 서버의 하드디스크, 데이터베이스 입출력이나 파일 업로드하는 경우)

 

Node가 매우 빠르고, non-blocking 입출력을 제공한다는 것 외에도, Node는 싱글 쓰레드 / 이벤트 루프에 기반들 둔다. 그리고 그것은 Node.js의 장점이 되는 또다른 주요한 요소이다.
Node.js에서 Single thread / Event loop는 무엇을 의미하는가?
가장 잘 알려진 웹 서버인 아파치와 NGINX가 동시 접속을 어떻게 처리하는지 이해해보자.
아래에 두 웹서버를 비교하는 벤치마크가 있다.
*Note: 위의 벤치마크는 실제 상황의 예제가 아니다. 로컬호스트에서 스태틱 파일을 다룬 결과이다.
위의 벤치마크는 실제 상황과 같지는 않지만 두 서버의 성능 통계를 잘 보여준다. 아파치와 NGINX 초당 매우 많은 수의 요청을 처리할 수 있는 것처럼 보이지만, 동시 요청의 수가 증가함에 따라, NGINX에 비해 아파치의 성능이 크게 떨어지는 것을 볼수 있다.  그리고 NGINX는 여전히 동시 접속수가 증가할때에도 성능의 저하가 없이 거의 같은 속도를 유지한다.
같은 벤치마크에 대해서, 두 서버의 메모리 사용에 관한 관점에서 본 그래프를 살펴보자.
*Note: 위의 벤치마크는 실제 상황의 예제가 아니다. 로컬호스트에서 스태틱 파일을 다룬 결과이다.
위 그래프는 증가하는 동시 요청수에 대한 두 서버의 메모리 사용을 나타낸다. 두 서버 모두 많은 수의 동시 접속을 처리할 수 있지만 서버의 자원, 즉 메모리 사용에는 눈에 띄는 큰 차이가 있다. 그래프를 보면 아파치가 NGINX보다 같은 동시 요청 수에 대해 훨씬 더 많은 양의 메모리를 사용한다는 것은 분명하다. NGINX는 동시 요청을 매우 효율적인 이벤트 루프 – 싱글 쓰레드 방식으로 처리한다. 반면에 아파치는 복수 개의 쓰레드를 (각 접속 당 하나) 쏟아낸다. 이 쓰레드들이 많은 양의 메모리를 사용하고, 그 결과 서버에 많은 수의 동시 요청이 발생할 경우 아파치는 정말 비효율적이게 된다. NGINX는 접속 당 새로운 쓰레드를 실행하는 대신에 이벤트 루프를 사용함으로써 매우 안정적으로 유지된다.
Context swithcing은 쉽지가 않았다, 실제 상황에서 테스트 했을 때, 두 서버 모두 자원을 사용하고 증가 된 응답 시간을 보였다. 그러므로, 대규모 동시성에 대해서는, 새로운 쓰레드들을 운영체제에 쏟아낼 수가 없다. 이를 처리하기 위해서, 싱글 쓰레드 실행에 기반을 둔 Node는 서버에 만들어지는 모든 새로운 리퀘스트를 처리하기 위해 복수개의 쓰레드를 실행하는 대신에 이벤트 루프를 사용한다. 그리고 이것은 context switching에서 어떤 자원도 낭비하지 않음으로써 Node.js를 매우 강력하게 만든다. 따라서, Node.js는 대규모 동시성을 처리할 때나 가장 저 레벨 베이스를 제공할 때 매우 효율적이기 때문에 그 결과 프로그래머들은 Node 위에서 스트림을 할 수 있고 데이터를 버퍼에 저장할 필요가 없다. 단지 이것만이 아니라, Node.js는 프로그래머가 이벤트 기반 알고리즘으로 코드를 짤수 있게 해준다. Node.js는 또한 개발자들이 코드와 업무를 병렬로 실행하는데 힘을 실어주며 non-blocking 입출력을 제공한다. 아키텍쳐적 이점들을 가지는것 외에도, Node(매우 빠른 구글의 V8 자바스크립 엔진 기반으로 만들어진)는 Node.js를 빛처럼 빠르게 만든다.
Why Node.js over Others available?
Node.js를 사용하기 전에 다른 방법들을 알아보고 왜 이벤트 기반 접근법이 오늘날 프로그래머들 사이에서 잘 알려지지 않았는지 알아보자. 이것에 관한 세가지 기본적인 이유가 있다.
  • 문화적 선입견 : 첫 번째 이유는 non-blocking 입출력을 사용하는 것에 대한 문화적 선입견이다. 어느 언어를 배우든지 맨 처음으로 짜보는 프로그램은 다음과 같다.
    1
    2

    3
    4

    5
    6
    7
    //문자열 출력
    puts("Please Enter Your Green Name");

    //입력을 받기 위해 대기
    var green_name=gets();

    //문자열 출력
    puts("Your Green Name is: "+green_name);

    위의 코드는 입력 요구 알고리즘을 기반으로 한다. 코드를 짜는 이런 접근법은 코드를 막아(blocking)버린다. 위의 코드에서 사용자는 ‘green name’을 입력하도록 요구 받고 사용자가 입력할 때까지 기다린다. 코드가 멈춰버린다! 이 코드는 사용자가 ‘green name’을 입력할 때 까지 어떤 것도 할 수가 없다.

    만약 같은 코드를 다음과 같이 작성한다면..

    1
    2

    3
    4
    5
    6
    7
    8
    //문자열 출력
    puts("Please Enter Your Green Name");
    //콜백 함수 정의
    gets( function (green_name) {
       puts("Your Green Name is: "+green_name);
    });
    //기다리지 않고 다른 일을 처리한다.

    이것은 이벤트 기반의 프로그래밍 접근법이다. 이 프로그래밍 접근법을 사용함으로써 프로그래머들은 evented non-blocking I/O를 얻을 수 있다. 이런 유형의 프로그래밍 접근법이 막기 – 멈추기 – 코딩 접근법 처럼 잘 알려지지 않은 유일한 이유는 사람들이 이런 방식의 코딩 접근법이 어렵고 더 복잡하다고 생각하기 때문이다(실제로는 사실이 아니다). 그래서, 이벤트 주도 방식으로 어플리케이션을 코딩하는 것에 대한 선입견이 존재한다.

  • 부족한 인프라 : Node의 방식으로 코딩을 하지 않는 또 다른 이유는 인프라의 부족이다. 만약 당신의 코드가 이벤트 중심으로 작동할 필요가 있다면, 절대 입출력을 막아서는 안되고, 당신의 코드가 싱글 쓰레드에 기반일 때 데이터베이스가 응답하는 것을 기다릴 수가 없고, 멈출 수도 없다. 대부분의 프로그래밍 라이브러리들은 이벤트 주도 프로그래밍 접근법을 지원할 수가 없다. 예를 들어: POSIX는 비동기 I/O를 지원하지 않는다. 지원하는 다른 것들은 같은 것을 얻기 위한 충분한 메뉴얼을 제공하지 않는다. C는 클로저와 익명 함수를 가지고 있지 않다. MySQL는 비동기 커넥션을 지원하지 않는다. 기타 등등. 이것들이 이벤트형 코드를 짜는데 어렵게 만든다.
  • 너무 많은 인프라 : 이벤트 주도 프로그래밍을 위한 플랫폼을 제공하는 라이브러리들이 있다. 루비의 Event Machine. 파이썬의 Twisted, Qt의 이벤트 루프가 그들이다. 비록, 이런 라이브러리들이 이벤트 프로그래밍을 위한 플랫폼에 non blocking I/O를 제공하고, 이 라이브러리들을 사용하면 효율적인 서버를 짜는 것이 상대적으로 간단할지라도, 사용자들은 이들을 어떻게 사용해야 할 지를 자주 헷갈려하는 경향이 있다. 예를 들어, 루비로 개발할 때 많은 라이브러리들을 가지고 있지만, 루비의 이벤트 머신 라이브러리는 MySQL 라이브러리와 조합될 수가 없다. 왜냐하면 모든 쿼리를 막아버리기 때문이다.

다행스럽게도,  Node를 사용한다면 이벤트 기반 어플리케이션을 개발이 더 이상 어려운 일이 아니다. Node는 매우 효율적이고, 순수한 이벤트 기반,non-blocking 웹 어플리케이션을 만들기 위한 인프라를 제공하고, 동시성 문제를 매우 효과적으로 처리할 수 있다. 이는 Node가 CommonJS 모듈시스템을 사용하고, non-blocking I/O를 제공하며, 구글에서 개발한 미친 스피드의 V8 자바스크립트 엔진에서 돌아가기 때문이다.  Node.js는 이벤트 기반 프로그래밍을 정말 쉽고, 매우 효율적이고, 빛과 같이 빠르게 만든다.

참고) http://applenamu3.blog.me/70152920583

       http://citybell.com/822

       http://blog.doortts.com/219