애매한 잡학사전

AWS Personalize putUsers 처리 Importing users incrementally 본문

DEV/JAVA

AWS Personalize putUsers 처리 Importing users incrementally

거대한 개발자 2021. 10. 26. 20:45
반응형

1. 개요

회사 프로젝트로 개인별 맞춤 추천 기능을 도입하기 위해서 AWS Personalize를 이용하기로 하였습니다.

AWS Personalize 세팅은 다른 직원이 담당하여 별도의 공부가 필요할 것 같아 일단 API를 보고 구현한 내용을 위주로 putItems, putEvents, getRecs를 정리해서 포스팅할 예정입니다. 

 

- AWS Personalize put users는 AWS 저장소 만들어져 있는 사용자의 집합(dataset)에 1명 또는 여러명의 사용자 정보를 저장하는 것을 지원하기 위한 API 입니다.

 

2. 소스

    2-1. Credentials 생성

    - AWS Personalize 생성 시 AWS에서 제공받은 accessKeyId와 secretAccessKey를

     이용하여 AwsBasicCredentials을 생성할 수 있게 method를 미리 구현합니다.

    private AwsBasicCredentials getAwsBasicCredentials() {
        final String awsAccessKeyId = '사용자 accessKeyId';
        final String awsSecretAccessKey = '사용자 secretAccessKey';
        return AwsBasicCredentials.create(awsAccessKeyId, awsSecretAccessKey);
    }

    

    2-2. Client 생성

    - StaticCredentialsProvider를 이용해서 위에서 생성한 basicCredentials method를 호출하고 

      credentilas을 Client에 포함시킬 수 있게 하고, AWS를 생성한 region을 포함시켜서 getEventClient method를 

      호출할 때마다 client를 build 할 수 있게 method를 구현합니다.

public PersonalizeEventsClient getEventClient() {
    return PersonalizeEventsClient.builder()
            .credentialsProvider(StaticCredentialsProvider.create(getAwsBasicCredentials()))
            .region(Region.AP_NORTHEAST_2)
            .build();
}

    

    2-3. putUsers Method 생성

    - AWS Personalize API 에는 최대 10명의 User까지 받을 수 있다고 되어 있지만 

     우리가 필요한 User의 수는 1명이라 아래와 같이 구현을 했지만 복수의 User를 입력받아야 한다면 

     User user = User.builder().userId().build(); 부분을 For문으로 처리해도 됩니다.

    - 필수 값인 userId, datasetArn 그리고 옵션인 properties는 호출하는 method에서 parameter로 받을 예정이기 

      때문에 Map<String, String> 으로 구현합니다.

    - 나머지 putUsersRequest, putUsers 부분은 AWS Personalize API에 있는 그대로 구현합니다.

    - 마지막 personalizeEventsClient.close 부분은 API에 없어서 그냥 안 해도 된다고 생각하고 생략 후

      실제 운영서버에서 동작시켜 봤는데 점점 이 Client 때문에 메모리 full 이 발생해서 close 처리를 구현합니다.

public int putUsers(PersonalizeEventsClient personalizeEventsClient, Map<String, String> paramMap) 
  	throws PersonalizeEventsException {

  ArrayList<User> users = new ArrayList<>();

  User user = User.builder().userId(paramMap.get("userId")).properties(paramMap.get("properties"))
  	.build();

  users.add(user);

  PutUsersRequest putUsersRequest = PutUsersRequest.builder()
  	.datasetArn(paramMap.get("datasetArn"))
  	.users(users)
  	.build();

  int statusCode = personalizeEventsClient.putUsers(putUsersRequest)
  	.sdkHttpResponse().statusCode();

  // client close 처리
  personalizeEventsClient.close();

  return statusCode;
}

    

    2-4. putUsers 호출 Method 생성

    - 필수인 datasetArn, userId 값을 paramMap에 넣고, 옵션으로 설정한 key에 해당하는 값들은 json string으로 

      입력을 해야 하기 때문에 JSON object와 JSON Array에 넣고 properties라는 key로 paramMap에 저장합니다.

    - 위에서 구현해 놓았던 client와 paramMap 값을 parameter로 putUsers method를 호출하면 처리 결과 코드가 

      리턴 되게 구현합니다.

public static void main(String... args) {
        
  AwsPersonalizeUtil awsPersonalizeUtil = new AwsPersonalizeUtil();

  try {
    Map<String, String> paramMap = new HashMap<>();

    JSONArray propertiesArr = new JSONArray();
    JSONObject propertiesObj = new JSONObject();

    paramMap.put("datasetArn", "AWS 사용자 datasetArn");
    paramMap.put("userId", "유저 id");

    propertiesObj.put("properties option 1", "옵션 값 입력");
    propertiesObj.put("properties option 2", "옵션 값 입력");

    propertiesArr.add(propertiesObj);

    paramMap.put("properties", String.valueOf(propertiesArr.get(0)));

    int resultCode = awsPersonalizeUtil.putUsers(awsPersonalizeUtil.getEventClient(), paramMap);

    System.out.println("AWS Personalize USER putUsers response Code = " + resultCode);

  } catch (PersonalizeEventsException pee) {
  	System.out.println("PersonalizeEventsException - " + pee.awsErrorDetails().errorMessage());
  } catch (AwsServiceException ae) {
  	System.out.println("AwsServiceException - " + ae.awsErrorDetails().errorMessage());
  } catch (Exception ex) {
  	System.out.println("AwsPersonalizeUtil.awsPersonalizeProcess - Exception : " + ex.getMessage());
  }

}

 

3. 마치며...

AWS API 문서에 나와 있는 내용을 나름 고민해서 구현한 부분이라 다시 한번 정리하여 내 것으로 만들고자 블로그에 

포스팅을 진행하였습니다. 아직 putItems, putEvents, getRecs와 필요한 라이브러리 파일까지 정리해야 할 내용이 많이 있기 때문에 빠른 시일 내에 추가적으로 포스팅하도록 하겠습니다. 

 

혹시 더 좋은 방법이나 잘못된 내용이 있으면 가차 없이 지적해 주시면 감사하겠습니다. 

 

 

#참고자료

AWS Personalize putUsers API : https://docs.aws.amazon.com/personalize/latest/dg/importing-users.html

Comments