서비스 계정으로 Google Calendar API 사용하기 (2)

개발자·2023년 3월 7일
0

1편 에서 작성한 코드중 Deprecated 된 기능이 있어 수정해주었다.
추가로 Calendar API의 update, delete도 사용해보자 😁

내가 개발중인 서비스는 Google과 연동해 OAuth 방식으로 로그인하는 시스템에서 SSO 방식으로 접속하게 된다. 따라서 Access Token에 직접 접근할 수 없어 서비스 계정을 추가하는 방식으로 Google API를 사용했다.

1편과 동일하게 서비스 계정 생성과 도메인 전체 위임을 진행해준다.
이 때 1편과 다르게 구글 캘린더 설정 부분을 따로 해주지 않아도 된다.

소스코드

<dependency>
	<groupId>com.google.auth</groupId>
	<artifactId>google-auth-library-oauth2-http</artifactId>
	<version>1.3.0</version>
</dependency>

우선 pom.xml에 위의 라이브러리를 추가해준다.
maven을 사용중이지 않다면 이 곳에서 맞는 코드를 찾아 추가해주면 된다.

public String setGoogleCalendar(RequestDTO request) {
    Calendar service = serviceAuth(request); //인증
    Event event = makeGoogleCalendarEvent(request); //이벤트 생성
  
    //이벤트 실행
    String calendarId = "캘린더 추가할 Google 계정";
    event = service.events().insert(calendarId, event).execute();
    log.debug("Event created: {}", event.getHtmlLink());
    
    return event.getId();
}

다음 소스코드는 구글 캘린더에 이벤트를 추가해주는 부분이다.
인증과 이벤트 생성 부분은 따로 메서드로 빼주었다.
참고) calendarId를 추가할 Google 계정으로 해준 이유는 구글 계정의 기본 캘린더 ID가 Google 계정(이메일) 이기 때문이다.

Google 자격 증명

public Calendar serviceAuth(RequestDTO request) throws FileNotFoundException, IOException, GeneralSecurityException {
    String keyFileName = "서비스계정key.json";
    InputStream keyFile = ResourceUtils.getURL("classpath:" + keyFileName).openStream();
    GoogleCredentials credentials = GoogleCredentials.fromStream(keyFile).createScoped(Arrays.asList(CalendarScopes.CALENDAR)).createDelegated("캘린더 추가할 Google 계정");
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);        
    NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
    
    return new Calendar.Builder(transport, JacksonFactory.getDefaultInstance(), requestInitializer).setApplicationName("appName").build();
}

기존에 사용했던 GoogleCredential이 Deprecated되어 GoogleCredentials로 변경해주었다.
GoogleCredentials.fromStream(InputStream) 코드로 서비스 계정의 JSON 키에서 사용자 인증 정보를 가져올 수 있다. 인증 정보를 Google의 HTTP 기반 클라이언트 에서 사용하기 위해
HttpRequestInitializer로 캐스팅 해주었다.
또한 createDelegated에 기존의 서비스 계정을 생성한 계정이 아닌 캘린더에 접근할 Google 계정을 추가해주었다. 이렇게 해야 캘린더 이벤트의 주체가 해당 계정으로 생성할 수 있다.

update, delete

캘린더 이벤트 생성 및 추가는 1편과 같다.

  • update
Calendar service = serviceAuth(request); //자격 증명
String calendarId = "캘린더 추가할 Google 계정";
String eventId = "기존 event ID";
Event newEvent = makeGoogleCalendarEvent(request); //수정할 Event 생성
service.events().update(calendarId, eventId, newEvent).execute();

log.debug("Event update: {}", "");

update할 CalendarId와 EventId를 파라미터로 넘겨 수정하면 된다. 수정할 Event는 이벤트 생성 방식과 동일하게 생성해주었다.

  • delete
Calendar service = serviceAuth(request); //자격 증명
String calendarId = request.getTaskOwnerMemberId();
String eventId = request.getCalendarEventId();
service.events().delete(calendarId, eventId).execute();

log.debug("Event deleted: {}", "");

delete도 비슷하게 해주면 된다.


결과

소스코드 실행시 다음과 같이 추가된 결과를 확인할 수 있다.


Ref.

https://github.com/googleapis/google-auth-library-java
https://developers.google.com/calendar/api/v3/reference/events
서비스 계정으로 Google Calendar API 사용하기

profile
log.info("공부 기록 블로9")

0개의 댓글