### 데이터의 정합성(Data Integrity)
**데이터의 정합성**은 데이터가 **일관성** 있고 **정확하며** **신뢰할 수 있는 상태**를 유지하는 것을 의미합니다. 데이터베이스를 설계하거나 운영할 때, 데이터의 정합성을 유지하는 것은 매우 중요합니다. 정합성이 무너진다면 잘못된 정보에 의한 오류가 발생할 수 있습니다.
---
### 정합성을 유지하기 위한 주요 원칙
1. **무결성 제약조건(Integrity Constraints)**
데이터베이스에서 무결성 제약조건을 설정하여 데이터의 정확성을 보장합니다.
- **개체 무결성 (Entity Integrity)**:
테이블의 각 행(row)이 고유해야 한다는 원칙입니다.
- `PRIMARY KEY`를 사용하여 보장.
- 예: 학생 테이블의 `student_id`는 고유해야 함.
- **참조 무결성 (Referential Integrity)**:
한 테이블의 외래 키(Foreign Key)가 다른 테이블의 기본 키를 올바르게 참조해야 한다는 원칙입니다.
- 예: `user_id`가 없는 상태로 `user_subjects`에 데이터 추가를 방지.
- **도메인 무결성 (Domain Integrity)**:
데이터 값이 미리 정의된 데이터 타입, 길이, 범위에 적합해야 함.
- 예: 과목의 난이도는 ["초급", "중급", "고급"]만 가능.
- **고유성 (Uniqueness)**:
특정 컬럼이 중복된 값을 가질 수 없도록 보장.
- 예: 이메일 주소는 고유해야 함.
---
2. **정규화(Normalization)**
데이터베이스를 정규화하여 중복과 불필요한 데이터 저장을 방지.
- 데이터 중복을 줄여 정합성을 유지.
- 테이블 간 관계를 명확히 정의하여 데이터 간 충돌 방지.
- 예:
- 잘못된 설계: 과목 이름과 레벨을 한 테이블에 중복 저장.
- 올바른 설계: 과목 테이블(`subjects`)과 레벨 테이블(`levels`)로 분리.
---
3. **트랜잭션(Transaction) 관리**
트랜잭션의 **ACID** 속성을 통해 데이터 정합성을 보장.
- **원자성(Atomicity)**: 트랜잭션의 모든 작업이 성공하거나 모두 실패해야 함.
- **일관성(Consistency)**: 트랜잭션 후에도 데이터베이스가 무결성을 유지.
- **고립성(Isolation)**: 동시에 실행되는 트랜잭션 간 간섭 방지.
- **내구성(Durability)**: 트랜잭션 완료 후 데이터가 영구히 저장.
---
4. **제약조건과 데이터 검증**
- **서버 측 검증**: 데이터베이스와 애플리케이션 레이어에서 입력 값을 검증.
- 예: 숫자가 아닌 값이 `age` 필드에 들어가지 않도록 함.
- **애플리케이션 로직**: 프론트엔드와 백엔드에서 추가적인 데이터 검증 로직 작성.
- 예: 수강신청 시 과목 수가 3개를 초과하지 않도록 제한.
---
### 데이터 정합성을 저해하는 요소와 해결 방법
1. **중복 데이터**
- **문제**: 데이터가 여러 곳에 저장되면 한 곳을 수정했을 때 다른 곳과 불일치 발생.
- **해결**: 정규화를 통해 중복 최소화.
2. **잘못된 데이터 입력**
- **문제**: 잘못된 값이나 데이터 타입의 값이 입력됨.
- **해결**: 도메인 무결성과 입력 검증 적용.
3. **참조 관계 깨짐**
- **문제**: 외래 키가 참조하는 기본 키가 삭제됨.
- **해결**: 참조 무결성을 설정하고, ON DELETE/UPDATE 옵션 사용.
4. **동시성 문제**
- **문제**: 다중 사용자 환경에서 데이터 충돌 발생.
- **해결**: 트랜잭션 격리 수준 설정과 적절한 잠금(Locking) 사용.
---
### 실무에서 데이터 정합성 유지 사례
1. **유저-과목 테이블 예시**
- 관계형 DB에서 설계:
```sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE subjects (
id SERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE NOT NULL
);
CREATE TABLE user_subjects (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
subject_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (subject_id) REFERENCES subjects(id) ON DELETE CASCADE
);
```
- 데이터 삭제 시 참조 무결성 유지:
- 유저 삭제 → 해당 유저의 과목 데이터도 삭제.
2. **API 레벨 검증**
- 입력 데이터에 대해 백엔드와 프론트엔드에서 유효성 검사를 병행.
- 예: `POST /add-subject` 요청 시 필수 파라미터가 누락되지 않았는지 확인.
---
### 요약
데이터의 정합성은 데이터 모델 설계, 무결성 제약조건, 트랜잭션 관리, 정규화 등 여러 요소를 통해 보장할 수 있습니다. 실무에서 데이터 정합성을 유지하려면 **테이블 설계부터 트랜잭션, 데이터 검증 로직**까지 체계적으로 적용해야 합니다. 😊
카테고리 없음