Skip to content

Latest commit

 

History

History
374 lines (250 loc) · 13.9 KB

File metadata and controls

374 lines (250 loc) · 13.9 KB

백엔드의 이해

서버 어플리케이션의 본질 : Request를 받아서 Response를 준다.


프로세스

  • 실행중인 프로그램

  • CPU(프로세서: 프로세스를 다루는 것)에 의해 실행되는 컴퓨터 프로그램의 인스턴스

    • 인스턴스 : 인스턴스는 일반적으로 실행중인 임의의 프로세스, 클래스의 현재 생성된 오브젝트를 가리킨다. 인스턴스화 된다는 것은 실제 메모리에 올라갔다는 것이다.
  • 운영체제가 관리하는 자원의 대상 (메모리 및 I/O도 운영체제가 관리하는 관리의 대상)

  • 메모리의 크기가 다른 프로그램도 자원 최적화와 해쉬 맵핑을 통해서 구동이 가능하다.

    (공간 자체가 부족할 경우 디스크를 활용한다. 자원 관리의 필요성)

프로세스 메모리 구조

  • kernel space : 운영체제 엑섹스를 위한 영역

  • Stack Memory :함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역

  • Heap Memory : 프로그램 실행 중 필요에 의한 동적 메모리 할당을 위한 공간. 가비지 콜렉터 발동 영역

  • Data, Text (static variable, const variable, code, etc) : 변하지 않는 영역(코드도 포함)

    process_memory

프로세스 제어 블록(PCB)

  • 프로세스 상태
  • 프로세스 권한
  • 프로세스 ID
  • 부모 프로세스 카운터
  • CPU 레지스터
  • CPU 스케쥴 관련 정보
  • 메모리 관리 정보
  • 상태 회계 정보 (CPU 점유율, 실행 시간 등 )
  • I/O 상태 관련 정보 (어느 Device를 사용중인지, 어떤 File을 사용중인지 등)

pcb

프로세스 상태

  • Ready : CPU가 사용가능한 (할당할 수 있는) 상태
  • Running : 프로세스가 CPU를 차지(프로세스를 실행)하고 있는 상태
  • Wait : CPU를 할당받아 실행되다가 어떤 사건이 발생 (예. 입·출력 작업이 완료)할 때까지 멈추어 있는 상태
  • Terminated : 프로세스의 실행이 완전히 끝나고 CPU 할당이 해제된 상태

process_state


쓰레드(thread)

  • 경량화한 프로세스(a light weight process)라고도 함
  • 쓰레드는 프로세스에게 병렬 처리 수단을 제공
  • 프로세스는 하나이상의 쓰레드를 소유하고 있음
  • 쓰레드는 서로 데이터를 공유한다. 같은 프로세스의 다른 쓰레드의 데이터에 접근할 수 있다.
  • CPU 활용의 단위
  • JavaScript는 one thread.

쓰레드와 프로세스의 차이

  • 쓰레드는 자원의 단위 프로세스는 더 큰 단위
  • 상대적으로 느리고 빠르다(병렬과 싱글의 차이)
  • 쓰레드 스위칭은 작고 프로세스 스위칭은 크다
  • 프로세스는 쓰레드를 포함한다.

thread


Web Server vs App Server

Web server

  • HTTP 프로토콜을 다룸
  • 주로 정적 컨텐트(static content) 처리
  • Forward Proxy와 Reverse Proxy 지원
  • nginx, apache

Forward proxy/ Reverse proxy

  • proxy : 서버와 클라이언트 사이에서 중계기로서 대리로 통신을 수행하는 기능.
  • Forward proxy : 클라이언트가 타겟 서버의 정보를 요청할 때, 프록시로 타겟 서버의 주소를 전달해 프록시가 데이터를 가져오는 방식
  • Reverse proxy : 클라이언트는 프록시로 요청하고, 프록시가 배후(reverse)의 서버로부터 데이터를 가져오는 방식

Application Server

  • WAS(Web Application Server)라고도 함
  • 어떤 페킷이냐에 따라서 동일한 url이라도 결과 값이 달라질 수 있다.
  • 비지니스 로직을 처리
  • 주로 동적 컨텐트 담당
  • HTTP 메시지 통신을 주로 하지만 CGI를 사용하기도 함

CGI(Common Gateway Interface)

  • 웹서버를 위한 표준 프로토콜
  • 웹서버는 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 라이브러리가 존재함)

Restful API

  • 정의 : 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 안의 서버들이 통신할 때 많이 사용한다.

  • 장점 : 편하다 (규약은 설정보다 편하다)

  • 단점 : 보안에 취약 할 수 있음

Sails.js

  • http://sailsjs.com/
  • 100% 자바스크립트 full stack web framework
  • Waterline ORM (모든 데이터베이스 지원)
  • Express 기반
  • REST API 자동 생성
  • Socket.IO 웹소켓 내장

sails js 및 프로젝트 설치

  • sails js 설치 : $ npm install sails@beta -g
  • sails project 생성 :$ sails new hello
  • sails api 생성 : $ sails generate api User
  • sails 서버 실행 : $ sails lift

Route

  • request 패킷을 관찰 후 이 패킷을 대상으로 하는 “무언가”로 보내는 과정
  • 묵시적 라우팅 (action 사용)
  • 명시적 라우팅 (routes.js 이용)

ORM (Object Relation Mapping)

ORM 이란 가상의 Object DB를 효과적으로 만들어 RDB를 OOP 언어의 개념으로 연계하는 프로그램 기술.

ORM이 없었던 시절

백앤드 프로그래머가 직접 쿼리를 제작하고, 결과 값을 파싱하여 변수에 바인드 함

String sql = "SELECT ... FROM persons WHERE id = 10";
DbCommand cmd = new DbCommand(connection, sql);
Result res = cmd.Execute();
String name = res0;

ORM이 생긴 이후

백앤드 프로그래머는 쿼리를 고안할 필요가 없어짐 / 결과 값 파싱 및 바인드도 신경 쓸 필요가 없어짐

Person p = repository.GetPerson(10);
String name = p.getFirstName();

도커(docker)

  • 도커는 컨테이너를 제공하는 소프트웨어 기술이다.
  • 도커는 추가적인 추상 레이어 및 운영체제 레벨의 가상화의 자동화를 제공한다.
  • 가볍다 = 빠르다 (일반 가상 머신과 비교하여)
  • 쉽다. 각종 이미지들을 손쉽게 구할 수 있다.
  • 도커 핵심 명령어 정리 : https://gist.github.com/nacyot/8366310

Docker로 MariaDB 설치

MariaDB Docker로 이미지 만들기

$ docker run --name [이미지 이름] -d -v [컴퓨터에 db파일을 저장할 경로]:/data/db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 mariadb

만든 이미지 실행하기

$ docker start [이미지 이름]


RDBMS (Relational Database Management System)

  • 관계형 모델(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.

DBMS 기본 용어

  • 스키마(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 [조건]

트렌젝션(Transaction)

  • 데이터베이스 관리 시스템의 상호작용의 단위
  • 논리적 작업 단위(LUW, Logical Units of Work)
  • 목적 : 데이터베이스 완전성(integrity) 유지

NoSQL

  • RDBMS와 다르게 최초 생성시 데이터간 관계를 정의하지 않음 (설계시 유연) - 명시적인 스키마가 존재하지 않음
  • 대표적인 NoSQL : MongoDB, Redis, HBase 등

RDBMS vs NoSQL 장단점

RDBMS의 장점

  • 법용성, 고성능, 안정적, 일관성
  • 정규화를 전제로 하고 있기 때문에 업데이트시 비용이 적다.
  • 데이터베이스 설계시 불필요한 중복을 방지
  • 복잡한 형태의 쿼리가 가능하여 원하는 데이터를 얼마든지 볼 수 있다. (Join, Group by 등)
  • 이미 성숙한 기술

RDBMS의 단점

  • 대량의 데이터 입력처리
  • 테이블의 인덱스 생성, 스키마 변경 시 성능
  • 개발, 운영할 때 데이터 컬럼을 확정 짓기 어려운 경우

NoSQL의 장점

  • 데이터 분산에 용이

  • 복제 및 장애대응에 용이

  • 데이터를 고속으로 처리할 필요가 있는 경우 로그 등 계속 적재되어야 하고 대량의 데이터를 저장하고 싶은

    경우 용이

NoSQL의 단점

  • 각 솔루션의 특징을 이해 해야할 필요가 있음. 러닝커브가 가파름
  • 새로운 기술로 분류되기 때문에 운영에 대한 노하우가 부족 (아는 사람 적음)
  • RDBMS와 비교하여 아직 안정성 부족
  • 보안에 취약하기 때문에 별도의 보안 체계를 마련
  • 데이터 모델링의 어려움

REQUEST, RESPONSE

sails.js 컨트롤 함수

module.exports ={
  index : function(req, res){
    // do something with req
    
    //return res
    return res.ok()
  },
};

req 주요 파라메터

  • 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 주 사용법

  • 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');

Middleware

  • request/response stack의 ‘가운데’에 있어서 붙여진 이름
  • Sails에서는 4가지 방법으로 middleware를 지원함(HTTP, Policy, Hook의 routes, Custom response)

레디스(redis)

  • 더 빠른 결과를 제공하기 위해 데이터를 메모리에 저장함 (메인 메모리의 처리 속도는 HDD의 800배, SSD의 40배 정도 빠름)
  • 인메모리 데이터 저장소 : 레디스 vs memcached
  • K-V 방식의 access

GRUNT

TASK

  • 작업을 정의함
  • 대표 TASK: minification, compilation, unit testing, linting

TARGET

  • TASK는 여러개의 TARGET을 소유 가능
  • 각 target은 다른 option 적용 가능
  • 대표 target : development

GRUNT의 특징 (feature)

  • 작업 옵션 설정
  • 파일 유틸리티
  • 탬플릿 기능
  • 외부 데이터 가져오기

View

EJS

  • EJS(Effective JavaScript Templating) : http://ejs.co/
  • 마지막으로 response 패킷에 넣을 HTML 데이터를 조립
  • sailsjs는 ejs를 기본 view engine으로 채용

consolidation

  • Express용 View Engine Normalizer
  • 다양한 View Engine 지원