[Spring] Google Calendar API Patch 400 Error 해결하기("Invalid start time.")

박철현·2025년 7월 6일
0

문제해결

목록 보기
16/17

문제 상황

  • 구글 캘린더 API를 사용하여 시간이 있는 일정 <-> 종일 일정 으로 변경을 시도하던 중 아래와 같은 오류를 받았습니다.
{
  "code": 400,
  "errors": [
    {
      "domain": "global",
      "message": "Invalid start time.",
      "reason": "invalid"
    }
  ],
  "message": "Invalid start time."
}

참고 : 종일 이벤트와, 시간제 이벤트의 API 요청 형식이 다르다.

  • 종일 이벤트
    • setDateTime : Null
    • setDate : 값 있음!
  • 시간제 이벤트
    • setDateTime : 값 있음!
    • setDate : Null

문제의 코드

// 하루종일 일정으로 변경하고싶다 -> 새로운날의 하루종일 일정으로 변경
		if (wantedAllDay) {
			apiEvent.setStart(
				new EventDateTime()
				.setDate(
					new DateTime(wantedStart.toLocalDate().toString())
				)
				.setDateTime(null)
				.setTimeZone(null)
			);

			apiEvent.setEnd
				(
					new EventDateTime()
					.setDate(
						new DateTime(wantedEnd.toLocalDate().toString())
					)
					.setDateTime(null)
					.setTimeZone(null)
				);
		}
  • 아니 분명이 null로 넣어줬는데 계속 에러 응답이 내려옴..
  • 이제 끝없는 몇시간을 날려가며.. 무한 서칭 및 GPT 이용..

해결

// 하루종일 일정으로 변경하고싶다 -> 새로운날의 하루종일 일정으로 변경
		if (wantedAllDay) {

			// 전일(all-day)로 바꿔야 할 경우 - 기존꺼에 업데이트 하기 때문에 Null 확실하게 처리해야 함
			EventDateTime newStart = new EventDateTime()
				.setDateTime(Data.NULL_DATE_TIME)   // 👈 반드시 포함
				.setTimeZone(null)
				.setDate(
					new DateTime(wantedStart.toLocalDate().toString())
				);

			EventDateTime newEnd = new EventDateTime()
				.setDateTime(Data.NULL_DATE_TIME)
				.setTimeZone(null)
				.setDate(
					new DateTime(wantedEnd.toLocalDate().toString())
				);

			apiEvent.setStart(newStart);
			apiEvent.setEnd(newEnd);
		}
		// 바꿀 일정이 하루종일이 아닌거로 바뀔경우 -> 새로운거로 변경
		else {
			DateTime startDt = new DateTime(
				Date.from(wantedStart.atZone(zone).toInstant())); // 2025-07-28T13:00:00+09:00
			DateTime endDt   = new DateTime(
				Date.from(wantedEnd.atZone(zone).toInstant()));   // 2025-07-28T17:00:00+09:00

			apiEvent.setStart(new EventDateTime()
				.setDate(Data.NULL_DATE_TIME)         // 👈 반드시 포함
				.setDateTime(startDt)
				.setTimeZone(zone.getId()));

			apiEvent.setEnd(new EventDateTime()
				.setDate(Data.NULL_DATE_TIME)  // 👈 반드시 포함
				.setDateTime(endDt)
				.setTimeZone(zone.getId()));
		}
  • 위처럼 google.api.client에 정의된 Enum으로 Null처리 해줘야 확실하게 처리됨
    • JSON화 될때 Null이라서 Key에 미포함하여 API 요청
      • KEY가 누락되니 Google Calendar Server에서는 변경 안하는 속성으로 간주
      • 그 결과 종일 이벤트 <-> 시간 지정 이벤트 간 null이 하나 있어야하는데 둘다 null이 아니기 때문에 400 코드 반환해버리기~!~!

후기

  • 인생아 내 일요일... 3 ~ 4시간 하다 눕다 하다 눕다 반복..
  • 누군가 이 글 보고 도움이 되었으면 좋겠습니다..!

참고자료

profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글