개발 로그: 드라이버 심(Seams), URL 버그, 그리고 DB 설정

하루 종일 플랫폼을 구축하며 시간을 보냈습니다. 그 과정에서 한 가지 아키텍처 아이디어가 끊임없이 떠올랐습니다. 바로 수행하는 작업과 데이터를 저장하는 곳 사이에 '심(seam, 이음매)'을 두어야 한다는 것입니다.

이렇게 하면 나중에 메인 코드를 변경하지 않고도 백엔드를 교체할 수 있습니다.

심(Seams)의 패턴

저는 관측성(observability) 플랫폼을 구축하고 있습니다. 이 플랫폼은 다양한 소스로부터 에러와 메트릭을 수집합니다. 모든 저장 작업은 동일한 패턴을 따랐습니다.

• 작은 인터페이스(계약)를 생성합니다. • Eloquent 드라이버(구현체)를 생성합니다.

대시보드와 파이프라인은 인터페이스와만 통신합니다. 현재는 신뢰할 수 있는 Postgres를 사용하고 있습니다. 나중에 더 빠른 데이터베이스가 필요해지면, 새로운 드라이버를 작성하기만 하면 됩니다. 대시보드 코드는 수정할 필요가 없습니다.

교훈은 간단합니다. 첫날부터 두 번째 드라이버가 필요한 것이 아닙니다. 첫날부터 인터페이스가 필요합니다. 지금 만드는 파일 하나가 나중에 발생할 대규모 재작업을 방지해 줍니다.

세 가지 좋은 습관

이중 식별자를 사용하세요. 빠른 내부 조인(join)을 위해 auto-increment ID를 사용하고, URL이나 API처럼 시스템 외부로 나가는 모든 것에는 UUID를 사용하세요. 이렇게 하면 행(row)의 개수를 비공개로 유지할 수 있습니다.

Enum을 사용하세요. 역할(role)과 상태(status)를 PHP enum에 저장하세요. 이렇게 하면 UI와 로직이 동일한 단일 진실 공급원(source of truth)을 사용하도록 보장할 수 있습니다.

데이터에 버전을 부여하세요. 페이로드에 항상 버전 필드를 포함하세요. 새로운 선택적 필드는 추가하되, 기존 필드의 이름을 바꾸거나 삭제하지 마세요. 이는 이전 클라이언트의 작동이 중단되는 것을 방지합니다.

트래킹 URL 버그

이메일 트래킹 패키지에서 버그를 발견했습니다. 이 패키지는 클릭을 추적하기 위해 링크를 재작성합니다. URL을 암호화한 다음 리다이렉트 과정에서 이를 복구하는 방식입니다.

문제는 Laravel이 이메일 템플릿의 링크를 HTML 이스케이프(HTML-escape) 처리한다는 점입니다. 서명된(signed) URL은 "&" 문자를 사용하는데, HTML에서는 이것이 "&"로 변합니다.

이스케이프된 문자열을 암호화하면 URL에 "&"가 그대로 남게 됩니다. Laravel이 서명을 검증하려고 할 때, 문자열이 변경되었기 때문에 검증에 실패합니다. 이 문제는 서명된 URL에서만 발생하기 때문에 찾아내기가 어렵습니다.

해결 방법: URL을 캡처하기 전에 HTML 엔티티를 디코딩하세요.

설정을 위한 데이터베이스 활용

관리자가 대시보드에서 앱 설정을 변경할 수 있는 기능을 만들었습니다. 이 설정들은 데이터베이스에 저장되지만, 앱은 여전히 표준 config() 함수를 사용하여 이를 읽습니다.

저는 AppServiceProvider에 얇은 오버레이(overlay)를 사용합니다. 이 서비스 프로바이더는 데이터베이스 설정을 읽어 현재 요청(request)에 대한 config로 밀어 넣습니다. 이렇게 하면 나머지 코드를 단순하고 표준적인 상태로 유지할 수 있습니다.

여기서 관통하는 주제는 경계(boundaries)입니다. 심(seam)을 어디에 둘지 결정하세요. 경계를 한 번 올바른 위치에 설정해 두면, 나머지는 모두 단순하게 유지됩니다.

출처: https://dev.to/nasrulhazim/dev-log-2026-06-25-driver-seams-everywhere-a-tracking-url-bug-and-db-backed-settings-442l