.
2편에서 API 인증 토큰 발급하는 법을 설명했고, 이번 3편에서는 구글 드라이브 API를 사용하는 방법을 작성하려 한다.
1. 검색
2편에서 사용한 샘플 코드 중 main 만 떼어내서 가져왔다.
주석 중 // 1. Drive 객체 생성 을 보면, 구글 드라이브 API를 사용하기 위해서는 Drive 객체를 만들어야 한다. 이때 api의 접근 권한을 설정하거나, 사용자 인증 방식을 정의하는데, 자세한 건 이전 글에 정리되어 있다.
public static void main(String... args) throws IOException, GeneralSecurityException {
// 1. Drive 객체 생성
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
// 2. 검색
String pageToken = null;
do {
try {
FileList list = service.files().list()
.setQ("name contains 'google' or fullText contains 'google'")
.setCorpora("allDrives")
.setIncludeItemsFromAllDrives(true)
.setSupportsAllDrives(true)
.setIncludeTeamDriveItems(true)
.setSupportsTeamDrives(true)
.setPageSize(10)
.setFields("nextPageToken, files(id, name, owners, parents, createdTime, description, mimeType, "
+ "webViewLink, webContentLink, fileExtension, iconLink, thumbnailLink, driveId, originalFilename)")
.setPageToken(pageToken)
.execute();
pageToken = list.getNextPageToken();
for(File file : list.getFiles()) {
System.out.println("file name: " + file.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
} while(pageToken != null);
}
생성한 Drive 인스턴스를 사용해서 service.files.list() 로 검색을 할 수 있다. 기본 코드는 구글 드라이브 api 사용 가이드 문서에서 참고했다.
2. 검색 조건 설정
검색을 할 때 setQ(), setPageSize(), setFileds() 형식으로 빌더패턴을 사용해서 검색 조건을 추가하고, 마지막에 execute() 를 실행해서 실제 검색을 수행한다. 설정 가능한 검색 옵션은 해당 페이지에 정리되어 있다.
주로 사용할법한 것만 나열하면 아래와 같다.
매개변수 | 설명 |
corpora | string 쿼리가 적용되는 항목 (파일/문서)입니다. 지원되는 본문은 'user', 'domain', 'drive', 'allDrives'입니다. 효율성을 높이려면 'allDrives'보다 'user' 또는 'drive'를 사용하세요. 기본적으로 말뭉치는 '사용자'로 설정됩니다. 하지만 'q' 매개변수를 통해 설정된 필터에 따라 달라질 수 있습니다. |
driveId | string 검색할 공유 드라이브의 ID입니다. * corpora를 drive로 세팅했다면 반드시 값을 넣어줘야 합니다. |
pageSize | integer 페이지당 반환할 최대 파일 수입니다. 파일 목록이 끝나기 전에도 일부 또는 빈 결과 페이지가 표시될 수 있습니다. |
pageToken | string 다음 페이지에서 이전 목록 요청을 계속하기 위한 토큰입니다. 이전 응답의 'nextPageToken' 값으로 설정해야 합니다. |
q | string 파일 결과를 필터링하는 쿼리입니다. 지원되는 구문은 '파일 및 폴더 검색' 가이드를 참고하세요. |
3. 검색 결과 필드 설정
검색 시에 얻을 수 있는 결과 필드의 명세(=사실상 file 이 가지고 있는 필드 명세) 는 여기에 정리되어 있다.
페이지에 들어가보면 json 형태로 값이 있다.
검색했을 때 결과로 확인하고 싶은 필드를 위 페이지에서 찾아서, api 사용할 때 .setField() 안에 넣어주면 된다.
예를 들면 아래와 같다.
// 파일 id, 파일명, 작성자 정보만 얻고 싶을 경우
FileList list = service.files().list()
.setQ("name contains 'google'")
.setCorpora("drive")
.setPageSize(10)
.setFields("nextPageToken, files(id, name, owners)")
.execute();
// 바로가기 링크와 썸네일 정보도 필요할 경우
FileList list = service.files().list()
.setQ("name contains 'google'")
.setCorpora("drive")
.setPageSize(10)
.setFields("nextPageToken, files(id, name, owners, webViewLink, thumbnailLink)")
.execute();
참고로 파일이 위치하는 전체 경로는 알아낼 수 없다. 구글 드라이브가 트리형태로 파일을 저장하는 게 아니라, 라벨 형태로 파일을 저장하기 때문이다. 전체 경로를 알아내려면 파일 검색 결과에서 parent 값을 가지고 다시 검색을 해서 parent의 파일명을 알아내고, 또 parent를 구하는 형식으로 재귀를 돌아야 한다.
4. 검색 결과 가져오기
결과를 가져오는 소스만 다시 보자
// 2. 검색
String pageToken = null;
do {
try {
FileList list = service.files().list()
.setQ("name contains 'google' or fullText contains 'google'")
(...)
.execute();
pageToken = list.getNextPageToken();
for(File file : list.getFiles()) {
System.out.println("file name: " + file.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
} while(pageToken != null);
검색 결과의 페이징은 토큰 형태로 처리한다. 검색을 할 때마다 list.getNextPageToken()에서 pageToken을 받고, 다음 검색을 할 때 pageToken을 넘겨줘야 한다.
결과값은 getter로 가져오는데, 샘플에는 getName()만 있지만, getId(), getDriveId() 등 필드를 참고해서 응용하면 된다. 더 정확하게 보려면 javadoc을 보는 게 낫다.
나는 결과를 가져올 때 file 필드 명세에 있는 json 참고하고 파싱한다고 생각하면서 코드를 짰다.
구글 드라이브 api 관련 글은 여기서 마칠 것 같다. 개인적으로 정리는 해두었으니 다음에 쓸 일이 있을 때 참고할 수 있으면 좋겠다.
'java' 카테고리의 다른 글
[230820] Exception에 관해서 (1) - Error, Exception, RuntimeException (0) | 2023.08.20 |
---|---|
[230813] java TreeMap (0) | 2023.08.13 |
[211005] JNI(Java Native Interface)로 C++ dll 사용하기 - cmd 사용 (0) | 2021.10.05 |
[210623] spring boot - error page 만들기 (0) | 2021.06.23 |
[210620] junit Assertions - Method (0) | 2021.06.20 |