일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 자바
- #jQuery
- AWS Glue
- function
- naver smartEditor
- 아이비시트
- 환경 구성
- aws lambda
- AWS Athena
- AWS SQS
- db
- 로그 데이터
- 카이호스트만
- 환경구성
- AWS
- athena
- Java
- intellij
- s3
- Study
- jQuery
- java8
- Log
- aws S3
- 인텔리J
- 자바8
- 자바스크립트
- ibsheet
- Git
- JavaScript
- Today
- Total
애매한 잡학사전
AWS Personalize putUsers 처리 Importing users incrementally 본문
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
'DEV > JAVA' 카테고리의 다른 글
[자바8] 람다 표현식 - 2장 (0) | 2022.02.15 |
---|---|
[자바8] 람다 표현식 - 1장 (0) | 2022.02.13 |
[자바8] 인터페이스 java 8 interface - 2장 (0) | 2022.01.27 |
[자바8] 인터페이스 java 8 interface - 1장 (0) | 2022.01.24 |
Java8 Portable version 만들기 (6) | 2017.12.03 |