티스토리 뷰
나는 구글 API에 대해 좋은 기억이 별로 없다.
예~전에 스프레드시트와 워드에 자동 저장하기 위해 사용했을 때도, 정말 힘들었던 기억이 있다.
왜냐하면 최신화를 안해놓기도 했고, 빠른 버전업의 영향인지 정리해 놓은 곳 마다 사용법이 다 다르기 때문이다.
인간적으로 공식 가이드 문서는 엔드투엔드로 잘 써줘야하지 않나 싶다.
GPT도 영 시원찮아서, 블로그랑 스택오버플로우 이곳 저곳 뒤적이면서 어떻게 사용할 수 있게 만들어 두긴 했다.
일단 Google Indexing API를 사용하게 된 취지는 명확하다.
현재 개발하고 있는 서비스가 대부분 SEO로 active user를 충당하고 있다.
생성된 게시물을 sitemap으로 관리하고 있는데, 구글 서치 콘솔에서 확인해보면 아직 색인되지 않은 페이지가 너무 많았다.
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://stackoverflow.com/questions/54285181/google-indexing-api-request-batch-in-java
아직 batch 요청이 남았는데, 코드를 정리하면서 같이해보지싶다.
'개발 > 개발팁' 카테고리의 다른 글
Windows 10에서 Phython requirements.txt 자동 생성하기(파이썬 패키지 의존성 자동 생성) (0) | 2024.02.19 |
---|---|
Windows 10에서 WSL1을 WSL2로 업데이트하기 (1) | 2024.02.10 |
Windows에서 AWS EC2 접속 시 UNPROTECTED PRIVATE KEY FILE 에러 해결하기 (0) | 2024.01.20 |
SpringBoot에서 DotEnv로 환경변수/키관리 하기 (0) | 2023.12.13 |
WSL에서 nodejs 최신판 설치시 node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node) 에러 해결하기 (0) | 2023.11.26 |
- Total
- Today
- Yesterday
- EKS
- awskrug
- 스프링부트
- OpenAI
- springboot
- ChatGPT
- lambda
- Elastic cloud
- openAI API
- 람다
- CloudFront
- GIT
- serverless
- AWS EC2
- Log
- Spring
- Kotlin
- chat GPT
- OpenFeign
- docker
- AWS
- JWT
- terraform
- S3
- AOP
- elasticsearch
- java
- cache
- MySQL
- 인프런
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |