Skip to content

Commit 2c64679

Browse files
authored
서버 및 DB 시간 처리 정책 UTC로 통일 (#93)
* fix: 서버 타임존 처리 UTC로 통일 * fix: 서버 타임존 처리 UTC로 통일 * refactor: UTC 변환로직을 도메인 레이어로 이동 * refactor: Jackson 설정 application.yaml 설정으로 변경
1 parent 6605b54 commit 2c64679

16 files changed

Lines changed: 80 additions & 41 deletions

File tree

Dockerfile

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ FROM amazoncorretto:25-alpine3.21
22

33
WORKDIR /app
44

5-
RUN apk add --no-cache curl tzdata && \
6-
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
7-
echo "Asia/Seoul" > /etc/timezone && \
8-
apk del tzdata
5+
RUN apk add --no-cache curl
96

107
RUN addgroup -g 1001 appgroup && adduser -u 1001 -G appgroup -D appuser
118
RUN mkdir -p /app/log && chown -R appuser:appgroup /app
@@ -16,4 +13,4 @@ USER appuser
1613

1714
EXPOSE 8080
1815

19-
ENTRYPOINT ["java", "-jar", "app.jar"]
16+
ENTRYPOINT ["java", "-Duser.timezone=UTC", "-jar", "app.jar"]

src/main/java/com/recyclestudy/common/config/TimeConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ public class TimeConfig {
99

1010
@Bean
1111
public Clock clock() {
12-
return Clock.systemDefaultZone();
12+
return Clock.systemUTC();
1313
}
1414
}

src/main/java/com/recyclestudy/email/ReviewEmailSender.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class ReviewEmailSender {
2222
private final ReviewCycleService reviewCycleService;
2323
private final Clock clock;
2424

25-
@Scheduled(cron = "${schedule.review-mail.cron}", zone = "Asia/Seoul")
25+
@Scheduled(cron = "${schedule.review-mail.cron}", zone = "UTC")
2626
public void sendReviewMail() {
2727
final LocalDateTime targetDateTime = LocalDateTime.now(clock).truncatedTo(ChronoUnit.MINUTES);
2828

src/main/java/com/recyclestudy/member/controller/response/MemberFindResponse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.recyclestudy.member.controller.response;
22

33
import com.recyclestudy.member.service.output.MemberFindOutput;
4-
import java.time.LocalDateTime;
4+
import java.time.Instant;
55
import java.util.List;
66

77
public record MemberFindResponse(String email, List<MemberFindElement> devices) {
@@ -14,6 +14,6 @@ public static MemberFindResponse from(final MemberFindOutput output) {
1414
return new MemberFindResponse(output.email().getValue(), memberFindElements);
1515
}
1616

17-
private record MemberFindElement(String identifier, LocalDateTime createdAt) {
17+
private record MemberFindElement(String identifier, Instant createdAt) {
1818
}
1919
}

src/main/java/com/recyclestudy/member/service/output/MemberFindOutput.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import com.recyclestudy.member.domain.Device;
44
import com.recyclestudy.member.domain.DeviceIdentifier;
55
import com.recyclestudy.member.domain.Email;
6-
import java.time.LocalDateTime;
6+
import java.time.Instant;
7+
import java.time.ZoneOffset;
78
import java.util.List;
89

910
public record MemberFindOutput(Email email, List<MemberFindElement> elements) {
@@ -13,11 +14,12 @@ public static MemberFindOutput of(
1314
final List<Device> devices
1415
) {
1516
final List<MemberFindElement> memberFindElements = devices.stream()
16-
.map(device -> new MemberFindElement(device.getIdentifier(), device.getCreatedAt()))
17+
.map(device -> new MemberFindElement(device.getIdentifier(),
18+
device.getCreatedAt() != null ? device.getCreatedAt().toInstant(ZoneOffset.UTC) : null))
1719
.toList();
1820
return new MemberFindOutput(email, memberFindElements);
1921
}
2022

21-
public record MemberFindElement(DeviceIdentifier identifier, LocalDateTime createdAt) {
23+
public record MemberFindElement(DeviceIdentifier identifier, Instant createdAt) {
2224
}
2325
}

src/main/java/com/recyclestudy/review/controller/ReviewController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public ResponseEntity<ReviewSaveResponse> saveReview(
3535
) {
3636
final ReviewSaveInput input = ReviewSaveInput.of(identifier, request.targetUrl(), request.cycle());
3737
final ReviewSaveOutput output = reviewService.saveReview(input);
38-
ReviewSaveResponse response = ReviewSaveResponse.of(output.url(), output.scheduledAts());
38+
ReviewSaveResponse response = ReviewSaveResponse.from(output);
3939
return ResponseEntity.status(HttpStatus.CREATED).body(response);
4040
}
4141

src/main/java/com/recyclestudy/review/controller/response/NextReviewResponse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.recyclestudy.review.controller.response;
22

33
import com.recyclestudy.review.service.output.NextReviewOutput;
4-
import java.time.LocalDateTime;
4+
import java.time.Instant;
55

6-
public record NextReviewResponse(LocalDateTime scheduledAt, int count) {
6+
public record NextReviewResponse(Instant scheduledAt, int count) {
77

88
public static NextReviewResponse of(final NextReviewOutput output) {
99
return new NextReviewResponse(output.scheduledAt(), output.count());
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.recyclestudy.review.controller.response;
22

3-
import com.recyclestudy.review.domain.ReviewURL;
4-
import java.time.LocalDateTime;
3+
import com.recyclestudy.review.service.output.ReviewSaveOutput;
4+
import java.time.Instant;
55
import java.util.List;
66

7-
public record ReviewSaveResponse(String url, List<LocalDateTime> scheduledAts) {
7+
public record ReviewSaveResponse(String url, List<Instant> scheduledAts) {
88

9-
public static ReviewSaveResponse of(ReviewURL url, List<LocalDateTime> scheduledAts) {
10-
return new ReviewSaveResponse(url.getValue(), scheduledAts);
9+
public static ReviewSaveResponse from(final ReviewSaveOutput output) {
10+
return new ReviewSaveResponse(output.url().getValue(), output.scheduledAts());
1111
}
1212
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package com.recyclestudy.review.service.output;
22

3+
import java.time.Instant;
34
import java.time.LocalDateTime;
5+
import java.time.ZoneOffset;
46

5-
public record NextReviewOutput(LocalDateTime scheduledAt, int count) {
7+
public record NextReviewOutput(Instant scheduledAt, int count) {
68

79
public static NextReviewOutput empty() {
810
return new NextReviewOutput(null, 0);
911
}
1012

1113
public static NextReviewOutput of(final LocalDateTime scheduledAt, final int count) {
12-
return new NextReviewOutput(scheduledAt, count);
14+
return new NextReviewOutput(scheduledAt.toInstant(ZoneOffset.UTC), count);
1315
}
1416
}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.recyclestudy.review.service.output;
22

33
import com.recyclestudy.review.domain.ReviewURL;
4+
import java.time.Instant;
45
import java.time.LocalDateTime;
6+
import java.time.ZoneOffset;
57
import java.util.List;
68

7-
public record ReviewSaveOutput(ReviewURL url, List<LocalDateTime> scheduledAts) {
9+
public record ReviewSaveOutput(ReviewURL url, List<Instant> scheduledAts) {
810

911
public static ReviewSaveOutput of(ReviewURL url, List<LocalDateTime> scheduledAts) {
10-
return new ReviewSaveOutput(url, scheduledAts);
12+
return new ReviewSaveOutput(url,
13+
scheduledAts.stream().map(scheduledAt -> scheduledAt.toInstant(ZoneOffset.UTC)).toList());
1114
}
1215
}

0 commit comments

Comments
 (0)