이번주 위클리 페이퍼의 주제는
SQL에서 DDL과 DML의 차이점을 설명하고, 각각의 대표적인 명령어들의 용도를 설명하세요.
역정규화가 필요한 상황과 적용 시 고려해야 할 사항, 그리고 역정규화를 적용할 때의 장단점을 설명해주세요.
SQL이란?
AWS는 SQL을 아래와 같이 설명하고 있다.
구조적 쿼리 언어(SQL)는 관계형 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어입니다. 관계형 데이터베이스는 정보를 표 형식으로 저장하며, 행과 열은 다양한 데이터 속성과 데이터 값 간의 다양한 관계를 나타냅니다. SQL 문을 사용하여 데이터베이스에서 정보를 저장, 업데이트, 제거, 검색 및 검색할 수 있습니다. 데이터베이스 성능을 유지 관리하고 최적화하는 데 SQL을 사용할 수도 있습니다.
SQL 명령은
개발자가 관계형 데이터베이스에 저장된 데이터를 조작하는 데 사용되는 특정 키워드 또는 SQL 문이다.
종류로는
DML (Data Manipulation Language)
DDL (Data Definition Language)
DCL (Data Control Language)
TCL (Transaction Control Language)
이렇게 있다.
DDL - 데이터 정의어
데이터베이스 구조를 설계하는 SQL 명령어. 데이터베이스 스키마를 정의하고 수정하는 역할을 한다.
대표적인 명령어로는
CREATE - 객체 생성
ALTER - 객체 구조 변경
DROP - 객체 삭제
TRUNCATE - 테이블 데이터 전체 삭제
DROP과 TRUNCATE은 둘 다 테이블의 데이터를 전체 삭제한다는 점은 같다.
TRUNCATE 명령어를 사용하면 삭제후 용량이 줄어들고 인덱스 등도 모두 삭제된다. CREATE TABLE을 한 직후의 상태와 같다.
하지만 DROP은 테이블 전체를 삭제한다. 따라서 테이블의 구조와 그 안의 데이터가 모두 삭제된다.
DML - 데이터 조작어
실제 데이터를 조회, 삽입, 수정, 삭제하는 명령어들이다.
대표적인 명령어로는
SELECT - 데이터 조회
INSERT - 데이터 삽입
UPDATE - 데이터 수정
DELETE - 데이터 삭제
DELETE는 DDL의 DROP, TRUNCATE와 달리 행(row)을 기준으로 삭제한다. 삭제할 때마다 롤백 가능하도록 트랜잭션 로그를 생성하기 때문에 속도가 느리다. 그대신 원하는 행만 조건적으로 삭제할 수 있다.
삭제 범위로는 DROP > TRUNCATE > DELETE 순이다.
DML과 DDL의 차이
DML은 테이블에 저장된 행 데이터를 대상으로 테이블 안의 실제 데이터를 조작하는 명령어이다. 데이터베이스 구조는 변경 하지 않고 트랜잭션 사용이 가능하다.
DDL은 테이블, 인덱스, 뷰 등의 데이터베이스 객체를 대상으로 구조(스키마)를 정의하고 변경하는 명령어이다. 자동으로 COMMIT 되며 구조를 변경하기 때문에 신중하게 사용해야 한다.
역정규화
우선 정규화라는 것은 데이터 중복을 최소화하고 데이터 무결성을 보장하기 위해 테이블을 체계적으로 분해하는 과정이다.
그렇다면 역정규화는 그 반대의 과정을 수행하는 것이다.
역정규화는 의도적으로 중복 데이터를 허용하여 조회 성능을 향상시키기 위해 사용한다. 즉 데이터 일관성보다는 성능 최적화를 선시 하는 설계 방법이다.
역정규화가 필요한 상황
수백만 건의 데이터에서 복잡한 JOIN이 발생할 때, 조회가 많고 수정이 적은 시스템(eg. 뉴스, 블로그 글), API 응답 속도가 중요한 서비스 등이 있다.
역정규화를 적용할 때 고려해야 할 사항
1. 적용 범위 결정 - 조회와 수정의 빈도를 비교하여 성능이 중요한 핵심 기능에만 수행하여야 한다.
2. 역정규화 수행 전에 중복 데이터를 관리할 수 있는 매커니즘이 우선 고려되어야 한다.
역정규화의 장단점
<장점>
성능 향상 - JOIN 쿼리를 사용하는 대 단일 테이블에서 빠른 조회가 가능하다.
쿼리 단순화 - SQL문이 단순해진다
(예시)
-- 정규화된 상태
SELECT u.name, u.email, p.title, p.content, c.name as category_name
FROM users u
JOIN posts p ON u.id = p.user_id
JOIN categories c ON p.category_id = c.id
WHERE p.id = 1;
-- 역정규화가 적용된 쿼리
SELECT user_name, user_email, title, content, category_name
FROM posts_denormalized
WHERE id = 1;
<단점>
개발 및 운영의 복잡성 - 동기화 로직을 구현해야 하고 디버깅이 어려워진다.
이상현상 발생 - 중복데이터를 허용해주기 때문에 삽입이상, 삭제이상, 갱신이상과 같은 이상현상이 발생할 수 있다.
'Weekly Paper' 카테고리의 다른 글
| [위클리 페이퍼] 컨테이너와 Docker, 컨테이너 오케스트레이션 (0) | 2025.06.29 |
|---|---|
| [위클리 페이퍼] JPA의 N+1문제, 트랜잭션의 ACID (1) | 2025.06.15 |
| [위클리 페이퍼] REST API의 장단점과 HTTP 요청 처리 과정 (2) | 2025.05.25 |
| [위클리 페이퍼] AOP, @Controller와 @RestController (0) | 2025.05.19 |
| [위클리 페이퍼] 웹서버와 WAS의 차이, Spring Boot의 Bean 등록 방법 (0) | 2025.05.06 |