본문 바로가기

데이터 Story/모델링 이론

선분 이력의 종료일자

이번 글에서는 종료일자에 대해 쓰려고 합니다. 선분 이력은 다 아실 것입니다. 자세한 내용은 제 책 등을 참고해 보시고요.

 

간단히 설명하면 선분 이력은 과거 특정 시점의 데이터를 조회하는 요건이 많을 때 채택하는 조회 성능을 고려한 방법입니다. 즉 성능 문제가 없다면 선분 이력을 채택하지 않아도 됩니다.

 

제 책에서 선분 이력을 설명한 목적이 두 가지가 있었습니다. 하나는 성능 이슈가 존재할 때 선분 이력을 정확하게 사용할 수 있도록 하는 것이고, 또 하나는 선분 이력의 남용을 방지하기 위해서입니다.

 

그런데 첫 번째 목적인 성능 문제에 대한 이슈가 최근에 있었는데요. 저 또한 Between 조회가 성능상 유리하다고 생각해 그렇게 썼는데요. Between 조회가 아니더라도 성능상 큰 문제가 없다고 주장한 블로그가 이슈가 됐습니다. 자세한 내용은 오동규님의 블로그를 참고해 보세요.

 

변경이력 테이블에 종료일자가 필요한가

 

제 책에도 썼지만 OLTP(Online Transaction Process)에서 성능 이슈가 발생할 때는 흔치 않습니다. 성능 이슈는 보통 광범위한 범위를 조회할 때 발생하기 때문에 Between 조회를 고려해야 하는 요건은 흔치 않습니다. 더구나 오동규님의 의견에 의해서 Between 조회 요건은 대폭 줄어들 것입니다. 그렇다고 앞으로 종료일자를 다 없애도 안 될 거 같습니다. ㅎㅎ

 

모델링은 종합적인 판단이 필요합니다. 제 책 제목에 전략서라는 단어를 사용했는데요. 이론적인 내용만으로 모델링을 수행하기에는 아직 체계가 굳건하지 않고요. 많은 사람이 모델링에 대한 공감대가 한방향으로 형성되면 아마 심리적이거나 환경적인 영향으로 모델링이 좌지우지되는 상황도 줄어들 거 같습니다.

 

성능은 5%만 빠르게 하는 방법도 채택해야 할 경우가 있습니다. 얼마나 중요하고 자주 사용되는 요건인지에 따라 결정이 달라질 수 있습니다. 성능 문제를 심도 있게 논할 능력은 없어서 상황에 맞는 전략적인 판단이 필요하다라고 언급하고 넘어가겠습니다.

 

제 책에서 더욱 강조했던, 두 번째 목적인 선분 이력의 남용에 대해 설명드리면요.

 

선분 이력에서 사용하는 종료일자는 몇 가지 문제가 있습니다. 가장 큰 문제는 추출 속성이라는 것입니다. 시작일자와 종료일자가 선분이 되도록 관리해야 하기 때문에 새로운 인스턴스의 시작 시점을 참조해 이전 인스턴스의 종료 시점을 계산해 업데이트 해야 합니다.

 

만약 시작일자와 종료일자를 연결해서 선분이 되지 않는다면 문제가 됩니다. 때에 따라서는 심각한 문제가 되고요. 제가 지속적으로 강조하는 무결성 문제입니다.

 

지난 날에는 무결성보다 성능을 더욱 중시했지만 점점 성능보다 무결성을 중요시 할 것입니다. 이미 데이터 품질 관련 프로젝트가 상당히 많습니다. 제가 5년 전에 예측한 일들인데 앞으로 5년 후에는 무결성에 더욱 힘을 기울일 것입니다. 성능 문제는 심각한 성능 문제에만 초점을 맞추게 될 것이라 생각합니다.

 

잠깐 다른 얘기를 했는데요. 시작일자와 종료일자를 연결해 선분이 되지 않는 예가 종종 있습니다. 유기체와 유사한 데이터를 완전하게 통제하기는 어렵습니다. 중복 속성을 사용하면 안 되는 이유입니다.

 

추출 속성인 종료일자는 성능을 향상시키기 위한 속성이지 본질적인 속성이 아닙니다. 데이터 성격상 없어도 되는 속성입니다. 성능상 커다란 이득도 없는 거 같습니다. 약간의 차이 사이에서 선택하는 문제인 거 같아요.

 

추출 속성인 종료일자 속성이 추가됨으로 인해 데이터 정합성이 깨지게 될 가능성이 존재한다는 점은 항상 유념해야 합니다. 실제로 실무에서 종종 볼 수 있는 현상입니다. 종료일자를 관리하는 선분 이력을 채택하는 것은 신중해야 합니다.

 

최근에 거의 무의식적으로 선분 이력을 채택하는 경향이 있습니다. 심지어 내역 데이터를 관리하는 엔터티에도 종료일자 속성을 포함하는 경향이 있습니다. 이건 내역 데이터인지 이력 데이터인지를 명확하게 분석하지 못한 게 원인이겠지만요.

 

마지막으로 기간을 의미하는 종료일자가 있습니다. 선분 이력을 위한 종료일자와 기간을 관리하는 종료일자는 다릅니다. 예를 들어 보험계약 엔터티의 보험 기간을 의미하는 보험시작일자와 보험종료일자는 이력 관리를 위한 데이터가 아닙니다.

 

보험시작일자와 보험종료일자 속성은 핵심적인 기초 속성(Basic Attributes)이므로 생략하면 안 됩니다. 추출 속성이 아니라는 거죠.

 

만약 보험종료일자가 연장되면, 이때 이력 데이터가 생깁니다. 기존의 보험종료일자를 관리해야 하기 때문에 [그림1]과 같이 관리될 것입니다. 보험기간만 선분 이력으로 관리한다고 가정하고 20257 1일에 2045년까지로 계약을 연장했다고 가정하겠습니다.

 

 

[보험계약]

#보험계약

보험시작일자

보험종료일자

보험료

보험금

123

2025-05-01

2035-04-30

10000

100000000

 

[보험계약기간이력]

#보험계약

#유효시작일자

유효종료일자

보험시작일자

보험종료일자

123

2025-05-01

2025-06-30

2025-05-01

2045-05-01

 

[그림1]

 

기간을 의미하는 이런 기초 속성은 선분 이력 속성과의 차별을 위해 ‘유효’라는 단어를 사용하지 않고 보험기간종료일자나 보험종료일자 등과 같이 사용하는 것이 좋습니다. 이력 데이터에는 ‘유효’를 붙이는 게 좋을 거 같습니다. 반대로 사용해도 좋고요. 일관적으로만 사용하면요.

 

추출 속성인 선분 이력의 종료일자 속성 사용은 신중을 기해야 합니다. 보수적으로 사용할것을 권하고요. 무의식적으로 무조건 사용하는 것을 지양해야 합니다.