본문 바로가기

테크 노트/소소한 개발 팁

java, google api 이용하기 (인증, sheet, youtube 등) (2019 ver)

잊고있던 블로그. 그나마 개발 관련 글은 딱 한 건인데 이게 5년간 조회수가 4천회가 넘었습니다. 개발자들이 많이 찾는 내용인것 같은데 4년전 내용이다보니 업데이트 할 필요가 있다는것을 느끼고 다시 써 봅니다.


준비물 

첫번째 준비물, https://console.cloud.google.com/apis/dashboard 에서 어떤 API를 사용할지 세팅
- 앱을 생성하지 않았다면 앱 이름부터 잘 지어서 생성하도록 합시다.
- 저의 경우 YouTube Data API v3, Google Sheets API, Google Drive API 이 3개를 지정했습니다.
- 참고로 구글스프레드시트를 사용할거면 Google Drive API도 꼭 사용 설정을 해야합니다.

두번째 준비물, https://console.cloud.google.com/iam-admin/serviceaccounts 에서 서비스 계정 생성하기
- private 구글 시트의 경우는 서버 인증키 방식으로 데이터 엑세스를 못하므로 서비스 계정을 생성하여 접근해야 합니다.
- 여기서 중요한것은, 설정한 이메일 주소를 구글 시트 공유 기능을 이용하여 권한 초대를 해줘야 한다는 점입니다. (말그대로 계정이니까)
- 또 중요한 것은 인증 키 파일을 json으로 저장해둬야 합니다. (왜냐면 밑에서 개발을 그렇게 할거니까요..)


개발 착수 

spring-boot 2 프로젝트(그냥 spring mvc도 가능)를 준비합시다.
우선 위에서 다운로드 받은 서비스 계정 관련 json 파일을 resources 디렉토리에 복사합니다.

그다음, 아래처럼 pom.xml을 열고 필요한 api 라이브러리들의 의존성을 넣습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-sheets -->
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-sheets</artifactId>
    <version>v4-rev1-1.21.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client</artifactId>
        </exclusion>
    </exclusions>
</dependency>
 
<!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-youtube -->
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-youtube</artifactId>
    <version>v3-rev206-1.25.0</version>
</dependency>
cs

위에서 언급한것 처럼 구글시트와 youtube api를 사용할건데요. 그래서 그 두개를 추가했습니다.
여기서 중요한 것은 저 exclusions인데, 위 아래 두개의 라이브러리에서 
버전이 다른 google-api-client를 참조해서그런지 충들이 발생하네요.
따라서 더 낮은 버전을 제외하기 위해 저런 구문을 추가하도록 합시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.util.Arrays;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
 
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.YouTubeScopes;
 
@Component
public class GoogleAPIClient {
    private Sheets sheets;
    private YouTube youTube;
    public GoogleAPIClient(@Value("${api.google.appName"String appName,
                           @Value("${api.google.serviceAccountAuthFile}"String keyFileName) throws IOException, GeneralSecurityException {
        InputStream keyFile = ResourceUtils.getURL("classpath:" + keyFileName).openStream();
        GoogleCredential credential = GoogleCredential.fromStream(keyFile).createScoped(Arrays.asList(SheetsScopes.SPREADSHEETS, YouTubeScopes.YOUTUBE));
        NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
        sheets = new Sheets.Builder(transport, JacksonFactory.getDefaultInstance(), credential).setApplicationName(appName).build();
        youTube = new YouTube.Builder(transport, JacksonFactory.getDefaultInstance(), credential).setApplicationName(appName).build();
    }
}
cs

사실, 이게 다 입니다. 저 @Value 부분만 잘 설정해주세요. 저의경우 application.yml에 저런 형태로 넣었기때문에 저렇게 했지만
하드코딩을 하셔도 되고, 다르게 하셔도 됩니다.

위처럼 GoogleAPIClient 라는 bean 의 생성자에서 필요한 객체들을 생성해주고요.
그 다음부턴 아래를 참고하여 api를 사용하시면 되겠습니다.
https://developers.google.com/youtube/v3/docs/
https://developers.google.com/sheets/api/?hl=ko


마치며 

구글 api 로그인하는건 저 코드가 다인데 저렇게 정리된 사이트가 없더군요.
(물론 구글 공식 레퍼런스도 있는데 뭔가 막 이것저것 써있어서 알아보기가 어렵네요.)
수동으로 인증 태워서 restful api를 사용하고 싶은 분도 계시겠지만 그걸 자동으로 해주는게 위 과정이라서
java에서 사용하실거라면 맘편히 위 방법을 추천드립니다.
저렇게 인증로직한 한번 잘 만들면 google api 여러개를 사용할 수 있으니까요.