Java 백엔드 개발에서 시간 처리 방식은 서버 내부 로직과 프론트엔드 통신 사이에서 형식이 달라질 수 있습니다. 이 글에서는 java.time 패키지를 중심으로, 서버에서의 시간 처리 방식과 프론트엔드와의 데이터 송수신 시 시간 형식을 비교해봅니다.
Java 8부터 지원되는 java.time 패키지를 사용하면 명확하고 안전한 시간 처리가 가능합니다.
LocalDateTime localTime = LocalDateTime.now();
ZonedDateTime zonedTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
Instant utcTime = Instant.now();
▶️ LocalDateTime: 타임존 정보가 없음
▶️ ZonedDateTime: 타임존 포함
▶️ Instant: UTC 기준 시점 표현
API를 통해 프론트에 시간을 전달할 때는 일반적으로 ISO 8601 형식을 사용합니다. Jackson을 통해 JSON 직렬화 포맷을 지정할 수 있습니다.
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
private ZonedDateTime createdAt;
▶️ 프론트는 문자열 형태의 시간 (예: 2025-06-19T14:30:00+09:00)을 받게 됩니다.
한국에서 많이 사용하는 형식으로, 타임존 없이 날짜와 시간을 명확하게 표현합니다.
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createdAt;
▶️ 이 포맷은 타임존이 포함되지 않기 때문에, 프론트와 서버가 같은 로컬 타임존을 공유한다는 전제가 있을 때만 사용해야 안전합니다.
주의: HH는 24시간제, hh는 12시간제입니다. hh를 사용할 경우 a(AM/PM) 포맷을 함께 사용해야 혼동을 줄일 수 있습니다.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a");
System.out.println(LocalDateTime.now().format(formatter));
// 출력 예: 2025-06-19 02:30:00 PM
프론트로부터 받은 시간 문자열을 Java에서는 자동으로 파싱할 수 있습니다. @DateTimeFormat 또는 Jackson 파서를 활용합니다.
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
public void updateTime(@RequestParam ZonedDateTime timestamp) {
// timestamp가 자동으로 변환됨
}
| 구별 | 형식 예시 | Java 타입 | 고려사항 |
|---|---|---|---|
| 서버 내부 처리 | 2025-06-19T14:30:00Z | Instant, ZonedDateTime | UTC 기준 처리 권장 |
| 프론트에 드림 | 2025-06-19T14:30:00+09:00 | ZonedDateTime | Jackson 직력화 포맷 설정 |
| 프론트에서 받음 | 2025-06-19T14:30:00+09:00 | ZonedDateTime | 정확한 파싱 설정 필요 |
| yyyy-MM-dd HH:mm:ss | 2025-06-19 14:30:00 | LocalDateTime | 타임존 문제 가능, 같은 타임존 사이 전제 |
Java 백엔드에서 시간은 UTC 기준으로 내부 처리하고, 프론트엔드와 통신할 때는 명시적인 타임존을 포함한 ISO 포맷을 사용하는 것이 안정적입니다. Jackson이나 Spring의 어노테이션을 적절히 활용하면 개발 생산성과 안정성을 동시에 확보할 수 있습니다.
| WAS, CDN, SSR, Web Server 쉽게 정리하기 - 웹 개발 핵심 개념 한눈에! (0) | 2025.06.20 |
|---|---|
| 질문도 실력이다! 주니어 개발자를 위한 질문 꿀팁 (0) | 2025.06.19 |
| [입문 필독] Spring 계층 구조 예제와 자주 하는 실수 정리 (0) | 2025.06.12 |
| JPA 실무에서 자주 묻는 질문 Top 5 + 팀장님이 좋아하는 질문법 (0) | 2025.06.08 |
| redis-cli 사용법 기초부터 실전까지: KEYS vs SCAN, 데이터 삭제까지 (2) | 2025.06.07 |