PostgreSQL 호환성 전수검사 기록
검사 범위
PortalConsole, ProcessCenter, DocumentLibrary의 DB provider, Drizzle schema, migration, raw SQL, upsert, write-result 처리, 테스트·빌드 설정을 점검했다.
확인된 상태
| 저장소 | PostgreSQL 상태 | 핵심 위험 |
|---|---|---|
| PortalConsole | MySQL/PostgreSQL provider·schema·migration 분기 존재 | 일부 서버 write 경로에 MySQL 전용 onDuplicateKeyUpdate가 남아 있음 |
| ProcessCenter | MySQL/PostgreSQL provider·schema·migration 분기 존재 | 일부 upsert가 MySQL 전용이고, 여러 repository가 affectedRows·insertId를 PostgreSQL 결과에 그대로 의존함 |
| DocumentLibrary | MySQL 전용 mysql2, mysqlTable, MySQL migration만 존재 | PostgreSQL URL을 넣으면 adapter·schema·migration 단계에서 지원되지 않음 |
이미 수정한 ProcessCenter 범위
server/db-connection.ts에 MySQL affectedRows와 PostgreSQL rowCount를 정규화하는 getAffectedRowCount와 방언별 upsert를 선택하는 dialectUpsert를 추가했다. 삭제·optimistic-lock 판정 경로를 공통 결과 함수로 전환했고, 디렉터리 동기화의 상태·조직·사용자 upsert를 PostgreSQL onConflictDoUpdate와 MySQL onDuplicateKeyUpdate로 분기할 수 있게 변경 중이다.
추가 고위험 후보
PortalConsole에는 server/directory.ts, server/portalApiKeys.ts, server/portalCredentialDelivery.ts, server/portalProvisioning.ts, server/portalRoutes.ts, server/themeSettings.ts, server/uiDelivery.ts, server/userIdentity.ts, server/userProfile.ts, server/encryptionRotationHistory.ts, server/backfillAssets.ts 등에 onDuplicateKeyUpdate가 남아 있다. 이 중 PostgreSQL 운영 DB에서 호출될 수 있는 경로는 방언별 upsert로 교체해야 한다.
ProcessCenter에는 server/repositories/approvalRepository.ts, organizationRepository.ts, terminologyRepository.ts에 PostgreSQL identity 반환을 위한 returning() 보정이 필요하다. PostgreSQL에서는 MySQL의 insertId가 제공되지 않는다.
DocumentLibrary는 단순 문법 보정 대상이 아니라 PostgreSQL driver, PostgreSQL schema, 별도 migration, transaction/result normalization을 추가해야 하는 별도 마이그레이션 작업이다. 현재 상태에서는 MySQL 전용 저장소로 분류하는 것이 안전하다.
검증 주의사항
환경변수 없이 전체 테스트를 실행하면 PortalConsole의 envelope encryption 테스트가 PORTAL_CONSOLE_ENVELOPE_MASTER_KEY 누락으로 실패할 수 있다. ProcessCenter는 기존 UI 계약 테스트와 환경 의존 테스트가 DB 호환성 테스트와 별개로 실패할 수 있으므로 저장소별 결과를 분리해서 기록한다.