DataBase & SQL, Schema design, DataBase 설계, Node.js에서 데이터베이스 사용
✍️ Today I Learned
1. DataBase & SQL
1-1. DataBase
데이터베이스는 IN-MEMORY, FILE I/O 방식의 한계와 관리하는 데이터의 양이 방대해짐에따라 효율적이고 데이터의 무결성을 지키기 위해 고안된 데이터에 특화된 서버이다.
이 데이터베이스가 활용되는 구조는 이전의 “2-TIER 아키텍쳐”인 클라이언트/서버의 구조에서 더 나아가, 웹&앱에서 취급하는 데이터를 따로 분리 하는 “3-TIER 아키텍쳐”라 불리우며 보안성, 대용량 서비스에서의 강점을 지닐수 있게 되었다.
1-2. SQL
-
하나의 언어인 Structured Query Language (SQL) 은 데이터베이스 언어로, 주로 관계형 데이터베이스에서 사용한다.
예를 들어 MySQL, Oracle, SQLite, PostgreSQL 등 다양한 데이터베이스에서 SQL 구문을 사용하여 데이터베이스에 쿼리(Query) 를 보내 원하는 데이터를 가져오거나 삽입할 수 있다.
SQL을 사용할 수 있는 데이터베이스와 달리, 데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL이라고 한다.
관계형 데이터베이스와는 달리, 테이블을 사용하지 않고 데이터를 다른 형태로 저장을 한다. NoSQL의 대표적인 예시는 MongoDB 와 같은 문서 지향 데이터베이스가 있다.
-
SQL 문법은 링크를 통하여 학습하였다.
1-3. ACID
ACID(원자성, 일관성, 고립성, 지속성) 는 데이터베이스 트랜잭션 이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다.
여기서 트랜잭션이란? 데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위해 행해지는 하나 이상의 쿼리를 모아 놓은 작업의 단위 이다.
-
원자성(Atomicity) 은 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다. 예를 들어, 자금 이체는 성공할 수도 실패할 수도 있지만 보내는 쪽에서 돈을 빼 오는 작업만 성공하고 받는 쪽에 돈을 넣는 작업을 실패해서는 안된다. 원자성은 이와 같이 중간 단계까지 실행되고 실패하는 일이 없도록 하는 것이다.
-
일관성(Consistency) 은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단된다.
-
독립성(Isolation) 은 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. 이것은 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다. 은행 관리자는 이체 작업을 하는 도중에 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽을 볼 수 없다. 공식적으로 고립성은 트랜잭션 실행내역은 연속적이어야 함을 의미한다. 성능관련 이유로 인해 이 특성은 가장 유연성 있는 제약 조건이다. 자세한 내용은 관련 문서를 참조해야 한다.
-
지속성(Durability) 은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다. 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 함을 의미한다. 전형적으로 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.
2. Schema design
2-1. 스키마(Schema)
-
스키마는 데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 기술한 메타데이터의 집합이다.
-
스키마는 데이터베이스를 구성하는 데이터 개체(Entity), 속성(Attribute), 관계(Relationship) 및 데이터 조작 시 데이터 값들이 갖는 제약 조건 등에 관해 전반적으로 정의한다.
-
스키마는 사용자의 관점에 따라 외부 스키마, 개념 스키마, 내부 스키마로 나눠진다.
2-2. Schema design (인스타그램 예제)
-
게시물(Post) 작성 기능 : 인스타그램에서는 여러 개의 사진(A)을 올릴 수 있다. 사진을 업로드할 때, 사진을 설명하는 간단한 글(C)이 올라간다.
-
게시물에 댓글 달기 및 좋아요 기능 : 게시물이 업로드되면 다른 사용자는 이 게시물에 댓글(E)을 달 수 있고, 좋아요(B) 를 눌러 관심을 표할 수 있다.
-
해시태그 기능 : 게시물에 #감성 #맛집 등의 해시태그(D)를 남길 수 있으며, 이 해시태그를 누르면 이 해시태그가 사용된 모든 게시물을 한 데 모아 볼 수 있다.
-
follow 기능 : 인스타그램에서 친구 관계는 팔로워(follower)와 팔로잉(following)으로 나뉜다. 김코딩이 최해커를 following 하면, 최해커의 피드가 김코딩의 홈 화면에 나타난다. 최해커의 입장에서는 김코딩이 follower로 추가된다.
-
해당 내용을 DB diagram에서 스키마 디자인을 해보면 다음 그림과 같다.
3. 관계형 데이터베이스
-
구조화된 데이터는 하나의 테이블로 표현할 수 있다. 사전에 정의된 테이블을 relation 이라고도 부르기 때문에, 테이블을 사용하는 데이터베이스를 관계형 데이터베이스(Relational database)라고 한다.
-
관계의 종류는 다음과 같다.
-
1:1 관계 : 하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우, 그러나 1:1 관계는 자주 사용하지 않는다. 1:1로 나타낼 수 있는 관계라면 관계를 맺기보다 직접 저장하는 게 나을 수 있다.
-
1:N 관계 : 하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우이다. 1:N(일대다) 관계는 관계형 데이터베이스에서 가장 많이 사용한다.
-
N:N 관계 : 여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우이다. N:N(다대다) 관계를 위해 스키마를 디자인할 때에는, Join 테이블을 만들어 관리해야한다. 1:N(일대다) 관계와 비슷하지만, 양방향에서 다수의 레코드를 가질 수 있다.
-
Self Referencing 관계 : 때로는 테이블 내에서도 관계가 필요하다. 예를 들어 추천인이 누구인지 파악하기 위해 사용할 수 있다. 이 관계는 1:N(일대다) 관계와 유사하다고 생각할 수 있다. 그러나 일반적으로 1:N 관계는 서로 다른 테이블의 관계를 나타낼 때 표현하는 방법이다.
-
4. Node.js에서 데이터베이스 사용
-
.env
환경변수 파일을 통하여dotenv
패키지로 환경변수를 변수처럼 가져와 사용 할 수 있음을 이미 우리는 학습하였다.이를 통하여Node.js 환경에서 데이터베이스와 연결하는 부분은 이미 작성된 예제를 통하여 SQL 실습을 진행하였다.
자세한 내용은 링크 참조.
🤔 Understanding
SQL 새로운 언어를 배웠다. 우선 첫 느낌은 뭐지 싶었는데 정말 엑셀과 유사하다…? 느낌이다. 여러 정보들을 시트(데이터베이스)에 담고 필요한 행과 열에 저장된 데이터 정보를 필터로 원하는값을 출력하는 느낌을 받았다.
실제로도 SQL Server에 담긴 정보를 Excel 파일로 내보낼 수 있는 기능도 있다는 걸 검색으로 알게되었다. (안써봤지만 몹시 유용해 보인다..)
일단 문법도 사람이 읽기 좋은 형태의 문법이기때문에 보고 쓰기에 어렵진 않지만, 학습할 내용이 조금 방대해보인다.. 실무에서는 데이터베이스만 따로 관리하는 DB 관리자가 있다는 얘기도 얼핏 들었다.
아직 단순하게 SQL을 써서 원하는 값을 추려내는 정도뿐이다. 앞으로 실제 예제를 통해서 데이터베이스를 활용하는 경험이 필요하다.