3주차 수업은 DBMS에 관한 내용이었다. 개인적으로 2학년 데이터베이스 수업을 절어서(?) 잘 모르기도 하고, 꼭 한 번 제대로 파보고 싶었다.

해피 서버와 드림 서버

1주차에는 단순히 로컬에 서버를 구축했고, 2주차에는 클라이언트와 서버를 분리했다. 이번 3주차의 핵심은 서버단에서 DBMSDB를 분리하는 것이다.
초등학생 때 매일같이 했던 크레이지아케이드 게임에는 해피 서버와 드림 서버가 있다. 해피 서버 사용자와 드림 서버 사용자는 서로 만날 수가 없다. 어떤 로직 때문에 이렇게 됐을까?

Server program + Back-end Language + DBMS

서버단에 대한 설명에서 Server program / Back-end Language / DBMS 세 파트를 통틀어서 서버라고 불렀다. 이번 포스팅에서는 편하게 APM이라고 부르겠다. 지금부터는 쉽게 설명을 하기 위한 가정일 뿐 실제로 넥슨이 서버를 나누어 서비스한 이유와는 무관하다.
해피 서버를 운영하던 도중 사용자가 너무 많아져 서버를 새로 만들어야한다고 생각해보자. APM을 통으로 하나 더 구축했고 아래와 같은 문제가 발견됐다.

  • 해피 서버 사용자와 드림 서버 사용자가 만나서 게임할 수 없다.
  • 유능한 해커에게 서버가 털리면 모든 사용자들의 정보가 날라간다.
  • APM 중 A(Apache)와 P(PHP)는 같은 로직으로 만들어져 중복된다.

이러한 문제는 M(MySQL)을 분리하여 쉽게 해결할 수 있다.

Server program + Back-end Language / DBMS

DBMSM을 분리하여 관리한다고 생각해보자. 사용자가 훨씬 많아져 서버를 또 만든다해도 1개의 데이터베이스로 모든 서버에 접근이 가능하다. DB를 외부에서 관리하기 때문에 보안상으로도 훨씬 안정적이다.

rDBMS

  • Server program : 종업원
  • Back-end Language : 요리사
  • DBMS : 스마트 냉장고

나는 현재 레스토랑에 와있고, 서버단 세 파트 각각을 위와 같이 비유해서 설명해보겠다. 클라이언트인 내가 종업원에게 스테이크를 주문하면 종업원은 요리사에게 메뉴를 전달할 것이다. 고기가 바로 준비되어 있으면 좋겠지만, 그렇지 않은 경우 요리사는 스마트 냉장고한테 고기 200g 줘라고 요청해야 한다. 이것이 우리가 흔히 말하는 query이다.

SQL (Structured Query Language)

방금 요리사가 요청한 것처럼 데이터를 관리하기 위해 만들어진 특수한 프로그래밍 언어를 SQL이라고 한다. 그리고 이러한 SQL을 사용하는 것이 바로 rDBMS 즉, 관계형 데이터베이스 관리 시스템이다. 쉽게 말해 테이블 간의 관계가 형성된 데이터베이스를 관리하는 것이다. 그래도 어렵다면 실생활 예를 들어보겠다.

출석부와 학적부

  • 출석부 : 학번, 이름, 사진
  • 학적부 : 학번, 전화번호, 주소

출석을 부르는데 아무개 가 결석한 것 같다. 아무개 한테 연락하려면 어떻게 해야 할까?
우리는 직관적으로도 알 수 있다. 출석부에서 아무개 의 학번을 찾아 학적부에서 해당 학번의 전화번호를 확인하면 된다. 이렇게 서로 관계를 형성하는 것이 바로 관계형 데이터베이스, rDB이다.

데이터 모델링

그렇다면 우리는 항상 SQL을 사용할 수 있을까? 전혀 그렇지 않다. 쿼리문을 사용하기 위해서는 당연히 잘 정제된 데이터가 필요하다. 그러기 위해서는 데이터 모델링을 반드시 거쳐야 한다.
데이터 설계라도고 불리는 데이터 모델링은 현실 세계를 표로 바꿔주는 작업이다. 추상화라고 볼 수도 있는데, 아래의 세 단계를 거친다.

분석 -> 논리적 모델 -> 물리적 모델

인스타그램 앱을 예로 들면 분석 과정은 사용자 닉네임, 프로필 사진, 게시글, 좋아요 수 등 모든 요소를 뽑아내는 것이다. 논리적 모델은 분석한 것을 바탕으로 entity / attribute / relation을 추출하는 것이다. attribute 중 연관된 것들끼리 묶은 것이 entity이며, 이러한 entity 사이의 관계를 정의한 것이 바로 relation이다.
이것을 DBMS로 옮긴 것이 물리적 모델이라고 봐도 무방하다. entity와 attribute는 각각 테이블컬럼에 대응된다. relation은 primary key / foreign key / join 등으로 매칭된다.

NoSQL은 ?

지금까지 관계형 데이터베이스에 대해서만 알아봤다. MySQL이나 postgreSQL, Oracle은 모두 이러한 관계형 데이터베이스를 관리하는 rDBMS인 셈이다.
그렇다면 NoSQL은 대체 뭘까? 한마디로 정의하자면 SQL 형태가 아닌 모든 것들을 뜻한다. key-value 형태의 DBMS 혹은 graph DBMS처럼 SQL 형태가 아니기만 하면 된다.