외부 DB 오류 분석 기록
관찰된 오류
배포 로그는 process_dev.directory_users 테이블이 없어서 애플리케이션이 시작 직후 종료되었음을 보여준다. 실패한 조회에는 현재 Directory Service가 더 이상 사용하지 않는 directory_users.password_hash와 directory_users.is_admin 컬럼이 포함되어 있다.
원인
현재 소스의 원장 모델은 사용자 기본 정보와 비밀번호 자격증명을 분리한다. 사용자는 directory_users에 저장하고 비밀번호 해시는 directory_user_credentials에 저장한다. 반면 로그의 dist/index.js는 과거 단일 사용자 테이블 모델을 사용하며 is_admin까지 조회한다. 또한 로그의 대상 DB는 process_dev이고, 해당 DB에는 현재 migration이 적용되지 않아 directory_users 테이블 자체가 없다.
따라서 단일 코드 오류가 아니라 다음 두 상태가 함께 발생한 것이다. 첫째, 배포 서비스가 현재 GitHub 최신 커밋이 아닌 구형 빌드 또는 다른 브랜치의 dist/index.js를 실행했다. 둘째, 관리형 클라우드의 process_dev DB에 Directory Service migration이 한 번도 적용되지 않았다.
수정 절차
배포 서비스의 소스 브랜치를 현재 Directory Service 최신 커밋으로 맞춘 뒤, 같은 배포 서비스의 DATABASE_URL이 가리키는 process_dev DB에 drizzle/0000부터 최신 migration까지 순서대로 적용해야 한다. migration은 애플리케이션 시작 명령에 임의로 삽입하지 않는다. 현재 개발 DB에는 일부 migration이 직접 적용되어 있어 자동 실행을 추가하면 이미 존재하는 테이블과 충돌할 수 있기 때문이다.
실제 관리형 클라우드 DB에 접속 가능한 운영 환경에서 pnpm drizzle-kit migrate를 실행하거나, 관리형 클라우드의 Pre-Deploy Command에 해당 명령을 등록한다. 적용 전후에는 SHOW TABLES로 directory_users, directory_departments, directory_user_credentials, directory_authorization_codes, portal_configurations가 존재하는지 확인한다. 적용 후에는 배포 서비스를 재배포하고 로그의 조회 SQL에 directory_user_credentials가 반영되는지 확인한다.
필요한 운영 정보
현재 프로젝트의 관리형 외부 DB와 배포 로그의 process_dev DB는 서로 다른 연결로 보인다. 이 환경에서 process_dev에 직접 migration을 적용하려면 관리형 클라우드의 실제 DATABASE_URL이 필요하다. 비밀번호가 포함된 URL은 채팅이나 소스에 입력하지 않고 관리형 클라우드 Secret 환경변수 또는 안전한 Secret 입력으로만 전달해야 한다.