👉 프로젝트 내부에서 S3랑 통신을 할려면?

키를 담을 객체를 만들고 ⇒
AwsProperties
경로 데이터를 들고있는 객체를 만들고 ⇒ putObjectRequest
AWS 라이브러리의 C3Client
객체를 이용하여 두 객체를 담아서
요청하면된다. 👉 AwsProperties 생성

_core >> 내부 폴더에
AwsProperties
클래스를 생성한다. 🔹 변수 사용 정리

요런 느낌으로 변수를 끌어와서 사용할 것이다.
code는 yml변수를
@Value
로 끌어오고
yml은 env 변수를 ${변수}
로 끌어오고
env에 내가 원하는 변수를 등록한다.
이렇게 env에 환경변수를 등록한다

yml에서 env변수를 끌어오려면
이렇게 import를 해야한다.
spring: # .env import config: import: optional:file:.env[.properties]
요렇게 먼저 세팅하면 사용할 수 있다.

그리고 깃에는 민감한 정보를 푸시할 수 없게 정책을 만들어 놓았다.
그래서 env같이 시크릿키가 담긴 파일을 깃 푸시를 할려면
해당 파일을 제외해야 되는데, 그러기 위해서는
.gitginore에 .env를 등록하면 된다.
그럼 push 할때 .env가 제외가 된다.
🔹 AwsProperties 정의
package com.project.videodemo._core; import lombok.Data; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Data @Configuration @ConfigurationProperties(prefix = "aws") public class AwsProperties { private Credentials credentials; private String region; private String bucket; @Data public static class Credentials { private String accessKey; private String secretKey; } }
아까 명시했던
액세스 키
/ 시크릿 키
/ 버킷 이름
/ 리전 이름
을 담을 객체라고 보면 된다. 여기서 특이한 것은
@ConfigurationProperties(prefix = “aws”)
인데
이 설정으로 yml내부의 변수를 호출 할 수 있다. 
prefix = “aws”
의 의미는
yml 내부 aws 항목 내부를 의미하고
JSON데이터의 형태처럼 정의를 해주면 바인딩이 된다. 

요런 느낌으로
이렇게 yml의 값이 코드로 바인딩이 되었지만,
그전에 yml이 변수로
${}
문법으로 끌어오고 있는 것이 보이는데
이것은 .env를 이용해서 환경변수를 yml로 끌어 온 것인다. 👉 AwsConfig 생성
package com.project.videodemo._core; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; @Configuration public class AwsConfig { @Bean public S3Client s3Client(AwsProperties awsProperties) { AwsBasicCredentials awsCreds = AwsBasicCredentials.create( awsProperties.getCredentials().getAccessKey(), awsProperties.getCredentials().getSecretKey() ); return S3Client.builder() .region(Region.of(awsProperties.getRegion())) .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) .build(); } }
AWS config 전체 코드
_core
폴더 내부에 생성한다. 🔹 AwsBaisCredentials ( 라이브러리 객체)

내가 정의한 AwsProperties 객체의
액세스키와 시크릿키를
자바 라이브러리 객체인 AwsBasicCredentials에 할당한다.
🔹 S3Client

S3Client를 생성할 때
리전 정보랑 AwsBasicCredentials를 사용하여 credentialProvide에 할당한다.
👉 s3 업로드 핵심로직

videoService에 의존성 주입으로
S3Client와 AwsProperties를 주입한다.
🔹 uploadToS3 로직
// S3로 업로드 하는 로직 public void uploadToS3(Path directoryPath, String baseFileName) throws IOException { try (Stream<Path> paths = Files.walk(directoryPath)) { List<Path> filesToUpload = paths.filter(Files::isRegularFile).collect(Collectors.toList()); for (Path fileToUpload : filesToUpload) { String s3Key = "videolocation/" + baseFileName + "/" + fileToUpload.getFileName().toString(); s3.putObject( PutObjectRequest.builder() .bucket(awsProperties.getBucket()) .key(s3Key) .build(), software.amazon.awssdk.core.sync.RequestBody.fromFile(fileToUpload) ); } } }
videoService.uploadToS3
의 로직인데
결국 S3Client s3
의 객체에 putObjectRequest로
경로와 요청데이터를 담아서 보내면 된다. 👉 파일 삭제
// 업로드후 파일삭제 @Transactional public void deleteLocalFiles(Path directoryPath) { try (Stream<Path> paths = Files.walk(directoryPath)) { paths.sorted(Comparator.reverseOrder()) .map(Path::toFile) .forEach(File::delete); } catch (IOException e) { // 로깅 또는 에러 처리 로직 추가 가능 System.err.println("Failed to delete files: " + e.getMessage()); } }
업로드가 마무리 되었으면 인코딩 서버 내에서는 해당 파일을 삭제하여서
서버를 가볍게 유지한다.
👉 프로젝트 내부에서 S3랑 통신을 할려면?

키를 담을 객체를 만들고 ⇒
AwsProperties
경로 데이터를 들고있는 객체를 만들고 ⇒ putObjectRequest
AWS 라이브러리의 C3Client
객체를 이용하여 두 객체를 담아서
요청하면된다. 👉 AwsProperties 생성

_core >> 내부 폴더에
AwsProperties
클래스를 생성한다. 🔹 변수 사용 정리

요런 느낌으로 변수를 끌어와서 사용할 것이다.
code는 yml변수를
@Value
로 끌어오고
yml은 env 변수를 ${변수}
로 끌어오고
env에 내가 원하는 변수를 등록한다.
이렇게 env에 환경변수를 등록한다

yml에서 env변수를 끌어오려면
이렇게 import를 해야한다.
spring: # .env import config: import: optional:file:.env[.properties]
요렇게 먼저 세팅하면 사용할 수 있다.

그리고 깃에는 민감한 정보를 푸시할 수 없게 정책을 만들어 놓았다.
그래서 env같이 시크릿키가 담긴 파일을 깃 푸시를 할려면
해당 파일을 제외해야 되는데, 그러기 위해서는
.gitginore에 .env를 등록하면 된다.
그럼 push 할때 .env가 제외가 된다.
🔹 AwsProperties 정의
package com.project.videodemo._core; import lombok.Data; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Data @Configuration @ConfigurationProperties(prefix = "aws") public class AwsProperties { private Credentials credentials; private String region; private String bucket; @Data public static class Credentials { private String accessKey; private String secretKey; } }
아까 명시했던
액세스 키
/ 시크릿 키
/ 버킷 이름
/ 리전 이름
을 담을 객체라고 보면 된다. 여기서 특이한 것은
@ConfigurationProperties(prefix = “aws”)
인데
이 설정으로 yml내부의 변수를 호출 할 수 있다. 
prefix = “aws”
의 의미는
yml 내부 aws 항목 내부를 의미하고
JSON데이터의 형태처럼 정의를 해주면 바인딩이 된다. 

요런 느낌으로
이렇게 yml의 값이 코드로 바인딩이 되었지만,
그전에 yml이 변수로
${}
문법으로 끌어오고 있는 것이 보이는데
이것은 .env를 이용해서 환경변수를 yml로 끌어 온 것인다. 👉 AwsConfig 생성
package com.project.videodemo._core; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; @Configuration public class AwsConfig { @Bean public S3Client s3Client(AwsProperties awsProperties) { AwsBasicCredentials awsCreds = AwsBasicCredentials.create( awsProperties.getCredentials().getAccessKey(), awsProperties.getCredentials().getSecretKey() ); return S3Client.builder() .region(Region.of(awsProperties.getRegion())) .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) .build(); } }
AWS config 전체 코드
_core
폴더 내부에 생성한다. 🔹 AwsBaisCredentials ( 라이브러리 객체)

내가 정의한 AwsProperties 객체의
액세스키와 시크릿키를
자바 라이브러리 객체인 AwsBasicCredentials에 할당한다.
🔹 S3Client

S3Client를 생성할 때
리전 정보랑 AwsBasicCredentials를 사용하여 credentialProvide에 할당한다.
👉 s3 업로드 핵심로직

videoService에 의존성 주입으로
S3Client와 AwsProperties를 주입한다.
🔹 uploadToS3 로직
// S3로 업로드 하는 로직 public void uploadToS3(Path directoryPath, String baseFileName) throws IOException { try (Stream<Path> paths = Files.walk(directoryPath)) { List<Path> filesToUpload = paths.filter(Files::isRegularFile).collect(Collectors.toList()); for (Path fileToUpload : filesToUpload) { String s3Key = "videolocation/" + baseFileName + "/" + fileToUpload.getFileName().toString(); s3.putObject( PutObjectRequest.builder() .bucket(awsProperties.getBucket()) .key(s3Key) .build(), software.amazon.awssdk.core.sync.RequestBody.fromFile(fileToUpload) ); } } }
videoService.uploadToS3
의 로직인데
결국 S3Client s3
의 객체에 putObjectRequest로
경로와 요청데이터를 담아서 보내면 된다. 👉 파일 삭제
// 업로드후 파일삭제 @Transactional public void deleteLocalFiles(Path directoryPath) { try (Stream<Path> paths = Files.walk(directoryPath)) { paths.sorted(Comparator.reverseOrder()) .map(Path::toFile) .forEach(File::delete); } catch (IOException e) { // 로깅 또는 에러 처리 로직 추가 가능 System.err.println("Failed to delete files: " + e.getMessage()); } }
업로드가 마무리 되었으면 인코딩 서버 내에서는 해당 파일을 삭제하여서
서버를 가볍게 유지한다.