서버 어플리케이션의 본질 : Request를 받아서 Response를 준다.
-
실행중인 프로그램
-
CPU(프로세서: 프로세스를 다루는 것)에 의해 실행되는 컴퓨터 프로그램의 인스턴스
- 인스턴스 : 인스턴스는 일반적으로 실행중인 임의의 프로세스, 클래스의 현재 생성된 오브젝트를 가리킨다. 인스턴스화 된다는 것은 실제 메모리에 올라갔다는 것이다.
-
운영체제가 관리하는 자원의 대상 (메모리 및 I/O도 운영체제가 관리하는 관리의 대상)
-
메모리의 크기가 다른 프로그램도 자원 최적화와 해쉬 맵핑을 통해서 구동이 가능하다.
(공간 자체가 부족할 경우 디스크를 활용한다. 자원 관리의 필요성)
-
kernel space : 운영체제 엑섹스를 위한 영역
-
Stack Memory :함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역
-
Heap Memory : 프로그램 실행 중 필요에 의한 동적 메모리 할당을 위한 공간. 가비지 콜렉터 발동 영역
-
Data, Text (static variable, const variable, code, etc) : 변하지 않는 영역(코드도 포함)
- 프로세스 상태
- 프로세스 권한
- 프로세스 ID
- 부모 프로세스 카운터
- CPU 레지스터
- CPU 스케쥴 관련 정보
- 메모리 관리 정보
- 상태 회계 정보 (CPU 점유율, 실행 시간 등 )
- I/O 상태 관련 정보 (어느 Device를 사용중인지, 어떤 File을 사용중인지 등)
- Ready : CPU가 사용가능한 (할당할 수 있는) 상태
- Running : 프로세스가 CPU를 차지(프로세스를 실행)하고 있는 상태
- Wait : CPU를 할당받아 실행되다가 어떤 사건이 발생 (예. 입·출력 작업이 완료)할 때까지 멈추어 있는 상태
- Terminated : 프로세스의 실행이 완전히 끝나고 CPU 할당이 해제된 상태
- 경량화한 프로세스(a light weight process)라고도 함
- 쓰레드는 프로세스에게 병렬 처리 수단을 제공
- 프로세스는 하나이상의 쓰레드를 소유하고 있음
- 쓰레드는 서로 데이터를 공유한다. 같은 프로세스의 다른 쓰레드의 데이터에 접근할 수 있다.
- CPU 활용의 단위
- JavaScript는 one thread.
- 쓰레드는 자원의 단위 프로세스는 더 큰 단위
- 상대적으로 느리고 빠르다(병렬과 싱글의 차이)
- 쓰레드 스위칭은 작고 프로세스 스위칭은 크다
- 프로세스는 쓰레드를 포함한다.
- HTTP 프로토콜을 다룸
- 주로 정적 컨텐트(static content) 처리
- Forward Proxy와 Reverse Proxy 지원
- nginx, apache
- proxy : 서버와 클라이언트 사이에서 중계기로서 대리로 통신을 수행하는 기능.
- Forward proxy : 클라이언트가 타겟 서버의 정보를 요청할 때, 프록시로 타겟 서버의 주소를 전달해 프록시가 데이터를 가져오는 방식
- Reverse proxy : 클라이언트는 프록시로 요청하고, 프록시가 배후(reverse)의 서버로부터 데이터를 가져오는 방식
- WAS(Web Application Server)라고도 함
- 어떤 페킷이냐에 따라서 동일한 url이라도 결과 값이 달라질 수 있다.
- 비지니스 로직을 처리
- 주로 동적 컨텐트 담당
- HTTP 메시지 통신을 주로 하지만 CGI를 사용하기도 함
- 웹서버를 위한 표준 프로토콜
- 웹서버는 CGI를 통해서 어플리케이션을 실행 -> 어플리케이션은 request를 가지고 response를 생성후 response를 웹서버로 전송 -> 이러한 어플리케이션을 CGI script 혹은 CGIs라고 함
- perl, php가 대표적인 CGIs Language
- Application의 stdout이 웹서버로 전송됨
- python은 wsgi(Web Server Gateway Interface)
- ruby는 rack(Ruby web server interface)
- node.js는 one thread application으로 gateway interface가 필요 없음 (하지만 굳이 cgi 방식으로 돌리겠다는 node.js cgi 라이브러리가 존재함)
-
정의 : request 메서드의 동사를 사용하여 데이터를 CRUD 하는것
- CRUD : Create(생성), Read(읽기), Update(갱신), Delete(삭제)
-
GET /boat -> boat 테이블의 목록을 제공해줌 /boat/find 와 동일
-
GET /boat/:id -> boat 테이블의 특정 id를 갖는 데이터를 제공 /boat/find/:id 와 동일
-
POST /boat -> boat 테이블에 데이터를 추가 /boat/create와 동일
-
PATCH /boat/:id -> boat 테이블에 특정 id를 갖는 데이터를 수정 /boat/update/:id
-
DELETE /boat/:id -> boat 데이블에 특정 id를 갖는 데이터를 삭제 /boat/destory/:id
-
Reverse Proxy 안의 서버들이 통신할 때 많이 사용한다.
-
장점 : 편하다 (규약은 설정보다 편하다)
-
단점 : 보안에 취약 할 수 있음
- http://sailsjs.com/
- 100% 자바스크립트 full stack web framework
- Waterline ORM (모든 데이터베이스 지원)
- Express 기반
- REST API 자동 생성
- Socket.IO 웹소켓 내장
- sails js 설치 : $ npm install sails@beta -g
- sails project 생성 :$ sails new hello
- sails api 생성 : $ sails generate api User
- sails 서버 실행 : $ sails lift
- request 패킷을 관찰 후 이 패킷을 대상으로 하는 “무언가”로 보내는 과정
- 묵시적 라우팅 (action 사용)
- 명시적 라우팅 (routes.js 이용)
ORM 이란 가상의 Object DB를 효과적으로 만들어 RDB를 OOP 언어의 개념으로 연계하는 프로그램 기술.
백앤드 프로그래머가 직접 쿼리를 제작하고, 결과 값을 파싱하여 변수에 바인드 함
String sql = "SELECT ... FROM persons WHERE id = 10";
DbCommand cmd = new DbCommand(connection, sql);
Result res = cmd.Execute();
String name = res0;
백앤드 프로그래머는 쿼리를 고안할 필요가 없어짐 / 결과 값 파싱 및 바인드도 신경 쓸 필요가 없어짐
Person p = repository.GetPerson(10);
String name = p.getFirstName();
- 도커는 컨테이너를 제공하는 소프트웨어 기술이다.
- 도커는 추가적인 추상 레이어 및 운영체제 레벨의 가상화의 자동화를 제공한다.
- 가볍다 = 빠르다 (일반 가상 머신과 비교하여)
- 쉽다. 각종 이미지들을 손쉽게 구할 수 있다.
- 도커 핵심 명령어 정리 : https://gist.github.com/nacyot/8366310
MariaDB Docker로 이미지 만들기
$ docker run --name [이미지 이름] -d -v [컴퓨터에 db파일을 저장할 경로]:/data/db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 mariadb
만든 이미지 실행하기
$ docker start [이미지 이름]
-
관계형 모델(Relational Model)
구조체(테이블 스키마 지칭)와 1차 술어논리로 구성된 언어(DB에서는 SQL을 지칭)를 사용하여 데이터를 다루는 접근법
-
관계 종류
-
일대일
일대일 관계에서 테이블 A의 한 행은 테이블 B의 한 행과만 일치할 수 있으며 이 반대의 경우도 마찬가지이다. 관련된 두 열 모두가 기본 키이거나 UNIQUE 제약 조건을 갖고 있는 경우 일대일 관계가 만들어진다.
-
일대다관계
가장 일반적인 관계 종류. 이 관계에서 테이블 A의 한 행은 테이블 B의 여러 행과 일치할 수 있지만 테이블 B의 한 행은 테이블 A의 한 행과만 일치할 수 있다.
-
다대다
다대다 관계에서 테이블 A의 한 행은 테이블 B의 여러 행과 일치할 수 있고, 그 반대의 경우도 마찬가지이다. 접합 테이블인 세 번째 테이블을 정의하여 이러한 관계를 만들 수 있다. 접합 테이블의 기본 키는 테이블 A와 테이블 B 모두의 외래 키로 구성된다.
-
-
대표적인 제품 : Oracle, MySQL, MariaDB, Sybase, Microsoft, SQL Server, Access, etc.
-
스키마(schema) : 데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것
-
쿼리(query) : DB에 물음을 던져 원하는 값을 추출해내는 것
-
뷰(view) : 하나 이상의 테이블에서 원하는 모든 데이터를 선택하여, 그들을 사용자 정의하여 나타낸 것
-
테이블(table) : 세로줄과 가로줄의 모델을 이용하여 정렬된 데이터 집합(값)의 모임
-
행(row) : 레코드 또는 튜플로 불리기도 하며, 어떤 테이블에서 단일 구조 데이터 항목을 가리킨다.
-
열(column) : 특정한 단순 자료형의 일련의 데이터값과 테이블에서의 각 열을 말한다.
-
기본키(primary key) : 관계에 저장된 레코드를 고유하게 식별하는 후보키 가운데, 설계자가 일반적으로 이용되어야한다고 정해 놓은 것
-
외래키(foreign key) : 한 테이블의 필드중 다른 테이블의 행(row)을 식별할 수 있는 키를 말한다.
-
데이터형(data type) : 해당 자료형에 대한 가능한 값, 해당 자료형에서 수행을 마칠 수 있는 명령들, 데이터의 의미, 해당 자료형의 값을 저장하는 방식을 결정
###SQL(Structered Query Language)
- SQL구문은 몇 가지 주요 키워드로 구성돼 있어 쉽게 배울 수 있음
- 특정 RDBMS에서만 쓸수 있는 SQL 구문도 존재 하지만 대부분은 공통적으로 쓸 수 있음
- 대소문자 구분 안함
- 테이블 생성 -
CREATE TABLE [테이블 이름] ([컬럼 이름] [자료형], ...); - 테이블 삭제 -
DROP TABLE [테이블 이름] - 입력 -
INSERT INTO [테이블 이름]([컬럼 이름], ...) VALUES([입력값], ...); - 조회 -
SELECT [컬럼이름], ... FROM [테이블 이름] WHERE [조건식] - 수정 -
UPDATE [테이블 이름] SET [컬럼 이름] = [수정할 값] WHERE [조건식] - 삭제 -
DELETE [테이블 이름] WHERE [조건]
- 데이터베이스 관리 시스템의 상호작용의 단위
- 논리적 작업 단위(LUW, Logical Units of Work)
- 목적 : 데이터베이스 완전성(integrity) 유지
- RDBMS와 다르게 최초 생성시 데이터간 관계를 정의하지 않음 (설계시 유연) - 명시적인 스키마가 존재하지 않음
- 대표적인 NoSQL : MongoDB, Redis, HBase 등
- 법용성, 고성능, 안정적, 일관성
- 정규화를 전제로 하고 있기 때문에 업데이트시 비용이 적다.
- 데이터베이스 설계시 불필요한 중복을 방지
- 복잡한 형태의 쿼리가 가능하여 원하는 데이터를 얼마든지 볼 수 있다. (Join, Group by 등)
- 이미 성숙한 기술
- 대량의 데이터 입력처리
- 테이블의 인덱스 생성, 스키마 변경 시 성능
- 개발, 운영할 때 데이터 컬럼을 확정 짓기 어려운 경우
-
데이터 분산에 용이
-
복제 및 장애대응에 용이
-
데이터를 고속으로 처리할 필요가 있는 경우 로그 등 계속 적재되어야 하고 대량의 데이터를 저장하고 싶은
경우 용이
- 각 솔루션의 특징을 이해 해야할 필요가 있음. 러닝커브가 가파름
- 새로운 기술로 분류되기 때문에 운영에 대한 노하우가 부족 (아는 사람 적음)
- RDBMS와 비교하여 아직 안정성 부족
- 보안에 취약하기 때문에 별도의 보안 체계를 마련
- 데이터 모델링의 어려움
module.exports ={
index : function(req, res){
// do something with req
//return res
return res.ok()
},
};- req.body : request의 바디
- req.header : reqeust의 헤더
- req.cookies : request의 쿠키
- req.method : request의 메서드 (GET, POST 등)
- req.params : request의 URL 파라메터 (라우팅 설정에서 /user/:name 을 설정 한 경우 req.params.name 으로 :name을 접근 할 수 있음)
- res.set('Content-Type', 'text/html');
- res.send(new Buffer('some html'));
- res.send(new Buffer('whoop'));
- res.send({ some: 'json' });
- res.send('some html');
- res.send(404, 'Sorry, we cannot find that!');
- res.send(500, { error: 'something blew up' });
- res.send(200);
- return res.redirect('/checkout');
- request/response stack의 ‘가운데’에 있어서 붙여진 이름
- Sails에서는 4가지 방법으로 middleware를 지원함(HTTP, Policy, Hook의 routes, Custom response)
- 더 빠른 결과를 제공하기 위해 데이터를 메모리에 저장함 (메인 메모리의 처리 속도는 HDD의 800배, SSD의 40배 정도 빠름)
- 인메모리 데이터 저장소 : 레디스 vs memcached
- K-V 방식의 access
- 작업을 정의함
- 대표 TASK: minification, compilation, unit testing, linting
- TASK는 여러개의 TARGET을 소유 가능
- 각 target은 다른 option 적용 가능
- 대표 target : development
- 작업 옵션 설정
- 파일 유틸리티
- 탬플릿 기능
- 외부 데이터 가져오기
- EJS(Effective JavaScript Templating) : http://ejs.co/
- 마지막으로 response 패킷에 넣을 HTML 데이터를 조립
- sailsjs는 ejs를 기본 view engine으로 채용
- Express용 View Engine Normalizer
- 다양한 View Engine 지원



