0.
NodeJS를 이용해 백엔드단의 서버를 만들어보면서
txt파일이나, json파일, csv파일 정도를 읽고 쓰는 과정을 배워보았다.
실제로도 야후파이낸스나 트레이딩뷰 api를 이용할때,
한국은행경제통계 시스템이나 공공데이터 통계자료를 사용할 때에도
csv파일을 다운 받아 엑셀로 열고 수정하는 작업을 많이 경험해보았을 것이다.
그렇다면. 굳이 DB를 사용하지 않고
파일 하나 만들어 놓고 거기에 수정하고 쓰고하면 되지 않을까?
맞는 말이다.
사실 규모가작고 혼자서 쓰는거라면 지금도 그렇게 해도 되지만...
데이터를 통째로 불러와서 다시 쓰는 행위를 수천수만번 반복하기 시작하면 이게 매우 비효율적인것을
느끼게 될 것이다.
파일의 양식을 정하고 그에 맞춰서 데이터를 처리하는 기능,
lock을 이용하여 Mutual Exclusive하게 작업하는 기능,
오류가 발생하였을 때 롤백하는 기능
병렬적으로 트랜잭션을 수행하는 기능,
모듈화를 통해서 웹서비스와 데이터처리의 단계를 따로따로 관리하는 기능 등..
수천, 수만명의 사용자들의 요청을 처리하기 위해서는 DB가 필요하다는 것을 느낄 수 있을 것이다.
정처기할때 ACID?랑 CRUD하면서 이게 무슨소리를 하는지는 대강 들어봤을 터이다.
1.
(1) CRUD 기능을 더 효율적으로 수행하고
(2) 유저가 더 많이 늘어 났을때도 작업을 문제없이 수행하는 Scalability(확장성)
(3) 여러 작업들을 병렬적으로 수행하는 Concurrent Access
을 하기 위해서
실제 서비스에서는 DBMS를 사용한다.
- simulatneous read/ write access
- optimize data storage and retrieval
- data querying ( =data filters)
기능을 제공해주며
거의 대부분의 웹사이트가 이러한 DBMS를 사용한다.
여러가지 DB솔루션이 있지만
대부분의 경우 두가지로 분류할 수 있다.
(1) SQL(Structured Query Language, 시퀄, 에스큐엘)을 통해
RDMS(Relational Database Management System, 관계형 데이터베이스 관리시스템)을 다루는 경우
= SQL DB
(2) 혹은 NoSQL언어를 이용해
Non-Relational Database Management System을 다루는 경우이다.
= NoSQL DB
위와 같은 두종류의 데이터베이스 상에서
DB가 수행해야할 CRUD operation을 질리도록 배워나갈 것이다.
CRUD란
Create Read Update Delete 기능을 의미한다.
---
2.
SQL와 RDBMS
SQL DB에서는
여러단계에 거쳐 정규화(Normalize)를 거친 Table에 데이터를 저장한다.
정처기에서 배웠던 1NF~5NF와 BCNF를 기억하는가..
<Airport>
ID City Country
MUC Munich Germany
JFK New York US
BCN Barcelona Spain
<Flights>
ID Start Dest
FL123 MUC JFK
FL331 BCN MUC
FL591 JFK BCN
과 같이, 여러가지 테이블 상에 데이터를 저장하고
특정 테이블의 ID에 있는 데이터를 다른 테이블의 데이터에 연관(Relation)짓는 방식으로
DB를 구성한다.
테이블과 속성들과 관련된 스키마가 존재하기는 하지만,
사용자가 직접 이러한 Relational DB에 데이터를 저장하지는 않다.
테이블과 스키마, 데이터유형을 미리 정해놓고
DB와 상호작용하는 것으로 사용자는 데이터를 직접 저장하고 읽지 않아도 되는 이점을 가지게 된다.
(*SQL의 DDL말하는거)
여러 테이블, 분리된 데이터
정의된 데이터타입과 스키마, 릴레이션 을 통해
확실하게 데이터를 다룰수 있다는 점이 RDBMS의 특이다.
---
3.
NoSQL
앞선 수업에서 json파일 포맷에 대해서 알아 보았다.
대괄호(backet mark, {} )와 쌍따옴표( double quote mark , "" )를 이용해서
(*파이썬에서 배웠던 딕셔너리처럼) key-value형태로 나타낸 양식이다.
이러한 json 파일의 구조와 NoSQL DB의 구조는 거의 비슷하다.
데이터를 하나의 테이블 상에서 DB를 다루기 위한 쿼리를 최대한 단순화(Simplify)하도록
구조화 한것.
앞서 배운 비행기와 관련된 데이터를 저장한다고 할 때,
{
"FlightCode" : 123,
"Start" : {
"APCode" : "MUC",
"APCity" : "Munich",
"APCountry" : "Germany"
},
"Dest" : {
"APCode" : "JFK",
"APCity" : "US",
"APCountry" : "US"
},
}
{
"FlightCode" : 331,
"Start" : {
"APCode" : "BCN",
"APCity" : "Barcelona",
"APCountry" : "Spain"
},
"Dest" : {
"APCode" : "MUC",
"APCity" : "Munich",
"APCountry" : "Germany"
},
}
와 같이 많은 데이터 중복이 발생하고
중첩된 형태로 데이터를 저장한다.
RDBMS로 따지면, 여러개의 테이블이 아니라 하나의 테이블안에
데이터와 관련된 정보를 그냥 다 적어넣는 것이다.
이러한 방식의 이점은 더 적은 쿼리로 더 많은 데이터를 얻어올 수 있다는 것.
가령 모든 항공편의 FlightCode를 가져오고 있다면,
Relation 같은거 생각안하고
한테이블에 대해서 "FlightCode" Key에 대한 값만 한번에 가져오는 것이 가능하다.
스키마도 없고 여러 테이블이 있는게 아니기에
정해진 틀에 맞춰서 데이터를 다루지 않고 유연한 대응이 가능하다는게
NoSQL DB의 특징이다.
---
4.
두 형태의 DB에 대해서 정답은 없다.
SQL과 NoSQL은 각각 상황에 따라 장점이 될 수도, 단점이 될 수도 있는 특징을 가지고 있으며
프로젝트의 상황과 개발자의 성향에 따라 잘 선택해서 사용하는 것이 좋다.
온라인쇼핑몰에서 수천명, 수만명의 주문자의 주문과 상품, 결제정보를 저장해야한다면
관계형 DB를 사용해서 테이블을 여러개 사용할 수 있지만
소규모로 사용하는 사람들이 많지 않고, 신속한 개발과 유연성이 필요한 프로젝트라면
NoSQL도 괜찮을 것이다.
Scalability의 측면에서 SQL이 좋은 편이고
Simplicity의 측면에서 NoSQL이 좋은 편이다.
Clear Winner는 없다.
NoSQL이 최근 인기있는 경향이 있지만
SQL도 많이 쓰고, 둘을 섞어 쓰기도 하기 때문에
결론은
둘다 배워놔라..
---
'지식이 늘었다 > 웹개발' 카테고리의 다른 글
DB (3) MySQL 튜토리얼 (1) - CREATE, ALTER, SELECT (0) | 2024.12.05 |
---|---|
DB (2) MySQL 설치 (0) | 2024.12.04 |
NodeJS (6) JS 개념 심화, ...연산자, 비동기함수와 프로미스, async/await (0) | 2024.12.02 |
NodeJS (4) EJS 템플릿 (0) | 2024.12.01 |
NodeJS (3) ExpressJS를 활용한 유저 데이터 저장 및 반환 (0) | 2024.12.01 |