2007년 6월
소개
Google Sheets에서 회의, 이벤트, 컨퍼런스에 관한 여러 정보를 관리하고 해당 정보를 쉽게 공유하고 검색하고 싶으신가요? Google에서는 개발자 이벤트 캘린더를 통해 이 작업을 수행합니다. 캘린더에 표시되는 데이터는 회사 전체의 다양한 Google 직원으로부터 제공됩니다. 이 중 많은 직원이 데이터가 저장된 Google 스프레드시트에 대한 수정 액세스 권한을 보유하고 있습니다. 스프레드시트에 널리 알려진 참여와 함께 확인되지 않은 이벤트가 있습니다. 제안서가 제출되거나 잠재적 스폰서십이 조사되기 전에도 예정된 이벤트를 입력하는 경우가 있습니다. '편집자'는 이벤트를 게시하고 게시된 이벤트를 스프레드시트의 열에 기록합니다.
Google Calendar에서 직접 이러한 일정을 관리하지 않는 이유는 무엇인가요? Calendar는 이벤트의 시간과 장소를 파악하는 데 적합하지만, 발표자 목록, 제출 마감일 등 많은 구조화된 정보를 유지하는 데는 스프레드시트가 더 적합합니다.

이벤트 목록이 포함된 소스 Google Sheets
한 동료 Google 직원이 스프레드시트에서 이벤트를 계속 관리하되 외부 공개 캘린더에 게시하는 수동 프로세스를 삭제하자고 제안했습니다. 또한 Mashup Camp에서 시연할 여러 Google 데이터 API(줄여서 'GData')를 기반으로 하는 흥미로운 프로젝트를 원했기 때문에 Event Publisher가 탄생했습니다.
Event Publisher는 스프레드시트에서 이벤트 목록을 유지하고 Calendar와 Google Base에 모두 게시하는 개념 증명 애플리케이션으로, 빠르게 개발되었습니다. Google Calendar를 사용하면 일정을 공유하고 다른 사용자가 자신의 캘린더 보기에 일정을 쉽게 포함할 수 있습니다. Calendar에서는 일정을 검색할 수 있지만 Google Base는 이벤트를 홍보할 수 있는 또 다른 장소를 제공하며 검색하기 쉬운 방식으로 구조화된 데이터를 저장하는 데 탁월합니다.
스프레드시트, 캘린더, Base는 각각 전체 읽기/쓰기 작업을 지원하는 API를 제공합니다. 더 나은 점은 이러한 각 서비스가 Google Data API 프로토콜을 사용하여 데이터에 대한 액세스를 노출한다는 것입니다.
설계 및 구현
이 프로젝트의 설계 단계는 매우 간단했습니다. 캘린더에 스프레드시트 데이터를 게시하는 웹 애플리케이션을 만들고 싶었기 때문입니다. 장기적인 목표는 개발자 이벤트 캘린더에 사용할 수 있는 애플리케이션을 빌드하는 것이었지만 단기적인 목표는 Mashup Camp에서 시연할 수 있는 작동하는 개념 증명 매시업을 만드는 것이었습니다. 이러한 목표를 염두에 두고 성숙한 클라이언트 라이브러리 중 하나이며 Java 웹 앱 작성에 익숙한 GData Java 클라이언트 라이브러리를 선택했습니다. 제공된 클라이언트 라이브러리 중 하나를 사용하면 원시 GData 프로토콜과 XML 데이터 모델에 대해 걱정하지 않고 대신 이벤트를 게시하는 데 필요한 비교적 간단한 애플리케이션 로직을 구현하는 데 집중할 수 있었습니다.
Java 클라이언트 라이브러리를 다운로드하고 이벤트 게시자의 클래스 모델 설계를 시작했습니다. 웹 애플리케이션으로 들어오는 모든 요청의 컨트롤러 역할을 하는 서블릿(이름은 EventPublisherServlet)을 만들었습니다. 또한 Calendar, Base, Spreadsheets와 상호작용하는 비즈니스 로직을 처리하기 위해 EventPublisher라는 클래스를 만들었습니다. 마지막으로 이벤트 데이터를 저장하기 위한 Bean 클래스를 작성했습니다. 애플리케이션의 사용자 인터페이스는 몇 개의 JSP를 사용하여 개발되었습니다.
여러 GData 서비스를 사용하는 것의 장점은 인터페이스가 일관되고 많은 클라이언트 라이브러리에 즐겨 사용하는 Google 서비스를 위한 서비스별 도우미 클래스가 포함된다는 것입니다. 클라이언트 라이브러리에는 제가 사용한 세 서비스에 대해 동일한 서비스, 항목, 피드 클래스가 있었기 때문에 스프레드시트에서 이벤트를 가져와 Base 및 Calendar에 게시하는 데 매우 유사한 코드를 사용할 수 있었습니다. 세 개의 개별 API를 사용하는 데 필요한 시간과 비교했을 때 개발 시간이 크게 단축되었습니다. EventPublisher에서 publishEventToCalendar() 및 publishEventToBase() 메서드를 검사하여 다양한 메서드 간의 유사점을 확인할 수 있습니다.
이벤트 게시자 획득 및 배포
이벤트 게시자 애플리케이션은 Google 데이터 Java 클라이언트 라이브러리 다운로드의 일부로 배포됩니다. Java 클라이언트 라이브러리를 다운로드한 후 java/mashups/eventpub 디렉터리를 확인합니다. 예의 각 파일의 의미에 관한 자세한 내용은 부록의 프로젝트 구조 섹션을 참고하세요.
애플리케이션에는 이벤트 게시자를 빌드하기 전에 다운로드해야 하는 종속 라이브러리가 여러 개 있습니다. 적절한 빌드 및 런타임 옵션을 구성한 후 (README.TXT 파일 참고) Ant를 사용하여 Java 클래스를 컴파일하고 WAR 파일을 생성할 수 있습니다. 이 WAR 파일은 이 애플리케이션을 테스트하는 데 사용한 Tomcat 5.5와 같은 즐겨 사용하는 서블릿 엔진에 배포할 수 있습니다. 기본 구성으로 실행되는 Tomcat의 경우 생성된 deploy/EventPublisher.war 파일을 webapps 디렉터리에 복사하기만 하면 됩니다. 그러면 자동으로 배포되며 http://hostname:8080/EventPublisher를 통해 액세스할 수 있습니다.
애플리케이션 실행 - 프로세스

AuthSub를 통해 Google 스프레드시트 계정에 인증합니다.
- 애플리케이션은 애플리케이션을 실행하는 호스트에서 /EventPublisher를 방문하여 로드됩니다. 이 경우 애플리케이션은 http://localhost:8080/EventPublisher에서 실행됩니다.
- Google Sheets 인증
- 사용자가 정적 함수 AuthSubUtil.getRequestUrl()에 의해 생성된 '인증' 링크를 클릭합니다.
- 사용자가 Google 계정 서비스로 리디렉션되며, 아직 Google에 로그인하지 않은 경우 사용자에게 사용자 인증 정보를 입력하라는 메시지가 표시됩니다.
- 사용자가 이벤트 게시자에게 스프레드시트 데이터에 액세스할 수 있는 권한을 부여합니다.
- 사용자는 URL에 일회용 AuthSub 토큰이 포함된 이벤트 게시자로 다시 리디렉션됩니다. 이벤트 게시자는 AuthSubSessionToken 서비스를 사용하여 일회용 토큰을 AuthSub 세션 토큰으로 교환합니다.
- 코드:
EventPublisherServlet.processAcceptAuthSubToken()
참고 - 문서: AuthSub 문서를 참고하세요.
- 스프레드시트/워크시트 선택
- 사용자는 이벤트 게시자에 의해 승인된 사용자가 액세스할 수 있는 스프레드시트 목록으로 리디렉션됩니다.
- 이벤트 데이터를 가져올 스프레드시트를 선택한 후 사용자에게 선택한 스프레드시트에서 적절한 워크시트를 선택하라는 메시지가 표시됩니다.
- 코드:
EventPublisher.getSsList()
및EventPublisher.getWsList()
참고
- 열 헤더 가져오기 및 매핑
- 그런 다음 애플리케이션은 스프레드시트 셀 피드를 사용하여 스프레드시트에서 데이터의 첫 번째 행을 가져옵니다. 이 첫 번째 행은 열 헤더를 나타냅니다. 필요한 각 데이터가 사용자에게 나열되고 데이터와 가장 일치하는 열 헤더를 선택하라는 메시지가 표시됩니다. 오른쪽의 화면 캡처에서 필요한 각 데이터 유형 옆에는 해당 열 헤더를 선택하는 선택 상자가 있습니다. 이 매핑은 서블릿 컨테이너의 세션 처리 메커니즘을 사용하여 사용자의 세션에 저장됩니다.
- 코드:
EventPublisherServlet.processListEvents()
참고
- 항목을 가져와 Beans에 저장
- 열이 매핑되면 이벤트 게시자가 워크시트의 각 행에 대한 단일 항목이 포함된 스프레드시트 목록 피드를 가져옵니다. 각 행은 단일 이벤트를 나타내며 행의 데이터는 Event Bean의 인스턴스에 채워집니다. 그런 다음 Bean 컬렉션이 세션에 저장되고 outputEventList.jsp 페이지를 사용하여 확인을 위해 화면에 출력됩니다.
- 캘린더 또는 Base에 항목 게시
- 사용자가 적절한 게시 타겟 (캘린더, 베이스 또는 둘 다)을 선택하고 '게시' 버튼을 클릭합니다. 이벤트는 사용자의 세션에 저장된 이벤트 객체 컬렉션에서 EventPublisher의
publishEventsToBase()
및publishEventsToCalendar
메서드를 사용하여 적절한 서비스로 푸시됩니다. 이러한 메서드는 서비스(CalendarEventEntry
및GoogleBaseEntry
)에 적합한 유형의 항목 객체를 만듭니다. 그런 다음 이러한 항목은 서비스 클래스CalendarService
및GoogleBaseService
에 의해 실행되는HTTP POST
를 통해 게시됩니다. - 이벤트가 게시되면 각 타겟 서비스에서 반환된 수정 URL이
EventPublisher.updateSsEventEditUrl()
메서드를 사용하여 Google 스프레드시트에 저장됩니다. 향후 게시 프로세스 반복에서는 스프레드시트의 각 서비스에 대한 수정 URL이 포함된 이벤트가 생성되지 않고 수정됩니다. 이렇게 하면 이벤트 데이터가 중복되지 않습니다.
- 사용자가 적절한 게시 타겟 (캘린더, 베이스 또는 둘 다)을 선택하고 '게시' 버튼을 클릭합니다. 이벤트는 사용자의 세션에 저장된 이벤트 객체 컬렉션에서 EventPublisher의


필요한 데이터를 스프레드시트 열에 매핑하고 게시할 이벤트를 미리 봅니다.
다음 단계 및 잠재적 개선사항
이 문서의 앞부분에서 언급했듯이 이 애플리케이션은 현재 프로토타입일 뿐입니다. 프로덕션에 즉시 사용할 수 있는 코드가 아닙니다. 이벤트 게시자를 프로덕션 환경에서 사용할 수 있도록 하려면 오류 처리를 포함해야 합니다. 현재 오류는 stderr로만 전송됩니다. 대신 검색, 게시 또는 기타 작업 중에 발생하는 오류는 사용자의 브라우저에 표시해야 합니다.
또한 Google Base는 데이터 세트의 무결성을 유지하기 위해 일정 기간이 지나도 업데이트되지 않은 항목을 만료시킵니다. 이벤트가 Google Base에 이미 추가된 경우 이벤트 게시자는 Google 스프레드시트에 저장된 수정 URL을 사용하여 이벤트를 업데이트하려고 시도합니다. Base의 이벤트 항목이 만료된 경우 수정 URL이 더 이상 유효하지 않으며 게시 시 404 오류가 반환됩니다. 404 응답을 수신하면 이벤트를 삽입해 보는 것이 해결 방법입니다.
이벤트 게시자 애플리케이션에 추가할 수 있는 또 다른 기능은 날짜만 저장하고 게시하는 대신 이벤트의 정확한 시간을 저장하고 게시하는 기능입니다. Google Base에서는 이벤트에 시간을 첨부해야 하므로 각 이벤트의 시간을 저장하면 Base 항목의 이벤트에 임의의 시간이 연결되는 것을 방지할 수 있습니다. Calendar는 적절한 시간에 일정을 표시할 수도 있습니다.
열 매핑을 비롯한 특정 스프레드시트의 구성을 저장하는 영구 데이터 저장 메커니즘이 필요할 수도 있습니다. 별도의 Google 스프레드시트, 데이터베이스 또는 로컬 디스크 저장소의 형태일 수 있습니다.
이 도움말을 통해 Google 데이터 API를 활용하는 애플리케이션에 대한 새로운 아이디어를 떠올리셨기를 바랍니다. 이 애플리케이션의 소스를 살펴보거나 필요에 맞게 빌드하고 수정하려면 Google Data API Java 클라이언트 라이브러리의 mashups/eventpub 디렉터리에서 찾을 수 있습니다. Google Data API 개발자 포럼에서 이 도움말에 대한 의견을 보내주세요. 특정 서비스와 관련된 질문은 서비스별 토론 그룹에 게시하세요.