From 94d0ee92fe2df3657b0dcb32ff6810ff12320ddc Mon Sep 17 00:00:00 2001 From: kmebin Date: Fri, 1 Sep 2023 14:50:01 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[JT-47]=20feat:=20S3=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=97=85=EB=A1=9C=EB=8D=94=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - application.yml s3 profile 분리 --- .gitignore | 3 ++ build.gradle | 3 ++ .../com/devtoon/jtoon/JToonApplication.java | 1 + .../jtoon/webtoon/UploadController.java | 26 +++++++++++++ .../src/main/resources/application.yml | 3 ++ module-domain-s3/build.gradle | 3 ++ .../java/com/devtoon/jtoon/S3Uploader.java | 37 +++++++++++++++++++ .../com/devtoon/jtoon/config/S3Config.java | 34 +++++++++++++++++ 8 files changed, 110 insertions(+) create mode 100644 module-application/src/main/java/com/devtoon/jtoon/webtoon/UploadController.java create mode 100644 module-application/src/main/resources/application.yml create mode 100644 module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java create mode 100644 module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java diff --git a/.gitignore b/.gitignore index f97035e3..9dcfeb9c 100644 --- a/.gitignore +++ b/.gitignore @@ -118,4 +118,7 @@ gradle-app.setting # Java heap dump *.hprof +application-*.yml +!application.yml + # End of https://www.toptal.com/developers/gitignore/api/gradle diff --git a/build.gradle b/build.gradle index b9c11bc4..278e5496 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,8 @@ subprojects { } dependencies { + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' } test { @@ -39,6 +41,7 @@ subprojects { project(':module-application') { dependencies { implementation project(':module-core') + implementation project(':module-domain-s3') } } diff --git a/module-application/src/main/java/com/devtoon/jtoon/JToonApplication.java b/module-application/src/main/java/com/devtoon/jtoon/JToonApplication.java index 5af162b1..4e055826 100644 --- a/module-application/src/main/java/com/devtoon/jtoon/JToonApplication.java +++ b/module-application/src/main/java/com/devtoon/jtoon/JToonApplication.java @@ -5,6 +5,7 @@ @SpringBootApplication public class JToonApplication { + public static void main(String[] args) { SpringApplication.run(JToonApplication.class, args); } diff --git a/module-application/src/main/java/com/devtoon/jtoon/webtoon/UploadController.java b/module-application/src/main/java/com/devtoon/jtoon/webtoon/UploadController.java new file mode 100644 index 00000000..14adbd2f --- /dev/null +++ b/module-application/src/main/java/com/devtoon/jtoon/webtoon/UploadController.java @@ -0,0 +1,26 @@ +package com.devtoon.jtoon.webtoon; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.devtoon.jtoon.S3Uploader; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class UploadController { + + private final S3Uploader s3Uploader; + + @PostMapping("/") + public void test( + @RequestPart(required = false, value = "image") MultipartFile[] files + ) { + for (MultipartFile file : files) { + s3Uploader.upload("images", file); + } + } +} diff --git a/module-application/src/main/resources/application.yml b/module-application/src/main/resources/application.yml new file mode 100644 index 00000000..ee283d7a --- /dev/null +++ b/module-application/src/main/resources/application.yml @@ -0,0 +1,3 @@ +spring: + profiles: + include: s3 diff --git a/module-domain-s3/build.gradle b/module-domain-s3/build.gradle index 7d82dc72..e9493c59 100644 --- a/module-domain-s3/build.gradle +++ b/module-domain-s3/build.gradle @@ -1,2 +1,5 @@ dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.0.2") + implementation 'io.awspring.cloud:spring-cloud-aws-starter-s3' } diff --git a/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java b/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java new file mode 100644 index 00000000..1b5f519c --- /dev/null +++ b/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java @@ -0,0 +1,37 @@ +package com.devtoon.jtoon; + +import java.io.IOException; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import io.awspring.cloud.s3.ObjectMetadata; +import io.awspring.cloud.s3.S3Template; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class S3Uploader { + + private final S3Template s3Template; + + @Value("${cloud.aws.s3.bucket}") + private String bucket; + + public void upload(String directory, MultipartFile file) { + String key = directory + "/" + UUID.randomUUID(); + + try { + s3Template.upload( + bucket, + key, + file.getInputStream(), + ObjectMetadata.builder().contentType("multipart/form-data").build() + ); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java b/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java new file mode 100644 index 00000000..be7a5011 --- /dev/null +++ b/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java @@ -0,0 +1,34 @@ +package com.devtoon.jtoon.config; + +import org.springframework.beans.factory.annotation.Value; +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.AwsCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; + +@Configuration +public class S3Config { + + @Value("${cloud.aws.credentials.access-key}") + private String accessKeyId; + + @Value("${cloud.aws.credentials.secret-key}") + private String secretAccessKey; + + @Value("${cloud.aws.region.static}") + private String region; + + @Bean + public S3Client s3Client() { + AwsCredentials credentials = AwsBasicCredentials.create(accessKeyId, secretAccessKey); + + return S3Client.builder() + .credentialsProvider(StaticCredentialsProvider.create(credentials)) + .region(Region.of(region)) + .build(); + } +} From b3ed14073a722cf1e77cc76b5190be51ea6339bc Mon Sep 17 00:00:00 2001 From: kmebin Date: Fri, 1 Sep 2023 16:53:17 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[JT-47]=20chore:=20=ED=99=98=EA=B2=BD=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=AA=85=20=EB=8C=80=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/devtoon/jtoon/S3Uploader.java | 4 ++-- .../main/java/com/devtoon/jtoon/config/S3Config.java | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java b/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java index 1b5f519c..dadfb757 100644 --- a/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java +++ b/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java @@ -18,14 +18,14 @@ public class S3Uploader { private final S3Template s3Template; @Value("${cloud.aws.s3.bucket}") - private String bucket; + private String BUCKET; public void upload(String directory, MultipartFile file) { String key = directory + "/" + UUID.randomUUID(); try { s3Template.upload( - bucket, + BUCKET, key, file.getInputStream(), ObjectMetadata.builder().contentType("multipart/form-data").build() diff --git a/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java b/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java index be7a5011..fe909ad8 100644 --- a/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java +++ b/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java @@ -14,21 +14,21 @@ public class S3Config { @Value("${cloud.aws.credentials.access-key}") - private String accessKeyId; + private String ACCESS_KEY_ID; @Value("${cloud.aws.credentials.secret-key}") - private String secretAccessKey; + private String SECRET_ACCESS_KEY; @Value("${cloud.aws.region.static}") - private String region; + private String REGION; @Bean public S3Client s3Client() { - AwsCredentials credentials = AwsBasicCredentials.create(accessKeyId, secretAccessKey); + AwsCredentials credentials = AwsBasicCredentials.create(ACCESS_KEY_ID, SECRET_ACCESS_KEY); return S3Client.builder() .credentialsProvider(StaticCredentialsProvider.create(credentials)) - .region(Region.of(region)) + .region(Region.of(REGION)) .build(); } } From 917f7ef80981cbed8a5f56fb5684e6e69be60e92 Mon Sep 17 00:00:00 2001 From: kmebin Date: Fri, 1 Sep 2023 17:13:42 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[JT-47]=20chore:=20File.separator=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - application-s3.yml 설정 수정 --- .../src/main/java/com/devtoon/jtoon/S3Uploader.java | 5 +++-- .../src/main/java/com/devtoon/jtoon/config/S3Config.java | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java b/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java index dadfb757..e9625907 100644 --- a/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java +++ b/module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java @@ -1,5 +1,6 @@ package com.devtoon.jtoon; +import java.io.File; import java.io.IOException; import java.util.UUID; @@ -17,11 +18,11 @@ public class S3Uploader { private final S3Template s3Template; - @Value("${cloud.aws.s3.bucket}") + @Value("${spring.cloud.aws.s3.bucket}") private String BUCKET; public void upload(String directory, MultipartFile file) { - String key = directory + "/" + UUID.randomUUID(); + String key = directory + File.separator + UUID.randomUUID(); try { s3Template.upload( diff --git a/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java b/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java index fe909ad8..58f19306 100644 --- a/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java +++ b/module-domain-s3/src/main/java/com/devtoon/jtoon/config/S3Config.java @@ -13,13 +13,13 @@ @Configuration public class S3Config { - @Value("${cloud.aws.credentials.access-key}") + @Value("${spring.cloud.aws.credentials.access-key}") private String ACCESS_KEY_ID; - @Value("${cloud.aws.credentials.secret-key}") + @Value("${spring.cloud.aws.credentials.secret-key}") private String SECRET_ACCESS_KEY; - @Value("${cloud.aws.region.static}") + @Value("${spring.cloud.aws.region.static}") private String REGION; @Bean