-
Notifications
You must be signed in to change notification settings - Fork 8
test: flyway 스크립트를 검증하는 테스트 코드 작성 #588
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
test: flyway 스크립트를 검증하는 테스트 코드 작성 #588
Conversation
Walkthrough
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested reviewers
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
15-18: 테스트 메서드 본문이 비어있는 이유를 명확히 해주세요.빈 메서드 본문이 의도적인 것이지만, 컨텍스트 로딩만으로 검증이 완료된다는 점을 주석으로 설명하면 코드 가독성이 향상됩니다.
🔎 제안하는 개선안
@Test void flyway_스크립트가_정상적으로_수행되는지_확인한다() { - + // Flyway 마이그레이션은 Spring 컨텍스트 초기화 시점에 자동으로 실행됩니다. + // 스크립트에 구문 오류나 JPA 엔티티와의 불일치가 있으면 컨텍스트 로딩이 실패합니다. }또한, Flyway가 실제로 실행되었는지 명시적으로 확인하려면 다음과 같이 개선할 수 있습니다:
+import org.flywaydb.core.Flyway; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.assertj.core.api.Assertions.assertThat; + @TestContainerDataJpaTest @TestPropertySource(properties = { "spring.flyway.enabled=true", "spring.flyway.baseline-on-migrate=true", "spring.jpa.hibernate.ddl-auto=validate" }) class FlywayMigrationTest { + @Autowired + private Flyway flyway; + @Test void flyway_스크립트가_정상적으로_수행되는지_확인한다() { - + // Flyway 마이그레이션이 성공적으로 적용되었는지 확인 + assertThat(flyway.info().applied()).isNotEmpty(); } }
📜 Review details
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
7-12: 테스트 접근 방식이 효과적합니다!컨텍스트 초기화 시점에 Flyway 스크립트 검증을 수행하는 방식은 타당합니다. 설정된 속성들도 적절하며,
@TestContainerDataJpaTest어노테이션을 통해 실제 MySQL 8.0 TestContainer를 사용하므로 다음 점들이 보장됩니다:
- 실제 MySQL 데이터베이스에 대한 마이그레이션 검증 - H2 호환성 문제 없음
- AUTO_INCREMENT, ENGINE=InnoDB, 백틱(`) 등 MySQL 전용 구문이 정상 작동
- 개발/프로덕션 환경과 동일한 데이터베이스에서 테스트되므로 신뢰도 높음
테스트는 현재 올바르게 구현되어 있습니다.
f11d220 to
9bd83cc
Compare
9bd83cc to
7d8c1a9
Compare
- 새로운 MySQL 환경에서 마이그레이션이 이루어지도록 수정
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
19-22: 테스트 메서드에 명시적인 검증 또는 주석을 추가하는 것을 권장합니다.현재 구현은 컨텍스트 로딩 중 Flyway 마이그레이션이 실행되고, 스크립트에 문제가 있으면 테스트가 실패하는 방식으로 동작합니다. 이는 유효한 접근 방식이지만, 다음과 같은 개선이 가능합니다:
- 명시적인 검증 추가: Flyway의
MigrationInfo를 조회하여 마이그레이션 성공 여부를 명시적으로 확인- 의도 문서화: 주석으로 테스트의 동작 방식을 설명
🔎 명시적인 검증을 추가하는 방법
+import org.flywaydb.core.Flyway; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.assertj.core.api.Assertions.assertThat; + @TestContainerSpringBootTest @TestPropertySource(properties = { "spring.flyway.enabled=true", - "spring.flyway.baseline-on-migrate=true", "spring.jpa.hibernate.ddl-auto=validate" }) -@DirtiesContext(classMode = BEFORE_CLASS) class FlywayMigrationTest { + @Autowired + private Flyway flyway; + @Test void flyway_스크립트가_정상적으로_수행되는지_확인한다() { - + // given & when: Spring 컨텍스트 로딩 시 Flyway 마이그레이션 자동 실행 + + // then: 모든 마이그레이션이 성공적으로 적용되었는지 확인 + var info = flyway.info(); + assertThat(info.pending()).isEmpty(); + assertThat(info.current()).isNotNull(); } }또는 주석만 추가하는 방법:
@Test void flyway_스크립트가_정상적으로_수행되는지_확인한다() { - + // 이 테스트는 Spring 컨텍스트 로딩 시 Flyway 마이그레이션이 성공적으로 수행되는지 검증합니다. + // 마이그레이션 스크립트에 문법 오류나 스키마 불일치가 있으면 컨텍스트 로딩이 실패하여 테스트가 실패합니다. }
📜 Review details
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
18-22: 이전 리뷰에서 지적된 사항:baseline-on-migrate속성 제거 권장TestContainers는 항상 깨끗한 데이터베이스로 시작하므로
spring.flyway.baseline-on-migrate=true설정은 불필요합니다. 이 설정은 기존 스키마에 Flyway를 처음 적용할 때 사용하는 것으로, 테스트 환경에서는 필요하지 않습니다.
🧹 Nitpick comments (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
42-44: 빈 테스트 메서드가 유효하지만, 명시적인 검증 추가를 고려해보세요현재 구현은 컨텍스트 로딩 실패를 통해 마이그레이션 오류를 감지하는 방식으로, 다음과 같은 검증이 암묵적으로 이루어집니다:
- Flyway 마이그레이션 실행: SQL 문법 오류가 있으면 실패
- JPA 스키마 검증:
ddl-auto=validate설정으로 엔티티와 스키마 불일치 감지- 컨텍스트 초기화: 모든 빈이 정상적으로 생성되는지 확인
다만, 다음과 같은 선택적 개선을 고려해볼 수 있습니다:
🔎 명시적인 검증 로직 예시
+import org.flywaydb.core.Flyway; +import org.springframework.beans.factory.annotation.Autowired; +import static org.assertj.core.api.Assertions.assertThat; + @Test void flyway_스크립트가_정상적으로_수행되는지_확인한다() { + // Flyway 마이그레이션이 실제로 실행되었는지 확인 + assertThat(flyway.info().applied()).isNotEmpty(); + + // 또는 로그를 통해 마이그레이션 실행 여부 확인 + // 예: flyway_schema_history 테이블 조회 등 }이렇게 하면 테스트 의도가 더 명확해지고, 실패 시 원인 파악이 쉬워집니다.
현재 구조도 PR 목표(스크립트 검증 및 오류 감지)를 충분히 달성하므로, 이는 선택적인 개선 사항입니다.
📜 Review details
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
src/test/java/com/example/solidconnection/support/RedisTestContainer.java (1)
RedisTestContainer(8-25)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
25-40: 컨테이너 설정과 초기화 로직이 올바르게 구현되었습니다다음과 같이 잘 구성되어 있습니다:
MySQLContainer 설정 (라인 26-29)
@Container애노테이션과 static final로 선언하여 생명주기가 올바르게 관리됩니다- 테스트용 데이터베이스 이름, 사용자명, 비밀번호가 명확하게 지정되어 있습니다
FlywayMySQLInitializer 구현 (라인 31-40)
ApplicationContextInitializer인터페이스를 올바르게 구현했습니다- 컨테이너의 JDBC URL과 인증 정보를 Spring 환경에 주입하는 로직이 정확합니다
RedisTestContainer와 동일한 패턴을 따라 일관성이 있습니다
Gyuhyeok99
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생하셨습니다~
| void flyway_스크립트가_정상적으로_수행되는지_확인한다() { | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// Spring Boot 컨텍스트가 정상적으로 시작되면
// Flyway 마이그레이션과 ddl-auto=validate 검증이 성공한 것
이런느낌의 주석만 안에 하나 들어가는 거 어떤가요~?
Hexeong
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM :) 다른 분들 리뷰 진행해주시면 될 것 같습니다~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
18-22:spring.flyway.baseline-on-migrate=true설정 재검토가 필요합니다.이전 리뷰에서 이미 지적되었듯이, TestContainers는 항상 깨끗한 데이터베이스로 시작하므로
baseline-on-migrate설정은 불필요합니다. 이 설정은 기존 스키마에 flyway_schema_history 테이블이 없을 때 사용하는 옵션입니다.테스트 환경에서는 제거하는 것을 권장합니다.
📜 Review details
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java
🧰 Additional context used
🧬 Code graph analysis (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
src/test/java/com/example/solidconnection/support/RedisTestContainer.java (1)
RedisTestContainer(8-25)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (2)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (2)
31-40: Initializer 구현이 적절합니다.
RedisTestContainer와 동일한 패턴으로 구현되어 일관성이 있습니다. MySQL 컨테이너 시작 타이밍 문제만 해결되면 정상적으로 동작할 것입니다.
42-46: 테스트 방식이 적절합니다.컨텍스트 로딩만으로 Flyway 마이그레이션과 JPA 스키마 검증을 수행하는 방식은 간결하면서도 효과적입니다.
- 실제로 39개의 마이그레이션 스크립트(V1~V39)가
src/main/resources/db/migration/디렉토리에 존재하며@TestPropertySource에서spring.flyway.enabled=true와spring.jpa.hibernate.ddl-auto=validate를 설정하고MySQLContainer를 통해 테스트용 DB를 구성하므로Spring Boot가 시작될 때 자동으로 Flyway 마이그레이션이 실행되고, 이어서 Hibernate의 스키마 검증이 진행됩니다. 불일치가 발생하면 컨텍스트 로딩 단계에서 실패하므로 테스트 신뢰성도 충분합니다. 주석도 의도를 명확하게 설명하고 있습니다.
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java
Outdated
Show resolved
Hide resolved
- 또한 MySQLTestContainer 코드와 유사한 컨벤션을 가지도록 수정
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
15-19: 이전 리뷰에서 지적된baseline-on-migrate설정이 여전히 남아있습니다.TestContainers는 항상 깨끗한 데이터베이스로 시작하기 때문에
spring.flyway.baseline-on-migrate=true설정이 불필요합니다. 이 설정은 기존 스키마는 있지만flyway_schema_history테이블이 없는 데이터베이스를 처리하기 위한 것으로, 테스트 환경에서는 해당되지 않습니다.제거를 권장합니다:
@TestPropertySource(properties = { "spring.flyway.enabled=true", - "spring.flyway.baseline-on-migrate=true", "spring.jpa.hibernate.ddl-auto=validate" })
🧹 Nitpick comments (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
22-29: 컨테이너 시작 타이밍 문제가 잘 해결되었습니다!이전 리뷰에서 지적되었던 컨테이너 시작 타이밍 이슈가 static 블록을 통해 완벽하게 해결되었습니다. 다음과 같은 개선점이 보입니다:
- 타이밍 보장: static 블록에서 컨테이너를 시작하여
FlywayMySQLInitializer가 실행되기 전에 컨테이너가 준비됩니다.- 일관된 패턴:
RedisTestContainer와 동일한 구조를 따라 코드베이스의 일관성이 향상되었습니다.- 네이밍 통일:
MYSQL에서CONTAINER로 변수명을 변경하여RedisTestContainer와 컨벤션이 일치합니다.선택적 개선: 명시적 shutdown hook 추가
TestContainers가 자동으로 정리하지만,
RedisTestContainer와 완전히 동일한 패턴을 원한다면 명시적 shutdown hook을 추가할 수 있습니다:static { CONTAINER.start(); + Runtime.getRuntime().addShutdownHook(new Thread(CONTAINER::stop)); }단, 이는 선택 사항이며 현재 구현도 충분히 안전합니다.
📜 Review details
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java
🧰 Additional context used
🧬 Code graph analysis (1)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (1)
src/test/java/com/example/solidconnection/support/RedisTestContainer.java (1)
RedisTestContainer(8-25)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (2)
src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java (2)
31-40: Initializer 구현이 깔끔합니다!
FlywayMySQLInitializer가 다음과 같이 잘 구현되었습니다:
- 표준 패턴 준수:
ApplicationContextInitializer를 구현하여 컨테이너 설정을 Spring 컨텍스트에 주입하는 표준 방식을 따릅니다.- 완전한 설정 주입: datasource의 URL, username, password를 모두 적절히 주입합니다.
- 코드베이스 일관성:
RedisTestContainer와 동일한 구조로 작성되어 유지보수가 용이합니다.
42-46: 테스트 설계가 탁월하고 주석이 잘 추가되었습니다!이 테스트는 다음과 같이 우아하게 설계되었습니다:
암묵적 검증: 메서드 본문이 비어있지만, Spring Boot 컨텍스트 로딩 과정에서 다음을 자동으로 검증합니다:
- Flyway 마이그레이션 스크립트의 파일명, 버전, SQL 문법
- JPA 엔티티와 DB 스키마 간의 정합성 (
ddl-auto=validate)명확한 의도 전달: 추가된 주석이 "컨텍스트 로딩 = 검증 성공"이라는 설계 의도를 명확히 설명합니다.
피드백 반영: 이전 리뷰에서 Gyuhyeok99님이 제안한 주석이 잘 반영되었습니다.
이러한 방식은 Flyway 검증 테스트의 모범 사례로, 별도의 assertion 없이도 스크립트 문제를 빌드 시점에 포착할 수 있습니다.
* fix: yml 들여쓰기 수정 (#555) * fix: yml 들여쓰기 수정 * fix: jdk 변경 * refactor: 멘토 및 채팅 관련 API 응답 수정 (#537) * refactor: 멘토의 멘토링 조회 응답에서 mentoringId가 아니라 roomId를 포함하도록 * refactor: 파트너가 멘토인 경우 partnerId는 mentorId로 - AS IS: 멘토/멘티 모두 partnerId가 siteUserId - TO BE: 멘티: siteUserId, 멘토: mentorId * refactor: 응답의 senderId가 mentorId/siteUserId가 되도록 * refactor: senderId에 해당하는 chatParticipant가 없을 경우 예외 처리하는 로직 추가 * refactor: 메서드명에 맞게 시그니처 변경 * refactor: getChatMessages 메서드에서 응답으로 siteUserId를 넘겨주도록 - AS IS: mentorId(mentor) / siteUserId(mentee) - TO BE: siteUserId(all) * refactor: 헬퍼 메서드로 메서드 복잡성을 분산한다 * refactor: getChatPartner 메서드의 응답으로 siteUserId를 넘겨주도록 - AS IS: mentorId(mentor) / siteUserId(mentee) - TO BE: siteUserId(all) * refactor: CD 성능 개선 (#552) * fix: deprecated된 base image를 eclipse-temurin:17-jdk로 변경 * refactor: scp 파일 전송하는 방식에서 GHCR로 push/pull하도록 변경 * fix: GHCR image 제거시 Org의 GITHUB_TOKEN 사용하도록 변경 * refactor : scp 파일 전송하는 방식에서 GHCR로 push/pull하도록 prod-cd.yml과 docker-compose.prod.yml 변경 * fix: prod 인스턴스 old image 이름 통일 * fix: prod-cd.yml StrictHostKeyChecking 옵션 문법 오류 수정 * fix: prod-cd.yml StrictHostKeyChecking 옵션 문법 오류 수정 * fix: dev-cd.yml Old images 정리 작업 중 이미지 이름 불일치 문제 해결 * chore: 마지막 줄 개행 추가 * chore: 마지막 줄 개행 추가 * feat: stage 인스턴스에 대한 최신 이미지 5개 유지 기능 및 old 이미지 제거 기능 추가 * chore: 중복된 환경변수 지정 제거 * chore: 중복된 pem키 생성 로직 제거 * fix: 잘못된 pem키 이름 수정 * refactor: 원격 호스트에서 pull할 경우, 최소 권한으로 실행하도록 Github App으로 임시토큰 발급하도록 수정 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 (#565) * fix: GitHub app token permission 문제 해결 (#566) * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정 * fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가 * fix: GitHub app token permission 문제 오류 해결 (#567) * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정 * fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가 * fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가 * fix: GitHub app token permission이 repo 레벨에서 부여되는 문제 해결 (#568) * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정 * fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가 * fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가 * fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가 * fix: GitHub app token permission 권한 오류 해결 (#569) * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정 * fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가 * fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가 * fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가 * fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가 * test: fork repo의 작업 branch에서 해당 workflows가 실행되도록 임시 수정 * refactor: test용 설정 제거 * feat: claude.md 파일 추가 (#560) * fix : 동일 멘토 멘티 중복 신청 불가능하도록 수정 (#563) * fix : 동일 멘토 멘티 중복 신청 불가능하도록 수정 - UK 제약조건 추가 - flyway script 추가 - CustomException 추가 - Service 로직 수정 - Test code 추가 * fix : column명 오류 수정 - column명 camelCase -> snake_case로 변경 * fix : column명 오류 수정 - column명 name으로 명시 * fix: GitHub app token permission 권한 오류 해결 (#570) * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정 * fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정 * fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가 * fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가 * fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가 * fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가 * test: fork repo의 작업 branch에서 해당 workflows가 실행되도록 임시 수정 * refactor: test용 설정 제거 * fix: docker login username 불일치 문제 * refactor: 최소권한 원칙 적용을 위한 Action Job 분리 * refactor: 필요없는 주석 제거 * fix: GHCR 정리 권한 PAT로 해결 (#573) * feat: 지원서가 APPROVED 인 유저의 멘토 생성 기능 추가 (#562) * feat: 지원서가 APPROVED 인 유저의 멘토 생성 기능 추가 * refactor: submitMentorApplication 메서드의 멘토 지원 유효 검증 부분을 메서드로 추출 * refactor: MentorMyPage 생성, 수정 부분의 channel 생성, 업데이트 부분 중복 제거 * test: Mentor 생성 관련 테스트 추가 * fix: 코드래빗 리뷰 적용 * refactor: 멘토 생성 시 channelRequest가 null 일 떄 예외 처리 * feat: MentorApplicationRequest 필드에 유효성 어노테이션 추가 * test: 채널 검색 시 siteUserId로 조회하는 문제 해결 * fix: 리뷰 수정사항 적용 * fix: 파일 끝에 개행 추가 * refactor: 멘토 생성 메서드에서 siteUser의 검증 제외 * refactor: dto 단에서 채널 리스트 null 검증 * feat: MentorApplication에 termId 추가 flyway 스크립트 추가 * fix: flyway 버전 충돌 해결 * feat: 어드민 멘토 승격 요청 페이징 조회 기능 추가 (#576) * feat: 어드민 멘토 지원서 페이징 조회 기능 추가 * feat: mentor/repository 패키지에 custom 패키지 추가 - custom 패키지에 페이징 조회를 책임지는 MentorApplicationFilterRepository 추가 - MentorApplicationSearchCondition 에서 넘긴 keyword 기반으로 닉네임, 권역, 나라, 학교명으로 필터링 검색 기능 추가 - MentorApplicationSearchCondition 에서 넘긴 mentorApplicationStatus 기반으로 승인, 거절, 진행중 으로 필터링 기능 추가 * test: 어드민 멘토 지원서 페이징 조회 테스트 추가 * feat: MentorApplication 엔티티에 approved_at 필드 추가 flyway 스크립트 작성 * fix: 파일 끝에 개행 추가 * refactor: 페이징 조회 시 count 쿼리에 불필요한 조인 막기 * fix: 코드래빗 리뷰 적용 * fix: flyway V39 스크립트 파일명 수정 * test: 테스트 코드 오류 수정, 검증 추가 * test: 기대하는 값이랑 다른 테스트 응답을 수정합니다 * feat: 어드민 멘토 승격 지원서 승인/거절 기능, 상태 별 지원서 개수 조회 기능 추가 (#577) * feat: 어드민 멘토 승격 지원서 승인/거절 기능 추가 * test: 어드민 멘토 지원서 승인/거절 테스트 추가 * feat: 멘토 지원서 상태별 개수 조회 기능 추가 * test: 멘토 지원서 상태별 개수 조회 테스트 추가 * fix: 대학이 선택되지 않은 멘토 지원서 승인 시 예외 발생하도록 수정 * refactor: 리뷰 내용 반영 * refactor: MENTOR_APPLICATION_ALREADY_CONFIRM -> MENTOR_APPLICATION_ALREADY_CONFIRMED 로 수정 * refactor: 멘토 지원서 거절 사유 관련하여 기획에 명시되지 않은 길이 제한 제거 * refactor: 리뷰 적용 * refactor: 변수명, 필드명 일관성 맞추기 * test: assertAll 적용 * feat: region 관련 관리 기능 추가 (#561) * feat: 지역 생성 기능 구현 (AdminRegion) 지역을 생성하는 기능을 구현했습니다: - AdminRegionCreateRequest: 지역 생성 요청 DTO - AdminRegionResponse: 지역 응답 DTO - AdminRegionService.createRegion(): 중복 검사를 포함한 지역 생성 로직 - AdminRegionController.createRegion(): HTTP POST 엔드포인트 중복 검사: - 지역 코드 중복 확인 - 한글명 중복 확인 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * feat: 지역 수정/삭제/조회 기능 구현 및 테스트 추가 (AdminRegion) 지역 관리 기능을 완성했습니다: 구현 기능: - AdminRegionUpdateRequest: 지역 수정 요청 DTO - AdminRegionService.updateRegion(): 한글명 중복 검사를 포함한 지역 수정 - AdminRegionService.deleteRegion(): 지역 삭제 - AdminRegionService.getAllRegions(): 전체 지역 조회 - AdminRegionController: 수정/삭제/조회 HTTP 엔드포인트 테스트 코드 (AdminRegionServiceTest): - CREATE: 정상 생성, 코드 중복, 한글명 중복 테스트 - UPDATE: 정상 수정, NOT_FOUND, 중복 한글명, 동일 한글명 테스트 - DELETE: 정상 삭제, NOT_FOUND 테스트 - READ: 빈 목록, 전체 조회 테스트 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * fix: 지역 관리 관련 에러코드 추가 (ErrorCode) 지역 관리 기능에 필요한 에러코드를 추가했습니다: - REGION_NOT_FOUND: 존재하지 않는 지역 - REGION_ALREADY_EXISTS: 이미 존재하는 지역 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * fix: jpa 오류 수정 * refactor: 코드리뷰 반영 --------- Co-authored-by: Claude <[email protected]> * fix: config.alloy 파일 경로 불일치 문제 해결 (#586) * fix: config.alloy 파일 경로 불일치 문제 해결 * refactor: docker-compose를 수정하는게 아닌 cd.yml의 경로를 수정하여 해결 * feat: 소셜 로그인 사용자는 비밀번호 변경을 할 수 없다. (#582) * feat: 소셜 로그인 사용자는 비밀번호 변경을 할 수 없도록 * test: 소셜 로그인 사용자 비밀번호 변경 관련 테스트 코드 작성 * chore: 컨벤션에 맞게 메서드명 변경 - ~~ 예외가 발생한다 * chore: 충돌 해결 * fix: Upgrade 헤더 유무에 따라 Connection 헤더의 값을 동적으로 설정하도록 (#581) * fix: Upgrade 헤더 유무에 따라 Connection 헤더의 값을 동적으로 설정하도록 - Upgrade 헤더가 존재하면(e.g. WebSocket) upgrade로 설정 - Upgrade 헤더가 존재하지 않으면 keep-alive로 설정 * chore: 서브모듈 업데이트 * feat: 멘토 지원서 대학교 매핑 기능, 대학 선택 상태 페이징 조건 추가 (#583) * feat: 멘토 지원서 검색 조건에 UniversitySelectType 추가 * feat: 어드민 멘토 지원서 페이징 조회 응답에 UniversitySelectType 추가 * test: 멘토 지원서 조회 테스트 추가 - test: UniversitySelectType 기반 페이징 조회 테스트 추가 * feat: 멘토 지원서에 대학 매핑 기능 추가 * test: 멘토 지원서 대학 매핑 테스트 추가 * refactor: 의미 없는 import 제거 * refactor: 리뷰 내용 반영 * refactor: 개행 및 공백 추가 * refactor: pathVariable 네이밍을 kebab-case 로 통일 * refactor: Service 레이어의 검증 로직을 도메인으로 이동 * refactor: PENDING 상태 및 OTHER 타입 검증을 도메인 메서드로 관리 * refactor: assignUniversity() 호출 전 검증 책임을 도메인 엔티티에 위임 * test : assertAll 로 검증 그룹화 * refactor: 스프링 부트 앱 외의 사이드 인프라 배포 과정을 분리 (#592) * refactor: dev 환경에서의 side-infra 배포 과정 분리 * refactor: prod 환경에서의 side-infra 배포 과정 분리 * refactor: docker-compose 가 실행되고 있지 않아도 스크립트가 실패하지 않게 변경 * fix: docker compose up 시에 사용할 환경변수 중 누락된 변수를 추가 * fix: S3 이름 불일치 문제 해결 (#594) * fix: s3 이름 불일치 문제 해결 * fix: s3와의 연동된 cloudfront URL로 수정 * refactor: 분리한 사이드 인프라에 대해서 필요없는 파일 정리 (#596) * test: flyway 스크립트를 검증하는 테스트 코드 작성 (#588) * test: flyway 스크립트를 검증하는 테스트 코드 작성 * fix: DirtiesContext 어노테이션을 통해 기존 컨텍스트를 폐기하도록 - 새로운 MySQL 환경에서 마이그레이션이 이루어지도록 수정 * fix: flyway 검증용의 별도의 MySQL 컨테이너를 사용하도록 * chore: 테스트 의도를 쉽게 이해할 수 있도록 주석 추가 * chore: 명시적으로 컨테이너를 시작하도록 - 또한 MySQLTestContainer 코드와 유사한 컨벤션을 가지도록 수정 * refactor: 게시글 조회 응답에 댓글 deprecated 여부 포함하도록 (#599) * feat: 유저의 멘토 지원서 신청 이력 조회 기능 추가 (#603) * feat: 유저의 멘토 지원 이력 조회 기능 추가 * refactor: 매개변수 타입 통일 * refactor: long 타입을 Long 으로 수정 * test: 멘토 지원서 이력 조회 테스트 추가 * test: MentorApplicationFixtureBuilder 에 rejectedReason 필드 및 빌더 메서드 추가 * refactor: 리뷰 사항 적용 * test: 멘토 지원서 이력 조회 에서 user와 university 재사용 * refactor: 긴 uri 를 짧게 수정 * refactor: 서브모듈 해시값 되돌리기 * refactor: 개행 지우기 * refactor: applicationOrder 자료형을 long 으로 수정 * fix: applicationOrder 를 int 자료형으로 처리하도록 복구 - 순서를 나타내고, 해당 값이 21억을 넘길 수 없다 판단하여 더 적합한 int 자료형으로 복구 * test: long type 을 기대하던 테스트 에러 해결 * fix: 탈퇴한 사용자가 물리적 삭제가 되지 않았던 문제를 해결한다 (#574) * refactor: FK에 ON DELETE CASCADE 옵션 추가 * refactor: 삭제 메서드로 사용자 연관 데이터를 삭제하도록 * feat: 어드민 유저 차단 기능 추가 (#604) * feat: 어드민 차단 기능 * test: 어드민 차단 기능 * feat: API 성능 로깅, 쿼리 별 메트릭 전송 추가 (#602) * feat: HTTP 요청/응답 로깅 필터 구현 - traceId 기반 요청 추적 - 요청/응답 로깅 - CustomExceptionHandler와 중복 로깅 방지 - Actuator 엔드포인트 로깅 제외 * feat: ExceptionHandler에 중복 로깅 방지 플래그 및 userId 로깅 추가 * feat: API 수행시간 로깅 인터셉터 추가 * feat: ApiPerf 인터셉터, Logging 필터 빈 등록 * refactor: logback 설정 변경 - info, warn, error, api_perf 로 로그 파일 분리해서 관리 * feat: 쿼리 별 수행시간 메트릭 모니터링 추가 * feat: 데이터소스 프록시 의존성 및 config 파일 추가 * feat: 데이터 소스 프록시가 metric을 찍을 수 있도록 listener 클래스 추가 * feat: 요청 시 method, uri 정보를 listener에서 활용하기 위해 RequestContext 및 관련 interceptor 추가 * refactor: 비효율적인 Time 빌더 생성 개선 - Time.builder 를 사용하면 매번 빌더를 생성하여 비효율적인 문제를 meterRegistry.timer 방식으로 해결 * feat: 로깅을 위해 HttpServeletRequest 속성에 userId 추가 * refactor: logback 설정 중 local은 console만 찍도록 수정 * refactor: FILE_PATTERN -> LOG_PATTERN 으로 수정 * test: TokenAuthenticationFilter에서 request에 userId 설정 검증 추가 - principal 조회 예외를 막기 위해 siteUserDetailsService given 추가 * refacotr: 코드 래빗 리뷰사항 반영 * test: 중복되는 테스트 제거 * refactor: 사용하지 않는 필드 제거 * refactor: 리뷰 내용 반영 * refactor: ApiPerformanceInterceptor에서 uri 정규화 관련 코드 제거 * refactor: ApiPerformanceInterceptor에서 if-return 문을 if-else 문으로 수정 * refactor: 추가한 interceptor 의 설정에 actuator 경로 무시하도록 셋팅 * refactor: 중복되는 의존성 제거 * refactor: 로깅 시 민감한 쿼리 파라미터 마스킹 - EXCLUDE_QUERIES 에 해당하는 쿼리 파라미터 KEY 값의 VALUE 를 masking 값으로 치환 * refactor: 예외 처리 후에도 Response 로그 찍도록 수정 * refactor: CustomExceptionHandler 원상복구 - Response 로그를 통해 user를 추적할 수 있으므로 로그에 userId 를 추가하지 않습니다 * refactor: 리뷰 사항 반영 * refactor: RequestContext 빌더 제거 * refactor: RequestContextInterceptor import 수정 * refactor: logback yml 파일에서 timestamp 서버 시간과 동일한 규격으로 수정 * refactor: ApiPerformanceInterceptor 에서 동일 내용 로그 중복으로 찍는 문제 수정 * fix: decode를 두 번 하는 문제 수정 * test: 로깅 관련 filter, interceptor 테스트 추가 * refactor: 코드래빗 리뷰사항 반영 * test: contains 로 비교하던 검증 로직을 isEqualTo 로 수정 * test: preHandle 테스트 에서 result 값을 항상 검증 * refactor: 단위테스트에 TestContainer 어노테이션 제거 * fix: conflict 해결 * fix: docker-compose 충돌 해결 (#610) * chore: release github action 임의 실행 추가 * refactor: 기본 추천 대학 후보 추가 (#161) * fix: config.alloy 경로 수정 * hotfix: 모의지원 현황 어드민 권한 제거 * hotfix: import 제거 * chore: 서브모듈 해시 업데이트 (#611)
관련 이슈
작업 내용
flyway는
dev,prod프로파일에만 사용하고 있고,ddl-auto: validate로 스크립트와 JPA 간 명세 불일치를 감지합니다. 기존에는local환경에서 스크립트를 작성하고 이에 대한 검증을 수행하기 위해서application-db.yml의local프로파일을 수정해야 했습니다.스크립트의 버전 충돌이 발생하거나 파일명 형식이 일치하지 않으면 스크립트가 실행되지 않거나, 런타임 에러가 발생하게 됩니다.
따라서 빌드 시점에 스크립트 검증을 수행하도록 gradle
flyway플러그인과 H2 데이터베이스를 사용하였습니다.그러나 스크립트 가 잘못 작성되어, 런타임 에러가 발생하여 서버가 다운되는 상황이 있었습니다.
이에 관련 테스트 클래스를 생성하였고,
@TestPropertySource를 사용하여 flyway 설정을 사용하도록 구현했습니다.특이 사항
실제 동작입니다. 문법 오류를 잘 감지합니다.
이제 애플리케이션 빌드하면 스크립트 파일명 관련 검증이 가능하며, 테스트 코드를 실행하면 스크립트 SQL문 관련 검증이 가능합니다. 이제 스크립트로 인해 고통(?)받는 일은 없으면 좋겠네요 ..!
리뷰 요구사항 (선택)
로컬에서는 테스트 통과했는데 ... 깃허브 액션에서는 실패했습니다. 테스트 순서에 영향을 받나 싶어 컨텍스트를 날리고 수행하도록 했지만 실패해서, 별도의 MySQL 컨테이너를 만들어 수행하는 방법으로 구현했습니다.
현재로서는 지금 방법이 간단한 거 같긴 합니다. 더 좋은 방법이 있다면 말씀해주세요 !