메뉴

국가 전반의 테스트 데이터 확장: 불변식과 예외 목록

국가를 늘릴 때 무엇이 모든 국가에서 같아야 하는지 먼저 정하는 방법과, 예외를 목록으로 관리해 확장 비용을 낮추는 순서를 정리합니다.

게시일

  • 불변식
  • 확장

국가 전반의 테스트 데이터 확장은 새 나라를 계속 더하는 일이 아니라, 늘려도 무너지지 않는 규칙을 먼저 세우는 일입니다. 규칙 없이 늘리면 국가 수에 비례해 확인할 대상이 늘고, 어느 순간부터는 아무도 전체를 파악하지 못합니다.

모든 국가에서 같아야 하는 것은 무엇인가요?

국가가 달라도 같아야 하는 것들을 불변식이라고 부릅니다. 예를 들어 어떤 국가의 값이든 저장 형식은 같아야 하고, 하나의 값을 가리키는 식별자는 하나여야 하며, 같은 입력은 언제나 같은 결과로 이어져야 합니다. 이 규칙들은 국가와 무관하게 성립합니다.

불변식을 먼저 정하는 이유는 확인 대상을 줄이기 위해서입니다. 국가마다 달라도 되는 부분을 따로 떼어 두면, 새 나라를 더할 때 확인할 것은 불변식이 지켜지는지와 그 나라만의 예외가 무엇인지 두 가지로 좁혀집니다.

불변식은 문장으로 적고, 각 문장에 어디서 확인할지를 붙여 둡니다. 확인 방법이 없는 불변식은 지켜지는지 알 수 없고, 알 수 없는 규칙은 시간이 지나면 잊힙니다.

국가마다 달라도 되는 것은 어떻게 표시하나요?

달라도 되는 부분은 예외 목록으로 관리합니다. 예외는 그 자체로 나쁜 것이 아니라, 통제되지 않은 예외가 문제입니다. 목록에 있고 이유가 적혀 있으면 그것은 설계이고, 아무 데도 없이 코드에 흩어져 있으면 부채입니다.

예외 목록에는 세 가지를 적습니다. 어떤 국가에서, 어떤 항목이, 왜 다른지입니다. 왜가 빠지면 다음 사람이 그 예외를 실수로 보고 지우거나, 반대로 같은 예외를 하나 더 만듭니다.

예외가 늘어나는 추세 자체를 봅니다. 같은 항목에 예외가 여러 국가에서 반복되면, 그것은 예외가 아니라 규칙을 잘못 잡은 신호입니다. 이때는 예외를 더하는 대신 불변식을 다시 봅니다.

구분 예 관리 방법
불변식 저장 형식, 식별자 유일성 문장으로 적고 검사로 확인
예외 특정 국가의 항목 부재 국가·항목·이유를 목록에 기록
미결 아직 판단하지 못한 항목 비워 두고 미결로 표시

확장은 어떤 순서로 하는 게 좋나요?

먼저 불변식을 검사하는 방법을 만듭니다. 국가를 늘리기 전에 검사가 있어야, 늘린 뒤에 무엇이 깨졌는지 알 수 있습니다. 검사가 없는 상태에서 목록을 키우면 문제는 조용히 쌓입니다.

다음은 비용이 낮은 국가부터 더합니다. 값의 구조가 이미 다뤄 본 것과 비슷한 나라가 여기에 해당합니다. 이 과정에서 불변식이 실제로 지켜지는지 확인하고, 검사가 잡지 못한 부분을 보강합니다.

그다음이 예외가 많은 국가입니다. 앞 단계에서 검사가 자리를 잡았기 때문에, 예외가 생기는 지점을 정확히 짚을 수 있습니다. 마지막으로 지금 열지 않을 국가를 정해 목록에 남겨 둡니다. 열지 않는 결정도 기록이 있어야 다시 논의할 수 있습니다.

이 순서는 국가를 하나씩 더하는 방식보다 느려 보이지만, 뒤로 갈수록 빨라집니다. 앞 단계에서 만든 검사가 뒤 단계의 확인을 대신하기 때문입니다.

국가를 더할 때 기존 국가가 깨지는 이유는 무엇인가요?

가장 흔한 원인은 목록의 첫 항목이나 기본값을 전제로 만든 코드입니다. 새 나라가 목록의 앞이나 뒤에 들어오면 기본값이 바뀌고, 그 값을 기준으로 만들어진 화면이 함께 흔들립니다.

두 번째는 항목의 유무를 가정한 검증입니다. 모든 국가에 하위 행정구역이 있다고 가정한 규칙은, 없는 나라를 더하는 순간 그 나라의 정상 입력을 막습니다. 이 문제는 새 나라를 더하기 전에는 드러나지 않습니다.

세 번째는 정렬과 검색입니다. 새 나라의 이름이 기존 목록의 순서를 바꾸면, 순서 자체를 기대한 화면이 어긋납니다. 특히 위치로 값을 고르는 화면에서 이 문제가 큽니다.

이런 문제를 줄이는 방법은 값의 위치가 아니라 식별자를 기준으로 다루는 것입니다. 어떤 값이 목록에서 몇 번째인지는 언제든 바뀔 수 있습니다. 검증 규칙을 숫자 구간에 기대게 만드는 방식의 위험은 숫자 검증의 동작 방식에서 다룹니다.

네 번째는 이름이 바뀌는 경우입니다. 표기가 바뀌면 정렬 위치가 달라지고 검색 결과의 순서도 달라집니다. 이름과 코드를 나눠 저장해 두면 표기가 바뀌어도 저장된 값은 흔들리지 않습니다.

확장 속도를 어떻게 정하나요?

속도는 사람이 감당할 수 있는 확인량으로 정합니다. 한 번에 여러 나라를 더하면 검사 결과가 섞여 어느 변경이 문제를 만들었는지 알기 어려워집니다. 한 번에 하나씩 더하면 느리지만 원인이 분명합니다.

중간 지점을 찾는 방법은 묶음의 크기를 정하고, 묶음마다 같은 검사를 돌리는 것입니다. 검사가 통과하면 다음 묶음으로 넘어가고, 실패하면 그 묶음 안에서 원인을 찾습니다. 이 방식은 문제가 생긴 범위를 묶음 크기로 제한합니다.

속도를 정할 때는 유지 비용도 함께 봅니다. 목록이 커질수록 사람이 눈으로 확인해야 하는 부분은 줄이고, 검사가 대신하게 해야 합니다. 눈으로 보는 확인은 국가 수에 비례해 늘어나기 때문입니다.

개발자를 위한 메모: 불변식을 검사로 옮겨라

  • 불변식을 문장으로 적고, 각 문장에 대응하는 검사를 하나씩 둡니다. 문장만 있고 검사가 없으면 규칙은 지켜지지 않습니다.
  • 예외를 코드가 아니라 데이터에 둡니다. 예외를 목록으로 읽을 수 있어야 추세를 볼 수 있습니다.
  • 새 국가를 더할 때 기본값과 첫 항목을 전제로 한 코드가 없는지 먼저 확인합니다.
  • 항목의 유무를 가정하지 않습니다. 있는 나라와 없는 나라를 같은 규칙으로 처리할 수 있어야 확장이 멈추지 않습니다.
  • 목록에 넣지 않기로 한 국가와 이유를 남깁니다. 제외도 결정이고, 결정은 기록되어야 다시 다룰 수 있습니다.

다음 단계

지금 목록에서 국가를 하나 골라, 그 나라를 지웠을 때 무엇이 깨지는지 생각해 보세요. 깨지는 지점이 곧 아직 불변식으로 정리되지 않은 부분입니다. 커버리지 상태를 표로 관리하는 방법은 국가 데이터 커버리지 목록에서, 값을 늘릴 때의 출처 관리 원칙은 국가 데이터 최신성에서 이어집니다. 확장된 목록의 결과는 국가와 지역 디렉터리에서 확인할 수 있습니다.

이 글에 적힌 불변식 목록과 예외 항목은 확장 순서를 설명하려고 지어낸 합성 예시이며, 어떤 시스템의 실제 검사 규칙이나 실제 예외 목록을 옮긴 것이 아닙니다.

이어 읽기

국가별 주소 및 신원 데이터 형식 관련 글