본문 바로가기
카테고리 없음

데이터의 정합성 ( 수정 예정)

by momomoo 2024. 11. 17.

### 데이터의 정합성(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` 요청 시 필수 파라미터가 누락되지 않았는지 확인.

---

### 요약
데이터의 정합성은 데이터 모델 설계, 무결성 제약조건, 트랜잭션 관리, 정규화 등 여러 요소를 통해 보장할 수 있습니다. 실무에서 데이터 정합성을 유지하려면 **테이블 설계부터 트랜잭션, 데이터 검증 로직**까지 체계적으로 적용해야 합니다. 😊