상세 설계 문서

MySQL 전환 기록

MySQL 전환 기록 - 2026-06-06

전환 결정

Supabase 기반 MVP 진행을 멈추고 자체 서버에서 Next.js + MySQL 구조로 전환한다.

운영 기준:

  • 도메인: https://contract.noriter.co.kr
  • 앱 서버: Docker 컨테이너 real-estate-saas
  • 리버스 프록시/인증서: Docker 컨테이너 real-estate-caddy
  • DB: Docker 컨테이너 real-estate-mysql

코드 변경

  • @supabase/supabase-js 제거
  • mysql2 추가
  • src/lib/supabase-admin.ts 삭제
  • src/lib/mysql.ts 추가
  • src/app/api/admin/dashboard/route.ts를 MySQL 쿼리로 전환
  • src/app/api/admin/offices/route.ts를 MySQL 연결로 전환
  • src/lib/admin-offices.ts를 MySQL 트랜잭션 기반 등록/수정/조회로 전환
  • .env.exampleDATABASE_URL 기준으로 변경
  • docs/mysql-schema.sql 추가
  • Dockerfile, .dockerignore 추가

서버 변경

  • /home/ubuntu/real-estate-contract-saas에 최신 코드 동기화
  • real-estate-mysql 컨테이너 생성
  • MySQL 데이터 볼륨 real_estate_mysql_data 생성
  • 서버 전용 .env.mysql, .env.local 생성
  • docs/mysql-schema.sql 실행
  • real-estate-saas 이미지 재빌드 및 재시작

검증 결과

  • 로컬 npm run lint 통과
  • 로컬 npm run build 통과
  • 서버 Docker build 통과
  • GET https://contract.noriter.co.kr/api/admin/offices
    • source: "mysql"
    • configured: true
    • 부동산 3건 반환
  • GET https://contract.noriter.co.kr/api/admin/dashboard
    • source: "mysql"
    • configured: true
    • 등록 부동산 3곳, 사용자 6명 반환
  • HTTPS 응답 정상

문자셋 보정

  • MySQL 연결은 utf8mb4 charset을 명시한다.
  • docs/mysql-schema.sqlset names utf8mb4와 DB 기본 문자셋 설정을 먼저 실행한다.
  • 초기 seed 데이터 한글 깨짐은 seed update 구문으로 복구했다.
  • GET /api/admin/dashboardGET /api/admin/offices에서 한글 응답 정상 확인.

다음 우선순위

  1. MySQL 기반 로그인/권한 테이블 확정
  2. 본사관리자 부동산 오너 계정 생성
  3. 부동산 오너 관리자 사용자 등록 기능
  4. 계약하기 저장 API와 계약서 원본 데이터 구조 연결
  5. 계약관리, 고객관리, 매물관리 리스트 연결
  6. 과금 계산 로직 정식화
  7. PDF 저장/인쇄 구현