1. 관계형 데이터베이스의 정규화
정규화는 데이터베이스 설계 시 데이터 중복을 최소화하고 삽입, 수정, 삭제 이상 현상을 제거하며 데이터 무결성을 유지하기 위한 일련의 과정이다. 정규화 과정을 통해 저장 공간을 효율적으로 사용하고, 일관된 데이터 관리를 보장할 수 있다.
정규화의 장점
- 데이터 중복 최소화: 동일 데이터의 반복 저장을 피하여 저장 공간을 절약한다.
- 이상 현상 제거:
- 삽입 이상, 수정 이상, 삭제 이상을 방지한다.
- 데이터 무결성 유지: 데이터의 정확성과 일관성을 보장한다.
- 저장 공간 효율적 사용: 불필요한 중복 저장을 제거하여 공간을 절약한다.
정규화의 단점
- JOIN 연산 필요: 여러 테이블로 분리된 데이터를 조회할 때 복잡한 JOIN 연산이 필요해 성능 저하의 원인이 될 수 있다.
2. 비정규화
비정규화는 정규화에 따른 JOIN 연산의 복잡성과 성능 저하를 완화하기 위해 일부러 데이터 중복을 허용하는 설계 기법이다. 시스템 응답속도가 중요한 환경이나 JOIN 연산으로 인한 성능 저하 우려가 있는 경우에 효과적이다.
비정규화의 장점
- 시스템 응답속도 향상: JOIN 연산의 부담을 줄여 빠른 데이터 접근이 가능하다.
- 복잡한 JOIN 연산 문제 완화: 쿼리 성능 개선을 위해 데이터 중복을 일부 허용한다.
비정규화의 단점
- 데이터 무결성 문제: 중복된 데이터 관리로 인해 갱신 시 일관성을 유지하기 어려울 수 있다.
3. JPA와 Hibernate의 관계 및 차이점
JPA(Java Persistence API)는 자바 플랫폼에서 객체와 관계형 데이터베이스 간의 매핑을 표준화한 인터페이스이다. 이에 반해 Hibernate는 JPA의 구현체 중 하나로, JPA가 정의한 표준을 기반으로 실제 ORM 기능을 수행하며 추가적인 확장 기능을 제공한다.
- JPA: 객체-관계 매핑을 위한 표준 인터페이스를 제공한다.
- Hibernate: JPA의 구현체로, 표준 기능 외에 다양한 고급 기능을 지원한다.
4. ORM (객체-관계 매핑)
ORM은 객체지향 프로그래밍 언어와 관계형 데이터베이스 간의 패러다임 불일치를 해결하기 위한 기술이다. ORM을 사용하면 데이터베이스의 테이블과 객체 간의 매핑을 자동으로 처리할 수 있어, SQL에 직접 의존하지 않고도 데이터베이스 작업을 수행할 수 있다.
ORM의 장점
- 개발 생산성 향상: 객체 중심의 코딩이 가능해 개발 효율이 증대된다.
- 객체지향적 사고와 일치: 개발자가 객체 개념에 맞춰 설계를 진행할 수 있다.
- SQL 추상화: 복잡한 SQL을 직접 다루지 않아도 데이터베이스 작업을 수행할 수 있다.
- 엔티티 그래프 탐색: 관계형 데이터베이스에서는 어려운 참조 탐색을 손쉽게 처리할 수 있다.
ORM의 단점
- 복잡한 쿼리 성능 저하: 대규모 데이터나 복잡한 쿼리의 경우 성능 문제가 발생할 수 있다.
- 추상화 계층으로 인한 어려움: 내부 동작 원리를 파악하기 어려워 디버깅이나 최적화에 한계가 있을 수 있다.
5. SQL Injection 및 방지 방법
SQL Injection은 공격자가 웹 애플리케이션의 입력값을 조작하여 악의적인 SQL 쿼리를 실행시키는 공격 기법이다. 이로 인해 데이터베이스에 무단 접근하거나 데이터 손실, 변조 등의 위험이 발생한다.
방어 방법
- Prepared Statement 사용:
- 파라미터 바인딩을 통해 입력값과 SQL 쿼리를 명확히 분리하여 처리한다.
- 입력값 검증 및 필터링:
- 사전에 의심스러운 입력을 차단함으로써 악의적 쿼리 실행을 방지한다.
6. 관계형 데이터베이스와 NoSQL 데이터베이스의 차이점
각 데이터베이스 유형은 데이터 저장 방식, 확장성, 처리 성능 등에서 차이를 보인다.
관계형 데이터베이스 (RDB)
- 정형화된 스키마: 데이터 구조가 미리 정의되어 데이터 무결성과 ACID 특성을 보장한다.
- 복잡한 JOIN 연산: 관계 데이터를 효과적으로 관리할 수 있다.
NoSQL 데이터베이스
- 유연한 스키마: 다양한 형태의 데이터 저장이 가능해 변화하는 요구사항에 유연하게 대응할 수 있다.
- 수평 확장 용이: 대규모 분산 환경에서 높은 성능을 제공하며, 스케일 아웃이 용이하다.
7. 인덱스
인덱스는 데이터베이스에서 특정 컬럼에 대한 검색 속도를 향상시키기 위해 사용하는 자료 구조이다. 인덱스는 크게 클러스터링 인덱스와 논클러스터링 인덱스로 나뉜다.
클러스터링 인덱스
- 물리적 정렬: 테이블 내 데이터가 실제로 물리적으로 정렬되어 저장된다.
- 유일성: 한 테이블 당 하나만 존재하며, 보통 기본키(PK)에 사용된다.
- 연속적 데이터 접근 유리: 범위 검색 등 연속적인 데이터 접근 시 성능이 우수하다.
논클러스터링 인덱스
- 논리적 구조: 데이터와는 별도로 관리되는 인덱스 구조이다.
- 다중 존재 가능: 한 테이블에 여러 개의 논클러스터링 인덱스를 생성할 수 있다.
- 검색 성능 향상: 특정 컬럼에 대한 검색 속도를 개선하지만, 범위 검색의 경우 추가적인 디스크 I/O가 발생할 수 있다.
8. 트랜잭션과 ACID 속성
트랜잭션은 데이터베이스 내에서 하나의 작업 단위로, 모든 작업이 전부 성공하거나 하나라도 실패할 경우 전체를 취소해야 한다. 이를 보장하기 위해 ACID 속성이 적용된다.
ACID 속성
- 원자성 (Atomicity): 트랜잭션 내의 모든 작업이 모두 성공하거나, 하나라도 실패하면 전체가 취소된다.
- 일관성 (Consistency): 트랜잭션 실행 전후 데이터의 일관성이 유지되어야 한다.
- 격리성 (Isolation): 각 트랜잭션은 서로 독립적으로 실행되어 다른 트랜잭션에 영향을 주지 않는다.
- 지속성 (Durability): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 저장된다.
'CS Repo > DB' 카테고리의 다른 글
SQL 쿼리의 동작 순서와 기본적인 동작 원리 (0) | 2025.05.01 |
---|