# 면접 예상 질문

# List

  • Restful API란 무엇인가?
  • Node.js의 장단점
  • 쓰레드와 프로세스란?
  • 프로세스에 할당되는 시스템 자원에 대해서 아는지?
  • 자바를 다뤄봤는지?
  • 서버 자원이 한정될 때, 이를 극복해본 경험이 있는지?
  • 아마존 웹서비스를 써본 경험이 있는지?
  • 서버 아키텍처나 데이터베이스 설계를 해본 경험이 있는지?
  • Relational DB를 다뤄 본 경험이 있는지?
  • Javascript와 JQuery의 차이점은?
  • Functional Programming과 Procedure Programming의 차이?
  • Functional Programming과 Objective Oriented Programming의 차이?
  • Library와 Framework 차이
  • 관계형 DB와 NOSQL 차이

# REST API란 무엇인가?

REST(Representational State Transfer)란 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것들을 의미한다.

즉, 자원(resource)의 표현(representation)에 의한 상태 전달이라고 할 수 있다.

REST는 기본적으로 웹의 기존 기술 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍쳐 스타일이다.

# REST의 구체적인 개념

HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해서 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.

# 장점

HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구축할 필요가 없다.

# 단점

  • 표준이 존재하지 않는다.
  • 사용할 수 있는 메소드가 4가지(GET, POST, DELETE, PUT)밖에 없다.
  • 구형 브라우저에서는 PUT, DELETE와 같은 것을 지원하지 못할 수도 있다.

# REST API의 개념

  • API(Application Programming Interface)란 데이터와 기능의 집합을 제공하여 컴퓨터 프로그램간 상호 작용을 촉진하며, 서로 정보를 교환 가능하도록 하는 것
  • REST API란 REST 기반으로 서비스 API를 구현한 것

# REST API 특징

  • 확장성과 재사용성을 높여서 유지보수 및 운용을 편하게 해준다.
  • HTTP 표준을 기반으로 구현하므로, HTTP를 지원하는 프로그램 언어로 클라이언트와 서버를 구현할 수 있다.

# REST API 설계 기본 규칙

  1. URI는 정보의 자원을 표현해야 한다.
  • resource는 동사보다는 명사, 대문자보다는 소문자를 사용한다.
  • resource의 document 이름으로는 단수 명사를 사용해야 한다.
  • resource의 컬렉션 이름으로는 복수 명사를 사용해야 한다.
  • resource의 스토어 이름으로는 복수 명사를 사용해야 한다.
  1. 자원에 대한 행위는 HTTP Method(GET, PUT, POST, DELETE)로 표현한다.
  • URI에 HTTP Method가 들어가면 안된다.
    • GET /members/delete/1 -> DELETE /members/1
  • URI에 행위에 대한 동사 표현이 들어가면 안된다.
    • GET /members/show/1 -> GET /members/1
  • 경로 부분 중 변하는 부분은 유일한값으로 대체한다.(즉, :id는 하나의 특정 resource를 나타내는 고유값이다.)

# RESTful의 개념

  • RESTful은 일반적으로 REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어이다.
    • REST API를 제공하는 웹 서비스를 RESTful하다고 말할 수 있다.
  • RESTful은 REST를 REST답게 쓰기 위한 방법으로써 누군가가 공식적으로 발표한 것이 아니다.
    • 즉, REST의 원리를 따르는 시스템을 RESTful이란 용어로 지칭한다.

# RESTful의 목적

  • 이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것
  • RESTful한 API를 구현하는 근본적인 목적이 성능 향상에 있는 것이 아니라 일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것이 주 동기이니, 성능이 중요한 상황에서는 굳이 RESTful한 API를 구현할 필요는 없다.

# RESTful하지 못한 경우

  • CRUD 기능을 모두 POST로만 처리하는 API
  • route에 resource, id외의 정보가 들어가는 경우

# Node.js 장단점

내가 쓴 블로그 글 참고(opens new window)

# Node.js란 ?

Javascript 런타임(프로그래밍 언어가 구동되는 환경)이다.

"Javascript 실행환경"

이전에는 자바스크립트 런타임이 브라우저 밖에 존재하지 않았는데, Node.js가 나오면서 그러한 한계가 극복됐다.

단일쓰레드 기반 비동기 방식으로 구성되어 있다.

  • 쓰레드 기반 동기방식(Blocking I/O)
    • 하나의 쓰레드가 request를 받으면 모든 처리가 완료될때까지 기다리다가 처리 결과가 완료되면 다시 응답을 보냄
    • 기존 업무 처리가 완료되기 전에 또 다른 request가 있으면 새로운 쓰레드가 업무를 처리함
    • 동시 request가 많은 경우 많은 쓰레드가 필요하게 되어 서버가 과부하 됨
  • 단일쓰레드 이벤트 루프 기반 비동기 방식(Non-Blocking I/O)
    • 하나의 쓰레드가 request를 받으면 바로 다음 처리에 요청을 보내놓고 다른 작업을 처리하다가 먼저 요청한 작업이 끝나면 이벤트를 받아서 응답을 보냄
    • 동시 request가 오더라도 처리가 완료될 때까지 기다리지 않아도 되기 때문에 서버 부하가 적음

# 장점

  • 프론트와 같은 언어인 자바스크립트를 서버단에서 사용하기 때문에 같은 언어로 프론트와 백을 모두 커버할 수 있음
  • 처리 성능이 높음 (단일쓰레드 이벤트 루프 기반 비동기 방식)
  • 서버 무리가 적음
  • java(jsp)는 쓰레드에 의한 동기방식이라 요청이 오면 반드시 결과를 받은 후에 다음 로직을 처리하지만 node.js는 비동기 방식으로 요청이 오면 다음 처리에 요청을 보내두고 다른 작업을 처리할 수 있음
  • npm(node package manager)를 통해서 다양한 패키지(모듈)이 제공된다.
    • 필요한 라이브러리나 패키지를 그때 그때 설치해서 사용 가능하기 때문에 개발 효율성 향상
  • javascript 기반이기 때문에 json을 지원한다.
  • 구글이 만든 V8 엔진을 사용한다.(구글이 망하지 않는 이상 속도는 점점 빨라질 것이다.)

# 단점

  • 이벤트 기반 비동기방식이라 콜백함수의 늪에 빠질 수 있다.
    • But, ES6 async/await 함수는 비동기를 동기 프로그래밍 코드처럼 작성하도록 도와준다.
  • 단일 쓰레드이기 때문에 각각의 작업이 무거운 웹서비스에는 어울리지 않는다.
    • 가벼운 I/O가 많은 웹서비스에 어울림
  • 에러가 날 경우 모든 프로세스가 다운되기 때문에 테스트가 중요하다.
    • 모든 케이스에 대해서 소스코드를 검증해야 한다.

# Node.js가 어울리는 웹서비스

  • 간단한 로직
  • 대용량(동시에 여러 request)
  • 빠른 응답시간 요구
  • 비동기방식에 어울리는 서비스(네트워크 스트리밍, 채팅 서비스 등)

# Node.js가 어울리지 않는 웹서비스

  • 단일 처리가 오래 걸리는 경우(싱글쓰레드이기 때문에)
  • 서버 체크 로직이 많은 경우(콜백 지옥...)
  • 업무 복잡도/난이도가 높은 경우(에러가 나면 서버가 죽기 때문에 코드의 품질 중요)

# 쓰레드와 프로세스란?

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고, 쓰레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.

# Program이란?

  • 어떤 작업을 위해 실행할 수 있는 파일

# Process란?

  • 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
  • 메모리에 올라와서 실행되고 있는 프로그램의 인스턴스(독립적인 개채)
  • OS로부터 시스템 자원을 할당받는 작업의 단위
    • 할당받는 시스템 자원의 예
      • CPU 시간
      • 운영되기위해 필요한 주소 공간
      • code, data, stack, heap의 구조로 되어 있는 독립된 메모리 영역
  • 즉, 동적인 개념으로는 실행된 프로그램을 의미한다.

# 프로세스의 메모리 구조

  • Code: 소스코드가 올라가는 곳
  • Data: 전역변수, static 변수가 할당되는 곳
  • Heap: 동적 할당을 위한 메모리 영역
  • Stack: 지역변수, 함수 호출시 전달되는 인자를 위한 메모리 영역

# Process의 특징

  • 프로세스는 각각 독립된 메모리 영역(stack, heap, code, data)을 할당받는다.
  • 기본적으로 프로세스당 최소 1개의 쓰레드를 가지고 있다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간 통신을 사용해야한다.(파이프, 파일, 소켓 등을 이용한 통신 방법)

# Thread란?

  • 프로세스 내에서 실행되는 여러 흐름의 단위
  • 프로세스의 특정한 수행 경로
  • 프로세스가 할당받은 자원을 이용하는 실행의 단위

# Thread의 특징

  • 쓰레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 쓰레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에 쓰레드끼리 공유하면서 실행된다.
  • 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
  • 각각의 쓰레드는 별도의 레지스터와 스택을 가지고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.

# 멀티 쓰레딩 장단점

  • 장점
    • 메모리 공유로 시스템 자원 소모가 줄어든다.
    • 응답시간이 단축된다.
    • Context switching에 대한 오버헤드가 줄어든다.
      • 스위치해야할 메모리 영역이 줄어들었기 때문
  • 단점
    • 서로 데이터를 사용하다가 충돌이 일어날 가능성이 있다
    • 디버깅이 까다로워진다.

# 프로세스에 할당되는 시스템 자원

프로세스가 실행되기 위해서는 여러 자원을 필요로 한다. CPU, 메모리, 파일 등 여러 자원을 사용하여 프로세스가 실행된다.

여기서 이런 자원들은 한정되어 있는데 여러 프로세스가 같이 동작을 하다보면 자원들을 할당받지 못해서 문제가 발생하게 된다. 이러한 상태를 교착상태라고 한다.

그러므로 운영체제는 이러한 자원을 프로세스들에게 적절히 잘 할당을 시켜주어야 한다.

# 교착상태의 필요조건

  • 상호배타(Mutual exclusion): 하나의 프로세스가 자원을 사용할 경우 다른 프로세스는 그 자원을 사용할 수 없다.
  • 보유 및 대기(Hode & wait): 프로세스가 자신이 가질 수 있는 자원은 가지고 있지만 다른 자원이 오기를 기다리고 있는 상태
  • 비선점(No Preemption): 임의의 프로세스가 자원을 할당받은 상태일 때 다른 프로세스가 이 자원을 빼았을 수 없는 상태
  • 환형대기(Circular wait): 프로세스의 자원 할당에서 첫 번째 프로세스와 마지막 프로세스의 자원할당이 겹치게 되어 원형에 있는 모든 프로세스가 자원 할당을 받고자 기다리는 형태가 만들어지는 것

# 프로세스 자원의 개념

컴퓨터 시스템 내에서 프로세스는 스스로 움직이는 능동적인 개체이지만, 자원이란 커널에 의해 다른 주체에게 할당되고 이것의 사용이 끝날 경우 다시 반납되는 피동적인 개체에 해당한다.

하드웨어자원은 기억장치나 프로세서, 하드디스크, 자기테이프, 모니터, 키보드 등의 각종 하드웨어 장치들을 의미하며, 소프트웨어 자원은 메시지, 시그널, 파일, 각종 공유 소프트웨어 등을 의미한다고 할 수 있다.

# OOP, PP, FP

  • 명령형 프로그래밍: 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식
    • 절차지향 프로그래밍(Procedural Programming): 수행되어야 할 연속적인 계산 과정을 포함하는 방식(C, C++)
    • 객체지향 프로그래밍(Object Oriented Programming): 객체들의 집합으로 프로그램의 상호작용을 표현(C++, Java, C#)
  • 선언형 프로그래밍: 어떤 방법으로 해야하는지를 나타내기보다 무엇과 같은지를 설명하는 방식
    • 함수형 프로그래밍(Functional Programming): 순수 함수를 조합하고 소프트웨어를 만드는 방식(클로져, 하스켈, 리스프)

# 명령형과 선언형 프로그래밍 비교

  • 명령형: 알고리즘을 명시하고 목표는 명시 안함
  • 선언형: 알고리즘은 명시하지 않고 목표만 명시

# 절차지향프로그래밍(Procedural Programming)

절차지향프로그래밍은 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다.

프로그램의 순서와 흐름을 먼저 세우고 함수를 설계하는 방식.

대표적인 언어로는 C언어가 있다.

명령이 순차적으로 실행된다.

Procedural = functions = routine = subroutine

함수라는 것을 이용해서 프로그램을 만들어가는 패러다임이다.

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

객체지향프로그래밍은 클래스를 통해서 연관있는 함수와 데이터를 하나로 묶어서 객체를 생성해 프로그래밍을 하는 방식이다.

객체지향프로그래밍은 아래의 네가지 특징을 골고루 사용해서 프로그래밍을 하는 방식이다.

그에 반해 클래스 기반 프로그래밍은 아래와 같은 특징을 사용하지 않는다.

  • 추상화
  • 캡슐화
  • 상속
  • 다형성

# 객체지향프로그래밍의 장단점

  • 장점
    • 코드 재사용이 용이하다.
      • 다른 사람이 만든 클래스를 가져와서 쓸 수도 있고, 필요하다면 상속을 이용해서 확장해서 사용할 수도 있음
    • 유지보수가 쉬움
      • 절차지향프로그래밍에서는 코드를 수정할 때 일일이 그 부분을 찾아서 수정해야하지만, 객체지향프로그래밍에서는 클래스 내부에 변수나 메서드로 구현되어 있기 때문에 해당 부분만 수정할 수 있음
    • 대형 프로젝트에 적합하다.
      • 프로젝트를 독립적인 객체 단위로 분리해서 작업할 수 있기 때문에 여러 개발자들과 협업해서 작업해야하는 규모가 큰 프로젝트에서 유리하다.
  • 단점
    • 처리속도가 상대적으로 느리다.
    • 객체가 많으면 용량이 커질 수도 있다.
    • 설계할 때 시간과 노력이 필요하다.

# 클래스와 인스턴스(객체)

클래스: 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐서 집단에 속하는 속성과 행위를 변수와 메서드로 정의한 것

인스턴스(객체): 클래스에서 정의한 것을 토대로 실제 메모리상에서 할당된 것으로 실제 프로그램에서 사용되는 데이터

# 객체지향에서의 추상화

불필요한 정보는 숨기고 중요한 정보만을 밖으로 내보내는 것

# 캡슐화

캡슐화는 코드를 재수정 없이 재활용 하는 것을 목적으로 하는 것이다.

객체지향프로그래밍에서의 캡슐화는 기능과 특성의 모음을 "클래스"라는 "캡슐"에 분류해서 넣는 것이다.

# 상속

상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고, 기능의 일부분을 추가하거나 변경해야 할 경우에 상속받은 자식 클래스에서 해당 기능만 다시 정의하여 사용할 수 있게 하는 것이다.

# 다형성

다형성이란 하나의 변수명, 함수명 등이 상황에 따라서 다른 의미로 해석될 수 있는 것이다.

즉 오버라이딩, 오버로딩이 가능하다는 이야기이다.

  • 오버라이딩: 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는 것

  • 오버로딩: 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라서 다르게 호출할 수 있게 하는 것

# 절차지향과 객체지향의 차이점

구분 절차지향프로그래밍 객체지향프로그래밍
처리방식 문제를 여러개의 함수로 나누어서 순차적으로 호출하여 처리하는 방식 문제를 여러개의 객체 단위로 나누어서 처리하는 방식
단점 대형 프로젝트에서는 적합하지 않음 설계할 때 시간과 노력이 필요함
장점 소규모 프로젝트에 용이함, 배우기 쉬움 대형 프로젝트에 적합함

#

# 함수형프로그래밍(Functional Programming)

함수형 프로그래밍은 **순수 함수(pure-function)**를 조합하고 공유상태(shared state), 변경 가능한 데이터(mutable data), **부작용(side-effects)**을 피하여 프로그래밍을 하는 프로세스이다.

또한 명령형이 아닌 선언형이며 애플리케이션의 상태는 순수 함수를 통해서 전달된다.

# 순수함수(pure-function)

  • 같은 입력이 주어지면 항상 같은 출력을 반환한다.
  • 부작용이 없다.

# 공유상태(shared state)

  • 공유 범위(shared scope) 내에 있는 변수, 객체 또는 메모리 공간이거나 범위 간에 전달 되는 객체의 속성

# 불변성(Immutability)

불변성은 함수형 프로그래밍의 핵심 개념이다.

불변성과 javascript의 const는 다르다. 불변 객체는 절대 변경될 수 없다.(freeze)

# 선언형 vs 명령형

함수형 프로그래밍은 선언적 패러다임

  • 명령형: 원하는 결과를 얻기 위해서 특정 단계를 설명하는 코드 라인을 사용한다.(HOW)
  • 선언형: 흐름 제어를 추상화하고, 대신에 데이터 흐름을 설명하는 코드 라인을 사용한다.(WHAT)

# 결론

  • 공유상태(shared state)와 부작용(side effects) 대신 순수함수(pure function)을 사용하라
  • 변경 가능한 데이터 보다 불변성(Immutability)를 따르라
  • 명령형(Imperative) 흐름 제어보다는 합성함수(Function composition)를 사용하라
  • 같은 곳에 있는 데이터에서만 작동하는 메서드 대신에 많은 데이터 유형에 대해 작업할 수 있도록 고차함수(Higher order functions)를 사용하여 일반적이고 재사용 가능한 도구를 만들어라
  • 명령적(Imperative) 코드보다 선언적(Declarative, 무엇을 해야하는지)코드를 만들어라
  • 구문(Statement)보다는 표현식(Expression)을 사용하라
  • ad-hoc polymorphism(가장 단순한 형태의 다형성)보다는 컨테이너와 고차 함수를 사용하라

# 1급객체

아래의 3가지 조건을 충족하면 1급객체라고 할 수 있다.

  1. 변수나 데이터에 할당할 수 있어야 한다.
  2. 객체의 인자로 넘길 수 있어야 한다.
  3. 객체의 리턴값으로 리턴할 수 있어야 한다.

# Javascript & Jquery

Javascript는 웹 브라우저에서 작동하는 스크립트이다. 주로 서버사이드 언어가 아닌 클라이언트 언어로 사용된다.

Jquery는 Javascript 라이브러리이다. Javascript로 빈번하게 사용되는 기능들을 약간 다른 형식으로 사용하게 만든 라이브러리 입니다.

모던 자바스크립트의 시대가 열린 이후로는 많은 개발자들이 jQuery를 사용하고 싶어하지 않는다.

jQuery가 아무리 간편하다고 해도 대부분의 우리가 필요한 기능들에 비해 너무 크기가 비대하다.

jQuery는 개발자들이 DOM(Document Object Model) 조작을 좀 더 편리하게 할 수 있도록 도와주는 기능들을 갖고 있다.

Vanilla Javascript를 사용했을 때와 jQuery를 사용했을 때의 퍼포먼스가 확연히 차이가 난다.

# RDBMS

# DBMS란?

DBMS(DataBase Management System)는 데이터베이스를 관리하는 시스템이다.

# Database란?

  • 데이터들이 모여 이루는 데이터 단위로 데이터를 저장, 유지보수하고 이를 검색하는 시스템
  • CRUD
  • 대량의 데이터를 처리하는 시스템

# RDBMS란?

RDBMS는 관계형 데이터 모델에 기초를 둔 데이터베이스이다. 관계형 데이터 모델이란 데이터를 구성하는데 필요한 방법 중 하나로써 모든 데이터를 2차원의 테이블 형태로 표현합니다.

RDB는 데이터의 독립성이 높고, 고수준의 데이터 조작언어(DML)를 사용하여 결합, 제약, 투영 등의 관계 조작에 의해 비약적으로 표현능력을 높일 수 있습니다.

  • 모든 데이터를 2차원 테이블로 표현
  • 테이블은 row(record, tuple)와 column(field, item)으로 이루어진 기본 데이터 저장 단위
  • 상호 관련성을 가진 테이블의 집합
  • 확장이 용이하다는 장점을 가짐
  • ER(Entity Relationship) 모델에 따라서 데이터베이스를 모델링하며, 데이터베이스는 하나 이상의 테이블로 구성됨. ER 모델에서는 Entity를 기반으로 테이블이 만들어짐

# RDBMS의 구조

Column = Field = Attribute

Row = Record = Tuple

# SQL란?

  • RDBMS에서 데이터를 관리하기 위해서 사용되는 표준 프로그래밍 언어
  • SQL은 크게 세 가지 종류로 나뉜다.
    • DDL(Data Definition Language): TABLE, INDEX 등의 개체를 만들고 관리하는데 사용되는 명령어
      • CREATE, ALTER, DROP
    • DML(Data Manipulation Language): 데이터의 CRUD를 위해 사용되는 명령어
      • INSERT, UPDATE, DELETE, SELECT
    • DCL(Data Control Language): 데이터 핸들링 권한 설정, 데이터 무결성 처리 등 수행
      • GRANT, BEGIN, COMMIT, ROLLBACK

# Library & Framework

라이브러리 - 내가 필요로 할 때 도서관에서 자료 찾는 것 처럼 마음대로 빌려서 쓰는 것

프레임워크 - 정해진 프레임 내에서 작업해야하는 것

# SQL(관계형 데이터베이스)과 NoSQL(비 관계형 데이터베이스) 차이

# SQL Database

SQL(Structured Query Language)은 구조화된 쿼리언어를 말한다. 따라서 이 SQL을 사용하게되면 RDBMS에서 데이터를 저장, 수정, 삭제 및 검색 할 수 있다.

  1. 엄격한 스키마
    1. 데이터는 테이블에 레코드로 저장되며, 각 테이블에는 명확하게 정의된 구조가 있다.
    2. 한 번 정의된 테이블에 새로운 필드를 넣을 수 없다. (스키마를 준수해야함)
  2. 관계
    1. 데이터의 중복을 피하기 위해서 데이터들을 여러 테이블로 나누어서 저장한다.
    2. 데이터가 항상 하나의 테이블에서만 관리되기 때문에 잘못된 데이터가 테이블 전체에 복제되어 발생하는 문제가 없다.

# NoSQL Database

NoSQL은 스키마와 관계가 없다.

NoSQL에서는 테이블을 컬렉션, 레코드를 문서라고 부른다. 이것은 단순히 이름만 다른 것이 아니라 핵심적인 차이가 있다. SQL에서는 정해진 스키마를 따르지 않는다면 데이터를 추가할 수 없지만, NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가할 수 있다.

NoSQL은 document-db, key value-db로 나누어진다.

NoSQL에서 문서(Document)는 JSON 데이터와 비슷한 형식을 가지고 있다.

예를들어, document DB인 MongoDB는 데이터를 json document로 저장한다. 이것은 보통의 SQL처럼 행과 열이 존재하는 것이 아니라 내가 원하는 어느 종류, 어떤 모양의 데이터로든 저장할 수 있다. 데이터의 구조가 매우 엄격한 SQL과 달리 NoSQL은 매우 자유롭다.

key-value DB에는 CasandraDB, DynamoDB 등이 있다.

CasandraDB는 Column-wide-database이다. 이 데이터베이스는 읽기와 쓰기 속도가 정말 빠르다는 것이 장점이다. 따라서 많은 양의 데이터를 빠르게 저장하는 서비스에서 굉장히 잘 어울린다.

DinamoDB는 서버리스 DB로서 아마존이 만든 DB이다. 예를들어서 듀오링고가 DynamoDB를 사용하는데 매초 24,000개의 읽기를 지원한다!

따라서 key-value db는 읽기와 쓰기가 정말 많이 요구될 때 좋은 선택지가 될 수 있다.

하지만 key-value db를 사용할 때는 document db와 다르게 어떤 데이터를 얻을지를 먼저 생각해야 한다.

SQL은 어떤 데이터를 얻을 것인지를 생각하지 않고, 데이터의 구조에 대해서 생각을 한다. 하지만 DinamoDB는 저장하기 전에 미리 어떤 데이터를 얻을 것인지를 고민해야 한다.

# 수직 및 수평 스케일링

두 데이터베이스를 비교할 때 살펴봐야할 또 하나의 중요한 개념은 스케일링(Scailng: 확장)이다.

확장은 수직(Verticle) 확장과 수평(Horizontal) 확장으로 구별할 수 있다.

  • 수직확장: 단순히 데이터베이스 서버의 성능을 향상시키는 것(ex. CPU 업그레이드)
  • 수평확장: 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산되는 것

# 각 데이터베이스의 장단점

SQL 장점

  • 명확하게 정의된 스키마, 무결성 보장
  • 관계를 통해서 각 데이터를 중복없이 한 번만 저장할 수 있음

NoSQL 장점

  • 스키마가 없기 때문에 유연성 높음. (저장된 데이터를 언제든지 조정할 수 있고, 새로운 필드를 추가할 수 있음)
  • 데이터는 애플리케이션에 필요한 형식으로 저장됨(데이터를 읽는 속도가 빠름)
  • 수직 및 수평 확장이 가능하므로 데이터베이스가 애플리케이션에서 발생시키는 모든 읽기/쓰기 요청을 처리할 수 있음

SQL 단점

  • 상대적으로 덜 유연하며, 데이터 스키마를 미리 알고 계획해야 함(나중에 수정이 어렵거나 불가능함)
  • JOIN문이 많은 복잡한 쿼리가 만들어 질 수도 있음
  • 수평 확장이 어렵고 보통 수직 확장만 가능함(어느 시점에서 처리량/처리 능력과 관련하여 약간의 성장 한계에 직면할 수 있음)

NoSQL 단점

  • 유연성 때문에 데이터 구조 결정이 늦어질 수 있다.
  • 복사된 데이터가 변경되면 여러 콜렉션과 문서를 수정해야 한다.

# SQL이 좋을 때

  • 앱의 여러 부분에서 관련 데이터가 비교적 자주 변경되는 경우(NoSQL이라면 항상 여러 컬렉션을 수정해야함)
  • 명확한 스키마가 중요하며 데이터 구조가 극적으로 변경되지 않을 때
  • Foreign key로 join을 한다던지 index를 계속 체크해야할 때

# NoSQL이 좋을 때

  • 정확한 데이터 요구사항을 알 수 없거나 관계를 맺고 있는 데이터가 자주 변경되는 경우
  • 읽기 처리를 자주하지만 데이터를 자주 변경하지 않는 경우
  • 데이터베이스를 수평으로 확장해야 하는 경우