티스토리 뷰

 

나는 구글 API에 대해 좋은 기억이 별로 없다.

 

예~전에 스프레드시트와 워드에 자동 저장하기 위해 사용했을 때도, 정말 힘들었던 기억이 있다.

 

왜냐하면 최신화를 안해놓기도 했고, 빠른 버전업의 영향인지 정리해 놓은 곳 마다 사용법이 다 다르기 때문이다.

 

인간적으로 공식 가이드 문서는 엔드투엔드로 잘 써줘야하지 않나 싶다.

 

GPT도 영 시원찮아서, 블로그랑 스택오버플로우 이곳 저곳 뒤적이면서 어떻게 사용할 수 있게 만들어 두긴 했다.


일단 Google Indexing API를 사용하게 된 취지는 명확하다.

 

현재 개발하고 있는 서비스가 대부분 SEO로 active user를 충당하고 있다.

 

생성된 게시물을 sitemap으로 관리하고 있는데, 구글 서치 콘솔에서 확인해보면 아직 색인되지 않은 페이지가 너무 많았다.

 

35%정도의 게시물이 색인이 생성되지 않음

 

SEO 향상을 위해서 이런 저런 작업을 했지만, 색인이 잘 안되지 않는 것들이 있어서

 

어떻게 하면 색인 생성을 더 효과적으로 할 수 있을까? 를 알아보게 된게 Google Web Indexing API 이다.

 

Indexing API란?

Indexing API를 사용하면 페이지가 추가되거나 삭제된 경우 사이트 소유자가 Google에 직접 알릴 수 있습니다. 이렇게 하면 Google에서 페이지를 새로 크롤링하도록 예약하여 사용자 트래픽의 질이 향상될 가능성이 있습니다. 채용 정보 또는 실시간 스트리밍 동영상 등 수명이 짧은 페이지가 대부분인 웹사이트의 경우, Indexing API를 사용하면 업데이트를 개별적으로 푸시할 수 있어 검색결과에 항상 최신 콘텐츠를 표시할 수 있습니다.

 

구글 Indexing API 공식 페이지에 나와있는 설명이다.

 

공식 페이지에 나와있는 기본요건부터 하나씩 작업을 해보자.

 

Web Indexing API 사용 가능한 서비스 계정 만들기

구글 API를 사용하기 위해서는 서비스 계정을 만들어야 한다.

 

그 전에, 이 페이지에서 프로젝트부터 생성한다.

 

우측 상단 프로젝트 선택 > 새 프로젝트 클릭

 

 

그냥 테스트 프로젝트라고 이름을 지었다.

 

 

여기서부터 설명이 점프해버리는데, 키를 발급받기 위해 내가 사용할 API인 Web Search Indexing API 검색한다.

 

 

MARKETPLACE에 있으니 선택하면 아래와 같은 창이 나온다.

 

사용을 클릭하면 잠시간의 로딩 후 사용 설정된 API 및 서비스를 보면 Web Search Indexing API가 추가되어있다.

 

 

이제 이 API를 사용하기 위한 서비스 계정을 만들어야 한다.

 

좌측 상단 햄버거 버튼 클릭 > IAM 및 관리자 > 서비스 계정 > 서비스 계정 만들기

 

서비스 계정 이름은 알아서 지어주자

아래와 같이 계정이 생성된다.

 

이제 이 계정을 복사하고, 서치 콘솔의 사용자로 등록해야 한다.

 

좌측 메뉴 하단  설정 > 사용자 및 권한 > 사용자 추가 > 권한을 소유자로 설정

 

권한을 소유자로 설정하지않으면 API 요청을 하면 permission error를 볼 것이다.

 

서비스 계정을 사이트 소유자로 추가하고 키 만들기

 

일단 여기까지 왔으면 설정은 거의 다 끝났다고 보면 된다.

 

서비스 계정 > 아까 만든 IAM 계정 클릭 > 키 > 키 추가 > JSON 선택 후 만들기

 

 

이 때 생성된 JSON 파일은 잘 보관해뒀다가. google ouath credential을 발급받는데 써야한다.

 

코드

build.gradle

repositories {
    mavenCentral()
    google()
    ...
}

..
implementation 'com.google.auth:google-auth-library-oauth2-http:0.25.2'
implementation 'com.google.apis:google-api-services-indexing:v3-rev20230927-2.0.0'

여기서부터 혼돈 시작인데 ouath 인증이 indexing 페이지에서 링크를 걸어둔 공식 사이트랑 github, 그리고 별도의 페이지에서 안내하는 방식이 다르다.

 

일단은, 서비스 클라이언트를 사용하고있으니 client library 페이지를 참고했다.

private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();

...

InputStream keyFile = ResourceUtils.getURL("classpath:" + "indexing-api-sa.json")
                                   .openStream();
                                   
GoogleCredentials credentials = GoogleCredentials.fromStream(keyFile)
                                                 .createScoped(Collections.singletonList(IndexingScopes.INDEXING));

NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
HttpRequestFactory requestFactory = transport.createRequestFactory(request -> {
    request.setParser(new JsonObjectParser(JSON_FACTORY));
    new HttpCredentialsAdapter(credentials).initialize(request);
});

다음은 indexing 요청을 날리는 코드인데, 버전 업되면서 이름이 바뀐건지 알림 기능이 붙은거 같긴하다.

String endPoint = "https://indexing.googleapis.com/v3/urlNotifications:publish";

UrlNotification urlNotification = new UrlNotification();
urlNotification.setUrl(indexUrl); // URL을 입력하세요.
urlNotification.setType(type); // "URL_UPDATED" 또는 "URL_DELETED"

GenericUrl genericUrl = new GenericUrl(endPoint);
HttpContent content = new JsonHttpContent(JSON_FACTORY, urlNotification);

HttpRequest request = requestFactory.buildPostRequest(genericUrl, content);
HttpResponse response = request.execute();

if (response.isSuccessStatusCode()) {
    log.info(indexUrl + " url indexing");
} else {
    log.error(indexUrl + " url indexing fail");
}

요청에 성공하면 로그를 찍었지만, 결과를 json pretty한 후 찍으면 아래와 같은 응답이 날아온다.

{
  "urlNotificationMetadata": {
    "latestUpdate": {
      "notifyTime": "2024-02-02T05:06:56.805880473Z",
      "type": "URL_UPDATED",
      "url": "..."
    },
    "url": "..."
  }
}

 

 

마치며

API를 갖다 쓰는게 google보다 어려운게 없는 것 같다.

 

레퍼런스 관리도 이런식으로 하는데가 있나 싶기도 하고..

 

이번에도 저번과 똑같은 경험을 하면서 개발을 했는데,

 

아래의 참고 사이트 두 곳이 없었으면 마무리 짓지 못했을지도 모른다.

 

- https://blog.naver.com/PostView.naver?blogId=moonbird_thinker&logNo=222991325667&categoryNo=69&parentCategoryNo=0

- https://stackoverflow.com/questions/54285181/google-indexing-api-request-batch-in-java

 

아직 batch 요청이 남았는데, 코드를 정리하면서 같이해보지싶다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함