Google Cloud에서 제공되는 Job Search API

이 Codelab에서는 Cloud Talent Solution API(CTS)를 사용하여 조직의 채용정보 검색 및 인재 채용을 개선하는 방법을 알아봅니다. CTS를 사용하면 머신러닝의 기능을 취업정보 검색 환경에 추가할 수 있습니다.

학습할 내용

  • Google Cloud 프로젝트에서 CTS 사용 설정
  • 이러한 회사에서 법인 및 일자리 만들기

필요한 항목

본 가이드를 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다 읽은 다음 실습 활동을 완료할 계획입니다

Google Cloud Platform 이전 경험이 어떠셨나요?

초급 중급 전문가

이 튜토리얼은 Google Cloud Platform에서 완전히 실행되도록 작성되었습니다. 워크스테이션에 다운로드할 필요가 없습니다.

Cloud Talent Solutions API 사용 설정

Cloud Console에서 애플리케이션을 열고 왼쪽 상단에서 햄버거 메뉴를 클릭합니다. Talent Solution -> 개요 메뉴를 확인합니다.

새로운 프로젝트이므로 API 사용 설정을 요청하는 새 화면으로 리디렉션됩니다. 사용 설정을 클릭하고 이 프로젝트에서 API가 사용 설정될 때까지 몇 분 정도 기다립니다.

데이터 로깅 사용 설정하기

이제 이전 개요 페이지로 돌아갑니다. 데이터 로깅을 사용 설정하라는 새 대화상자가 나타납니다. 사용 설정되어 있지 않은 경우 이전 대화상자 페이지로 돌아갑니다. 이는 취업정보 검색 API가 데이터를 필요로 하는 머신러닝 모델을 기반으로 한다는 사실만을 의미합니다. 통합의 일환으로 이러한 모델을 추가로 학습시키기 위해 검색하는 사용자의 이벤트를 전송할 수 있습니다. 코드를 통해 이를 구현할 때 어떤 정보를 전송할지 지정할 수 있습니다.

이러한 이벤트에 대해 자세히 알아보고 나중에 보내는 방법을 자세히 살펴보겠습니다. 하지만 선행 학습된 모델은 문제없이 작동합니다. 데이터 로깅을 사용 설정한 후 이 대화상자의 왼쪽 탐색 메뉴에서 '서비스 계정 연결'을 클릭합니다.

서비스 계정 설정

API 요청을 할 때 실제 인증된 계정을 대신하여 요청해야 합니다. Google Cloud Platform의 권장사항을 따르는 서비스 계정을 설정하는 것이 좋습니다. 서비스 계정을 권한이 제한된 인증된 사용자를 설정하는 간편한 방법이라고 생각해 보세요. 이를 통해 독립적인 안전한 시스템을 구축할 수 있습니다.

예를 들어 Job Search API를 사용하려면 서비스 계정이 필요합니다. 이 리소스를 만들고 왼쪽 탐색 메뉴의 'Cloud Talent Solution' 섹션에서 'Job Editor'를 사용하여 읽기/쓰기 권한을 부여합니다. 또한 단독으로 '작업 뷰어'로 서비스 계정을 설정하여 읽기 전용 액세스만 할 수 있습니다.

다음 단계에서는 사용자에게 이 서비스 계정에 대한 액세스 권한을 부여할지 묻습니다. 이 단계를 건너뛸 수 있지만 하단 근처에 있는 '키 만들기'를 클릭해야 합니다. 키 유형으로 "JSON"를 선택한 다음 "Create"를 선택하세요. 새 JSON 사용자 인증 정보 파일이 자동으로 다운로드됩니다. 파일을 서버에 저장합니다. 이후 섹션에서 작성하는 코드에서 이 파일을 사용하여 인증합니다.

환경 변수 설정하기

사용 편의성을 위해 Google Cloud Shell을 사용합니다. 여러분의 개발 환경에서 이 작업을 하고 싶으신가요? 좋습니다. 원하는 언어로 Google Cloud SDK클라이언트 라이브러리를 설치해야 합니다. 이 Codelab에서는 Python을 사용합니다. Cloud Shell에는 이미 Cloud 클라이언트 라이브러리가 설치되어 있습니다. 잘 맞나요?

라이브러리를 사용하여 코드를 실행하려면 두 개의 환경 변수가 설정되어 있는지 확인해야 합니다. 하나는 pID를 지정하고 다른 하나는 서비스 계정의 키 파일을 지정합니다. 설정해 드립니다.

프로젝트에서 웹 콘솔의 오른쪽 상단에 있는 '>_" 아이콘을 클릭하여 Cloud Shell을 엽니다. 프로젝트 ID를 지정하고 json 키 파일의 경로를 설정하려면 다음 환경 변수를 추가하세요.

export GOOGLE_CLOUD_PROJECT="your-project-id"
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"

변수가 설정되었는지 확인하려면 'echo'를 사용합니다.

echo $GOOGLE_CLOUD_PROJECT
echo $GOOGLE_APPLICATION_CREDENTIALS

Cloud Shell에서 코드 편집기 열기

Google Cloud Console의 오른쪽 상단에 있는 Cloud Shell 아이콘을 사용하여 Cloud Shell을 엽니다.

Cloud Shell의 오른쪽 상단에는 일련의 아이콘이 있습니다. 다음과 같이 File -> Launch Code Editor를 클릭합니다.

회사 만들기

File -> New File을 사용하여 새 소스 파일을 만들고 아래 콘텐츠로 채웁니다. 이를 create_company.py라고 합니다.

create_company.py에서 확인하세요

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

# Build the service object, passing in the api name and api version
client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']


# Specifying details for the company that's going to be created.
# These are the only two required fields.
# Optional fields are documented at
# http://googleapis.github.io/google-api-python-client/docs/dyn/jobs_v3.projects.companies.html#create
new_company = {
    'display_name': "FooCorp",
    'external_id': "foo_llc"
}
request = {'company': new_company}

try:

    # This is the API call that actually creates the new company.
    result = client_service.projects().companies().create(
       parent=project_id, body=request).execute()

    # You can easily just print the result as a string if you want
    print('Company created: %s' % result)

    # Or you can individual fields.  The fields returned depend on what's specified
    # in the "new_company" object.  To see possible fields of the
    # response, see the "create" documentation at:
    # http://googleapis.github.io/google-api-python-client/docs/dyn/jobs_v3.projects.companies.html#create
    print('%s: %s, %s' % (result.get('externalId'),
                       result.get('displayName'),
                       result.get('name')))

except Error as e:
    print('Got exception while creating company')
    raise e

이 코드의 역할 탐색 기능 다음과 같은 두 개의 관련 클라이언트 라이브러리 호출이 있습니다.

  • client_service = build('jobs', 'v3')Google API python 클라이언트 라이브러리를 사용하여 서비스 객체를 만듭니다.
  • client_service.projects().companies().create(parent=project_id, body=request).execute()는 API 호출을 실행하여 회사를 만듭니다. 이 호출에 대한 응답은 회사 정보를 포함하는 객체입니다. 요청 객체와 응답 객체의 콘텐츠는 모두 만들기 메서드 문서를 참조하세요.

명령 프롬프트에서 파일을 실행하면 (코드 편집기 창 바로 밑에 편리하게 사용됨) 다음과 같은 출력이 표시됩니다.

> python create_company.py
Company created: {u'externalId': u'foo_llc', u'displayName': u'FooCorp', u'name': u'projects/[PROJECT_ID]/companies/1cd6ada9-e678-49cf-80da-aaaf8876feda'}
Foo_llc, FooCorp, projects/[PROJECT_ID]/companies/1cd6ada9-e678-49cf-80da-aaaf8876feda 

name은 Job Search API에서 생성되는 고유 식별자이고 external_id는 자체 채용정보 시스템에서 제공하는 식별자입니다. API를 통해 객체를 참조할 때마다 name을 사용해야 합니다.

회사 업데이트

시스템에 이미 법인이 있는 경우 일부 필드를 추가하거나 변경하려면 프로세스는 다음과 같은 단계로 구분됩니다.

  • 회사의 현재 필드 값으로 객체 만들기
  • API로 업데이트할 회사를 파악할 수 있도록 회사 '필드 이름' 필드를 키로 사용하여 새 필드 또는 업데이트된 필드로 객체를 업데이트합니다.
  • "patch" 메서드를 사용하여 새 객체를 제출합니다.

이 과정에서 실제로 어떤 값을 업데이트했는지에 관계없이 회사 값을 모두 덮어쓰므로 기존 값을 모두 가져와야 합니다. 즉, 회사 정보를 업데이트하기 전에 정보를 가져와야 합니다.

작업공간에서 새 파일인 update_company.py를 만듭니다. 아래에 나온 get_company 메서드를 추가하여 사용 중지한 상태에서 시작하세요.

update_company.py를 참고하세요.

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

# Build the service object, passing in the api name and api version
client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']
company_name = 'Your company name goes here'


def get_company(company_name):
   try:
       company_existed = client_service.projects().companies().get(
           name=company_name).execute()
       print('Company existed: %s' % company_existed)
       return company_existed
   except Error as e:
       print('Got exception while getting company')
       raise e


newCompany = get_company()

이 시점에서 API 호출이 회사를 만들 때와 매우 비슷하게 보인다는 점에 유의하세요. 클라이언트 라이브러리는 REST 인터페이스와 일치하도록 생성되므로 회사에서 수행하는 CRUD 작업은 모두 client_service.projects().companies().theMethod(argName=argValue).execute(). 형식입니다.

이제 기존 값 집합이 있으므로 업데이트하려는 필드 이름과 새 값으로 "patch" 객체를 만들고, 이 객체를 사용하여 회사 객체를 새 값으로 업데이트합니다. Python에서 이 작업을 하는 것은 즐거운 일이므로 클라이언트 라이브러리는 회사를 사전 객체로 표현합니다. 즉, 메서드가 이미 내장되어 있습니다. 복잡한 루프가 필요하지 않습니다. 이미 작성한 코드 바로 아래에 사전 객체를 만듭니다.

update_company.py를 참고하세요.

...  
    patch = {
       'displayName': "The New Bar",
       'websiteUri': "http://www.example.com"
    }
    newCompany.update(patch)
    print("Debug: New company info %s " % newCompany)
... 

이제 해야 할 남은 작업은 요청 객체를 만들고 (객체에 들어갈 수 있는 항목에 관한 자세한 내용은 패치 문서 참고) API 호출을 실행합니다.

... 
    request = {'company': newCompany}
 
    company_updated = client_service.projects().companies().patch(
        name=company_name, body=request).execute()
    print('Company updated: %s' % company_updated)
... 

또는 실제로 변경하려는 입력란만 제공하려면 업데이트 마스크와 함께 입력란을 포함하면 됩니다. 이는 이미 업데이트된 회사 객체 설정이 없거나, 업데이트하려는 필드 하나만 있고 불필요하게 큰 객체를 앞뒤로 보내지 않으려는 경우에 유용합니다. 그런데 업데이트 마스크를 어떻게 사용할 건가요? 회사 정보를 업데이트하는 새롭고 획기적인 방법을 보여주는 코드가 어디에 있나요?

독자이신 여러분께 감사드립니다! 아래 스니펫은 전체 항목 대체 대신 업데이트 마스크를 사용하여 회사 정보 업데이트를 실행합니다.

update_company.py를 참고하세요.

... 
   # New set of fields, not the complete company object
   companyFields = {'displayName': 'The New Bar',
                    'websiteUri': 'http://shouldNotUpdate.com',
                    'externalId': 'bar_llc'}

   # Note that the mask only contains the display name, not the URL.
   # This is entirely for demonstration purposes.  This mask will tell the API
   # to update the display name, but NOT the website uri.
   mask = 'displayName'
   request = {'company': companyFields,
              'update_mask': mask}
   company_updated = client_service.projects().companies().patch(
       name=company_name,
       body=request).execute()
   print('Company updated!: %s' % company_updated)
... 

API 호출은 동일합니다. 차이점은 요청 객체에 companyupdate_mask (두 개의 필드)가 있는 것입니다 (회사). 업데이트 마스크는 쉼표로 구분된 필드 목록입니다. 마스크에 "websiteUri" 필드를 포함하려는 경우 마스크 값은 다음과 같습니다.

   mask = 'displayName,websiteUri'

어떤 경로를 선택하든 Cloud Shell에서 실행하면 (문에 출력된 내용을 가정한 경우) 회사의 이전 값과 새로운 값을 모두 보여주는 출력이 표시됩니다.

$ python update_company.py
Company existed: {u'externalId': u'bar_llc', u'displayName': u'The New Bar', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'websiteUri': u'http://www.example.com'}
Company {u'externalId': u'bar_llc', u'displayName': u'The New Bar', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'websiteUri': u'http://www.example.com'}
New company info {u'externalId': u'bar_llc', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'displayName': 'The New Bar', u'websiteUri': 'http://www.example.com'}
Company updated: {u'externalId': u'bar_llc', u'displayName': u'The New Bar', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'websiteUri': u'http://www.example.com'}
$

일자리를 찾을 수 없다면 일자리를 찾는 데 그 어떤 일도 일어나지 않을 것입니다. 지난 섹션에서는 회사를 만드는 방법을 알아보았습니다. 이제 작업을 만드는 방법과 작업에 관한 권장사항을 살펴보겠습니다.

작업은 회사에 첨부됩니다. 아직 API로 만든 회사가 없거나 섹션 끝에서 'delete'(삭제됨) 호출을 실행했지만 유일한 회사를 삭제한 경우, 다시 돌아가서 회사를 만듭니다. 그런 다음 작업을 만들 준비가 되었습니다.

작업 만들기

먼저 작업을 만들어 보세요.

작업을 만들려면 다음 데이터가 필요합니다.

  • 회사의 이름입니다. 사람이 읽을 수 있는 'Ffy Company LLC'는 아니라 "projects/[PROJECT_ID]/companies/COMPANY_ID" 문자열입니다.
  • 작업의 요청 ID입니다. 이 값은 회사의 external_id와 유사하며, 일자리에 대한 고유한 식별자를 나타냅니다. 따라서 Cloud Talent Solution API를 현재 채용 솔루션과 더 쉽게 동기화할 수 있습니다(예: senior_llama_wrangler).
  • 채용정보의 표시 이름인 제품명입니다(예: "선임 라마 랭글러.").
  • 작업에 대한 설명입니다. 올바른 형식 지정을 위해 설명에 삽입된 HTML이 포함될 수 있습니다. 별다른 설명이 필요 없습니다. "<p>라마 랭글러팀을 이끌 것입니다.
  • applicationInfo: 신청 방법에 관한 추가 정보입니다. 추가 지침이 있는 1개 이상의 URI, 1개 이상의 이메일 주소 또는 HTML 형식의 문자열일 수 있습니다. 3개를 모두 포함할 수도 있습니다. 하지만 적어도 1은 포함해야 합니다.

따라서 이전에 만든 회사 FooCorp의 채용정보를 만든 경우 필드는 다음과 같습니다.

name

projects/[PROJECT_ID]/companies/0123-Big-Hex-String-AABB0

requisition_id

고위직

title

실버 라마 랭글러

description

경력이 필요한 숙련된 라마 랭글러입니다. 리더십 역량이 필수적입니다. 라마 요양보호사와 팀을 꾸려 전대적인 랭글러들을 훈련시킵니다. 동물들과 잘 어울리고 정말 빨리 달릴 수 있는 경우가 있습니다. 좋아요. 짧은 라마입니다.

application_info

URI: http://www.example.com/llama_wrangler_application/

이메일: llama-apply@example.com

더 이상 회사 이름이 없다면 3단계에서 사용한 "get_company" 코드를 사용하여 검색할 수 있습니다.

채용정보를 만드는 코드는 회사를 만드는 코드와 매우 유사합니다. 처음 몇 줄은 매우 익숙할 것입니다. 그런 다음 요청을 나타내는 키 (값 쌍 쌍의 집합)만 만들고 사전 명령어를 "create" API 호출과 함께 전송합니다.

create_job.py라는 파일에 다음 스니펫을 붙여넣습니다. 실제로 원하는 이름을 지정할 수 있지만 이 가이드에서는 파일 이름을 가정합니다.

create_job.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']

new_job = {
   'company_name': 'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e',
   'title': 'Senior Llama Wrangler',
   'description':
   """Experienced Llama Wrangler required for full-time position.
   Leadership ability required, as you will be taking a team of llama
   caregivers and training them up to full-scale wranglers.
   <p/>Must work well with animals and occasionally be prepared to run
   really, like really really fast.  Like REALLY fast.
   These are quick llamas.""",
   'requisition_id': 'senior_llama_wrangler',
   'application_info': {
       'uris': ['http://www.example.com/llama-wrangler-application'],
       'emails': ['llama-apply@example.com']
   }
}

try:
   # Nest that Job object in a "job" object.  Now it's an API request!
   request = {'job': new_job}

   # The actual API call happens here.
   result = client_service.projects().jobs().create(
       parent=project_id, body=request).execute()
   print('Job created: %s' % result)

except Error as e:
   print('Got exception while creating job')
   raise e

Cloud Shell에서 실행하면 방금 만든 작업으로 큰 JSON blob을 돌려받게 됩니다.

$ python create_job.py
Job created: {u'languageCode': u'en', u'description': u'Experienced Llama Wrangler required for full-time position. Leadership ability required, as you will be taking a team of llama caregivers and training them up to full-scale wranglers.Must work well with animals and occasionally be prepared to run really, like really really fast. Like REALLY fast. These are some quick llamas.', u'applicationInfo': {u'emails': [u'llama-apply@example.com'], u'uris': [u'http://www.example.com/llama-wrangler-application']}, u'companyName': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'requisitionId': u'senior_llama_wrangler', u'title': u'Senior Llama Wrangler', u'postingExpireTime': u'2019-09-11T16:04:48.546Z', u'visibility': u'ACCOUNT_ONLY', u'postingCreateTime': u'2019-08-12T16:04:48.546Z', u'companyDisplayName': u'Masked Panda Inc', u'postingUpdateTime': u'2019-08-12T16:04:48.611Z', u'postingPublishTime': u'2019-08-12T16:04:48.611Z', u'name': u'projects/[PROJECT_ID]/jobs/12345}

위와 같은 결과를 얻으면 작업이 성공적으로 생성된 것입니다.

작업은 고유해야 합니다.

실험으로 마지막 스크립트를 다시 실행하면 어떤 일이 일어나는지 확인할 수 있습니다.

$ python create_job.py
Got exception while creating job
Traceback (most recent call last):
  File "create_job.py", line 37, in <module>
    raise e
googleapiclient.errors.HttpError: <HttpError 409 when requesting https://jobs.googleapis.com/v3/projects/[PROJECT_ID]/jobs?alt=json returned "Job projects/[PROJECT_ID]/jobs/103672929591403206 already exists. Request ID for tracking: ec94f4cb-70f1-48cf-bae6-b4dad056ac3f:APAb7ITRlgTTpVMONSSBCG4LnFzqR765Eg==. Related Job requisition ID: senior_llama_wrangler.">

어떻게 된 것인가요? 중복된 구직 정보를 입력하려고 했습니다. 만료되지 않은 작업은 시스템에서 고유해야 합니다.

고유성은 다음 필드에 따라 결정됩니다.

  • 회사 이름 - 취업정보를 만들 때 필수이며 업데이트할 수 없습니다.
  • 요청 ID - 작업을 만들 때 필요하며 업데이트할 수 없습니다.
  • 언어 코드 - 선택사항, 기본값은 en_us, 업데이트 가능

생성 또는 업데이트하려는 작업에 이러한 필드 3개가 모두 만료되지 않은 기존 작업과 중복되는 경우, 이러한 작업은 중복으로 간주되어 위와 같은 오류 메시지와 함께 생성/업데이트 실패가 발생합니다.

축하합니다.

축하합니다. 이제 이 회사와 회사의 취업정보가 시스템에 추가되었습니다. 이 모든 과정이 1시간도 채 되지 않았습니다! 독자가 여기에 도달하기 위해 인터넷에서 최고의 채용 정보 사이트를 찾는 데 얼마나 걸렸는지 알 수 있나요? 1시간 이상 남았음 방법 등. 주 개월 이사회 회의. 스프레드시트와 사명 선언문이 포함되어 있을 수 있습니다. 사무실에서 진짜 정말 진짜인 것 같네요. 이것으로 무엇을 했는지 아시나요? 1시간 미만입니다. 잘하셨습니다!

그런데 더 많은 기능이 있습니다! 계속 진행하겠습니다.

작업 업데이트

회사와 마찬가지로 작업을 보고 가져오기하여 세부정보를 확인하고, 작업을 패치하여 업데이트할 수 있습니다.

여기에서 작업 세부정보를 확인할 수 있습니다. 아래 스니펫이 익숙해지면 이전 섹션에서 'get_company" 메서드를 가져와 "company"를 "job"로 교체하고 job_name 변수에 추가했습니다. 작업 정보를 먼저 확인해 보겠습니다.

update_job.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']

# The interesting bit
def get_job():
   try:
       job_existed = client_service.projects().jobs().get(
           name=job_name).execute()
       print('Job existed: %s' % job_existed)
       return job_existed
   except Error as e:
       print('Got exception while getting job')
       raise e

job_name = "projects/[PROJECT_ID]/jobs/12345"
job_info = get_job(job_name)

실제로 취업정보를 업데이트하기 위해 회사를 업데이트할 때와 동일한 옵션이 있습니다. 즉, 업데이트된 값을 포함하는 완전한 객체를 전송하여 기존 객체를 대체하거나, 작은 패치를 쉼표로 구분된 필드 마스크로 제출하는 것입니다.

update_job.py (전체 객체 교체로 업데이트)

   # First the full-replacement method.  Update the complete job object with new field values.
   job_patch = {
       'title': "Rogue Llama Acquisition Engineer"
   }

   job_info.update(job_patch)
   request = {"job": job_info}

   job_updated = client_service.projects().jobs().patch(
       name=job_name, body=request).execute()
   print ("Updated job info : %s" % job_updated)

update_job.py (새 필드 값 및 업데이트 마스크만 해당)

   # Alternatively, if you know which fields have been updated, you can submit a patch with just the changes
   # and an update mask. This time let's just re-use the same job patch, and create an update mask.
   job_patch = {
       'title': "Rogue Llama Acquisition Engineer"
   }

   update_mask = "title"
   request = {"job": job_patch,
              "updateMask": update_mask
              }

   job_updated = client_service.projects().jobs().patch(
       name=job_name, body=request).execute()

   print ("Updated job info : %s" % job_updated)   

위의 두 스니펫은 정확히 동일한 작업을 합니다. 직책 'Rogue Llama 획득 엔지니어'로 특정 채용 목록을 업데이트합니다. API를 호출하는 코드 줄도 동일합니다. 유일한 차이점은 요청 객체에 있습니다. 하나는 전체 작업 객체를 가지고 있으며, 이 객체를 작업 이름으로 대체합니다. 다른 하나는 업데이트할 필드 집합입니다.

어떤 실행을 선택하든 결과는 동일합니다. 도전해 보세요.

$ python update_job
Updated job info : {u'languageCode': u'en', u'description': u'Experienced Llama Wrangler required for full-time position. Leadership ability required, as you will be taking a team of llama caregivers and training them up to full-scale wranglers.Must work well with animals and occasionally be prepared to run really, like really really fast. Like REALLY fast. These are some quick llamas.', u'applicationInfo': {u'emails': [u'llama-apply@example.com'], u'uris': [u'http://www.example.com/llama-wrangler-application']}, u'companyName': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'derivedInfo': {u'jobCategories': [u'SCIENCE_AND_ENGINEERING']}, u'requisitionId': u'senior_llama_wrangler', u'title': u'Rogue Llama Acquisition Engineer', u'postingExpireTime': u'2019-09-11T16:04:48.546Z', u'visibility': u'ACCOUNT_ONLY', u'postingCreateTime': u'2019-08-12T16:04:48.546Z', u'companyDisplayName': u'Masked Panda Inc', u'postingUpdateTime': u'2019-08-12T19:28:41.850Z', u'postingPublishTime': u'2019-08-12T16:04:48.611Z', u'name': u'projects/[PROJECT_ID]/jobs/12345}

축하합니다. 4단계를 완료하셨습니다.

멋져요. 일종의 생산성 괴물과도 같습니다. 지금까지 회사를 만들고, 일자리를 만들고, 빠르게 업데이트할 수 있습니다. 그런데 이런 수업에서 특이한 점이 있다는 사실을 알고 계실지도 모릅니다. D를 C.R.U.D에 포함하는 마지막 작업. D를 삭제하려면 어떻게 해야 하나요? 독자, 걱정 마세요. 다음 섹션에서는 이를 자세히 다룹니다.

지금부터 5분 정도 이야기를 나누는 데 도움이 될 만한 이유들로 회사를 시작해 보세요.

회사 삭제

회사를 삭제하는 방법은 간단합니다. 회사를 만들거나 업데이트할 때 사용한 것과 동일한 import 문을 사용하면 삭제 메서드를 호출하여 회사 이름만 전달할 수 있습니다 (요청 본문은 필요하지 않음).

   # Yup, that's the whole thing.
   company_to_delete = "Insert company name here"
   result = client_service.projects().companies().delete(
       name=company_to_delete).execute()

이 API를 사용하는 동안 정리를 돕기 위해 회사 이름을 명령줄 매개변수로 사용하고 추측하여 회사를 삭제하는 간단한 Python 스크립트입니다.

delete_company.py

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')

# Name of the company to delete
company_to_delete = 'projects/[PROJECT_ID]/companies/123-abc-123'

try:
   # Yup, that's the whole thing.
   result_company = client_service.projects().companies().delete(
       name=company_to_delete).execute()

   print('Result of deleting company: %s' % result_company)

except Error as e:
   print('Got exception while deleting company')
   raise e

회사 이름을 단독 명령줄 인수로 전달하여 호출합니다.

$ python delete_company.py projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e
Got exception while deleting company
Traceback (most recent call last):
  File "delete_company.py", line 29, in <module>
    raise e
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://jobs.googleapis.com/v3/projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e?alt=json returned "Company with name projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e still has open jobs. Request ID for tracking: 6b9fe1a0-50ae-48b0-b33d-1622d547c363:APAb7ISnO4taWI4poffoX/EqzRCPSwpEbQ==">

이제 Cloud 함수가 완성되었네요. 잠시 기다려 주세요. 잠시만 기다려 주세요. 저게 뭔가요? 오류인가요? 아직도 일자리가 열려 있나요?

물론입니다. 이제 회사를 삭제하는 첫 번째 규칙을 알게 되었습니다. 해당 회사가 아직 채용 중인 경우 실패하게 됩니다. 어떻게 해야 할까요? 회사와 연결된 모든 채용 정보를 살펴보고 삭제해야 합니다.

지금 합리적으로 생각하는 점은 방금 만든 취업정보를 삭제하고 함께 일하는 회사를 삭제하는 것입니다. 합리적입니다. 그렇게 해 봅시다.

delete_company.py

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')

# Replace with your actual company and job names.
company_to_delete = 'projects/[PROJECT_ID]/companies/123-abc-123'
job_to_delete = 'projects/[PROJECT_ID]/jobs/12345'

try:
   result_job = client_service.projects().jobs().delete(
       name=job_to_delete).execute()

   result_company = client_service.projects().companies().delete(
       name=company_to_delete).execute()

   print('Result of deleting job: %s' % result_job)
   print('Result of deleting company: %s' % result_company)

except Error as e:
   print('Got exception while deleting company')
   raise e

이제 다시 실행해 보세요. 이러한 API 호출에서 반환되는 값은 현재 "회사" 및 "작업" 항목이어야 합니다. 즉,

python delete_company.py
Result of deleting job: {}
Result of deleting company: {}

아. 잘하셨습니다.

마지막으로 위의 해결책은 독자가

  • 이미 이 회사의 모든 기존 작업 이름을 알고 있습니다.
  • 회사에서 수동으로 작업을 처리하기에는 너무 많은 작업이 생성되었기 때문입니다.

사건을 사칭해 보세요.

지정된 프로젝트 ID와 모회사와 일치하는 취업정보를 반환하는 API 호출 jobs.list()가 있습니다. 메서드 호출 방법은 다음과 같습니다.

jobs_response = client_service.projects().jobs().list(
    parent=project_id,
    filter='companyName="' + company_name + '"').execute()
if jobs_response.get('jobs') is not None:
    for job in jobs_response.get('jobs'):
        print('- %s: %s' % (
              job.get('title'),
              job.get('name')))

이제 Google Cloud Talent Solutions Job Search API를 사용하여 회사 및 채용정보 목록을 만들고 관리할 수 있습니다.

학습한 내용

  • 회사 만들기 및 관리
  • 회사의 채용 정보 목록 만들기 및 관리
  • 사용자를 대신하여 API와 상호작용하도록 서비스 계정 설정

자세히 알아보기