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

정규화란?

by 개발초보입니다 2024. 1. 13.

정규화란 무엇인가?

데이터베이스의 성능과 효율성을 향상시키기 위해 사용되는 중요한 개념 중 하나인 정규화는 데이터의 구조를 최적화하여 중복을 제거하고 일관성을 유지하는 과정입니다. 이는 데이터 베이스의 설계를 더욱 유연하고 견고하게 만듭니다.


정규화의 필요성

데이터베이스를 사용하면서 데이터의 양이 증가하면서 중복된 정보가 발생할 수 있습니다. 이로 인해 데이터 일관성이 흔들리고, 수정이나 삭제 시 문제가 발생할 수 있습니다. 정규화는 이러한 문제들을 해결하기 위해 데이터를 적절한 테이블에 분산시켜 중복을 최소화 하고, 데이터의 무결성을 보장합니다.

 

정규화는 또한 쿼리의 성능 향상에도 도움을 줍니다. 특히, 여러 테이블을 조인하더라도 데이터의 일관성을 유지하면서 효과적인 검색을 가능케 합니다. 이는 대규모 시스템에서 데이터 베이스의 성능을 향상시키는 데 중요한 역할을 합니다.

 

이처럼 정슈화는 데이터 베이스의 설계를 더욱 효율적으로 만들어 유지보수성과 확장성을 높이는 데 기여합니다.


정규화의 기본 원리

정규화는 데이터의 중복을 최소화하고 관계형 데이터베이스에서 데이터의 일관성과 무결성을 유지하기 위한 원칙에 기반합니다. 여러 정규형이 있지만, 일반적으로 1NF(제 1 정규형)에서 5NF(제 5 정규형) 까지의 단계를 거쳐 데이터를 정규화 합니다.


제 1 정규형(1NF)

데이터베이스 테이블의 각 열은 원자값(Atomic Value)을 가지며, 모든 열에는 반복되는 그룹이 없어야 합니다. 이는 각 셀에는 하나의 값만 들어가야 한다는 것을 의미합니다.


제 2 정규형(2NF)

테이블이 1NF 이어야 하며, 기본키에 대해 모든 열이 완전 함수 종속이어야 합니다. 즉, 기본키의 일부가 아닌 전체에 종속된 열이 없어야 합니다.


제 3 정규형(3NF)

테이블이 2NF이어야 하며, 기본키에 비종속적인 열이 없어야 합니다. 즉, 기본키에 직접적으로 종속되지 않는 열이 존재하지 않아야 합니다.


BCNF(Boyce-Codd 정규형)

3NF를 만족하며, 모든 결정자가 후보키여야 합니다. 결정자는 어떤 열의 값에 의해 다른 열의 값이 결정되는 역할을 합니다.


제 5 정규형(5NF)

BCNF를 만족하며, 다치 종속을 제거합니다. 다치 종속은 한 테이블의 두 후보키 간의 의존성을 의미합니다.


정규화의 단계별 예시

제 1정규형(1NF)

고려할 테이블

학생 정보 테이블 (Student)
----------------------------------
학번 (Student_ID) | 이름 (Name)     | 과목 (Subjects)
----------------------------------
101              | 홍길동          | 수학, 영어
102              | 이순신          | 국어, 수학

 

1NF를 적용한 테이블

학생 정보 테이블 (Student)
----------------------------------
학번 (Student_ID) | 이름 (Name)     | 과목 (Subject)
----------------------------------
101              | 홍길동          | 수학
101              | 홍길동          | 영어
102              | 이순신          | 국어
102              | 이순신          | 수학

제 2정규형(2NF)

고려할 테이블

주문 정보 테이블 (Order)
-----------------------------------
주문번호 (Order_ID) | 상품번호 (Product_ID) | 수량 (Quantity)
-----------------------------------
1                 | 101                   | 5
1                 | 102                   | 3
2                 | 103                   | 2

 

2NF를 적용한 테이블

주문 정보 테이블 (Order)
-----------------------------
주문번호 (Order_ID) | 수량 (Quantity)
-----------------------------
1                 | 5
2                 | 2

상품 정보 테이블 (Product)
--------------------------
상품번호 (Product_ID) | 주문번호 (Order_ID)
--------------------------
101                   | 1
102                   | 1
103                   | 2

제 3정규형(3NF)

고려할 테이블

도서 정보 테이블 (Book)
--------------------------------
도서번호 (Book_ID) | 저자 (Author)     | 출판사 (Publisher)
--------------------------------
1                 | 김작가             | A출판사
2                 | 이작가             | B출판사

 

3NF를 적용한 테이블

도서 정보 테이블 (Book)
-------------------------
도서번호 (Book_ID) | 저자 (Author_ID)
-------------------------
1                 | 1
2                 | 2

저자 정보 테이블 (Author)
-------------------------
저자번호 (Author_ID) | 저자 (Author)
-------------------------
1                   | 김작가
2                   | 이작가

비정규화와의 비교

정규화의 장점

  1. 중복 최소화
    • 정규화는 데이터베이스에서 중복을 최소화하여 저장 공간을 효율적으로 활용할 수 있습니다.
  2. 데이터 일관성
    • 데이터베이스가 정규화되면 데이터의 일관성이 유지되며, 갱신, 삽입, 삭제 작업이 더 쉬워집니다.
  3. 조인의 간소화
    • 테이블이 정규화되면 여러 테이블 간의 조인이 간소화되어 복잡성이 낮아집니다.

비정규화의 장접

  1. 조회 속도 향상
    • 비정규화는 조회 속도를 향상시키는 데 기여할 수 있습니다. 특히, 데이터의 읽기 작업이 많은 경우에 유용합니다.
  2. 질의의 단순화
    • 중복된 데이터를 갖고 있는 비정규화된 테이블은 특정 질의에서 단순화된 결과를 얻을 수 있어 개발자가 더 쉽게 질의를 작성할 수 있습니다.
  3. 트랜잭션 처리 간소화
    • 간혹 데이터의 중복이 트랜잭션 처리를 간소화할 수 있습니다. 특히, 쓰기 작업이 많은 시스템에서 유용합니다.

언제 사용할 것인가?

  • 정규화
    • 일반적으로 데이터베이스 설계 초기 단계에서 사용됩니다.
    • 트랜잭션 처리가 많은 OLTP(Online Transaction Processing) 시스템에서 주로 사용됩니다.
  • 비정규화
    • 데이터의 읽기 작업이 많은 경우나, OLAP(Online Analytical Processing) 시스템에서 사용됩니다.
    • 보고서 생성이나 분석에 적합한 구조를 만들 때 사용됩니다.

주의사항

  • 정규화
    • 과도한 정규화는 성능 저하를 일으킬 수 있습니다.
    • 테이블 간의 조인이 많아질수록 성능에 영향을 미칠 수 있습니다.
  • 비정규화
    • 데이터의 일관성을 위해 주의가 필요합니다. 중복된 데이터가 변경되면 모든 복사본이 업데이트되어야 합니다.
    • 각 상황에 맞게 적절한 정도의 비정규화를 선택해야 합니다.

Java나 Spring Framework에서의 정규화의 활용

ORM(Object-Relational Mapping)사용

  • Java에서는 ORM 라이브러리인 Hibernate, Spring Data JPA 등을 통해 객체와 데이터베이스 간의 매핑을 수행할 수 있습니다.
  • 정규화된 테이블을 기반으로 객체를 효율적으로 매핑하여 객체지향적인 개발을 가능케 합니다.

Spring Data JPA의 Repository 인터페이스 활용

  • Spring Data JPA에서 제공하는 Repository 인터페이스를 사용하면 데이터베이스 조작이 간편해집니다.
  • 테이블 간의 관계를 Java 코드로 표현하고, Repository를 통해 자동으로 쿼리를 생성하여 사용할 수 있습니다.
// 예: Spring Data JPA Repository 인터페이스
public interface StudentRepository extends JpaRepository<Student, Long> {
    // Custom Query Method 등록 가능
    List<Student> findBySubjects(String subject);
}

Spring MVC에서의 데이터 유효성 검증

  • Spring MVC에서는 데이터 유효성 검증을 위해 Hibernate Validator 등을 사용합니다.
  • 정규화된 데이터 모델을 기반으로 한 객체에 대한 검증 규칙을 정의하고, 이를 통해 입력 데이터의 일관성을 유지할 수 있습니다.
// 예: Hibernate Validator를 사용한 데이터 유효성 검증
public class Student {
    @NotEmpty(message = "이름은 필수 항목입니다.")
    private String name;

    // ...
}

Spring Security를 활용한 인증 및 권한 부여

  • Spring Security를 사용하면 정규화된 사용자 정보를 기반으로 인증 및 권한 부여를 수행할 수 있습니다.
  • 사용자 정보는 정규화된 형태로 데이터베이스에 저장되어야 하며, Spring Security를 통해 접근 권한을 부여받은 사용자만이 특정 기능에 접근할 수 있습니다.

Spring Batch에서의 대량 데이터 처리

  • Spring Batch는 대량 데이터를 처리하는 데 효과적입니다. 정규화된 데이터베이스 모델을 기반으로 하여 대량 데이터를 효과적으로 추출, 변환, 로드할 수 있습니다.
// 예: Spring Batch에서의 ItemReader
@Bean
public ItemReader<Student> studentItemReader(DataSource dataSource) {
    JdbcCursorItemReader<Student> reader = new JdbcCursorItemReader<>();
    reader.setDataSource(dataSource);
    reader.setSql("SELECT student_id, name, subjects FROM student");
    reader.setRowMapper(new BeanPropertyRowMapper<>(Student.class));
    return reader;
}

Spring Boot의 자동 설정과 관련된 활용

  • Spring Boot는 자동 설정을 통해 정규화된 데이터베이스 모델을 인식하고 필요한 빈을 자동으로 구성할 수 있습니다.
  • @Entity, @Repository, @Service 등의 어노테이션을 활용하여 빈을 정의하고, Spring Boot가 이를 인식하여 자동으로 빈을 구성합니다.
// 예: Spring Boot에서의 JPA Entity 클래스
@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long studentId;

    private String name;

    // ...
}

마무리

정규화는 데이터베이스 설계의 중요한 원칙 중 하나고, 데이터의 일관성과 무결성을 유지하면서 중복을 최소화하는 과정입니다. Java와 Spring Framework에서는 이러한 정규화된 데이터베이스 모델을 활용하여 강력하고 효율적인 애플리케이션을 개발할 수 있습니다.

 

프로젝트를 시작할 때는 데이터베이스 설계에서부터 정규화를 고려하는 것이 중요합니다. ORM 라이브러리를 활용하면 객체와 데이터베이스 간의 매핑이 용이해지며, Spring Data JPA를 통해 간단하게 Repository를 작성하여 데이터 조작이 가능해집니다.

 

또한, Spring Framework의 다양한 기능들을 활용하여 데이터 유효성 검증, 보안, 대량 데이터 처리 등을 효과적으로 수행할 수 있습니다. Spring Boot의 자동 설정은 정규화된 데이터 모델을 인식하고 빈을 자동으로 구성하여 개발 생산성을 향상시켜줍니다.

 

마지막으로, 각 프로젝트의 특성에 따라 정규화와 비정규화를 적절히 조절하고 사용하는 것이 중요합니다. 성능, 일관성, 확장성 등을 고려하여 데이터베이스 설계를 진행하면 높은 품질의 애플리케이션을 개발할 수 있습니다.