

# Lambda Java 함수의 직렬화 사용자 지정
<a name="java-custom-serialization"></a>

Lambda [Java 관리형 런타임](lambda-java.md#java-runtimes)은 JSON 이벤트에 대한 사용자 지정 직렬화를 지원합니다. 사용자 지정 직렬화를 사용하면 코드를 단순화하고 잠재적으로 성능을 향상할 수 있습니다.

**Topics**
+ [사용자 지정 직렬화를 사용하는 경우](#custom-serialization-use-cases)
+ [사용자 지정 직렬화 구현](#implement-custom-serialization)
+ [사용자 지정 직렬화 테스트](#test-custom-serialization)

## 사용자 지정 직렬화를 사용하는 경우
<a name="custom-serialization-use-cases"></a>

Lambda 함수가 간접적으로 간접 호출되면 입력 이벤트 데이터를 Java 객체로 역직렬화해야 하며, 함수의 출력을 함수의 응답으로 반환할 수 있는 형식으로 다시 직렬화해야 합니다. Lambda Java 관리형 런타임은 Amazon API Gateway 및 Amazon Simple Queue Service(Amazon SQS)와 같은 다양한 AWS 서비스의 이벤트 페이로드를 처리하는 데 적합한 기본 직렬화 및 역직렬화 기능을 제공합니다. 함수에서 이러한 서비스 통합 이벤트로 작업하려면 프로젝트에 [aws-java-lambda-events](https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-events) 종속성을 추가합니다. 이 AWS 라이브러리에는 이러한 서비스 통합 이벤트를 나타내는 Java 객체가 포함되어 있습니다.

Lambda 함수에 전달하는 이벤트 JSON을 나타내기 위해 자체 객체를 사용할 수도 있습니다. 관리형 런타임은 기본 동작을 사용하여 JSON을 객체의 새 인스턴스로 직렬화하려고 시도합니다. 기본 직렬 변환기에 사용 사례에 대한 원하는 동작이 없는 경우 사용자 지정 직렬화를 사용하세요.

예를 들어 함수 핸들러가 다음 구조를 사용하여 `Vehicle` 클래스를 입력으로 예상한다고 가정해 보겠습니다.

```
public class Vehicle {
    private String vehicleType;
    private long vehicleId;
}
```

그러나 JSON 이벤트 페이로드는 다음과 같습니다.

```
{
    "vehicle-type": "car",
    "vehicleID": 123
}
```

이 시나리오에서 관리형 런타임의 기본 직렬화는 JSON 속성 이름이 카멜 대/소문자 Java 클래스 속성 이름(`vehicleType`, `vehicleId`)과 일치할 것으로 예상합니다. JSON 이벤트의 속성 이름(`vehicle-type`, `vehicleID`)이 카멜 대/소문자가 아니므로 사용자 지정 직렬화를 사용해야 합니다.

## 사용자 지정 직렬화 구현
<a name="implement-custom-serialization"></a>

[서비스 제공업체 인터페이스](https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html)를 사용하여 관리형 런타임의 기본 직렬화 논리 대신 선택한 직렬 변환기를 로드합니다. 표준 `RequestHandler` 인터페이스를 사용하여 JSON 이벤트 페이로드를 Java 객체로 직접 직렬화할 수 있습니다.

**Lambda Java 함수에서 사용자 지정 직렬화를 사용하려면**

1. [aws-lambda-java-core](https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core) 라이브러리를 종속성으로 추가합니다. 이 라이브러리에는 Lambda에서 Java로 작업하기 위한 다른 인터페이스 정의와 함께 [CustomPojoSerializer](https://github.com/aws/aws-lambda-java-libs/blob/main/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/CustomPojoSerializer.java) 인터페이스가 포함되어 있습니다.

1. 프로젝트의 `src/main/resources/META-INF/services/` 디렉터리에 `com.amazonaws.services.lambda.runtime.CustomPojoSerializer`라는 이름의 파일을 생성합니다.

1. 이 파일에서 `CustomPojoSerializer` 인터페이스를 구현해야 하는 사용자 지정 직렬 변환기 구현의 정규화된 이름을 지정합니다. 예시:

   ```
   com.mycompany.vehicles.CustomLambdaSerialzer
   ```

1. `CustomPojoSerializer` 인터페이스를 구현하여 사용자 지정 직렬화 논리를 제공합니다.

1. Lambda 함수에서 표준 `RequestHandler` 인터페이스를 사용합니다. 관리형 런타임은 사용자 지정 직렬 변환기를 사용합니다.

fastJson, Gson, Moshi, jackson-jr 등 널리 사용되는 라이브러리를 사용하여 사용자 지정 직렬화를 구현하는 방법에 대한 자세한 예제는 AWS GitHub 리포지토리에 있는 [사용자 지정 직렬화](https://github.com/aws/aws-lambda-java-libs/tree/main/samples/custom-serialization) 샘플을 참조하세요.

## 사용자 지정 직렬화 테스트
<a name="test-custom-serialization"></a>

함수를 테스트하여 직렬화 및 역직렬화 논리가 예상대로 작동하는지 확인합니다. AWS Serverless Application Model 명령줄 인터페이스(AWS SAM CLI)를 사용하여 Lambda 페이로드의 호출을 에뮬레이션할 수 있습니다. 이는 사용자 지정 직렬 변환기를 도입할 때 함수를 빠르게 테스트하고 반복하는 데 도움이 될 수 있습니다.

1. 함수를 간접 호출할 JSON 이벤트 페이로드가 포함된 파일을 생성한 다음 AWS SAM CLI로 간접 호출합니다.

1. [sam local 간접 호출](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-invoke.html ) 명령을 실행하여 함수를 로컬로 간접 호출합니다. 예시:

   ```
   sam local invoke -e src/test/resources/event.json
   ```

자세한 내용은 [Locally 간접 호출 Lambda functions with AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-using-invoke.html)을 참조하세요.