Data/DataBase

데이터베이스 Anti-Pattern 피하기

누구세연 2024. 11. 25. 22:25

데이터베이스 설계는 애플리케이션 성능과 안정성을 결정짓는 중요한 요소입니다. 하지만 초기 설계 단계에서 잘못된 방향으로 진행되면 성능 저하, 데이터 무결성 문제, 높은 유지보수 비용을 초래할 수 있습니다. 이러한 잘못된 설계를 Anti-Pattern이라고 합니다.

 

이번 글에서는 데이터베이스 설계에서 자주 발생하는 Anti-Pattern과 이를 피하기 위한 방법을 정리해보겠습니다.🙂

 

 

Anti-Pattern이란?

Anti-Pattern은 처음에는 효과적인 해결책처럼 보이지만, 장기적으로 문제를 야기하는 잘못된 설계 패턴입니다.

  • 문제점:
    • 성능 저하
    • 데이터 무결성 위반
    • 유지보수 어려움
  • 예방 방법: 문제를 조기에 인식하고 개선된 설계 원칙을 적용해야 합니다.

 

대표적인 Anti-Pattern과 해결 방법

1. 중복 데이터 (Data Duplication)

문제

동일한 데이터를 여러 테이블에 저장하면 데이터 불일치 및 업데이트 시 추가 작업이 필요해집니다.

 

해결

  • 정규화(Normalization): 데이터 중복을 줄이기 위해 테이블을 설계합니다.
  • 데이터 중복이 필요한 경우:
    • 중복 데이터를 허용해야 하는 경우, **트리거(Trigger)**나 애플리케이션 로직을 통해 무결성을 유지합니다.

예제

잘못된 설계

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerName VARCHAR(100),
    CustomerAddress VARCHAR(255)
);

고객 정보가 매 주문마다 반복 저장됩니다.

 

개선된 설계

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    Name VARCHAR(100),
    Address VARCHAR(255)
);

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

 

2. 과도한 Join 사용

문제

테이블 간 Join이 너무 많아지면 쿼리가 복잡해지고 성능이 저하됩니다.

 

해결

  • 필요한 데이터만 적절히 Join: 쿼리를 단순화하고 필요한 데이터만 가져옵니다.
  • 뷰(View) 또는 데이터 스냅샷 활용: 자주 사용하는 복잡한 쿼리는 뷰나 스냅샷 테이블로 대체합니다.

 

3. 범용 테이블(Generic Table)

문제

다양한 데이터 유형을 하나의 테이블에 저장하려다 데이터 관리가 복잡해집니다.

 

해결

  • 각 데이터 유형에 맞는 테이블을 설계합니다.
  • 데이터 구조에 맞는 명확한 스키마를 정의합니다.

예제

잘못된 설계

CREATE TABLE GenericTable (
    ID INT PRIMARY KEY,
    KeyName VARCHAR(50),
    Value VARCHAR(255)
);

 

개선된 설계

CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    Name VARCHAR(100),
    Price DECIMAL(10, 2)
);

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    ProductID INT,
    Quantity INT,
    FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);

 

 

4. 불필요한 인덱스 남발

문제

모든 열에 인덱스를 생성하면 읽기 성능은 향상되지만, 쓰기 성능이 저하됩니다.

 

해결

  • 자주 조회되는 열만 인덱싱
  • 복합 인덱스(Composite Index) 활용
  • 주기적으로 사용되지 않는 인덱스를 제거

 

5. 너무 긴 트랜잭션 (Long-Running Transactions)

문제

트랜잭션이 오래 유지되면 락 경합(Lock Contention)이 발생해 동시성 문제가 생깁니다.

 

해결

  • 트랜잭션을 가능한 한 작게 설계
  • 배치(Batch) 처리 방식 도입

 

Anti-Pattern을 피하기 위한 체크리스트

  1. 정규화는 적절히 되었는가?
  2. 중복 데이터를 피했는가?
  3. 인덱스를 과도하게 사용하지 않았는가?
  4. 트랜잭션 범위는 적절히 설정되었는가?
  5. 쿼리 성능은 최적화되었는가?

 

 

데이터베이스 설계는 한 번 잘못되면 나중에 수정하기 어렵고 비용이 많이 듭니다.
Anti-Pattern을 인지하고, 이를 피하기 위한 설계를 통해 성능과 유지보수성을 모두 잡아보세요!