

# Java 애플리케이션에서 Amazon RDS Data API 직접 호출
<a name="data-api.calling.java"></a>

Java 애플리케이션에서 Amazon RDS Data API(Data API)를 직접적으로 호출할 수 있습니다.

다음 예제는 AWS SDK for Java를 사용합니다. 자세한 내용은 [AWS SDK for Java 개발자 안내서](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/welcome.html)를 참조하십시오.

각 예에서 DB 클러스터의 Amazon 리소스 이름(ARN)을 Aurora DB 클러스터의 ARN으로 바꿉니다. 또한 DB 클러스터에 대한 액세스를 허용하는 Secrets Manager의 보안 암호의 ARN으로 보안 암호 ARN을 바꿉니다.

**Topics**
+ [SQL 쿼리 실행](#data-api.calling.java.run-query)
+ [SQL 트랜잭션 실행](#data-api.calling.java.run-transaction)
+ [일괄 SQL 작업 실행](#data-api.calling.java.run-batch)

## SQL 쿼리 실행
<a name="data-api.calling.java.run-query"></a>

`SELECT` 문을 실행하고 Java 애플리케이션으로 결과를 가져올 수 있습니다.

다음 예는 SQL 쿼리를 실행합니다.

```
package com.amazonaws.rdsdata.examples;
	
	import com.amazonaws.services.rdsdata.AWSRDSData;
	import com.amazonaws.services.rdsdata.AWSRDSDataClient;
	import com.amazonaws.services.rdsdata.model.ExecuteStatementRequest;
	import com.amazonaws.services.rdsdata.model.ExecuteStatementResult;
	import com.amazonaws.services.rdsdata.model.Field;
	
	import java.util.List;
	
	public class FetchResultsExample {
	  public static final String RESOURCE_ARN = "{{arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster}}";
	  public static final String SECRET_ARN = "{{arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret}}";
	
	  public static void main(String[] args) {
	    AWSRDSData rdsData = AWSRDSDataClient.builder().build();
	
	    ExecuteStatementRequest request = new ExecuteStatementRequest()
	            .withResourceArn(RESOURCE_ARN)
	            .withSecretArn(SECRET_ARN)
	            .withDatabase("{{mydb}}")
	            .withSql("{{select * from mytable}}");
	
	    ExecuteStatementResult result = rdsData.executeStatement(request);
	
	    for (List<Field> fields: result.getRecords()) {
	      String stringValue = fields.get(0).getStringValue();
	      long numberValue = fields.get(1).getLongValue();
	
	      System.out.println(String.format("Fetched row: string = %s, number = %d", stringValue, numberValue));
	    }
	  }
	}
```

## SQL 트랜잭션 실행
<a name="data-api.calling.java.run-transaction"></a>

SQL 트랜잭션을 시작하고 하나 이상의 SQL 문을 실행한 다음, 변경 사항을 Java 애플리케이션으로 커밋할 수 있습니다.

**중요**  
3분 안에 트랜잭션 ID를 사용하는 호출이 없는 경우 트랜잭션 시간이 초과됩니다. 커밋되기 전에 트랜잭션 시간이 초과되면 자동으로 롤백됩니다.  
트랜잭션 ID를 지정하지 않으면 호출 결과가 자동으로 커밋됩니다.

다음 예는 SQL 트랜잭션을 실행합니다.

```
package com.amazonaws.rdsdata.examples;
	
	import com.amazonaws.services.rdsdata.AWSRDSData;
	import com.amazonaws.services.rdsdata.AWSRDSDataClient;
	import com.amazonaws.services.rdsdata.model.BeginTransactionRequest;
	import com.amazonaws.services.rdsdata.model.BeginTransactionResult;
	import com.amazonaws.services.rdsdata.model.CommitTransactionRequest;
	import com.amazonaws.services.rdsdata.model.ExecuteStatementRequest;
	
	public class TransactionExample {
	  public static final String RESOURCE_ARN = "{{arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster}}";
	  public static final String SECRET_ARN = "{{arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret}}";
	
	  public static void main(String[] args) {
	    AWSRDSData rdsData = AWSRDSDataClient.builder().build();
	
	    BeginTransactionRequest beginTransactionRequest = new BeginTransactionRequest()
	            .withResourceArn(RESOURCE_ARN)
	            .withSecretArn(SECRET_ARN)
	            .withDatabase("{{mydb}}");
	    BeginTransactionResult beginTransactionResult = rdsData.beginTransaction(beginTransactionRequest);
	    String transactionId = beginTransactionResult.getTransactionId();
	
	    ExecuteStatementRequest executeStatementRequest = new ExecuteStatementRequest()
	            .withTransactionId(transactionId)
	            .withResourceArn(RESOURCE_ARN)
	            .withSecretArn(SECRET_ARN)
	            .withSql("{{INSERT INTO test_table VALUES ('hello world!')}}");
	    rdsData.executeStatement(executeStatementRequest);
	
	    CommitTransactionRequest commitTransactionRequest = new CommitTransactionRequest()
	            .withTransactionId(transactionId)
	            .withResourceArn(RESOURCE_ARN)
	            .withSecretArn(SECRET_ARN);
	    rdsData.commitTransaction(commitTransactionRequest);
	  }
	}
```

**참고**  
데이터 정의 언어(DDL) 문을 실행하는 경우 호출 시간이 초과된 후에도 문을 계속 실행하는 것이 좋습니다. DDL 문 실행이 끝나기 전에 종료되면 오류가 발생하고 데이터 구조가 손상될 수 있습니다. 호출이 RDS 데이터 API 시간 초과 간격인 45초를 초과한 후에도 문을 계속 실행하려면 `continueAfterTimeout` 파라미터를 `true`로 설정합니다.

## 일괄 SQL 작업 실행
<a name="data-api.calling.java.run-batch"></a>

Java 애플리케이션을 사용하여 데이터 배열에 대해 대량 삽입 및 업데이트 작업을 실행할 수 있습니다. 파라미터 세트의 배열을 사용하여 DML 문을 실행할 수 있습니다.

**중요**  
트랜잭션 ID를 지정하지 않으면 호출 결과가 자동으로 커밋됩니다.

다음 예제에서는 대량 삽입 작업을 실행합니다.

```
package com.amazonaws.rdsdata.examples;
	
	import com.amazonaws.services.rdsdata.AWSRDSData;
	import com.amazonaws.services.rdsdata.AWSRDSDataClient;
	import com.amazonaws.services.rdsdata.model.BatchExecuteStatementRequest;
	import com.amazonaws.services.rdsdata.model.Field;
	import com.amazonaws.services.rdsdata.model.SqlParameter;
	
	import java.util.Arrays;
	
	public class BatchExecuteExample {
	  public static final String RESOURCE_ARN = "{{arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster}}";
	  public static final String SECRET_ARN = "{{arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret}}";
	
	  public static void main(String[] args) {
	      AWSRDSData rdsData = AWSRDSDataClient.builder().build();
	
	    BatchExecuteStatementRequest request = new BatchExecuteStatementRequest()
	            .withDatabase("test")
	            .withResourceArn(RESOURCE_ARN)
	            .withSecretArn(SECRET_ARN)
	            .withSql("INSERT INTO test_table2 VALUES (:string, :number)")
	            .withParameterSets(Arrays.asList(
	                    Arrays.asList(
	                            new SqlParameter().withName("string").withValue(new Field().withStringValue("Hello")),
	                            new SqlParameter().withName("number").withValue(new Field().withLongValue(1L))
	                    ),
	                    Arrays.asList(
	                            new SqlParameter().withName("string").withValue(new Field().withStringValue("World")),
	                            new SqlParameter().withName("number").withValue(new Field().withLongValue(2L))
	                    )
	            ));
	
	    rdsData.batchExecuteStatement(request);
	  }
	}
```