오늘은 예전에 리덕스를 사용해서 구현했던 Cmarket 페이지의 상품목록과 주문내역을 저장하고 불러오는 기능을 SQL을 사용하여 데이터베이스에 실제 웹페이지처럼 정보가 영구적으로 저장될 수 있도록 구현하는 스프린트를 진행하였고그 후 SQL의 추가적인 내용을 학습하였다.
관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 하며, 이를 위해서는 아래의 세가지 부분을 신경써서 데이터를 설계 및 관리해야 한다.
데이터 중복(Data Redundancy)
데이터 중복은 실제 데이터의 동일한 복사본이나, 부분적인 복사본을 뜻하며, 일관된 자료 처리의 어려움, 저장 공간 낭비, 더이터 효율성 감소 등의 이유로 문제가 발생한다.
데이터 무결성(Data Integrity)
데이터 무결성이란 데이터의 수명 주기 동안 정확성과 일관성을 유지하는 것을 뜻하며, 입력된 데이터가 오염되지 않고, 입력된 그대로 데이터를 사용할 수 있다는 뜻이다.
데이터 이상 현상(Anomaly)
데이터 이상현상이란 기대한 데이터와 다른 이상 현상을 가리키며 크게 세가지 유형으로 발생한다.
DDL(Data Definition Language)
데이터를 정의할 때 사용하는 언어로 테이블을 만들 때 사용하는 CREATE
이나 테이블을 제거할 때 사용되는 DROP
등이 DDL에 해당하며, 데이터베이스의 테이블과 같은 오브젝트를 정의할 때 사용한다.
DML(Data Manipulation Language)
데이터베이스에 데이터를 저장할 때 사용하는 언어로 INSERT
처럼 새로운 레코드를 추가할 때 사용되는 문법을 포함해 데이터를 삭제하는 DELETE
나, 변경하는 UPDATE
가 DML에 포함된다.
DCL(Data Control Language)
데이터베이스에 대한 접근 권한과 관련된 문법으로 어느 유저가 데이터베이스에 접근할 수 있는지 권한을 설정한다. 권한을 주는 GRANT
나, 권한을 가져가는 REVOKE
등이 DCL에 포함된다.
DQL(Data Query Language)
정해진 스키마 내에서 쿼리할 수 있는 언어로, SELECT
가 DQL에 해당되며, DML의 일부분으로 취급하기도 한다.
TCL(Transaction Control Language)
DML을 거친 데이터의 변경사항을 수정할 수 있고, COMMIT
처럼 DML이 작업한 내용을 데이터베이스에 커밋하거나, ROLLBACK
처럼 커밋했던 내용을 다시 롤백하는 문법이 있다.
CASE
SQL에서도 프로그래밍 언어의 if 문과 같이, CASE를 사용하면 특정 조건에 따라 다른 결과를 받을 수 있다.
SELECT CASE WHEN CustomerId <= 25 THEN 'GROUP 1' WHEN CustomerId <= 50 THEN 'GROUP 2' ELSE 'GROUP 3' END FROM customers
SUBQUERY
쿼리문을 작성할 때, 다른 쿼리문을 포함할 수 있는데 이 때 포함되는 다른 쿼리문을 SUBQUERY(서브쿼리)라고 한다. 서브쿼리는 실행되는 쿼리에 중첩으로 위치해, 정보를 전달하는데 소괄호로 감싸야 한다.
서브쿼리의 결과는 개별 값이나 레코드 리스트이고, 서브쿼리의 결과를 하나의 칼럼으로 사용할 수 있다.
SELECT CustomerId, CustomerId = (SELECT CustomerId FROM customers WHERE CustomerId = 2) FROM customers WHERE CustomerId < 6
IN, NOT IN
IN은 특정한 값이 서브쿼리에 있는지 확인할 수 있다.
SELECT * FROM customers WHERE CustomerId IN (SELECT CustomerId FROM customers WHERE CustomerId < 10)
EXISTS
EXISTS 또는 NOT EXISTS는 돌려받은 서브쿼리에 존재하는 레코드를 확인한다. 만약 조회하려는 레코드가 존재한다면 참(TRUE)을, 그렇지 않은 경우에는 거짓(FALSE)을 리턴한다.
SELECT EmployeeId FROM employees e WHERE EXISTS ( SELECT 1 FROM customers c WHERE c.SupportRepId = e.EmployeeId ) ORDER BY EmployeeId
FROM
FROM에도 서브쿼리를 사용할 수 있는데, 다음과 같이 쿼리문과 서브쿼리를 사용해 조회된 결과를 하나의 테이블이나 조회할 대상으로 지정해 사용할 수 있다.
SELECT * FROM ( SELECT CustomerId FROM customers WHERE CustomerId < 10 )
Cmarket에서 query 함수를 사용해서 클라이언트에 response 하는 부분에 대한 기본적인 설명없이 스프린트를 진행해서 필요한 내용을 하나 하나 찾느라 처음에는 애를 먹었다. 기초적인 부분은 설명을 해주고 스프린트를 진행했다면 훨씬 수월하게 진행할 수 있었을 텐데, 공식문서를 찾아보면서 감을 잡고 코드를 작성할 수 있었다. 추가적인 내용을 학습하고 나니, 앞으로 SQL을 어떻게 공부할지에 대해서 감이 잡혔다. 우선 쿼리를 이용해서 내가 원하는 형태의 데이터를 추출할 수 있도록 명령문을 익히고, 스키마를 어떻게 설계해야 효율적으로 데이터를 관리할 수 있는지 예시들을 찾아보고, 실제 서버에서 어떻게 구현해야 하는지 레퍼런스 코드를 살펴볼 예정이다.