비투엔 기술기고

[기고] 데이터 품질 보장과 애플리케이션 성능 확보 사이에서

알 수 없는 사용자 2017. 6. 15. 19:55







데이터 중복 특성과 적용

전 회에서는 데이터 중복의 필요성과 대응 방안을 논하였다. 데이터 중복이 완전히 제거된 상태로 정보시스템을 구축하는 것이 가장 이상적이지만, 성능 확보를 위해 피할 수 없는 선택이라면 그 특성을 이해하고 적용할 필요가 있다. 이번 회에서는 데이터 중복 방식, 중복 방향, 컬럼 유형별 중복 제약사항 등을 살펴보고자 한다. 참고로, 본 기고에서 언급하는 데이터 중복의 범위는 동일한 데이터베이스 내에서의 중복에 한정함을 밝혀둔다. Data Warehouse 구축 등을 위해 타 데이터베이스로의 복제 등도 넓게 해석하면 데이터 중복이라고 할 수 있으나 본 기고에서는 다루지 않는다.



1. 데이터 중복 방식

데이터는 값에 대한 변형 없이 다른 위치에 복제하는 방식과 업무적인 의미에 따라 특정 규칙이나 로직을 적용하여 가공한 결과를 저장하는 방식으로 중복시킬 수 있다.


① Copy
- 특정 테이블의 컬럼을 다른 테이블에 동일하게 복제하는 방식
- 데이터 타입, 길이, 도메인 등이 완전히 동일




위 ERD(Entity Relationship Diagram)에서 주문상세 테이블의 주문일자 컬럼은 주문 테이블의 주문일자를 변형 없이 복사(Copy)한 컬럼이다. 주문상세 테이블에 데이터가 발생될 때에는 주문 테이블의 주문일자를 읽어 주문상세 테이블의 주문일자 컬럼에 기록한다. 또한 주문 테이블의 주문일자가 변경될 때에 연관된 주문상세 테이블의 모든 로우들의 주문일자도 동일한 값으로 변경되어야 한다. 결국 주문상세 테이블의 주문일자 컬럼은 항상 주문 테이블의 주문일자 컬럼과 동일한 값으로 유지되어야 하며, 특별한 사유가 없는 한 데이터 타입과 길이, 도메인이 일치해야 한다.



② Derivation
- 하나 이상의 컬럼에 정해진 로직을 적용하여 그 결과 값을 저장하는 방식
- 컬럼 대신 로우 수를 이용하기도 함
- 흔히, 저장되는 컬럼을 ‘Derived Column’이라고 함
- 데이터 타입, 길이, 도메인 등이 일치하지 않을 수 있음





위 ERD에서 주문상세 테이블의 주문금액 컬럼은 주문일자 시점의 상품단가 테이블 단가 컬럼에 주문수량을 곱하여 파생(Derivation)시킨 것이다. 이러한 컬럼을 파생컬럼(Derived Column, 유도컬럼이라고도 함)이라고도 한다. 파생컬럼은 하나 이상의 원천컬럼을 가공한 결과이므로 데이터 타입이나 길이 혹은 도메인이 일치하지 않을 수도 있다.



2. 데이터 중복 방향
데이터 중복 방향은 테이블 간 논리적 관계의 카디널리티(Cardinality, 관계수)에 따라 하향 또는 상향 등으로 분류할 수 있다.


① 하향 중복



1쪽 테이블의 컬럼을 M쪽 테이블에 중복하는 것을 하향 중복이라고 한다. 위 ERD처럼 주문 테이블의 주문일자를 주문상세 테이블에 복사하는 경우다.


② 상향 중복




M(Many)쪽 테이블의 컬럼을 1쪽 테이블에 중복하는 것을 상향 중복이라고 한다. 위 ERD처럼 주문상세의 주문수량을 Sum하여 주문 테이블에 총주문수량 컬럼에 저장하는 경우다. 또한 주문상세 테이블에서 주문금액이 가장 큰 상품코드 하나를 추출해 주문 테이블에 대표상품코드 컬럼으로 저장하고자 하는 경우도 상향 중복이다.



③ 자기 중복




테이블의 특정 컬럼들을 가공한 결과를 저장하기 위해 해당 테이블에 컬럼을 추가하는 경우를 자기 중복이라고 한다. 위 ERD에서 보험계약담보 테이블의 기본보험료 컬럼은 보험가입금액 × 보험료율을 계산한 결과를 저장한 것이며 자기 중복이다.


④ 혼합 중복




두 개 이상의 테이블에 있는 컬럼들을 가공한 결과를 특정 테이블에 저장할 때, 이를 혼합 중복이라고 한다. 위 ERD에서는 보험계약담보 테이블의 적용보험료가 혼합 중복에 해당하며 보험계약담보 테이블의 기본보험료에 할인할증 테이블의 할인할증율 컬럼 값을 곱한 결과를 저장하는 컬럼이다.

참고로, 할인할증은 특정 담보에만 국한하여 적용하는 할인할증과 모든 담보에 적용하는 할인할증 서브타입으로 표현되며, 보험계약담보 테이블의 적용보험료 계산 시 여러 개의 할인할증율을 반영하는 순서 등의 복잡한 계산식이 적용되어야 하나, 본 기고에서는 생략하기로 한다.



3. 데이터 중복 방식과 중복 방향 간 상관성

데이터 중복 방식과 중복 방향 간에서는 일정한 상관성 내지는 제약사항이 존재한다. 어찌 보면 아래 내용이 당연한 얘기처럼 보일 수 있으나, 실무에서는 당연한 것을 간과하고 무턱대고 데이터 중복 요건을 데이터 모델에 수용하여 혼란을 초래하는 경우가 있으므로 주의할 필요가 있다.


① 하향 중복과 데이터 중복 방식 상관성
데이터 중복 요건 상 상위 테이블, 즉 1에 해당하는 테이블의 컬럼을 M쪽 테이블에 중복하고자 할 경우는 Copy 방식과 Derivation 방식이 모두 허용된다. 데이터 중복이란 것이 본래 하나의 데이터 값을 하나 이상으로 복제 또는 가공을 의미하므로 하향 중복, 즉 1쪽 테이블의 데이터를 M쪽 테이블에 중복하는 것은 어떤 방식으로든 가능하다.

다만, 건수나 금액과 같은 숫자형 컬럼들에 대한 하향 중복 시 값이 M배만큼 확대 해석될 수 있으므로 주의가 필요하다. 이에 대해서는 컬럼 유형 중복 특성에서 따로 다루고자 한다.


② 하향 중복 외 중복 방향과 데이터 중복 방식 상관성
하향 중복을 제외한 상향 중복, 자기 중복, 혼합 중복의 경우는 모두 Derivation 방식만 허용된다. 다수 개를 하나로 모으고자 할 때 대표성을 가진 하나만을 선택하거나 혹은 어떤 계산식을 적용해야 할 것이므로 Copy 방식이 불가능함을 쉽게 알 수 있다. 다만, 자기 중복의 경우는 하나를 다능한 것은 아니지만 동일 테이블에 동일 의미를 지니는 컬럼을 두 개 이상 생성시킬 필요는 없으므로 Copy 방식은 의미가 없다. 데이터 중복 방식과 데이터 중복 방향 간 상관성을 요약하면 다음과 같다.




4. 컬럼 유형 중복 특성

데이터 값을 저장하기 위한 컬럼의 유형에 따라서도 데이터 중복 특성이 존재한다. 예를 들어, 숫자형 컬럼들을 하향 중복하면 의미적으로는 값이 M 배수만큼 확대 해석될 수 있는 위험성이 있다고 주지한 바 있다. 그러나 성별코드나 주문번호 등도 숫자형으로 정의할 수 있고, 이러한 컬럼들은 하향 중복이 가능하다.


① Measurement형 컬럼
Measurement형 컬럼이란, 주로 숫자형이며 Sum, Average 등과 같은 연산결과가 업무적으로 의미를 가질 수 있는 것들이다. 예를 들어 입금액, 출금액, 보험료, 보험금, 주문수량, 주문건수 등이 있다. 이와 같은 컬럼들의 데이터 중복 특성을 요약하면 다음과 같다.
- 상향 중복만 가능
- 하향 중복 필요 시 업무적 기준 필요
- Copy 방식의 하향 중복 필요 시 Group 함수 사용 제한

Measurement형 컬럼들을 상향 중복한다는 것은 M쪽 테이블의 컬럼 값을 Sum하거나 Average하여 그 결과를 1쪽 테이블에 저장하는 것이므로 업무적으로 타당하다. 반면 1쪽 테이블의 Measurement형 컬럼을 M쪽에 중복시키는 하향 중복을 해야 할 경우, Copy 방식을 이용하면 그 값이 M배수만큼 확대 해석될 수 있으므로 각별한 주의가 필요하다. 가급적 M개 로우에 배부하는 방식, 즉 복제한 결과를 Sum했을 때 1쪽 테이블의 컬럼 값과 동일한 값이 출력되도록 업무 규칙을 적용하여 복제할 것을 권고한다. 만약 하향 중복을 Copy 방식으로 해야 할 경우, 중복된 M개 데이터를 Sum이나 Average 등과 같은 Group 함수를 이용하면 값의 왜곡이 발생할 수 있으므로 사용하지 않도록 주의가 필요하다.


② 비 Measurement형 컬럼
Measurement형이 아닌 컬럼들에 대해서는 다음과 같은 중복 특성이 있다.
- 하향 중복만 가능
- 상향 중복 필요 시 업무적 기준 필요

이미 3.2 데이터 중복 방향의 하향 중복에서 예시한 바와 같이 비 Measurement형 컬럼에 해당하는 주문일자를 주문상세 테이블에 의미적 변형 없이 중복 가능하다. 반면에 ‘1.2 데이터 중복 방향’의 ‘상향 중복’에서 예시한 바와 주문상세 테이블의 상품코드를 주문 테이블에 중복하고자 할 때에는 여러 개의 상품코드 값을 하나의 상품코드 값으로 변형해야 하는 과정이 필요하다. 예시에서는 주문금액이 가장 큰 상품코드 하나를 선택해 주문 테이블에 대표상품코드로 중복시킨 것이다.




맺으면서

누차 강조하지만, 데이터 중복은 피할 수 있는 방법이 있다면 최대한 제거해야 하는 필요악(必要惡)이다. 그러나 시스템의 안정적인 정보 서비스를 위해 데이터 중복을 완전히 회피할 수는 없으므로 본 기고의 내용을 참고하여 의사를 결정하기 바란다. 마지막으로 본 기고에서 미처 언급하지 못한 추가사항을 다음과 같이 제언하면서 마치고자 한다.

  • 데이터 중복을 회피할 수 있는 기술적 대안을 찾아 적용한다.

  • 데이터 중복을 적용해야 할 상황이라면 원천 테이블의 컬럼 및 Derivation 규칙을 기술해둔다.

  • 데이터 중복의 원천이나 Derivation 규칙을 기술하는 명시적인 가이드라인을 규정하여 관리한다.

  • 데이터 중복의 원천이나 Derivation 규칙을 이용하여 데이터 정합성 품질을 주기적으로 측정할 수 있는 체계를 갖고 있어야 한다.

  • 데이터 중복은 성능 저하를 해소하기 위해 적용하며 정보시스템 구축 사업 시 개발 단계 후반기 또는 통합 테스트 단계에서 비로소 성능 저하 문제가 발견되어 데이터 중복 필요성이 인지되는 경우가 많다. 하지만 이 시기에 데이터 중복을 결정하면 중복 데이터의 정합성을 유지하기 위해 데이터 입력-변경-삭제하는 응용 프로그램의 변경이 불가피하고, 데이터 이행 등도 다시 해야 하는 등 적지 않은 문제에 직면한다. 그러므로 데이터 중복 요건을 조기에 발견하고 대응하는 것이 중요하다.

  • 개발 기간에는 개발자나 성능개선 담당자로부터 데이터 중복 요건을 받아 영향도를 평가해 중복 수용 여부를 결정할 수 있는 명시적인 절차와 R&R을 정해 운영할 필요가 있다. 프로젝트 후반에 성능 문제가 크게 대두되는 경우, 책임 소재를 놓고 논쟁이 발생할 수 있고 상호 불신과 조직의 내부 균열에 영향을 미칠 수 있으므로 명시적인 절차와 R&R의 규정은 의외로 중요하다. 데이터 모델러뿐 아니라 PMO의 지속적인 관심과 관리가 필요한 부분이기도 하다.


출처: 한국데이터진흥원 데이터 전문가 지식포털 DBguide.net