시트 자동화를 해야하는 상황에 처했다. 🥲
TODO 👊
1. MySQL DB에 쿼리를 날려 결과를 조회한다.
2. 받아온 결과를 적절하게 Google Spreadsheet에 자동으로 입력한다.
3. 이때, 결과는 실행 시점 기준 오늘, 어제의 데이터만을 입력하며, 이미 존재하는 경우 수정한다.
CHOOSE
우선 언어는 Java
를 선택했다. 이유는 딱히 없고.. 회사에서 프레임워크로 대부분 Spring boot
를 사용했기 때문이다. Sheet API는 공식 문서를 참고하고, 구글링과 스택오버플로우에 의존했다.. 이 글을 쓰는 이유도 자료가 너무 없었기 때문 + 삽질을 너무 많이 해서 혹시라도 이 글을 보신 분께서 더 좋은 솔루션을 주실 까 하는 맘에 😅
참고 자료 - https://www.baeldung.com/google-sheets-java-client
ADD Maven Dependency
구글 시트 api를 사용하기 위해 먼저 dependency
를 등록하자.
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.30.4</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client-jetty</artifactId>
<version>1.30.6</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-sheets</artifactId>
<version>v4-rev581-1.25.0</version>
</dependency>
Obtaining OAuth2.0 Credentials
시트 api를 사용하기 위해서는 OAuth2.0 credential
이 필요하다. 우선 Google Developers Console에서 프로젝트를 등록한 뒤, 해당 프로젝트에 대해 Google Sheet API
를 사용 가능하도록 설정한다. 이후 JSON
으로 제공되는 Credential
파일을 다운로드 받는다. 해당 파일의 내부는 요렇게 생겼다.
{
"installed":
{
"client_id":"<your_client_id>",
"project_id":"decisive-octane-187810",
"auth_uri":"https://accounts.google.com/o/oauth2/auth",
"token_uri":"https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
"client_secret":"<your_client_secret>",
"redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]
}
}
이 파일을 credentials.json
이라고 명명하고, 본인의 프로젝트에서 src/java/resources
폴더에 위치하도록 한다.
Obtaining Credential Object
제목을 영어로 쓰려하니 좀 어색하다..😅 암튼, 이제 프로젝트에서 우리가 사용할 credential
을 얻는 코드를 짜보자.
나는 Credential
만 담당하는 클래스인 Credentials
를 생성하고, 그 안에 authorize()
라는 메서드를 생성했다. 메서드 내부는 아래와 같다.
public static Credential authorize() throws IOException, GeneralSecurityException {
InputStream in = Credentials.class.getResourceAsStream("/credentials.json");
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
JacksonFactory.getDefaultInstance(), new InputStreamReader(in)
);
List<String> scopes = Arrays.asList(SheetsScopes.SPREADSHEETS);
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(),
clientSecrets, scopes)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File("tokens")))
.setAccessType("offline")
.build();
Credential credential = new AuthorizationCodeInstalledApp(
flow, new LocalServerReceiver())
.authorize("당신 이름");
return credential;
}
이건 어쩌면 팁일 수 있는데,
sheet api
와java
간에 어떻게 제대로 된 통신을 하고, 어떤 과정을 거쳐서 인증을 받는지에 대한 것을 알고 싶다면 공식 문서를 참고하길.. 여기에서는 우선 꼭 필수적인 내용은 최대한 공식 문서에서 복붙하고, 커스텀이 필요한 부분만 직접 로직을 구현해 커스텀한다. (무튼.. 내가 그렇게 했다.)
Constructing Sheet Service Instance
이제 획득한 Credentials
를 이용하여 우리가 본격적으로 사용할 Sheet Service
인스턴스를 생성해보자.
public static void setup() throws IOException, GeneralSecurityException {
Credential credential = Credentials.authorize();
sheetsService = new Sheets.Builder(GoogleNetHttpTransport.newTrustedTransport(),
JacksonFactory.getDefaultInstance(), credential)
.setApplicationName(APPLICATION_NAME)
.build();
}
우리는 이제 위 sheetsService
인스턴스를 가지고, 원하는 서비스를 제공받을 수 있다!