첫날부터 심(Seam)을 구축하십시오
대용량 데이터를 위한 플랫폼을 구축할 때는 선택의 기로에 서게 됩니다.
장기적인 저장을 위해 빠른 데이터베이스가 필요합니다. 하지만 첫날부터 복잡한 시스템을 구축하는 것은 어렵습니다. 아직 데이터 패턴조차 파악하지 못했을 수도 있습니다. 가장 안전한 선택은 이미 사용 중인 표준 관계형 데이터베이스를 사용하는 것입니다.
실수는 코드를 그 첫 번째 데이터베이스에 직접 결합하는 것입니다. 앱의 모든 부분이 데이터베이스를 직접 호출하게 되면 함정에 빠지게 됩니다. 나중에 더 나은 데이터베이스로 교체하려면 엄청난 규모의 리팩터링이 필요할 것입니다.
올바른 방법은 심(seam)을 구축하는 것입니다.
심은 계약(contract)입니다. 시스템이 '어떻게' 하는지는 말하지 않고, '무엇을' 하는지만 정의합니다.
- 작업에 대한 인터페이스를 만듭니다.
- 현재 데이터베이스를 사용하는 기본 드라이버를 작성합니다.
- 해당 드라이버를 인터페이스에 바인딩합니다.
앱의 다른 모든 부분은 인터페이스하고만 통신합니다. 백그라운드에서 어떤 데이터베이스가 실행되고 있는지 아무도 알 수 없습니다.
데이터가 늘어나 더 빠른 시스템이 필요해지면, 작업은 간단해집니다. 새 드라이버를 작성하고, 코드 한 줄을 변경한 뒤 배포하면 됩니다. 대시보드가 깨지거나 파이프라인이 중단되는 일은 없습니다.
어떤 이들은 이를 성급한 추상화(premature abstraction)라고 부릅니다. 아직 그럴 필요가 없다고 말이죠.
저는 동의하지 않습니다. 인터페이스를 만드는 데는 파일 하나가 더 추가될 뿐입니다. 이를 건너뛰는 것은 단지 비용을 나중으로 미루는 것일 뿐입니다. 결국 변경이 필요해졌을 때, 당신은 압박감 속에서 수백 개의 파일을 수정해야 할 것입니다. 인터페이스는 저렴한 보험과 같습니다.
심을 더 견고하게 만들기 위해 다음 세 가지 습관을 활용하십시오:
이중 식별자를 사용하십시오. 내부 데이터베이스 조인(join)에는 빠른 정수(integer)를 사용하십시오. 시스템 외부로 나가는 모든 것에는 UUID를 사용하십시오. 이렇게 하면 데이터를 안전하게 유지하면서 조인 속도를 높일 수 있습니다.
공통 어휘를 위해 Enum을 사용하십시오. 상태(status)나 심각도(severity)를 나타낼 때 임의의 문자열을 사용하지 마십시오. 단일 Enum을 사용하여 앱의 모든 부분이 동일한 언어로 소통하게 하십시오.
데이터에 버전 관리된 엔벨로프(envelope)를 사용하십시오. 시스템이 여러 소스로부터 데이터를 받는다면 엄격한 스키마를 사용하십시오. 새로운 필드만 추가하십시오. 새 버전 없이 필드를 삭제하거나 이름을 변경해서는 안 됩니다. 이렇게 하면 시스템을 개선하는 동안에도 기존 클라이언트가 정상적으로 작동합니다.
경계를 찾으십시오. 계약으로 이름을 붙이십시오. 단순한 구현으로 그 안을 채우십시오.
계약은 당신의 약속입니다. 드라이버는 단지 오늘 그 약속을 지키는 방법일 뿐입니다.
Source: https://dev.to/nasrulhazim/build-the-seam-on-day-one-the-second-driver-on-day-ninety-26b
