Skip to content

[Chore/#111] JVM 기본 시간대 서울로 고정 및 메인 클래스 bootstrap 패키지로 이동 - #112

Open
tnals0924 wants to merge 4 commits into
feat/#109-notification-settingsfrom
chore/#111-timezone-config
Open

tnals0924 wants to merge 4 commits into
feat/#109-notification-settingsfrom
chore/#111-timezone-config

Conversation

@tnals0924

@tnals0924 tnals0924 commented Oct 13, 2026 •

Copy link
Copy Markdown
Member

#️⃣연관된 이슈

🎯 해결하려는 문제가 무엇인가요?

기동할 때 JVM 기본 시간대를 Asia/Seoul로 고정합니다.

❓ 왜 해결해야 하나요?

코드 일부가 LocalDateTime.now()처럼 JVM 기본 시간대를 그대로 씁니다. 컨테이너 시간대가 UTC면 9시간 어긋납니다. 곧 붙일 예약 푸시 알림(행사 D-1, 반납 기한 임박·연체 등)은 날짜와 시각 비교가 많아서, 어긋나면 엉뚱한 날이나 시각에 알림이 갑니다.

⭐ 어떻게 해결했나요?

  • bootstrap에 kr.ac.kookmin.stream.bootstrap.config.TimezoneConfig(@Configuration)를 추가했습니다. @PostConstruct에서 TimeZone.setDefault(TimeZone.getTimeZone(DateUtil.KST))를 호출합니다. 시간대 값은 core:common의 DateUtil.KST를 재사용합니다.
  • 메인 클래스를 kr.ac.kookmin.stream.bootstrap으로 옮겼습니다. bootstrap 모듈의 클래스가 루트 패키지에 흩어지지 않게 하려는 것입니다. 메인 클래스 패키지가 탐색 기본값이라 범위가 좁아지므로 루트 패키지(kr.ac.kookmin.stream)로 다시 넓혔습니다.
    • 빈: @SpringBootApplication(scanBasePackages = ...)
    • JPA 엔티티·레포지토리: @AutoConfigurationPackage(basePackages = ...). 지금은 @EntityScan·@EnableJpaRepositories 없이 자동 설정 패키지에 기대고 있습니다
    • 설정 바인딩: @ConfigurationPropertiesScan(...)
    • Modulith: ApplicationModules.of(StreamServerApplication.BASE_PACKAGE). 클래스를 넘기면 그 패키지(bootstrap)가 루트가 되어 다른 모듈을 찾지 못합니다
    • bootstrap 테스트 4개도 같은 패키지로 옮겼습니다. @SpringBootTest가 테스트 패키지에서 위로 올라가며 메인 클래스를 찾기 때문입니다.
  • architecture.md 4-2절("메인 클래스는 {basePackage}에 둔다")과 4-4절 예시를 바뀐 위치에 맞게 고쳤습니다.

🧩 이 PR의 한계 & 트레이드오프

  • 적용 시점: 스프링 컨텍스트가 이 설정 빈을 만들 때 적용됩니다. 그보다 먼저 초기화되는 것(로깅 등)은 기동 직후 잠깐 이전 시간대를 쓸 수 있습니다. 비즈니스 로직은 모두 컨텍스트가 뜬 뒤에 돌기 때문에 영향이 없습니다.
  • 로컬 검증 범위: 컴파일과 ModularityTests·DomainImplAccessTests까지만 확인했습니다. Modulith는 기존 모듈을 모두 찾았고(bootstrap 모듈이 하나 늘어남) 통과했습니다. 로컬에 DB와 Docker가 없어 탐색 범위를 넓힌 뒤 컨텍스트가 실제로 뜨는지는 확인하지 못했습니다. CI에도 테스트 작업이 없으니, 머지 전에 RentalApplyConcurrencyTest(Testcontainers)를 돌리거나 dev에서 기동과 시간대를 확인해야 합니다.

⛓️ 기존 기능에 미치는 영향

  • 서버 시간대가 UTC인 환경에서 LocalDateTime.now()·LocalDate.now()를 쓰는 곳의 값이 9시간 늦게(한국 시간으로) 바뀝니다. 지금 운영 중인 시각 비교(행사 모집 상태, 대여 시간 검증 등)는 원래 한국 시간 기준으로 작성되어 있어 의도대로 맞춰집니다.
  • DateUtil.KST를 명시한 곳은 변화가 없습니다.
  • 메인 클래스와 bootstrap 테스트의 패키지가 바뀝니다. bootJar는 메인 클래스를 자동으로 찾으므로 Dockerfile·배포 설정은 바꾸지 않았습니다.
  • DB의 DEFAULT CURRENT_TIMESTAMP는 MySQL 서버 시간대를 따르므로 이 PR과 무관합니다.

🔀 Edge Case & 실패 시나리오

  • 해당 없음. 설정값 없이 항상 Asia/Seoul로 고정합니다.

📋 검토한 대안과 선택 이유

  • main()에서 SpringApplication.run 전에 지정: 로깅보다도 먼저 적용되지만, 실행 설정을 설정 클래스로 모으려고 config 패키지에 두었습니다.
  • JAVA_OPTS=-Duser.timezone=Asia/Seoul 또는 컨테이너 TZ 환경변수: 배포 환경 설정에 의존해서, 빠뜨리면 조용히 UTC로 돕니다. 코드로 고정했습니다.

💬 리뷰 포인트

  • StreamServerApplication의 탐색 범위 설정(scanBasePackages, @AutoConfigurationPackage, @ConfigurationPropertiesScan)에 빠진 것이 없는지
  • @PostConstruct 적용 시점이 충분한지

@tnals0924 tnals0924 self-assigned this Oct 13, 2026
@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 59 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository: billilge/stream-server/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5135a0b8-9bb1-4bd7-acdd-a6fe2db59d51
📥 Commits

Reviewing files that changed from the base of the PR and between 68b1a8b and b76f1c5.

📒 Files selected for processing: 8
  • bootstrap/src/main/java/kr/ac/kookmin/stream/StreamServerApplication.java
  • bootstrap/src/main/java/kr/ac/kookmin/stream/bootstrap/StreamServerApplication.java
  • bootstrap/src/main/java/kr/ac/kookmin/stream/bootstrap/config/TimezoneConfig.java
  • bootstrap/src/test/java/kr/ac/kookmin/stream/bootstrap/DomainImplAccessTests.java
  • bootstrap/src/test/java/kr/ac/kookmin/stream/bootstrap/ModularityTests.java
  • bootstrap/src/test/java/kr/ac/kookmin/stream/bootstrap/MySqlIntegrationTest.java
  • bootstrap/src/test/java/kr/ac/kookmin/stream/bootstrap/RentalApplyConcurrencyTest.java
  • docs/conventions/architecture.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@tnals0924 tnals0924 changed the title [Chore/#111] JVM 기본 시간대 서울로 고정 [Chore/#111] JVM 기본 시간대 서울로 고정 및 메인 클래스 bootstrap 패키지로 이동 Oct 13, 2026
@tnals0924
tnals0924 added this pull request to stack #122 October 14, 2026 07:31
@sangrae2325

Copy link
Copy Markdown
Collaborator

bootstrap 모듈 코드를 한곳에 모으기 위해 이동시키고 그대신 메인부터 시작하는 탐색범위를 어노테이션으로 넓힌점 이해했습니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JVM 기본 시간대 서울로 고정

2 participants