어떤 회사는 메모가 필요하고 어떤 회사는 품목과 수량만 보이면 된다. 그 차이마다 프로그램을 복사하면 같은 오류를 여러 곳에서 고쳐야 할 수 있다.

나는 회사별 차이를 설정으로 표현하되 무엇이든 숨기거나 실행할 수 있게 열어 두지는 않았다. 새 합성 코드는 설정 검증만 구현하며 실제 다중 회사 서비스나 동적 화면을 완성한 것은 아니다.

차이를 모두 코드 분기로 만들기 전에

이번 configuration은 버전, 회사 ID, 필드 목록과 기본 수량을 받는다. 품목과 수량은 필수이고 메모만 선택이다. 예제에 없는 업종별 항목을 상상해 넣지 않았다. 고정된 업무 핵심과 회사별로 조절할 선택을 분리하는 방법을 작게 검증하려는 구성이다. 실제 업체 자료나 설정은 사용하지 않았다.

설정이 늘면 각 조합의 의미도 함께 늘어난다. 필드를 지우는 일이 단순히 화면을 짧게 만드는지, 저장 가능한 자료의 뜻을 바꾸는지 확인해야 한다. 이번 예제에서는 핵심 두 항목을 제거한 설정을 거절한다. 사용하기 쉽다는 이유로 업무의 최소 조건까지 없애지는 않겠다는 판단을 함수로 남겼다.

허용 목록 밖의 설정을 무시하지 않는다

필드 이름과 최상위 키는 정해진 것만 허용한다. 같은 필드를 두 번 넣거나 모르는 script 키를 주면 오류가 난다. 기본 수량도 정수 1부터 99까지이며 참·거짓 값은 받지 않는다. 조용히 무시하면 설정자가 적용됐다고 믿을 수 있으므로 잘못된 입력을 초기에 드러내는 쪽을 선택했다.

이 허용 목록이 실제 서버의 보안 정책을 대신하지는 않는다. 회사 ID는 인증된 관리 문맥에서 정해야 하고 누가 설정을 변경할 수 있는지도 별도로 확인해야 한다. 이번 함수는 신뢰할 호출자가 넘긴 설정 값을 검사한다. 브라우저에서 회사 문자열을 바꿀 수 있다고 다른 회사 설정 권한이 생기는 것은 아니다.

설정 버전과 저장 자료 버전은 다르다

여기서 version 1은 설정 문법의 버전이다. 주문 자료가 어떤 스키마로 저장됐는지와 같은 숫자가 아니다. 화면에서 메모를 숨기는 선택도 이미 저장된 메모를 지우라는 명령으로 해석하지 않았다. 현재 모듈에는 실제 자료 저장과 삭제 기능이 없어서 그런 부작용이 실행되지 않는다.

실제 서비스에서는 기존 값 보존, 내보내기에서의 열 처리와 다시 켰을 때의 표시를 정해야 한다. 설정 변경이 자료 변환을 요구한다면 별도 미리보기와 검토가 필요하다. 나는 설정을 바꾸는 단추 하나가 보이지 않는 자료 변경까지 수행하는 흐름을 피하고 싶었다. 다른 책임은 다른 계약으로 드러내 둔다.

검증한 설정은 복사해서 돌려준다

함수는 입력을 그대로 공유하지 않고 깊은 복사본을 반환한다. 호출자가 결과의 필드 배열을 바꿔도 원래 설정은 변하지 않는지 테스트했다. 설정을 읽는 화면이 배열을 정리하면서 다른 곳의 기준까지 바꾸는 일을 줄이기 위한 작은 경계다. 실제 영구 저장이나 여러 요청의 동시 변경까지 해결하지는 않는다.

테스트에는 선택 필드 추가, 필수 필드 제거 거절, 중복과 알 수 없는 키, 잘못된 기본 수량이 들어 있다. 통과한 것은 이 합성 계약의 검사다. 실제 입력 화면이 설정에 맞춰 그려지는지, 라벨과 접근성 순서가 적절한지는 아직 별도다. 함수 테스트를 화면 검수 결과로 부르지 않는다.

재사용할 선택을 좁게 열어 둔다

회사마다 다르게 만들 수 있다는 말은 모든 차이를 자유로운 코드 조각으로 받는다는 뜻일 필요가 없다. 먼저 반복되는 차이를 알아내고 허용할 옵션과 지킬 규칙을 명시하면 공통 수정을 유지하면서 화면을 단순하게 할 수 있다. 이번 예제는 그 출발점만 코드로 만든 것이다.

공유 패키지에서 설정 검사와 자료 변환 미리보기를 각각 확인할 수 있다. 실제 적용에서는 화면 생성, 설정 저장, 변경 이력과 권한을 연결하고 조합별 흐름을 시험해야 한다. 나는 코드를 복사하지 않는다는 구호보다 어떤 차이는 허용하고 어떤 의미는 보존할지 설명하는 기준을 공개하고 싶었다.