[ENHANCEMENT] 타임존 처리 KST로 통일#115
Conversation
📝 WalkthroughWalkthrough알림 발송 방식을 메일 직접 전송에서 NotificationType 기반 NotificationOutbox 저장 방식으로 전면 전환했으며, 신규 CommissionMatchedEvent/Notifier를 추가했다. 또한 JVM 기본 타임존을 Asia/Seoul로 설정하고, 서비스/응답 DTO에 산재된 명시적 Asia/Seoul ZoneId/@jsonformat timezone 지정을 제거했다. ChangesNotification Outbox 전환
Estimated code review effort: 4 (Complex) | ~60 minutes KST 타임존 통일
Estimated code review effort: 2 (Simple) | ~15 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 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.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/main/java/ditda/backend/domain/auth/service/DesignerAuthService.java (1)
78-83: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winDesigner ID에는
designer.getId()를 전달해야 합니다.Line 79의
user.getId()는 이벤트/템플릿에서designerId로 소비됩니다. 관리자 메일도 디자이너 ID로 포트폴리오 조회를 안내하므로, User PK가 전달되면 조회가 실패할 수 있습니다.수정 제안
eventPublisher.publishEvent(new DesignerSignedUpEvent( - user.getId(), + designer.getId(), user.getName(), user.getEmail(), !portfolioKeys.isEmpty(),🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/java/ditda/backend/domain/auth/service/DesignerAuthService.java` around lines 78 - 83, The DesignerSignedUpEvent is currently being published with user.getId(), but this value is consumed as designerId in downstream event handling and email/template logic. Update DesignerAuthService to pass designer.getId() into the DesignerSignedUpEvent constructor, keeping the other fields unchanged, so portfolio lookup and admin guidance resolve against the correct designer identifier.
🧹 Nitpick comments (1)
src/main/java/ditda/backend/domain/payment/notification/DepositNotifier.java (1)
3-47: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
@EventListener전환은 outbox 패턴에 적절합니다.
@TransactionalEventListener(AFTER_COMMIT)에서@EventListener로의 변경은 동일 트랜잭션 내에서 outbox 레코드를 저장하게 하여, 비즈니스 상태 변경과 알림 등록의 원자성을 보장합니다. try-catch/로깅 제거도 scheduler에 위임하는 구조와 일관됩니다.
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")이 호출마다 새 인스턴스를 생성합니다.private static final상수로 추출을 권장합니다.♻️ 제안: DateTimeFormatter 상수화
+ private static final DateTimeFormatter NOTIFIED_AT_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + // 어드민 입금 확인 메일 발송 private void registerAdminDepositCheck(DepositNotifiedEvent event, LocalDateTime mailScheduledAt) { outboxRepository.save(NotificationOutbox.create( adminProperties.getNotificationEmail(), NotificationType.DEPOSIT_CONFIRM_REQUEST_ADMIN, Map.of( "commissionId", event.commissionId(), "title", event.commissionTitle(), "instructorName", event.instructorName(), "depositorName", event.depositorName(), "amount", event.amount(), - "notifiedAt", event.notifiedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) + "notifiedAt", event.notifiedAt().format(NOTIFIED_AT_FORMATTER) ), mailScheduledAt )); }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/java/ditda/backend/domain/payment/notification/DepositNotifier.java` around lines 3 - 47, `DepositNotifier.onDepositNotified` and `registerAdminDepositCheck` are fine functionally, but the timestamp formatter is recreated on every event. Extract the `DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")` used for `notifiedAt` into a `private static final` constant in `DepositNotifier` and reuse it in the `Map.of(...)` payload to avoid repeated allocations and keep formatting centralized.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@src/main/java/ditda/backend/domain/commission/core/service/CommissionDeadlineService.java`:
- Line 33: `CommissionDeadlineService`에서 `LocalDate.now()`가 JVM 기본 타임존을 따라 테스트에서
날짜가 흔들리는 문제를 고쳐야 합니다. `get...`/마감 조회 로직에서 현재 날짜를 직접 생성하는 부분을 `Clock` 또는 고정된
`ZoneId` 기반으로 주입받아 사용하도록 바꾸고, `@SpringBootTest`와 관련 단위 테스트 부트스트랩에서도 `Asia/Seoul`
타임존이 고정되도록 설정해 `CommissionDeadlineService`의 조회 결과가 CI에서 일관되게 나오게 해 주세요.
In `@src/main/resources/templates/email/designer-signup-notification.html`:
- Around line 42-46: The designer signup email template currently hardcodes the
Swagger URL, which can send the wrong link outside production. Update the link
in designer-signup-notification.html to use the existing swagger.server-url
value as a template variable and bind it with th:href instead of a fixed href,
so the button resolves correctly across environments.
---
Outside diff comments:
In `@src/main/java/ditda/backend/domain/auth/service/DesignerAuthService.java`:
- Around line 78-83: The DesignerSignedUpEvent is currently being published with
user.getId(), but this value is consumed as designerId in downstream event
handling and email/template logic. Update DesignerAuthService to pass
designer.getId() into the DesignerSignedUpEvent constructor, keeping the other
fields unchanged, so portfolio lookup and admin guidance resolve against the
correct designer identifier.
---
Nitpick comments:
In
`@src/main/java/ditda/backend/domain/payment/notification/DepositNotifier.java`:
- Around line 3-47: `DepositNotifier.onDepositNotified` and
`registerAdminDepositCheck` are fine functionally, but the timestamp formatter
is recreated on every event. Extract the
`DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")` used for `notifiedAt` into a
`private static final` constant in `DepositNotifier` and reuse it in the
`Map.of(...)` payload to avoid repeated allocations and keep formatting
centralized.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yml
Review profile: CHILL
Plan: Pro Plus
Run ID: 27dea4de-e96e-403b-a00c-f390f2ebeea4
📒 Files selected for processing (40)
src/main/java/ditda/backend/BackendApplication.javasrc/main/java/ditda/backend/domain/auth/event/DesignerSignedUpEvent.javasrc/main/java/ditda/backend/domain/auth/notification/DesignerSignupMailer.javasrc/main/java/ditda/backend/domain/auth/notification/DesignerSignupNotifier.javasrc/main/java/ditda/backend/domain/auth/notification/EmailVerificationMailer.javasrc/main/java/ditda/backend/domain/auth/service/DesignerAuthService.javasrc/main/java/ditda/backend/domain/commission/application/facade/DesignerApplicationFacade.javasrc/main/java/ditda/backend/domain/commission/core/dto/response/CommissionCreateResponse.javasrc/main/java/ditda/backend/domain/commission/core/event/CommissionMatchedEvent.javasrc/main/java/ditda/backend/domain/commission/core/notification/AllFirstDraftsSubmittedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/ApplicationDeadlineClosedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/CommissionCompletedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/CommissionMatchedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/DraftSelectedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/FinalDeadlineClosedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/FirstDraftDeadlineClosedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/PayoutRequestedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/RevisionRequestedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/RevisionSubmittedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/service/CommissionDeadlineService.javasrc/main/java/ditda/backend/domain/commission/draft/dto/response/DraftSelectResponse.javasrc/main/java/ditda/backend/domain/commission/draft/dto/response/DraftSubmitResponse.javasrc/main/java/ditda/backend/domain/commission/draft/facade/DesignerDraftFacade.javasrc/main/java/ditda/backend/domain/commission/draft/facade/InstructorDraftFacade.javasrc/main/java/ditda/backend/domain/commission/revision/facade/DesignerRevisionFacade.javasrc/main/java/ditda/backend/domain/commission/revision/facade/InstructorRevisionFacade.javasrc/main/java/ditda/backend/domain/payment/dto/response/DepositNotifyResponse.javasrc/main/java/ditda/backend/domain/payment/event/DepositNotifiedEvent.javasrc/main/java/ditda/backend/domain/payment/notification/DepositMailer.javasrc/main/java/ditda/backend/domain/payment/notification/DepositNotifier.javasrc/main/java/ditda/backend/domain/payment/service/PaymentService.javasrc/main/java/ditda/backend/global/apipayload/response/ApiResponse.javasrc/main/java/ditda/backend/global/notification/EmailSender.javasrc/main/java/ditda/backend/global/notification/NotificationOutbox.javasrc/main/java/ditda/backend/global/notification/NotificationOutboxRepository.javasrc/main/java/ditda/backend/global/notification/NotificationOutboxScheduler.javasrc/main/java/ditda/backend/global/notification/NotificationType.javasrc/main/java/ditda/backend/global/notification/OutboxStatus.javasrc/main/resources/templates/email/deposit-notification.htmlsrc/main/resources/templates/email/designer-signup-notification.html
💤 Files with no reviewable changes (2)
- src/main/java/ditda/backend/domain/auth/notification/DesignerSignupMailer.java
- src/main/java/ditda/backend/domain/payment/notification/DepositMailer.java
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/main/java/ditda/backend/domain/auth/service/DesignerAuthService.java (1)
78-83: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winDesigner ID에는
designer.getId()를 전달해야 합니다.Line 79의
user.getId()는 이벤트/템플릿에서designerId로 소비됩니다. 관리자 메일도 디자이너 ID로 포트폴리오 조회를 안내하므로, User PK가 전달되면 조회가 실패할 수 있습니다.수정 제안
eventPublisher.publishEvent(new DesignerSignedUpEvent( - user.getId(), + designer.getId(), user.getName(), user.getEmail(), !portfolioKeys.isEmpty(),🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/java/ditda/backend/domain/auth/service/DesignerAuthService.java` around lines 78 - 83, The DesignerSignedUpEvent is currently being published with user.getId(), but this value is consumed as designerId in downstream event handling and email/template logic. Update DesignerAuthService to pass designer.getId() into the DesignerSignedUpEvent constructor, keeping the other fields unchanged, so portfolio lookup and admin guidance resolve against the correct designer identifier.
🧹 Nitpick comments (1)
src/main/java/ditda/backend/domain/payment/notification/DepositNotifier.java (1)
3-47: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
@EventListener전환은 outbox 패턴에 적절합니다.
@TransactionalEventListener(AFTER_COMMIT)에서@EventListener로의 변경은 동일 트랜잭션 내에서 outbox 레코드를 저장하게 하여, 비즈니스 상태 변경과 알림 등록의 원자성을 보장합니다. try-catch/로깅 제거도 scheduler에 위임하는 구조와 일관됩니다.
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")이 호출마다 새 인스턴스를 생성합니다.private static final상수로 추출을 권장합니다.♻️ 제안: DateTimeFormatter 상수화
+ private static final DateTimeFormatter NOTIFIED_AT_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + // 어드민 입금 확인 메일 발송 private void registerAdminDepositCheck(DepositNotifiedEvent event, LocalDateTime mailScheduledAt) { outboxRepository.save(NotificationOutbox.create( adminProperties.getNotificationEmail(), NotificationType.DEPOSIT_CONFIRM_REQUEST_ADMIN, Map.of( "commissionId", event.commissionId(), "title", event.commissionTitle(), "instructorName", event.instructorName(), "depositorName", event.depositorName(), "amount", event.amount(), - "notifiedAt", event.notifiedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) + "notifiedAt", event.notifiedAt().format(NOTIFIED_AT_FORMATTER) ), mailScheduledAt )); }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/java/ditda/backend/domain/payment/notification/DepositNotifier.java` around lines 3 - 47, `DepositNotifier.onDepositNotified` and `registerAdminDepositCheck` are fine functionally, but the timestamp formatter is recreated on every event. Extract the `DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")` used for `notifiedAt` into a `private static final` constant in `DepositNotifier` and reuse it in the `Map.of(...)` payload to avoid repeated allocations and keep formatting centralized.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@src/main/java/ditda/backend/domain/commission/core/service/CommissionDeadlineService.java`:
- Line 33: `CommissionDeadlineService`에서 `LocalDate.now()`가 JVM 기본 타임존을 따라 테스트에서
날짜가 흔들리는 문제를 고쳐야 합니다. `get...`/마감 조회 로직에서 현재 날짜를 직접 생성하는 부분을 `Clock` 또는 고정된
`ZoneId` 기반으로 주입받아 사용하도록 바꾸고, `@SpringBootTest`와 관련 단위 테스트 부트스트랩에서도 `Asia/Seoul`
타임존이 고정되도록 설정해 `CommissionDeadlineService`의 조회 결과가 CI에서 일관되게 나오게 해 주세요.
In `@src/main/resources/templates/email/designer-signup-notification.html`:
- Around line 42-46: The designer signup email template currently hardcodes the
Swagger URL, which can send the wrong link outside production. Update the link
in designer-signup-notification.html to use the existing swagger.server-url
value as a template variable and bind it with th:href instead of a fixed href,
so the button resolves correctly across environments.
---
Outside diff comments:
In `@src/main/java/ditda/backend/domain/auth/service/DesignerAuthService.java`:
- Around line 78-83: The DesignerSignedUpEvent is currently being published with
user.getId(), but this value is consumed as designerId in downstream event
handling and email/template logic. Update DesignerAuthService to pass
designer.getId() into the DesignerSignedUpEvent constructor, keeping the other
fields unchanged, so portfolio lookup and admin guidance resolve against the
correct designer identifier.
---
Nitpick comments:
In
`@src/main/java/ditda/backend/domain/payment/notification/DepositNotifier.java`:
- Around line 3-47: `DepositNotifier.onDepositNotified` and
`registerAdminDepositCheck` are fine functionally, but the timestamp formatter
is recreated on every event. Extract the
`DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")` used for `notifiedAt` into a
`private static final` constant in `DepositNotifier` and reuse it in the
`Map.of(...)` payload to avoid repeated allocations and keep formatting
centralized.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yml
Review profile: CHILL
Plan: Pro Plus
Run ID: 27dea4de-e96e-403b-a00c-f390f2ebeea4
📒 Files selected for processing (40)
src/main/java/ditda/backend/BackendApplication.javasrc/main/java/ditda/backend/domain/auth/event/DesignerSignedUpEvent.javasrc/main/java/ditda/backend/domain/auth/notification/DesignerSignupMailer.javasrc/main/java/ditda/backend/domain/auth/notification/DesignerSignupNotifier.javasrc/main/java/ditda/backend/domain/auth/notification/EmailVerificationMailer.javasrc/main/java/ditda/backend/domain/auth/service/DesignerAuthService.javasrc/main/java/ditda/backend/domain/commission/application/facade/DesignerApplicationFacade.javasrc/main/java/ditda/backend/domain/commission/core/dto/response/CommissionCreateResponse.javasrc/main/java/ditda/backend/domain/commission/core/event/CommissionMatchedEvent.javasrc/main/java/ditda/backend/domain/commission/core/notification/AllFirstDraftsSubmittedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/ApplicationDeadlineClosedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/CommissionCompletedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/CommissionMatchedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/DraftSelectedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/FinalDeadlineClosedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/FirstDraftDeadlineClosedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/PayoutRequestedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/RevisionRequestedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/notification/RevisionSubmittedNotifier.javasrc/main/java/ditda/backend/domain/commission/core/service/CommissionDeadlineService.javasrc/main/java/ditda/backend/domain/commission/draft/dto/response/DraftSelectResponse.javasrc/main/java/ditda/backend/domain/commission/draft/dto/response/DraftSubmitResponse.javasrc/main/java/ditda/backend/domain/commission/draft/facade/DesignerDraftFacade.javasrc/main/java/ditda/backend/domain/commission/draft/facade/InstructorDraftFacade.javasrc/main/java/ditda/backend/domain/commission/revision/facade/DesignerRevisionFacade.javasrc/main/java/ditda/backend/domain/commission/revision/facade/InstructorRevisionFacade.javasrc/main/java/ditda/backend/domain/payment/dto/response/DepositNotifyResponse.javasrc/main/java/ditda/backend/domain/payment/event/DepositNotifiedEvent.javasrc/main/java/ditda/backend/domain/payment/notification/DepositMailer.javasrc/main/java/ditda/backend/domain/payment/notification/DepositNotifier.javasrc/main/java/ditda/backend/domain/payment/service/PaymentService.javasrc/main/java/ditda/backend/global/apipayload/response/ApiResponse.javasrc/main/java/ditda/backend/global/notification/EmailSender.javasrc/main/java/ditda/backend/global/notification/NotificationOutbox.javasrc/main/java/ditda/backend/global/notification/NotificationOutboxRepository.javasrc/main/java/ditda/backend/global/notification/NotificationOutboxScheduler.javasrc/main/java/ditda/backend/global/notification/NotificationType.javasrc/main/java/ditda/backend/global/notification/OutboxStatus.javasrc/main/resources/templates/email/deposit-notification.htmlsrc/main/resources/templates/email/designer-signup-notification.html
💤 Files with no reviewable changes (2)
- src/main/java/ditda/backend/domain/auth/notification/DesignerSignupMailer.java
- src/main/java/ditda/backend/domain/payment/notification/DepositMailer.java
🛑 Comments failed to post (2)
src/main/java/ditda/backend/domain/commission/core/service/CommissionDeadlineService.java (1)
33-33: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash # Description: 테스트 환경에서 TimeZone 설정 여부 확인 # 테스트 설정 클래스에서 TimeZone.setDefault 호출 여부 검색 rg -rn --type=java 'TimeZone\.setDefault' -g '**/test/**' -g '**/*Test*' -g '**/*Spec*' # `@SpringBootTest` 또는 테스트 설정 클래스에서 타임존 관련 설정 검색 rg -rn --type=java 'TimeZone|ZoneId|Asia/Seoul' -g '**/test/**' -g '**/*Test*' -g '**/*Spec*'Repository: Ditda-Official/Ditda-Backend
Length of output: 166
🏁 Script executed:
#!/bin/bash set -euo pipefail echo "== Relevant files ==" git ls-files | rg '(^|/)(src/test|test|tests|spec|.*Test.*|.*Spec.*|BackendApplication\.java|CommissionDeadlineService\.java)$' echo echo "== Search for timezone setup in main/test code ==" rg -n --hidden --glob '!**/target/**' --glob '!**/build/**' --glob '!**/out/**' 'TimeZone\.setDefault|ZoneId|Asia/Seoul|UTC' src test .github || true echo echo "== CommissionDeadlineService.java ==" sed -n '1,120p' src/main/java/ditda/backend/domain/commission/core/service/CommissionDeadlineService.java echo echo "== BackendApplication.java ==" sed -n '1,160p' src/main/java/ditda/backend/BackendApplication.java echo echo "== Test files containing `@SpringBootTest` or test configuration ==" rg -n --hidden --glob '!**/target/**' --glob '!**/build/**' --glob '!**/out/**' '`@SpringBootTest`|`@TestConfiguration`|`@BeforeAll`|`@PostConstruct`' src/test test || trueRepository: Ditda-Official/Ditda-Backend
Length of output: 5687
🏁 Script executed:
#!/bin/bash set -euo pipefail echo "== BackendApplicationTests.java ==" sed -n '1,220p' src/test/java/ditda/backend/BackendApplicationTests.java echo echo "== Test resources ==" git ls-files src/test/resources || true for f in $(git ls-files 'src/test/resources/**' 2>/dev/null || true); do echo echo "== $f ==" sed -n '1,220p' "$f" done echo echo "== Search for any timezone test bootstrap ==" rg -n --hidden --glob 'src/test/java/**' --glob 'src/test/resources/**' 'TimeZone\.setDefault|ZoneId|Asia/Seoul|UTC|Clock\.fixed|now\(' src/test/java src/test/resources || trueRepository: Ditda-Official/Ditda-Backend
Length of output: 2081
테스트 부트스트랩에서도 타임존을 고정해 주세요
LocalDate.now()는 JVM 기본 타임존을 따르므로,@SpringBootTest/단위 테스트에서Asia/Seoul로 고정하지 않으면 CI에서 날짜 경계가 달라져 마감 조회 결과가 흔들릴 수 있습니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/java/ditda/backend/domain/commission/core/service/CommissionDeadlineService.java` at line 33, `CommissionDeadlineService`에서 `LocalDate.now()`가 JVM 기본 타임존을 따라 테스트에서 날짜가 흔들리는 문제를 고쳐야 합니다. `get...`/마감 조회 로직에서 현재 날짜를 직접 생성하는 부분을 `Clock` 또는 고정된 `ZoneId` 기반으로 주입받아 사용하도록 바꾸고, `@SpringBootTest`와 관련 단위 테스트 부트스트랩에서도 `Asia/Seoul` 타임존이 고정되도록 설정해 `CommissionDeadlineService`의 조회 결과가 CI에서 일관되게 나오게 해 주세요.src/main/resources/templates/email/designer-signup-notification.html (1)
42-46: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash # 기존에 재사용 가능한 admin/swagger/base URL 설정이 있는지 확인합니다. rg -n -C2 'swagger-ui|adminSwaggerUrl|api\.ditda\.kr|class AdminProperties|record AdminProperties|notificationEmail' .Repository: Ditda-Official/Ditda-Backend
Length of output: 5620
🏁 Script executed:
#!/bin/bash set -euo pipefail echo '--- file outline: relevant config and email files ---' ast-grep outline src/main/java/ditda/backend/global/config/AdminProperties.java --view expanded || true ast-grep outline src/main/resources/application.yaml --view expanded || true ast-grep outline src/main/resources/application-prod.yaml --view expanded || true ast-grep outline src/main/resources/templates/email/designer-signup-notification.html --view expanded || true ast-grep outline src/main/resources/templates/email/admin-payout-request.html --view expanded || true echo '--- search email rendering / template variable usage ---' rg -n -C2 'process\(|TemplateEngine|Context|setVariable|thymeleaf|designer-signup-notification|admin-payout-request|notificationEmail|swagger\.server-url|server-url' src/main/java src/main/resourcesRepository: Ditda-Official/Ditda-Backend
Length of output: 19701
src/main/resources/templates/email/designer-signup-notification.html:43 — Swagger 링크를 설정값으로 바꾸세요.
https://api.ditda.kr/swagger-ui/index.html하드코딩은 로컬/스테이징에서 잘못된 링크를 보냅니다. 이미 있는swagger.server-url을 템플릿 변수로 주입해th:href로 바꾸는 편이 안전합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/resources/templates/email/designer-signup-notification.html` around lines 42 - 46, The designer signup email template currently hardcodes the Swagger URL, which can send the wrong link outside production. Update the link in designer-signup-notification.html to use the existing swagger.server-url value as a template variable and bind it with th:href instead of a fixed href, so the button resolves correctly across environments.
Jong0128
left a comment
There was a problem hiding this comment.
수고하셨습니다!
merge 해주시면 감사하겠습니다 😄
🚀 Related issue
Closes #111
#️⃣ Summary
🔧 Changes
@JsonFormat의timezone="Asia/Seoul"속성 제거📸 Test Evidence
💬 Reviewer Notes
BackendApplication의TimeZone.setDefault는 Jib TZ와 중복이지만 의도적으로 유지했습니다.Jib TZ는 컨테이너 실행 시에만 적용되어, 로컬 실행이나 나중에 배포 도구가 바뀔 때 TZ 설정이 유실되면 조용히 UTC로 돌아갈 수 있는 문제점이 있어 실행 환경과 무관하게 JVM이 KST를 보장하도록 했습니다.
@Scheduled(zone="Asia/Seoul")은 의도적으로 유지했습니다.다른 ZoneId 명시와 달리 cron 해석 존을 정하는 실제 동작 속성입니다. 스케줄러가 UTC를 기준으로 돌면 크리티컬한 문제라, 명시적으로 남겼습니다.
Summary by CodeRabbit
New Features
Bug Fixes