bibimbap/docs/db-update-query-generator.md

98 lines
2.9 KiB
Markdown

# DB 업데이트 쿼리 생성기 사용법
`DbUpdateQueryGeneratorTest``dev` 스키마와 `live` 스키마의 테이블 구조를 비교해서, `live`에 필요한 DDL 쿼리를 생성하는 테스트 유틸이다.
현재 설정은 코드에 하드코딩되어 있다.
```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`를 사용한다.