위클리페이퍼06: 데이터베이스 설계
Q1. SQL에서 DDL과 DML의 차이점을 설명하고, 각각의 대표적인 명령어들의 용도를 설명하세요.
Q1-1. 답변
DDL
테이블과 인덱스 등의 데이터베이스 구조를 생성, 수정, 삭제하는 명령어
- 명령어
CREATE: table 생성ALTER: table 수정DROP: table 삭제
DML
데이터베이스에 데이터를 조회, 저장, 수정, 삭제하는 명령어
- 명령어
SELECT: 데이터 조회INSERT: 새로운 데이터 추가UPDATE: 기존 데이터 수정DELETE: 데이터 삭제
Q1-2. 정리
DDL(Data Definition Language)과 DML(Data Manipulation Language)은 다음과 같은 차이점이 있습니다:
DDL(Data Definition Language)
- 데이터베이스의 구조를 정의하고 수정하는 언어입니다.
- 테이블, 뷰, 인덱스 등의 데이터베이스 객체를 생성, 수정, 삭제하는 데 사용됩니다.
- 대표적인 명령어:
CREATE: 새로운 데이터베이스 객체를 생성ALTER: 기존 객체의 구조를 수정DROP: 데이터베이스 객체를 삭제TRUNCATE: 테이블의 모든 데이터를 삭제
DML(Data Manipulation Language)
- 데이터베이스 내의 데이터를 조작하는 언어입니다.
- 실제 데이터를 조회, 입력, 수정, 삭제하는 작업을 수행합니다.
- 대표적인 명령어:
SELECT: 데이터 조회INSERT: 새로운 데이터 추가UPDATE: 기존 데이터 수정DELETE: 데이터 삭제
Q2. 역정규화가 필요한 상황과 적용 시 고려해야 할 사항, 그리고 역정규화를 적용할 때의 장단점을 설명해주세요.
Q2-1. 답변
시스템의 성능 요구사항을 충족하기 위해 의도적으로 정규화를 위배하는 것, 즉 역정규화가 필요하다. 이때, 테이블 조인 횟수가 많은지, 빠른 조회가 필요한지, 복잡한 쿼리가 자주 반복되는지 등을 고려해야 한다.
역정규화 시 장점은 조인 연산이 줄어들고, 데이터 구조가 단순해져서 조회 속도가 향상된다. 반대로, 단점은 추가적인 INSERT나 UPDATE를 추가해야 해서 복잡성이 증가하고, 정합성 문제가 발생할 위험이 크다.
Q2-2. 정리
적용 상황과 배경
데이터베이스의 정규화는 데이터의 일관성과 무결성을 보장하는 중요한 설계 원칙이지만, 때로는 시스템의 성능 요구사항을 충족시키기 위해 의도적으로 정규화를 위배하는 역정규화가 필요합니다. 특히 실시간 데이터 처리가 필요한 통계 시스템이나, 복잡한 조인으로 인해 성능 저하가 심각한 경우에 역정규화를 고려해볼 수 있습니다.
설계 시 고려사항
역정규화를 적용할 때는 신중한 검토가 필요합니다. 먼저 데이터의 조회 빈도와 갱신 빈도의 비율을 분석해야 합니다. 조회가 갱신보다 훨씬 빈번한 경우 역정규화가 효과적일 수 있습니다. 또한 데이터 무결성과 성능 사이의 균형을 고려해야 하며, 중복 데이터를 관리하기 위한 추가적인 시스템 리소스도 검토해야 합니다.
역정규화 적용의 장점
역정규화를 적용하면 시스템 성능 측면에서 여러 이점을 얻을 수 있습니다. 가장 큰 장점은 데이터 조회 성능의 향상입니다. 복잡한 조인 연산이 줄어들고 쿼리가 단순화되어 전반적인 응답 속도가 개선됩니다. 특히 실시간 처리가 필요한 대규모 시스템에서는 이러한 성능 향상이 사용자 경험을 크게 개선할 수 있습니다.
역정규화 적용의 단점
반면에 역정규화는 여러 가지 단점과 위험 요소를 수반합니다. 첫째, 데이터 중복으로 인한 저장공간이 증가하고 데이터 갱신 시 추가적인 오버헤드가 발생합니다. 둘째, 데이터의 정합성을 유지하기 위해 추가적인 애플리케이션 로직이 필요하며, 이는 시스템의 복잡도를 증가시키는 요인이 됩니다. 또한 중복된 데이터를 동기화하는 메커니즘을 구현하고 지속적으로 모니터링해야 하며, 시스템의 요구사항이 변경될 때마다 역정규화 전략의 타당성을 재검토해야 합니다.
Q3. JPA에서 발생하는 N+1 문제의 발생 원인과 해결 방안에 대해 설명하세요.
Q3-1. 답변
N+1 문제 발생 원인
연관 관계가 설정된 Entity를 조회할 때 발생하는 성능 문제로, 특정 목록을 조회할 때, 목록과 연계된 정보를 조회하기 위해 N번이 더 조회되는 현상이다.
해결 방안
JOIN FETCH를 사용@EntityGraph를 사용@BatchSize를 사용
Leave a comment