본문 바로가기

java

[230805] [google drive api] java api 사용하기 (3) - 파일 검색 코드 작성

.

 

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 관련 글은 여기서 마칠 것 같다. 개인적으로 정리는 해두었으니 다음에 쓸 일이 있을 때 참고할 수 있으면 좋겠다.