공개 API가 없어서 '정직한 추정기'를 만들었다
LA에 처음 왔을 때 룸쉐어를 했습니다. 몇 달 뒤 렌트비가 확 올랐고, 저는 그냥 더 내고 살았습니다. 항의할 생각을 못 한 게 아니라, 그 인상이 합법인지 아닌지를 판단할 방법 자체를 몰랐습니다. 임대료 규제는 주마다, 시마다, 심지어 건물마다 다르고, 그걸 일반인이 알아내는 건 거의 불가능에 가깝습니다.
몇 년이 지난 지금도 사정은 비슷합니다. 제 임대 계약은 만료까지 3개월 남았고, 미국 렌트비는 여전히 살벌하고, 사업을 하는 입장에서 수입은 거의 없는 상황입니다. 다음 갱신 때 집주인이 얼마를 올릴 수 있는지가 저에게는 추상적인 질문이 아닙니다. 그때 문득 그 시절 생각이 났습니다. 이런 걸 알려주는 도구가 있었다면, 적어도 어딘가에 도움을 요청해볼 생각은 했을지도 모르겠다고.
그래서 만든 것이 RentRights입니다. 주소를 넣으면 그 주소에 어떤 임대료 규제 — LA City RSO, 캘리포니아주 AB1482, LA County 규정(RSTPO/JCO) — 가 적용될 가능성이 높은지 추정해주는 오픈소스 웹앱입니다.
문제: 확정 데이터가 존재하지 않는다
만들기 시작하면서 바로 부딪힌 현실이 있습니다. "이 주소는 RSO 대상입니다"라고 확정해주는 공개 API가 없습니다. RSO 등록부는 있지만 프로그램이 질의할 수 있는 형태가 아닙니다.
선택지는 둘이었습니다. 확정 못 하니까 안 만들거나, 추정할 수 있는 데이터로 추정하거나. 저는 후자를 골랐는데, 조건을 하나 달았습니다. 추정이라는 사실을 절대 숨기지 않는다. Census와 LA County Assessor의 공개 데이터에서 건축 연도 같은 단서를 모아 적용 가능성을 계산하되, 결과는 언제나 "추정"으로 표시합니다. 확신을 팔기 시작하는 순간 이 도구는 도움이 아니라 위험이 됩니다. 그래서 이름도 스스로 '정직한 추정기(honest estimator)'라고 부릅니다.
편향의 자백
룰 엔진에는 명시적인 방향성이 하나 있습니다. 건축 연도가 경계선에 걸리거나 데이터가 모호할 때, 엔진은 세입자 보호 쪽으로 기웁니다. "보호 대상일 수 있으니 확인해보세요"가 "해당 없음"보다 낫다는 판단입니다.
거창한 정의감에서 나온 원칙이라고 쓰고 싶지만, 솔직히 말하면 제가 세입자라서 그렇게 된 것 같습니다. 임대인이 만들었다면 다른 방향으로 기울었을지도 모릅니다. 중요한 건 그 편향을 숨기지 않는 것이라고 생각했습니다. 이 기울기는 룰 엔진에 명시적으로 코딩되어 있고, 198개의 테스트로 고정되어 있습니다. 누구든 코드를 열면 이 도구가 어느 쪽으로 기우는지 확인할 수 있습니다. 편향이 없는 도구인 척하는 것보다, 편향을 코드에 적어두고 테스트로 묶어두는 쪽이 더 정직하다고 믿습니다.
공개 데이터 통합은 신뢰가 전부
이런 도구는 한 번 틀린 답을 주면 끝이라, 견고함에 시간을 많이 썼습니다. Assessor 쿼리는 프로파일링해 보니 경로에 따라 13~55초까지 걸리는 경우가 있어서, 인덱스 기반 쿼리로 1초 안에 떨어지는 폴백 경로를 만들었습니다. 외부 API 호출은 사용자 입력이 쿼리 문자열에 그대로 보간되지 않도록, 허용된 파라미터만 화이트리스트로 통과시켜 쿼리가 변조될 여지를 줄였습니다. 화려한 부분은 아니지만, "렌트비 올랐는데 이거 맞나요"를 검색하다 들어온 사람에게 60초 로딩과 깨진 응답은 그냥 닫는 버튼과 같습니다.
그때의 나에게
이 앱이 법률 자문을 대체할 수는 없습니다. 목표는 더 소박합니다. 그 시절의 저처럼, 인상 통지를 받고 그게 정당한지조차 모른 채 그냥 더 내기로 하는 사람이 — 최소한 "물어볼 곳은 있는지" 찾아볼 용기를 얻는 것. 추정기가 할 수 있는 일은 거기까지고, 거기까지는 제대로 하고 싶습니다.