# DB 업데이트 쿼리 생성기 사용법

`DbUpdateQueryGeneratorTest`는 `dev` 스키마와 `live` 스키마의 테이블 구조를 비교해서, `live`에 필요한 DDL 쿼리를 생성하는 테스트 유틸이다.

관련 문서:

- [문서 인덱스](index.md)
- [2026-06-16 프로젝트 전면 분석](analysis/2026-06-16-project-analysis.md)
- [보안 개선 체크리스트](security/security-remediation-checklist.md)
- [회원가입 정보 구조](user-signup-schema.md)

현재 설정은 코드에 하드코딩되어 있다.

```java
select = dev
update = live
```

## 생성되는 파일

테스트를 실행하면 아래 파일이 생성된다.

```text
src/test/db/dev-to-live-update.sql
```

이 파일에는 `live`에 적용할 수 있는 테이블 생성 쿼리가 저장된다.

## 생성되는 쿼리

`dev`에는 있지만 `live`에는 없는 테이블이 있으면 다음 정보를 포함한 쿼리를 만든다.

- `CREATE SEQUENCE IF NOT EXISTS`
- `CREATE TABLE`
- 컬럼 타입
- `NOT NULL`
- `DEFAULT`
- `PRIMARY KEY`
- 컬럼 `COMMENT`

예시:

```sql
CREATE SEQUENCE IF NOT EXISTS "users_id_seq";
CREATE TABLE "users" (
    "id" bigint DEFAULT nextval('users_id_seq'::regclass) NOT NULL,
    "display_name" character varying(80) NOT NULL,
    "created_at" timestamp with time zone DEFAULT now() NOT NULL,
    PRIMARY KEY ("id")
);
COMMENT ON COLUMN "users"."id" IS '사용자 고유 ID';
```

## 생성하지 않는 쿼리

데이터 복제 쿼리는 생성하지 않는다.

아래와 같은 쿼리는 만들지 않는다.

```sql
INSERT INTO "games" (...) SELECT ... FROM "dev"."games";
UPDATE "games" SET ...;
SELECT setval(...);
```

즉, 이 유틸은 데이터 복사가 아니라 스키마 구조 업데이트용이다.

## 실행 방법

IntelliJ에서 실행할 때:

1. `src/test/java/com/pandoli365/bibimbap/DbUpdateQueryGeneratorTest.java`를 연다.
2. `printRequiredUpdateQueries()` 테스트를 실행한다.
3. 콘솔에 `SQL file saved: ...` 메시지가 나오는지 확인한다.
4. `src/test/db/dev-to-live-update.sql` 파일을 열어 생성된 SQL을 확인한다.

Maven으로 실행할 때:

```powershell
$env:JAVA_HOME='C:\Users\acst0\.jdks\azul-21.0.10'
.\mvnw.cmd -Dtest=DbUpdateQueryGeneratorTest test
```

## 적용 방법

생성된 SQL은 바로 운영 DB에 적용하지 말고 먼저 내용을 확인한다.

확인할 항목:

- 생성 대상 테이블이 맞는지
- `DEFAULT nextval(...)` 시퀀스 이름이 의도한 이름인지
- `NOT NULL`, `DEFAULT`, `PRIMARY KEY`가 맞는지
- 컬럼 코멘트가 깨지지 않았는지

문제가 없으면 `live` DB에 접속한 상태에서 `src/test/db/dev-to-live-update.sql`의 내용을 실행한다.

## 주의사항

- 이 유틸은 DB에 직접 변경을 적용하지 않는다.
- 테스트 실행 시 DB에는 읽기 쿼리만 수행한다.
- 생성된 SQL에는 `"live".` 스키마 prefix를 붙이지 않는다.
- 따라서 SQL을 실행할 때는 반드시 `live` 스키마가 기본 스키마로 잡힌 연결에서 실행해야 한다.
- `dev` DB 접속 정보는 `src/main/resources/dev/db.properties`를 사용한다.
- `live` DB 접속 정보는 `src/main/resources/live/db.properties`를 사용한다.

## 관련 문서

- [analysis/2026-06-16-project-analysis.md](./analysis/2026-06-16-project-analysis.md) — 이 유틸을 "운영 도구(실DB 필요·CI 불가, surefire 제외)" 로 분류한 D3 테스트 분석 참조.
