그렇다면 데이터베이스는 굳이 왜 필요한 것일까? 우선 데이터를 다룰 수 있는 방법들 중에서 메모리에서 데이터를 다룬다고 하면 전원을 끄면 데이터가 날라가게 되고 File I/O를 통해 데이터를 다루면 원하는 데이터를 가져올 수가 없고 항상 모든 데이터를 가져온 후 서버에서 필터링하는 과정을 거쳐야 해서 상당히 불편하다.
데이터베이스 서버는 필터링 외에도 File I/O로 구현이 힘든 관리를 위한 여러 기능들은 제공한다.
SQL(Structured Query Language)은 구조화된 쿼리(질의문) 언어를 의미한다. 여기서 쿼리는 데이터베이스에 저장되어있는 정보를 필터링 하기 위한 질문인데, SQL은 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있다. 즉, SQL은 데이터베이스에 사용하는 프로그래밍 언어라고 할 수 있다.
SQL은 주로 관계형 데이터베이스에서 사용하는데, MySQL, Oracle, SQLite, PostgreSQL 등의 관계형 데이터베이스에서 사용한다.
SQL을 사용하는 데이터베이스와 다르게 데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL이라고 한다. NoSQL은 테이블을 사용하지 않고 데이터를 다른 형태로 저장한다. MongoDB와 같은 문서지향 데이터베이스가 NoSQL의 종류이다.
데이터 정의어는 데이터베이스를 정의하거나 그 정의를 수정할 목적으로 사용하는 언어이다. 데이터를 저장하고 있는 테이블 등의 구조를 생성하고 변경하기 위해 사용하는 명령어들이다. 데이터베이스나 테이블을 만들 때 사용하는 CREATE
나 테이블을 제거할 때 사용되는 DROP, ALTER
등이 데이터 정의어에 해당한다.
CREATE TABLE [테이블명];
DROP/TRUNCATE TABLE [테이블명];
데이터 조작어는 데이터를 검색, 삽입, 삭제, 갱신할 수 있도록 지원하는 언어이다. 사용자와 데이터베이스 관리 시스템 간의 인터페이스를 제공하고 트랜잭션 제어어를 활용하여 실행 전 상태로 복귀 가능한 명령어이다.
INSERT INTO [테이블명] (필드명...) VALUES (값...);
UPDATE [테이블명] SET 필드1=값1, 필드2=값2... {WHERE ...};
DELETE FROM [테이블명] {WHERE ...}
SELECT [필드명] FROM [테이블명] {WHERE ...}
데이터 제어어는 여러 사용자가 데이터를 공유하여 병행 수행을 제어한다. 데이터 무결성을 유지시키면서 내부적으로 여러가지 규정이나 제약조건 등을 기술하기 위해 사용되는 언어이다. 사용자 별로 데이터베이스에 접근할 수 있는 권한을 부여하거나 회수한다.
GRANT 권한 부여 / REVOKE 권한 회수
TCL : Transaction Control Language
COMMIT 트랜잭션 확정
ROLLBACK 트랜잭션 취소
CHECKPOINT 복귀지점 설정
데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명을 스키마라고 한다.
구조화된 데이터는 하나의 테이블로 표현할 수 있는데 사전에 정의된 테이블을 릴레이션이라고 부르기 때문에, 테이블을 사용하는 DB를 관계형 DB(Relational Database)라고 한다.
명칭 | 의미 |
---|---|
데이터 | 각 항목에 저장되는 값 |
테이블 | 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적 |
컬럼 | 테이블의 한 열 |
레코드 | 테이블의 한 행에 저장된 데이터 |
키 | 테이블의 각 레코드를 구분할 수 있는 값 |
1:1 관계
하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우
1:N 관계
하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우 (RDB에서 가장 많이 사용)
N:N 관계
여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우
이 경우, Join 테이블을 만들어 관리한다.
Self referencing 관계
테이블 내에서의 관계.
ex) 추천인이 누구인지 파악
위의 이미지는 인스타그램이 동작하기 위해 어떻게 스키마를 디자인해야하는지 직접 디자인해본 것이다.
우선 각 테이블은 id값을 가지고 관계를 가지는 테이블은 관계 대상 테이블의 id값을 갖는다. 처음에는 유저와 팔로워 사이의 관계를 1:N 관계라고 생각했었는데 아주 이기적인 발상이었다. 한 유저가 누군가를 여러명 팔로우 가능하면 다른 누군가도 여러 유저를 팔로우가 가능하다. 때문에 N:N 관계를 가진다.
이번 과제에서는 큰 어려움을 겪었었다. 테스트가 정상적으로 동작하지 않아서 초반에 진행이 잘 되지 않았기 때문이다. 원래 테스트 케이스가 3개가 출력이 되어야 했는데 아래의 사진처럼 2개 밖에 출력이 되지 않았고, Timeout
이라는 에러가 계속 나타나서 정상적으로 동작함에도 불구하고 테스트가 통과되지 않는 현상이 벌어졌다.
이 문제를 해결하기 위해 먼저 Timeout 에러에 대해 구글링을 해보고 MySQL에서 Timeout 관련된 설정들을 모두 50000까지 수정을 했다. 하지만 그럼에도 오류는 여전했다. 후에 알았지만 Timeout 에러가 MySQL과는 관련이 없었고 테스트 동작에 관련이 되어있었다.
그래서 package.json
파일에서 test Timeout 설정 부분이 2000ms로 설정된 부분을 50000으로 설정하였다. 이렇게 하니까 테스트를 통과하지는 못 했으나 3개의 테스트 케이스가 정상적으로 출력되기는 했다. 하지만 테스트 시간이 2초에서 50초로 늘어난 바람에 테스트를 하는데 너무 긴 시간이 소요됐다.
테스트케이스를 통과하지 못한 부분은 한 동기분이 리눅스의 용량이 부족할 경우에 그런 현상이 생길 수 있다는 말씀을 하셔서 듀얼부팅 윈도우즈 용량을 없애버리고 리눅스 용량을 가득채웠더니 해결이 되었다. 힘든 경험이었지만 문제가 해결되니 보람찼다.