이전의 포스트에서 flyway를 적용시키고 테이블의 컬럼을 추가했습니다.
2023.08.19 - [spring] - Spring flyway 적용하기
Spring flyway 적용하기
다들 아시다시피 jpa의 ddl-auto는 create, create-drop, update 옵션을 사용하면 엔티티를 만들면 자동으로 DDL을 작성하여 테이블을 생성하고 수정하는 편리한 기능입니다. 하지만 운영환경에서도 이 기
hjsdev.tistory.com
현재 프로젝트에서 테스트 코드를 작성할 때 @Sql
어노테이션을 사용해 미리 작성한 sql파일로 필요한 데이터를 넣고 있어 추가된 컬럼을 수정했습니다.
이전 Sql
insert into student_lesson
values (1, false, 1, 1);
insert into student_lesson
values (2, false, 1, 2);
insert into student_lesson
values (3, false, 1, 3);
insert into student_lesson
values (4, false, 1, 4);
수정한 Sql
insert into student_lesson
values (1, false, 1, 1, false);
insert into student_lesson
values (2, false, 1, 2, false);
insert into student_lesson
values (3, false, 1, 3, false);
insert into student_lesson
values (4, false, 1, 4, false);
하지만 수정된 Sql로 다시 테스트를 돌리니 아래와 같은 문제가 발생했습니다.
SQLIntegrityConstraintViolationException cannot add or update a child row
해당 에러는 참조테이블에 없는 값을 추가해서 발생한 오류입니다. 하지만 분명히 참조 테이블에 대한 변경은 없었고 is_deleted
컬럼은 false
로 제대로 값을 넣어주고 있었는데 에러가 발생했습니다. 설마 컬럼의 위치가 달라서 생기는 문젠가 하고 확인했더니
사진과 같이 문제는 없었습니다.
계속 고민을 하다가 로컬이나 배포환경에서는 이미 있는 테이블에 컬럼을 추가했으니 끝에 추가가 됐고, 테스트 환경에서는 testContainer를 사용하고있는 환경에서 ddl-auto create 옵션으로 매번 새로운 테이블을 생성하니 Entity에 작성한 순서대로 컬럼이 위치하나하고 찾아보니 Entity에 정의한 순서대로 생성되는 것이 아닌 알파벳 순으로 변경되어 생성된다고 합니다.
그래서 테스트 환경에서는 student_lesson_id -> focus_status -> is_deleted -> lesson_id -> student_id 순으로 생성이된 것 입니다.
해결 방안
단순히 sql 문을 수정해서 문제를 해결할 수 있지만, 테이블은 계속해서 변화한다고 예상하고 테스트 환경과 운영 환경에서의 차이가 있다면 추후에도 계속 예상할 수 없는 문제가 생길 것 같아서 테스트 환경에서도 flyway를 적용시키는 방법으로 해결했습니다.
spring:
test:
database:
replace: none
datasource:
driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
url: jdbc:tc:mysql:8:///noti
username:
password:
hikari:
data-source-properties:
rewriteBatchedStatements: true
flyway:
enabled: true
jpa:
database-platform: org.hibernate.dialect.MySQL8Dialect
hibernate:
ddl-auto: validate
테스트 환경에서 사용하는 properties에 해당 설정을 추가해 flyway를 사용하게 했습니다.
- flyway: enabled: true
- jpa: hibernate: ddl-auto: validate
결론
ddl-auto를 믿지말자
'spring' 카테고리의 다른 글
Spring Security CORS 이슈 해결 - Preflight 403 Invalid CORS request (1) | 2023.10.10 |
---|---|
Java 17, Spring boot 3 알아보기 (0) | 2023.08.28 |
Spring flyway 적용하기 (0) | 2023.08.19 |