JSON-LD 학습.
비행기 티켓 메일이나 호텔 예약 메일을 받으면 Google Calendar에 일정이 자동으로 뜨는 경우가 있음.
처음에는 Gmail이 본문을 대충 읽어서 처리하는 줄 알았는데, 실제로는 메일 안에 구조화된 데이터가 들어가는 방식이었음.
그게 JSON-LD.
예를 들면 이런 식.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FlightReservation",
"reservationNumber": "LJ349-ABC123",
"underName": {
"@type": "Person",
"name": "Chloe"
},
"reservationFor": {
"@type": "Flight",
"flightNumber": "LJ349",
"airline": {
"@type": "Airline",
"name": "Jin Air"
},
"departureAirport": {
"@type": "Airport",
"iataCode": "ICN",
"name": "Incheon"
},
"arrivalAirport": {
"@type": "Airport",
"iataCode": "KKJ",
"name": "Kitakyushu"
},
"departureTime": "2026-04-08T15:45:00+09:00",
"arrivalTime": "2026-04-08T17:15:00+09:00"
}
}
</script>
사람이 보기에는 그냥 비행기 예약 메일인데, 컴퓨터 입장에서는 이게 FlightReservation이라는 걸 알 수 있음.
Schema.org 규칙을 기준으로 작성함.
FlightReservation은 비행기 예약.
LodgingReservation은 숙박 예약.
RestaurantReservation은 식당 예약.
Book은 책 정보.
이런 식으로 데이터 타입이 정해져 있음.
메일 본문에 그냥 “출발시간 15시 45분”이라고 쓰면 컴퓨터는 의미를 정확히 알기 어려움.
그런데 JSON-LD로 넣으면 `departureTime`이 출발시간이라는 걸 명확하게 알 수 있음.
Python으로 만들면 대략 이런 식.
import json
schema = {
"@context": "https://schema.org",
"@type": "FlightReservation",
"reservationNumber": "LJ349-ABC123",
"reservationFor": {
"@type": "Flight",
"flightNumber": "LJ349",
"departureTime": "2026-04-08T15:45:00+09:00",
"arrivalTime": "2026-04-08T17:15:00+09:00"
}
}
html = f"""
<html>
<body>
<p>항공편 LJ349 탑승권입니다.</p>
<script type="application/ld+json">
{json.dumps(schema, indent=2)}
</script>
</body>
</html>
"""
실제로 RestaurantReservation이랑 FlightReservation 메일을 보내서 테스트했음.
Gmail에서 JSON-LD를 인식했음.
식당 예약은 제목, 시간, 주소, 전화번호를 추출함.
비행기 예약은 항공편 번호, 시간, 출발지, 도착지, 좌석 정보를 추출함.
다만 Calendar에 완전 자동 추가되지는 않았음.
“내 캘린더에 추가” 버튼을 보여주는 방식.
이유는 발신자 신뢰도 때문으로 보임.
공식 항공사나 호텔 도메인이면 자동 등록될 수 있지만, 개인 도메인에서 보낸 테스트 메일은 사용자 확인을 요구하는 방식.
정리하면 JSON-LD는 메일이나 웹페이지 안에 숨겨진 구조화된 데이터임.
Gmail, Google Calendar, 검색엔진이 이 데이터를 읽고 예약, 일정, 별점, 상품 정보 같은 걸 이해함.
여행 일정 자동화나 gog 연동을 하려면 이 구조를 알아두는 게 필요했음.