웹 개발자 로드맵 2017 - BackEnd편



웹 개발자 로드맵 2017

앞전엔 프론드엔드 쪽 정리이지만 이번엔 백엔드 정리이다.



Ruby


  • 스크립팅 언어 (인터프리터 방식)이자 순수한 객체 지향 프로그래밍 언어이다.

  • 특징

    1. 자유로운 형식 다른 언어에 비해서 들여 쓰기가 크게 중요하지 않기 때문에, 모든 행과 열에서 프로그램을 자유롭게 작성할 수 있다.
    2. 대소문자의 구분 들여쓰기가 중요하지 않은 대신에 대문자와 소문자를 구분하는 것이 굉장히 중요하다. 예를 들어, endEND는 같은 알파벳이지만 완전히 다른 키워드를 의미하게 된다.
    3. 주석 # 부호 뒤에 오는 내용은 한 줄 단위로 주석 처리가 된다. 큰 주석 블록을 만들기 위해서는 =begin=end를 사용한다.
    4. 문장 구분 기호 일반적인 프로그래밍 언어는 하나의 구문이 끝나면 세미콜론(;)을 붙이지만 루비에서는 줄바꿈 만으로 구분이 된다. 한줄에 여러 구문을 사용한다면 세미콜론(;)으로 구분한다.


[Ruby] Ruby on Rails - 프레임워크


  • 웹 애플리케이션 개발을 위한 프레임워크이다.

  • 레일즈의 철학
    1. DRY - "Don't Repeat Yourself"같은 코드를 반복하지 마라
    2. Convention Over Configuration설정 보다 관습 이 원칙은 원하는 기능들에 대해서 일정한 가정을 바탕으로 해결책을 제공하여 작은 단위의 끝없는 설정 파일들을 줄여준다.
    3. REST는 웹 어플리케이션의 최고의 패턴이다. 리소스와 표준 HTTP 요청에 적합한 웹 어플리케이션 개발은 가장 빠른 방법이다.
  • MVC 모델을 근간으로 하여 비즈니스 로직과 UI를 분리하고, DRY를 쉽게 달성하게 해주며, 유지보수를 쉽게 해주는 장점이 있다.

  • MVC 란? MVC패턴
    • Model 어플리케이션의 정보와 데이터를 다루는 규칙들. 레일즈의 경우, Model은 주로 데이터베이스 테이블과 상호 작용 하는 규칙들을 관리
    • View 어플리케이션의 유저 인터페이스를 의미. 레일즈에서 뷰는 주로 데이터 표현에 관련된 루비 코드가 삽입되어 있는 HTML 파일이다.
    • Controller 컨트롤러는 ModelView연결하는 역할을 한다. 레일즈에서 컨트롤러는 웹브라우저의 요청을 받아서, 모델을 통해 데이터를 조회하고, 출력을 위해 뷰에게 데이터를 넘겨준다.
  • 레일즈의 컴포넌트
    1. Action Pack MVC 모델의 아래의 세가지 컴포넌트를 포함하는 하나의 gem이다.
      • Action Controller : Rails 애플리케이션의 컨트롤러를 관리하는 컴포넌트 들어온 요청을 Rails 애플리케이션으로 전달하고, 파라미터 파싱, 해당 파라미터들을 적절한 action으로 분배 등의 역할을 한다. 세션 관리나 template rendering, redirect 관리 등의 역할도 한다.
      • Action View : Rails 애플리케이션의 view를 담당한다.
      • Action Dispatch : Web 요청을 라우팅 하고 작성한 Rails 애플리케이션이나 RACK 애플리케이션에 dispatch 한다.
    2. Action Mailer : E-mail 서비스 제작을 위한 프레임워크
    3. Active Model : Action Pack gem 서비스와 Active Record 같은 ORM gem 서비스를 연결하는 인터페이스
    4. Active Record : ORM^Object Relationship Mapping^. DB에 독립적인 CRUD 기능을 제공
    5. Active Resource : 비즈니스 오브젝트와 REST 웹서비스 간의 연결을 관리하는 프레임 워크. 웹 기반의 resource 들을 CRUD 문법으로 로컬 오브젝트에 매핑해준다.
    6. Active Support : Rails 에서 사용가능한 utility 클래스나 library의 집합
    7. Railties : 새로운 레일즈 어플리케이션을 만들고 다양한 프레임워크와 플러그인들을 연결시켜주는 레일즈의 핵심 코드
  • REST
    • REpresentational State Transfer의 약자
    • WWW와 같은 분산 시스템을 위한 소프트웨어 아키텍처의 일종이다. 기존의 웹 서비스들이 서비스 제공자마다 서로 다른 구조를 갖고 유지보수 및 이해가 쉽지 않으므로 이것을 보편적이고 통일된 형태로 표현함으로써 URL만으로 해당 웹페이지가 어떤 의도를 갖고 있는지 파악할 수 있도록 한 것.

    • 특징
      1. 자원 표현을 위해 자원 식별자 사용 (ex) URL
      2. 시스템 컴포넌트 간에 자원 상태 교환
    • 사람들이 이용하는 모든 컴퓨터의 자원들은 리소스이고, 이 리소스를 보여주는 틀이 웹이다. 웹에 보여지는 리소스들은 결국 HTMLXML 두 가지 형태로 표현될 수 있고, 이러한 HTMLXML에 접근하기 위한 방법으로 URI를 이용한다. 리소스들을 조작하는 행위에는 CRUD 네가지 방법이 있을것이다. 즉, REST는 무엇을(리소스) 어떻게(CRUD) 할것인가를 보편적인(URI) 방법으로 표현하고자 하는것 이라고 볼 수 있다.
  • Rails 애플리케이션 동작에 필요한 것
    • 클라이언트의 요청을 받고 응답하기 위해 HTTP 서버가 필요
    • 데이터베이스


[Ruby] RSpec - 테스트


  • Ruby코드를 테스트 하기 위해 Ruby로 작성된 테스트 도구이다.

자료가 없어 일단 스킵



[Ruby] RubyGems - 패키지 관리자


  • 프론트 엔드 개발을 빠르고 쉽게 할 수 있는 프레임 워크이다. 각종 웹페이지에서 사용하는 레이아웃, 버튼, 입력 창 등의 디자인을 CSS와 JavaScript로 만들어 놓았고, 반응형 웹 디자인도 지원하여 디자인을 할 시간이 크게 줄어들었다.

  • 웹 디자인의 혁명 이라고 불리며 오픈소스이다.



Python


  • 특징
    1. 가독성 파이썬의 문법은 간결하고 가독성이 좋다. 다른 언어와 달리 중괄호로 범위를 설정하지 않고 들여쓰기로 범위를 설정한다.
        if 4 in [1,2,3,4]: print("4가 있습니다")
      
    2. 무료 파이썬은 무료이다.
    3. 많은 라이브러리 파이썬에는 매우 많은 라이브러리가 있고 기본적으로 포함되어 있다. 확장성도 좋다.
    4. 기본적으로 제공되는 라이브러리 외 쉽게 라이브러리를 추가할 수 있다. C로 구현되어 있는 모듈을 쉽게 만들어 사용 가능.
  • 단점
    1. 빠른 속도를 요구하거나 하드웨어를 직접 건드려야하는 프로그램에는 맞지 않다.
    2. 하위버전인 2.x버전과 상위버전인 3.x버전이 서로 호환 되지 않는다.


[Python] Pip - 패키지 관리자


  • 파이썬에서 패키지를 관리하는 시스템으로 pip install [패키지 이름]의 형태로 패키지를 설치하게 된다.


[Python] Unittest(=pyUnit) - 테스트


  • 단위 테스트가 가능한 Testing 라이브러리

  • 단위 테스트란? 모듈 또는 응용 프로그램 내의 개별 코드 단위가 예상대로 작동하는지 확인하는 반복 가능한 활동



[Python] Django - 프레임워크(동기식)

  • Python을 기반으로 만들어진 웹 프레임 워크이다. 웹 개발에서 번거로운 요소들을 새로 개발 할 필요 없이 내장된 기능만을 이용해 빠른 개발을 할 수 있다는 장점이 있다.

  • 특징 MVC 패턴 기반 MTV

    • MVC패턴을 기반으로 한 프레임 워크이다. 하지만 Django에서는 ViewTemplate, ControllerView 라고 부른다. Django에서 View는 데이터를 가져오고 변형하는 컴포넌트인 반면에 Template는 데이터를 사용자에게 보여주는 컴포넌트이다. 그래서 Django를 흔히 MTV(Model - Template - View) 프레임워크` 라고 부르기도 한다. (관리자 웹 인터페이스 제공)

    • 사용자 관리, 사용자 그룹관리, 사용자 별 권한에 대한 것 뿐 아니라, 각각의 모델 객체에 대해서 목록 추가/삭제/변경 기능이 관리자 인터페이스에서 모두 제공된다. 이는 특히 DB, Web Application을 실험적으로 작성하기 좋다. 데이터베이스 모델링만으로 웹 어플리케이션의 작동을 실험 해 볼 수 있다.



[Python] aiohttp - 프레임워크(비동기식)

  • Python 3.4부터 표준 라이브러리로 추가된 asyncio(PEP3156)을 위한 HTTP 서버 / 클라이언트 프레임워크이다.

  • 기능
    1. Client / Server API
    2. Persistent connections
    3. Websockets … 등
  • I/O wait이란? I/O 연산은 일반적으로 CPU 연산보다 느리며 컴퓨터에서 사용되는 리소스도 조금 다르다. 그래서 main Thread에서 순차적으로 진행하다보면 I/O 연산과정에서 대기시간이 발생하게 되고 그 프로그램은 일시정지 되는데 이를 I/O Wait 이라고 한다.

  • asyncio란? 그래서 CPU의 연산처리와 I/O 연산처리의 리소스 위치 차이에 착안해 I/O wait동안 프로그래밍적으로 그 지점을 기억해 놓고 대기시간동안 다른 연산을 수행할 수 있도록 하여 그 대기시간을 줄여 총 수행시간을 단축 할 수 있게 해주는 것.


Node.js


  • 확장성 있는 네트워크 애플리케이션 개발에 사용되는 소프트웨어 플랫폼

  • 특징

    1. V8 Engine Node.js는 구글 크롬 웹 브라우저의 자바스크립트 엔진인 V8을 기반으로 자바스크립트를 사용한다. 엔진중 가장 빠른 성능을 물려받았으며, 자바 스크립트를 직접 기계어로 컴파일하여 빠르다.
    2. Event-Driven 방식 사용자가 이벤트를 발생시켰을 때, 입력 장치로 데이터를 전송했을 때 ‘만’ 작동하는 방식. 하나의 스레드가 모든 작업을 직접 처리하는 대신 작업을 위임하고 완료됐다는 이벤트가 발생하면 결과를 받아 처리
    3. Non-Blocking(비동기) 패러다임 Bloacking I/O를 사용하면 스레드가 블로킹되고 대기상태에 있게 된다. 이는 시간과 메모리를 낭비하게 된다. 하지만 Non-Blocking I/O 방식은 I/O 작업을 진행하는 동안 유저의 프로세스 작업을 중단시키지 않는다. 장점 : 빠르다, 쉽다, 적은메모리
    4. Single Thread
      • 단일 스레드의 장점은 적은양의 자원으로 일을 처리할 수 있다.
      • 요청 순서에 따라 결과가 돌아오지 않는다.
      • 이벤트 기반 응용 프로그램에서 이벤트를 처리하고 오류가 난다면 싱글 스레드가 코드를 처리하면서 블록킹되지 않고 다른 작업을 처리한다.
      • 예외가 발생한다면 어플리케이션 전체에 영향을 준다.


[Node.js] npm - 패키지 관리자


  • Node Packaged Manager의 약자이다.

  • 패키지란? 관리를 위해 모듈에 몇 가지 정보를 추가한 것으로 결국 모듈이지만 조금 더 큰 단위라고 볼 수 있다. 이러한 패키지들은 공유를 위해 인터넷에 올리기도 하는데 이 또한 npm을 사용해 내려받아 설치가 가능하다.

  • 패키지 매니저란? 자바 스크립트 세계에서 개 발자는 코드의 패키지를 공유하고 이를 조립하여 프로젝트를 빌드하는 도구로 패키지 매니저를 사용한다.

  • Node.js로 만들어진 패키지를 웹에서 받아서 설치하고 관리해주는 프로그램이다. (PythonPIP, ‘Java’의 ‘Maven’과 비슷한 역할을 한다.)

  • 패키지 정의 파일을 package.json 파일이라고 한다. 해당 파일 내의 "scripts""dependencies" 부분을 알아보자.

    1. "script"는 우리가 run 명령어를 통해서 실행할 것들을 적어두는 것
    2. "dependencies"의 경우는 설치할 모듈들을 의미

    이렇게 package.json 파일이 정리되면 배포를 해야할 때 파일만 같이 배포를 하면 해당 프로그램 개발에 사용되었던 모듈을 그대로 인스톨 할 수 있게된다. 인스톨은 다음 명령어로 간단하게 할 수 있다.

      npm install
    


[Node.js] Yarn - 패키지 관리자


  • Yet Another Resource Negotiator의 약자 → "리소스 협상가"

  • facebook에서 만든 새로운 자바스크립트 패키지 매니저이다. 기존의 존재하는 npm과 동일한 기능을 수행한다.

  • npm이 있는데 왜 Yarn을 사용할까?

    1. npm의 한계 npm 저장소의 취약한 보안 이슈를 시작으로 패키지가 많아짐에 따라 빌드 성능이 좋지 않다는 점이 가장 큰 문제 (패키지가 중복으로 설치될 수 있다.)
    2. npm에 비해 빠른 속도
    3. 모든 패키지를 유저 디렉토리에 저장해 캐싱

    종합하자면 속도, 안전성, 신뢰성이 보장이 된다.



[Node.js] Express - 프레임워크


  • Node.js의 핵심모듈인 HttpConnect 컴포넌트를 기반으로 하는 웹 프레임워크다. 그러한 컴포넌트를 미들웨어^middleware^라고 한다. 웹 앱에 MVC형태의 구조를 제공한다.

  • 이 같은 앱은 백엔드만 갖춘 REST API에서 온갖 기능을 제공하는 고도로 확장 가능한 풀스택(jade-brower와 Socket.IO 등)을 포함하는 실시간 웹 앱에 이르기까지 다양하다.



[Node.js] Mocha - 테스트


  • 단순한 자바 스크립트 개발에서는 단위 테스트가 필요하지 않지만, 점차 코드가 복잡해지면서 작성한 함수가 잘 동작하고 제대로 된 값을 반환하는지 검증하는 과정을 거치기 위해 Mocha는 태스크 러너를 지원하는 테스트 프레임 워크이다.

  • 테스트를 왜 해야하는가?
    • 테스트 코드의 중요성
      1. 반복적인 행위를 줄여준다. 테스트 코드 없이 테스트를 하려면 계속 서버를 on/off 하며 수동으로 동작시켜줘야 하고, 애플리케이션이 복잡해 진다면 테스트 역시 복잡해진다.
      2. 빠른 오류 & 버그 확인과 수정, 리팩토링의 베이스
      3. Bottom-up, outside-in 가능 테스트 코드가 없다면 DAO, Repository, Service 레이어는 Router(=Controller)가 없으면 동작 테스트 할 수 없다.
      4. 심리적 안정감, 자신감 취득
      5. 코드의 올바른 동작에 대한 하나의 스펙문서
        • 스펙 명세를 테스트 코드로 번역한다는 느낌
        • (ex) Spring Rest Docs : 테스트코드를 작성하고 성공해야만 Docs 생성.
      6. 레거시 코드를 보는 관점 단위 테스트로부터 보호받지 못하는 코드들로써 시간이 지날수록 히스토리를 모르게 되고, 코드는 복잡해져 테스트가 불가능하거나 어려워진다.
  • 테스트 프레임워크는 테스트의 접근방식에서 크게 TDD와 BDD로 나눌 수 있다. Mocha는 TDD와 BDD를 모두 지원하고 있다.

  • TDD와 BDD란?
    • TDD : Test Driven Development(테스트 주도 개발)
    • BDD : Behavior Driven Development(행위 주도 개발)
  • 특징
    • 간단한 비동기 테스트 지원
    • 테스트 커버리지 리포팅
    • 테스트에 특화된 타임아웃
    • 전역변수 메모리 누출 탐지
    • 수행되는 루프에서 행이 걸리는 것을 막기 위한 자동 탈출(auto-exit) 기능
    • 원하는 assertion 라이브러리 사용 가능
    • mocha.opts 지원


PHP 7


  • PHP란?
    • Personal Home Page Tools의 약자였으나 PHP:Hypertext Preprocessor로 변경되었다.

    • 별도의 실행 파일을 만들 필요 없이 HTML 문서 안에 포함시켜 다양한 언어를 문장 형식으로 사용하여 동적으로 사용할 수 있는 웹문서

  • 특징
    1. 웹에 최적화 된 언어
    2. 웹 개발에 필요한 수 많은 로직들이 함수의 형태로 미리 제공
    3. 크로스플랫폼
    4. 거의 모든 데이터베이스를 지원
    5. 가장 많은 공개 소프트웨어가 PHP로 만들어 짐


[PHP 7] Composer - 패키지 관리자


  • PHP의 의존성 관리도구이다.

  • 필요한 확장 기능을 쉽게 설치해주는 기능도 제공하지만, 프로젝트에서 필요한 확장 기능을 통합해서 관리해주는 도구다.

  • 의존성 정의

    • 프로젝트 설정은 compower.json파일에 기술하며 의존성 항목은 require 항목으로 기술한다. require는 “owner/packagename” : “version” 형식으로 기술
      {
      "name": "lesstif/my-project", 
      "require": {
            "laravel/framework": "4.2.*",
            "kmd/logviewer": "1.2.*",
            "monolog/monolog": "1.11.*"
            "netresearch/jsonmapper" : "*"
        },
      }
      
    • 설치 아래의 명령을 실행하면 composer.json의 내용을 읽어서 여기에 정의된 라이브러리를 설치한다.
      php composer.phar install
      


[PHP 7] PHPUnit - 테스트


  • Junit처럼 단위 테스트를 할 수있는 PHP용 Unit test 프레임워크이다.

  • 단위 테스트(Unit Testing)란?

    • 함수레벨에서 특정 부분의 동작을 검증하는 것
    • 단위 테스트 하나만으로 소프트웨어를 전체 검증할 수는 없으나, 구성요소 하나하나를 확실하게 만들 수 있다. 구성요소들이 확실해지면 전체적인 결함, 시간, 비용, 리스크를 줄일 수 있다. 특히 앞으로 변경할 코드는 문제가 없다는 확신을 갖는 것이 궁극적인 목적


[PHP 7] Mockery - 테스트


  • 애플리케이션을 테스팅할때, 애플리케이션의 특정 부분을 mock하여 주어진 테스트가 진행될 때 실제로 실행되지 않도록 할 수 있다. 동적으로 mock 객체를 만들어 주는 프레임 워크

  • Mock이란? 실제 객체를 만들기엔 비용과 시간이 많이 들거나 의존성이 길게 걸쳐져 있어 제대로 구현하기 어려울 경우, 가짜 객체를 만들어 사용한다.

    • Mock 객체는 언제 필요한가?
      • 테스트 작업을 위한 환경 구축이 어려운 경우
      • 테스트가 특정 경우나 순간에 의존적인 경우
      • 테스트 시간이 오래 걸리는 경우
      • 개인 PC의 성능이나 서버의 성능문제로 오래 걸릴 수 있는 경우 시간을 단축하기 위해 사용


[PHP 7] Laravel - 프레임워크


  • PHP를 기반으로 하는 웹 개발 프레임 워크이다.

  • MVC 아키텍처 패턴을 따라 웹 애플리케이션을 개발하기 위해 고안되었다.

  • 라라벨의 기능들 중 일부는 모듈 방식의 패키징 시스템이며, 전용 의존성 관리자, 관계형 데이터 베이스에 접근하는 각기 다른 방법, 소프트웨어 전개와 유지보수의 도움을 주는 유틸리티, 신택틱 슈거 지향이 포함된다.



[PHP 7] PSRs


  • PHP Standard Recommendation의 약자이다.

  • 프레임 워크나 라이브러리를 사용하면 종속되어 버리는 문제를 해결하고 각 프레임워크나 애플리케이션간의 상호 운용성을 확보하기 위한 PHP 표준 권고 규약이다.



Web Server(웹서버)


  • 정적 콘텐츠인 각종 파일을 클라이언트에 제공하는 역할의 서버

  • HTTP 서버는 http 요청을 처리할 수 있는 웹서버로 클라이언트가 GET, POST 등의 메소드를 이용해 요청하면 HTTP 서버가 결과를 되돌려 준다.

  • 웹 브라우저랑 다르며 서버를 돌리기 위한 HTTP 프로토콜을 따르는 소켓 서버 프로그램의 한 종류이다. ↔ 웹브라우저는 소켓 클라이언트 프로그램



[Web Server] Nginx


  • 동시접속 처리에 특화된 웹 서버 프로그램. Apache 보다 동작이 단순하고, 전달자 역할만 하기 때문에 동시접속 처리에 특화되어 있다.

  • 현재는 아파치가 시장 점유율 1위 이지만, AWS(아마존 웹 서비스) 상에서는 시장 점유율 44%에 달할 정도로 가볍고 성능이 좋은 엔진이다.

  • Apache란?

    • HTTP웹서버 → Tomcat, Resin 등의 웹 어플리케이션 서버와 같이 사용 가능하며 Open-SSL등을 설치하여 보안 강화(Https)도 가능하다.
  • 특징

    • 비동기 처리 방식(Event-Drive) 방식


RESTful APIs

REST, REST API를 선행으로 알고 있어야 이해하기 편하다.


  • REST란?
    • REpresentational State Transfer 의 약자
    • 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다.
      • 자원의 표현
        • 자원 : 해당 소프트웨어가 관리하는 모든 것 → (ex) 문서, 그림, 데이터, 해당 소프트웨어 자체 등
        • 자원의 표현 : 그 자원을 표현하기 위한 이름 → (ex) DB의 학생 정보가 자원일 때, ‘students’를 자원의 표현으로 칭함
      • 상태 전달
        • 데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달한다.
        • Json 혹은 XML을 통해 데이터를 주고 받는 것이 일반적이다.
    • HTTP URI를 통해 자원을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.
  • RESTful이란?
    • 일반적으로 REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어 (REST API를 제공하는 웹 서비스를 RESTful 하다고 할 수 있다.)
    • RESTful은 REST를 REST답게 쓰기 위한 방법으로, 누군가가 공식적으로 발표한 것이 아니다.
  • REST API란?
    • API란?
      • 데이터와 기능의 집합을 재공하여 컴퓨터 프로그램 간 상호작용을 촉진하며, 서로 정보를 교환 가능하도록 하는 것.
    • REST 기반으로 서비스 API를 구현한 것
    • 최근 OpenAPI, 마이크로 서비스 등을 제공하는 업체 대부분은 REST API를 제공한다.
    • RESTful의 목적은 이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것이다.


MVC


  • MVC는 Model-View-Controller의 약자이다.

  • Model
    • 어플리케이션이 ‘무엇’을 할 것인지를 정의
    • 내부 비지니스 로직을 처리하기 위한 역할 (ex) 처리되는 알고리즘, DB, 데이터 등
  • View
    • 화면에 무엇인가를 보여주기 위한 역할
    • Controller 하위에 종속되어, Model이나, Controller가 보여주려고 하는 모든 필요한 것들을 보여주고, 사용자의 입력을 받아 Model의 데이터를 업데이트 한다.
  • Controller
    • Model이 ‘어떻게’ 처리할 지 알려주는 역할
    • ModelView가 각각 무엇을 해야 할 지를 알고 통제함
    • 비즈니스 로직을 처리하는 Model과 완전히 UI에 의존적인 View가 서로 직접 접근하지 못하게 한다.
  • 한계
    • 복잡한 화면과 데이터의 구성이 필요한 구성이라면 Controller에 다수의 Model과 View가 복잡하게 연결되어 있는 상황이 생길 수 있다. 이 경우 새 기능을 추가할때마다 크고 작은 문제점을 가지고 소스 분석이나 테스트가 어렵다.


Authentication(인증)


  • 보안에는 기초 개념 두가지가 존재한다.
    • 인증 (Authentication)
    • 권한 (Authorization)
  • 인증
    • 웹에서 인증을 요청하는 유저는 서버에게 두 가지 정보를 제시해야 한다.
      1. 나는 ‘누구’?
      2. 내가 그 유저인 ‘증거’

      가장 쉬운 예시는 아이디와 비밀번호이다.

    • 어떤 사이트는 아이디-비밀번호로 로그인을 하고 난 후 공인인증서 로그인을 또 해야하는 경우가 있다. 이렇게 이중으로 인증하는 방식을 2FA(2-Factor Authentication)이라 한다.
    • 이 외에도 지문 인식, 안면 인식 등의 물리적인 인증 방식도 있다.
  • 권한
    1. 권한 부여(grant authority) 인증을 성공적으로 마친 후에 해당 유저에게 권한을 부여한다.
    2. 리소스 가로채기(intercept) 적절한 권한을 가진 자만 해당 자원에 접근할 수 있도록 자원의 외부요청을 가로채는 것


[Authentication] JWT(JSON Web Token)


  • JSON으로 전자 서명을 하여 URL-safe 문자열로 표현한 것

  • 서명
    • 서명 할 때 사용한 키를 사용하여 JSON이 손상되지 않았는지 확인할 수 있도록 하는 것
  • URL safe
    • URL에 포함 할 수 없는 문자를 포함하지 않는 것


[Authentication] OAuth 2.0


  • Open Authorization, Open Authentication을 뜻하는 것으로 애플리케이션(페이스북, 구글 트위터등의 서비스 제공자)의 유저의 비밀번호를 Third party앱에 제공 없이 인증, 인가를 할 수 있는 오픈 스탠다드 프로토콜

  • OAuth 인증을 통해 애플리케이션 API를 유저 대신에 접근할 수 있는 권한을 얻을 수 있다.
  • OAuth가 사용되기 전에는 아이디와 비밀번호를 사용하였는데, 이는 보안상 취약한 구조라 이 문제를 보안하기 위해 OAuth의 인증은 API를 제공하는 서버에서 진행하고, 유저가 인정되었다는 Access Token을 발급한다.


SOILD, YAGNI, KISS 등


일단 패스



regular expression(정규표현식)


  • 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식 언어 즉, 어떤 텍스트 내에서 특정한 형태나 규칙을 가진 문자열을 찾기 위해 그 형태나 규칙을 나타내는 패턴을 정의하는 것

예제

  • EX1) 개행이 아닌 문자에 매치하기
    abc.def.ghi.jkx
    
        [^\n]{3}(?:\.[^\n]{3}){3}
        -----------------------------------------------------------------
        [^\n]                       # 개행문자가 아닌 글자
            {3}                    # 가 3개 있고
                (?:                 # 캡쳐하지 않는 그룹이 시작
                  \.               # . 이 온 후
                    [^\n]{3}       # . 다음에 다시 개행이 아닌 문자가 3개
                            ){3}   # 이 그룹이 다시 3회  
    
  • EX2) 핸드폰 번호 매치하기
    010-1234-5678
    01012345678
    010.1234.5678
    
        01[016789]\D?\d{3,4}\D?\d{4}
        -----------------------------------------------------------------
        01[016789]          # 010, 011 등의 식별번호로 시작하며
        \D?\d{3,4}      # 숫자가 아닌 구분기호는 있을 수도 없을 수도
            \D?\d{4}$  # 구분기호(옵션)뒤에 4자리 숫자
    


security(보안)


  • 네트워크 보안
    • 가장 바깥에 있는 외피 보호막 시스템 내부와 외부 사이에 방화벽을 끼워 비정상적인 통신이나 패킷을 차단한다.
  • 서버 시스템 보안
    • Windows, Linux, Unix 등 운영체제에 관련된 개발을 주로 하는 업체들은 자사의 시스템에 대한 주기적인 보안 업데이트 및 패치를 통하여 ‘알려진 웹 위협’에 대응한다.
  • 웹 애플리케이션 보안
    • 애플리케이션 계층은 네트워크 계층이나 시스템 계층에 비해 기술적으로 고도화되어 있고 애플리케이션의 종류도 다양하기 때문에 대부분의 보안 관리자들이 보안 정책을 수립하고 또 적용함에 있어 가장 많은 어려움을 겪는다.

    • 시큐어 코딩(Secure Coding)
      • 개발 과정에서 개발자의 지식 부족이나 실수, 또는 각 프로그래밍 언어의 고유한 약점 등 다양한 원인으로 발생할 수 있는 온갖 취약점을 최소화하기 위해서, 설계 단계부터 보안을 고려하여 코드를 작성하는 제작 방식
    • 웹 스캐너(Web Scanner)
      • 웹 스캐너는 ‘웹 취약점 점검 툴’로도 불리며, 웹 애플리케이션 외부에서 통신을 통하여 잠재적인 취약점이나 설계상의 취약점을 분석하는 프로그램
      • 웹 스캐너의 성능과 동작은 각각 다를 수 있지만, 웹 스캐너의 핵심은 그 효과를 얻기 위해서는 꾸준한 점검을 통해 애플리케이션의 상태를 주기적 그리고 지속적으로 확인해야 함
    • 웹 서버 악성코드 탐지(Web-based Malware Detection)
      • 웹 쉘(WebShell)이라고도 불리며, 애플리케이션 내부에서 동작하는 악성코드
      • 해커는 웹 쉘을 통해 보안 시스템을 우회하여 별도의 인증 없이 시스템에 접속하는 것이 가능하다. 이를 점검하기 위해서는 전문적으로 웹 쉘만 탐지해주는 솔루션을 활용하여 서버 내부에서 탐지해야 한다. 웹 스캐너와 동일하게 웹 서버 악성코드 탐지 솔루션 또한 주기적인 점검과 실행이 필수적이다.
    • 웹 방화벽(Web Application Firewall)
      • 웹을 통한 외부의 침입이나 웹 공격을 탐지하고 대응하는 역할
      • 웹 보안 취약점을 외부에 노출되지 않도록 보호하고 해당 보호 솔루션들에게까지 공격이 미치기 이전에 외부에서 근본적으로 차단하는 역할까지 수행한다. 또한 웹 서버 악성코드가 웹 서버로 업로드되는 것도 막는다.
    • 데이터 보안(Data Security)
      • 일반적으로 데이터를 암호화함으로써 해커가 최종적으로 노리는 데이터를 알아볼 수 없게 만드는 ‘데이터 암호화’ 솔루션을 많이 사용
      • 하지만 암호화만으로 모든 일이 끝나는 건 아니고, 누가 접근할 수 있고 언제 접근했는지 등을 확인하는 접근 제어와 로그 감사에도 많은 주의를 기울어야 한다. 또한 데이터 암호화에 있어서는 암호화된 데이터를 열어 볼 수 있는 데이터 암복호화 키 관리가 매우 중요하기에, 키 관리에도 각별히 주의해야 한다.


Docker


  • 컨테이너 기반의 오픈소스 가상화 플랫폼

  • 컨테이너란?

    • 격리된 공간에서 프로세스가 동작하는 기술
    • 기존의 가상화 방식은 주로 OS를 가상화 하였으나, 성능 문제가 있어 이를 개선하기 위해 프로세스를 격리하는 방식이 등장하여, 하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VM을 사용하는 느낌을 준다.


Storage


  • 자료를 저장하기 위한 저장장치

  • 방식에 따른 종류

    • DAS(Direct Attached Storage) DAS
      • 서버에 HBA(Host Bus Adapter)를 장착하여 서버와 직접 연결 하는 방식 (ex) 개인용 컴퓨터에 외장 하드를 직접 붙인 형태
    • 장점
      • 직결 방식으로 속도가 빠르며 Switch가 필요없기 때문에 초기 구축 비용 및 추후 유지보수 비용이 저렴함
    • 단점
      • 연결할 수 있는 서버(Host)의 제한이 있고, 다른 서버에 할당되어 있는 저장영역에 접근이 불가
    • NAS(Network Attached Storage) NAS
      • 네트워크를 통하여 연결하는 방식 Switch라는 물리적인 네트워크 장비가 필요
    • 장점
      • CIFS, NFS, SAMBA 형식의 파일 서비스 프로토콜을 이용하여 파일들을 여러 서버(호스트) 또는 클라이언트(PC)에서 공유 할 수 있다.
    • 단점
      • 네트워크로 연결되다보니 Latency(지연율)에서 자유롭지 못하다. 간혹 대용량의 I/O가 발생되면 이로 인한 Latency 발생으로 다른 네트워크에 속도 저하 이슈를 발생 시킬 수 있다.
      • 파일 서비스에 특화된 방식이다 보니 DB를 사용하는 환경에서 속도저하 이슈가 발생 할 수 있다.
    • SAN(Storage Area Network) SAN
      • 서버와 스토리지 사이에 FC Switch로 연결하는 방식
    • 장점
      • 일반 네트워크와는 다른 별도의 네트워크를 이용하여 데이터를 전송함으로써 일반 네트워크의 부하를 줄여주며 FC(광채널)로 구성이 되기 때문에 높은 처리 속도를 낼 수있다.
    • 단점
      • 스토리지의 공유는 가능하나 파일 시스템같의 공유가 불가능
      • 다른 연결방식에 비해 초기 구성비용이 많이 들고 이를 유지보수 하는 비용 또한 많이 소요


[Storage] Oracle - 관계형 데이터베이스


  • Database에서 가장 많이 쓰이며, 기능 또한 가장 좋은 Database


[Storage] PostgreSql - 관계형 데이터베이스


  • 노드에 걸쳐 확장하기 쉽고 트랜잭션과 SQL 쿼리를 지능적으로 배포해 대규모 병렬 처리가 가능
  • 더 큰 용량의 컴퓨터와 메모리, 스토리지를 사용할 수 있다.


[Storage] MySQL - 관계형 데이터베이스


  • 전세계적으로 가장 널리 사용되는 오픈소스 데이터베이스
  • 다중 사용자, 다중 쓰레드를 지원하고 C, Java, Python 스크립트 등을 위한 응용프로그램 인터페이스(API)를 제공


[Storage] MariaDB - 관계형 데이터베이스


  • MySQL의 소유권 정책으로 회사를 떠난 MySQL 개발자 와드니어스가 만들었으며, 기존 DB와 호환되며 명령어와 사용법이 같은 라이센스 없는 MySQL이다.


[Storage] NoSQL 데이터베이스


  • NoSQL 데이터베이스란?
    • 초고용량 데이터 처리 등 성능에 특화된 목적을 위해 비 관계형 데이터 저장소에 비구조적인 데이터를 저장하기 위한 분산저장 시스템 (빅데이터 처리에 특화)
    • 단순 검색 및 추가작업에 있어서 매우 최적화된 키 값 저장 기법을 사용하여 응답속도나 처리효율 등에 있어서 매우 뛰어난 성능을 나타냄

    • 특징
      1. 관계형 모델을 사용하지 않으며 테이블 간 연결해서 조회할 수 있는 조인 기능이 없음
      2. 데이터 조회를 위해 직접 프로그래밍하는 등의 비 SQL 인터페이스를 통한 데이터 접근
      3. 대부분 여러 데이터베이스 서버를 묶어서(클러스터링) 하나의 데이터베이스를 구성
      4. 관계형 데이터베이스에서는 지원하는 데이터 처리 완결성(Transaction, ACID 지원)이 보장되지 않음
      5. 데이터의 스키마와 속성들을 다양하게 수용하고 동적으로 정의(Schemaless)
      6. 데이터베이스의 중단없는 서비스와 자동 복구 기능 지원
      7. 대다수의 제품이 Open Source로 제공
      8. 대다수의 제품이 고 확장성, 고 가용성, 고 성능 특징을 가짐


[Storage] Redis - NoSQL 데이터베이스


  • REmote DIctionary Server의 약어
  • 인 메모리 키 값 데이터 구조를 저장하는 키 값 스토어
  • 캐싱, 세션 관리, pub/sub 및 순위표 등에 많이 사용


[Storage] MongoDB - NoSQL 데이터베이스


  • 오픈 소스 데이터 베이스로, JSON 스타일의 문서 지향적 스토리지 시스템에 대한 지원을 제공
  • 구조와 상관없이 데이터를 저장할 수 있으며, 전체 인덱스 지원, 샤딩, 복제 등 다양한 기능을 제공하는 유연한 데이터 모델을 지원
|RDBMS|MongoDB| |:---:|:---:| |Database|Database| |Table|Collection| |Tuple/Row|Document| |Column|Field| |Table Join|Embedded Documents| |Primary Key|Primary Key ( Default _id )|


Search Engines(검색 엔진)


  • 웹에 존재하는 많은 양의 정보 중에서 사용자가 원하는 정보만을 여러 웹 사이트나 웹 페이지 등에서 검색해 주는 시스템이나 프로그램
  • 정보 수집 → 색인 → 검색 순서로 동작 (사용자가 검색엔진을 사용하기 전에 미리 웹상에서 정보를 수집하여 색인을 만들어 놓고, 사용자가 찾고자 하는 정보의 키워드를 입력하면 미리 만들어 놓은 색인 중에서 입력된 키워드에 해당하는 정보들을 찾아서 보여주는 것)
  • 현재 대부분의 검색엔진에서는 해당 과정을 크롤러(crawler)라고 부르는 정보 수집 프로그램을 사용하여 수행하고 있다.


[Search Engines] ElasticSearch


  • 아파치의 Lucene 기반으로 개발한 오픈소스 실시간 분산 검색 엔진(서버)으로 JSON 기반의 비정형 데이터 분산 검색과 분석을 지원
  • 특징
    • 설치와 서버확장이 매우 편리
    • 실시간 검색 서비스 지원, 분산 및 병렬 처리 그리고 멀티테넌시 기능을 제공
    • 다양한 기능을 플러그인 형태로 구현하여 적용 가능


GOF Design Patterns


  • the Gang Of Four 의 약어이며 해당 개발자들이 소프트웨어 개발 영역에서 디자인 패턴을 처음 제시했다. (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 4명의 개발자를 의미한다. 별 의미 없다)
  • 디자인 패턴 사용 시 장단점
    • 장점
      • 개발자 간의 원활한 의사소통
      • 소프트웨어 구조 파악 용이
      • 재사용을 통한 개발 시간 단축
      • 설계 변경 요청에 대한 유연한 대처
    • 단점
      • 객체지향 설계/구현 위주로 사용
      • 초기 투자 비용 부담
  • 정리된 디자인 패턴
    1. Iterator
    2. Adapter
    3. Template Method
    4. Factory Method
    5. Singleton
    6. Prototype
    7. Builder
    8. Abstract Factory
    9. Bridge
    10. Strategy
    11. Composite
    12. Decorator
    13. Visitor
    14. Chain of Responsibility
    15. Facade
    16. Mediator
    17. Observer
    18. Memento
    19. State
    20. Flyweight
    21. Proxy
    22. Command
    23. Interpreter


Architecture Patterns


  • 주어진 상황에서의 소프트웨어 아키텍쳐에서 일반적으로 발생하는 문제점들에 대한 일반화되고 재사용 가능한 솔루션 (소프트웨어 디자인 패턴과 유사하지만 더 큰 범주에 속함)

  • 정리된 디자인 패턴(세부 사항은 링크 참조 → 10가지 패턴 설명)

    1. 계층화 패턴 (Layered pattern)
    2. 클라이언트-서버 패턴 (Client-server pattern)
    3. 마스터-슬레이브 패턴 (Master-slave pattern)
    4. 파이프-필터 패턴 (Pipe-filter pattern)
    5. 브로커 패턴 (Broker pattern)
    6. 피어 투 피어 패턴 (Peer-to-peer pattern)
    7. 이벤트-버스 패턴 (Event-bus pattern)
    8. 모델-뷰-컨트롤러 패턴 (Model-view-controller pattern)
    9. 블랙보드 패턴 (Blackboard pattern)
    10. 인터프리터 패턴 (Interpreter pattern)


Give DDD a Shot(Domain Driven Design)


  • Domain이란?
    • 어플리케이션 내의 로직들이 관여하는 정보와 활동의 영역 (ex) 어떤 웹 서비스를 만들 때 회원 가입, 회원 탈퇴 하는 작업은 “회원”과 관련된 일련의 작업들이며, 여기서 “회원”이라는 도메인이 있다고 볼 수 있다.
  • 도메인이 중심이 되는 개발 방식을 말하며, 그 목적은 소프트웨어의 연관된 부분들을 연결하여 계속해서 진화하는 새로운 모델을 만들어 나가 복잡한 어플리케이션을 만드는 것을 쉽게 해 주는 것

  • 핵심 목표는 Loose couplint, High Cohesion으로, 각 도메인이 연결성이 적고 높은 정도로 연관되어 보다 가벼운 설계를 지향한다.

  • DDD의 3가지 주요 원리
    • 핵심 도메인과 그 기능에 집중
    • 도메인의 모델을 정교하게 구축
    • 어플리케이션 모델을 발전시키고 새롭게 생기는 도메인 관련 이슈를 해결하기 위해 도메인 전문가와 끊임없이 협력




© 2019. by mintheon

Powered by mintheon