본문 바로가기

Spring Boot

[Spring Boot] REST API 결과 AWS S3에 저장하기

AwsS3.java

package com.example.demo;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CopyObjectRequest;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;

import org.springframework.stereotype.Service;

@Service
public class AwsS3 {

    //Amazon-s3-sdk 
    private AmazonS3 s3Client;
    final private String accessKey = "AKIXXXXXXXXXXXXXXXXX"; //"IAM에서 발급받은 accessKey"
    final private String secretKey = "p4MHrXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // "IAM에서 발급받은 secretKey"
    private Regions clientRegion = Regions.AP_NORTHEAST_2; // region
    private String bucket = "sample-pslab-bucket";

    private AwsS3() {
        createS3Client();
    }

    //singleton pattern
    static private AwsS3 instance = null;
    
    public static AwsS3 getInstance() {
        if (instance == null) {
            return new AwsS3();
        } else {
            return instance;
        }
    }

    //aws S3 client 생성
    private void createS3Client() {

        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        this.s3Client = AmazonS3ClientBuilder
                .standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(clientRegion)
                .build();
    }
    
    public void uploadContents(String contents , String s3Path) {
    	try
        {
            byte[] contentAsBytes = contents.getBytes("UTF-8");
            ByteArrayInputStream    contentsAsStream      = new ByteArrayInputStream(contentAsBytes);
            ObjectMetadata  md = new ObjectMetadata();
            md.setContentLength(contentAsBytes.length);
            this.s3Client.putObject(new PutObjectRequest(this.bucket, s3Path, contentsAsStream, md));
        }
        catch(AmazonServiceException e)
        {
        	 e.printStackTrace();
        }
        catch(Exception ex)
        {
        	 ex.printStackTrace();
        }
    }
}

OkHttpSample.java(동기)

package com.example.demo;

import org.springframework.stereotype.Service;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;

@Service
public class OkHttpSample {
	
	// get TEST
	public String callGET(){
		System.out.println("[callGET]");
		String responseString = null;
		
		try { 
			// 인스턴스 생성
			OkHttpClient client = new OkHttpClient();
			// URL
			String strURL = "https://dummy.restapiexample.com/api/v1/employees";
			// GET요청을 위한 build 작업.
			Request.Builder builder = new Request.Builder().url(strURL).get();
			// json을 주고받는 경우, 헤더에 추가.
			builder.addHeader("Content-type", "application/json");
			// request 객체 생성.
			Request request = builder.build();
			// request를 요청하고 그 결과를 response 객체로 응답 받음.
			Response response = client.newCall(request).execute();
			// 응답처리
			if (response.isSuccessful()) {
				ResponseBody body = response.body();
				responseString = body.string();
				System.out.println("[callGET responseBody]:" + responseString);
				body.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return responseString;
	}
	
	// post TEST
	public String callPOST() {
		System.out.println("[callPOST]");
		String responseString = null;
		try {
			// 인스턴스를 생성.
			OkHttpClient client = new OkHttpClient();
			// URL
			String strURL = "https://dummy.restapiexample.com/api/v1/create";
			// parameter를 JSON object로 전달
			String strBody = "{\"name\":\"test\",\"salary\":\"123\",\"age\":\"23\"}";

			// POST요청을 위한 request body를 구성.
			RequestBody requestBody = RequestBody.Companion.create(strBody, MediaType.get("application/json; charset=utf-8"));
			
			// POST요청을 위한 build작업
			Request.Builder builder = new Request.Builder().url(strURL).post(requestBody);
			// json을 주고받는 경우, 헤더에 추가
			builder.addHeader("Content-type", "application/json");
			// request 객체를 생성
			Request request = builder.build();
			// request를 요청하고 그 결과를 response 객체로 응답을 받음.
			Response response = client.newCall(request).execute();
			// 응답처리
			if (response.isSuccessful()) {
				ResponseBody body = response.body();
				responseString = body.string();
				System.out.println("[callPOST responseBody]:" + responseString);
				body.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return responseString;
	}
}

DemoApplication.java (@SpringBootApplication)

package com.example.demo;

import java.io.File;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner{
	
	@Autowired
	private AwsS3 awsS3;
	
	@Autowired
	private OkHttpSample okHttpSample;
	
	@Autowired
	private OkHttpAsyncSample okHttpAsyncSample;
 
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
	
	@Override
	public void run(String... args) throws Exception {
		okHttpsTest();
	}
	
	public void okHttpsTest() {
		String getResponseString = okHttpSample.callGET();
		s3ContentsUploadTest(getResponseString , "getTest");
		
		String postResponseString = okHttpSample.callPOST();
		s3ContentsUploadTest(postResponseString , "postTest");
	}
	
	public void s3ContentsUploadTest(String contents , String fileName) {
		
        String s3Path = "javatest/"+fileName; // S3에 저장될 경로 및 파일 이름
        awsS3.uploadContents(contents, s3Path);
		
	}

}

테스트 결과

 

[참고]

How to write a string to Amazon S3 bucket

'Spring Boot' 카테고리의 다른 글

[Spring Boot] Lombok 오류  (0) 2022.08.31
[Spring Boot] OkHttp REST Client  (0) 2022.07.11
[Spring Boot] AWS S3에 파일 업로드,복사,삭제하기  (0) 2022.07.11