Spring Boot prod 프로필이 켜졌는데 DB 설정이 맞지 않았던 기록
GitHub Actions로 CI/CD를 구성하던 중이었습니다. 개발 환경은 H2 인메모리 DB를, 배포 환경은 MySQL을 사용했습니다. 배포용 설정은 application-prod.yml에 두고 prod 프로필로 실행하도록 해 둔 상태였습니다.
배포 설정이 로컬에서도 동작하는지 보려고 두 파일을 함께 두었습니다.

IntelliJ 실행 설정에도 사용할 프로필을 지정했습니다.

실행 로그에도 prod가 활성화됐다는 메시지가 찍혔습니다.
Spring Boot의 설정 우선순위 문서에 따르면 prod가 활성화되면 기본 설정과 프로필별 설정을 모두 읽습니다. 같은 위치의 프로필별 값이 기본 값을 덮어쓸 뿐 기본 파일의 나머지 설정은 그대로 남습니다.

프로필은 켜졌는데 DDL 오류가 났습니다
오류가 난 부분의 로그입니다. 스택 트레이스 뒷부분은 생략했습니다.
Hibernate:
drop table if exists user_info CASCADE
2023-07-20 22:23:34.184 WARN 24522 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Warning Code: 1051, SQLState: 42S02
2023-07-20 22:23:34.184 WARN 24522 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Unknown table '...'
Hibernate:
create table user_info (
id bigint generated by default as identity,
account_type varchar(255),
is_admin boolean,
is_ban boolean,
is_writer boolean,
sns_id varchar(255),
user_email varchar(255),
user_name varchar(255),
user_password varchar(255),
primary key (id)
)
2023-07-20 22:23:34.213 WARN 24522 --- [ main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL "
create table user_info (
id bigint generated by default as identity,
account_type varchar(255),
is_admin boolean,
is_ban boolean,
is_writer boolean,
sns_id varchar(255),
user_email varchar(255),
user_name varchar(255),
user_password varchar(255),
primary key (id)
)" via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
create table user_info (
id bigint generated by default as identity,
account_type varchar(255),
is_admin boolean,
is_ban boolean,
is_writer boolean,
sns_id varchar(255),
user_email varchar(255),
user_name varchar(255),
user_password varchar(255),
primary key (id)
)" via JDBC Statement
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:458) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
이하 생략먼저 눈에 띈 것은 다음 SQL 문법 오류였습니다.
Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'by default as identity,
account_type varchar(255),
is_admin bool' at line 2처음에는 MySQL 예약어 문제라고 생각했습니다. 그다음에는 prod를 활성화했는데도 기본 파일의 H2 설정이 영향을 주는 것이 아닌지 의심했습니다.
그런데 위 로그에서 generated by default as identity 구문을 거부한 쪽은 MySQL이었습니다. 이 로그만 보고 “H2에 연결됐다”고 결론 내릴 수는 없고 실제 연결 대상과 Hibernate의 SQL 방언 설정을 함께 확인해야 합니다.

시험 삼아 prod의 내용을 기본 application.yml에 그대로 넣었더니 실행됐습니다. 이어서 기본 파일의 개발 설정을 application-dev.yml로 분리했을 때도 문제가 해결됐습니다.
파일을 분리한 뒤 실행은 됐지만 이것만으로는 어떤 설정이 섞였는지 알 수 없습니다. application.yml이라는 이름 자체가 문제이거나 이를 반드시 dev로 바꿔야 하는 것은 아닙니다.

개발 설정을 분리한 뒤에는 dev도 명시적으로 활성화해야 합니다. 아래 spring.profiles.active 설정은 기본 설정 파일이나 실행 옵션에 둡니다. 프로필별 파일 자체에는 넣지 않습니다. 프로필 공식 문서를 참고했습니다.
spring:
profiles:
active: dev