관계형 데이터베이스와 NoSQL에 대한 이야기

 

 

우리가 흔히 많이듣고 접하는 데이터베이스는 관계형 데이터베이스(RDB) 일것이다

전자정부프레임워크라고 해서 공공기관에서 하는 여러 개발프로젝트는 Spring과 RDB인 MySQL, Oracle 등 거의 정형화 되있다고 보면된다

 

여기서 전자정부프레임워크는 왜 주로 관계형 데이터베이스들이 많은것일까?

이것에 대한 고민으로 부터 시작해서 관계형 데이터베이스의 장점과 단점 그리고 어느때 쓰면좋은지, 관계형데이터베이스의 단점을 보완하기 위해서 나온 방법은 무엇이고 NoSQL의 장점과 단점도 알아보도록 하자

 

 

 

 

 

 

 

우선 관계형 데이터베이스의 데이터 저장형식에 대해서 살펴보도록 하자

관계형 데이터베이스는 흔히 정형화된 데이터들을 관리하는데 주로쓰이는데 테이블과 튜플, 그리고 안에있는 속성으로 엑셀의 표와같은 형태로 저장되게된다

 

 

 

자 여기서이제 주목해야될것은 RDB는 정형화된 데이터라는 것이다

형식이 있는 데이터의 모음이기때문에 데이터의분류와 정렬, 탐색속도가 빠르며, 스키마가 명확하게 정의되어있기에 한눈에들어온다

그리고 ACID에 따라 데이터의 신뢰성이 높으며 무결성을 보장해준다

데이터를 중복없이 한번만 저장할수있으며, 유지보수가 편하다는 장점을 가지고있다

여러가지 장점중에 RDB를 쓰는것은 트랜잭션을 잘 구현해놓았기때문에 데이터의 무결성을 보장해주는데 이것은 곧 데이터가 곧 돈인 중요한 시스템에서 잘쓰인다는것이다

 

하지만 이 정형화된 데이터형식으로인해 발생하는 단점이 있는데 첫번째로는 새로운 스키마를 추가할경우 많은것을 수정해야한다는 것이다 이는 곳 확장에 불리하다는 것을 알수있다

또한 삽입이상을 제어하기위해 우리는 데이터베이스 정규화를 하는데 정규화로 여러개로 쪼개진 데이터베이스들을 다시 조립할때는 Join을 사용한다 이는 곧 복잡한 쿼리가 만들어지며, 퍼포먼스에 영향을 줄수있다

 

그리고 성능향상을 위해서 Scale-up을 하게되면 많은 비용이 든다는것이다 Scale-out 같이 여러개의 서버를 둘경우에는 Join이 많은 쿼리경우 성능에 영향을 줄수있고 무엇보다 구현하는것이 복잡하고 어렵다

위에 단점들을 하나로 정리하자면 관계형 데이터베이스는 많은 자원 (커넥션, Join 등) 을 사용하기떄문에 시스템부하가높다

 

그러므로 RDB는 주로 대규모트래픽을 감당해야하는 큰 서비스보다는 공공기관 프로젝트처럼 비교적 적은사용자와 보안이 중요한 (학사관리 등) 프로젝트에서 주로 쓰인다

실제로 결제시스템같은 중요한 기능을 담당하는 것은 따로 관계형 데이터베이스로 관리하기도한다

 

 

 

 

 

그다음은 NoSQL에 대해서 알아보자 NoSQL은 SQL을 사용하지 않기때문에 이름이 붙혀진것이 아니라 Not only SQL로써 SQL 만을 지원하지않고 여러가지 포맷을 지원한다는 의미이다

 

NoSQL은 RDB와 다른 비정형화된 데이터를 저장하고 다룰수있다

이게무슨말이냐면 RDB는 테이블안에 표형태로 정돈되어 저장되지만 NoSQL은 따로 형식이 없다 그냥 저장할수있다

 

 

 

 

위에 사진은 MongoDB에 데이터를 넣는 방법인데 db.이름.save를 통해 데이터를 JSON형태로 저장할수있다

이는 곧 기존형식에 맞춰야하는 RDB에 비해서 유연한 데이터저장방식을 지원한다

그리고 RDB와 다르게 중복을 허용한다 이는곳 Join연산을 하지않는다는 것이다

 

이러한 유연한 저장방식덕분에 대용량의 데이터를 저장할수있으며 Scale-up이나 Scale-out 분산시스템등에 더 용이하다

서버에 데이터를 분산저장하여 특정서버에 에러가 발생해도 서비스 중지가 발생하지 않도록 하는것이다

 

NoSQL은 RDB에 있던 ACID의 일부를 포기하며 high-throughput과 low-latency를 모티브로 하기때문에

처리량이 RDB에 비해서 무척 빠르다는것을 알수있다

 

물론 ACID를 지원하는 다른 NoSQL도 있지만 자세히 알진않으니 패스하도록 한다

NoSQL은 저장방식이나 동작구조에 따라서 정말많은 데이터베이스의 종류들을 지원한다

한 예로 KEY와 VALUE 형태로 저장하는 NoSQL도있는데 Redis가 대표적인 예이다

이는 곧 단순한 구조때문에 속도가 빠르며 분산저장에 용이하다

 

또한 특이하게 Wide-Column 형식으로 저장하는 데이터베이스도 존재하는데 대표적으로 Hbase가 그런형식이

 

 

NoSQL의 단점은 어찌보면 RDB가 가진 장점들을 일부포기했기때문에 이게 단점이 될수도있는데

RDB는 트랜잭션을 통해서 중간에 장애가 발생하게되면 데이터의 무결성을 막아줄수있지만 NoSQL은 중간에 장애가 발생하면 데이터의 손실이 발생할수도있다

 

또한 많은 인덱스를 사용하려면 충분한 메모리가 필요하다 이는 곳 인덱스의 구조가 메모리에 저장된다는것을 의미한다

 

정리해보자면 RDB는 주로 처리량이 많이 요하지는 않고, 중요한 데이터를 다루는 서비스에 적합하다

NoSQL는 서비스에 따라서 다르지만 많은 처리량과 빠른응답속도를 필요로 하는 서비스에 적합하다

 

이는 기획자가 잘 컴토해서 어떤 데이터베이스를 사용할지 정하는 요소이며, 기획하는 프로젝트의 방향성을 알수있는 지표가 될수도있다

트레이드 오프를 잘 따져보면서 어떤걸 사용할지 생각해보도록 하자