Skip to content

Commit

Permalink
[JT-47] feat: S3 파일 업로더 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
kmebin authored Sep 1, 2023
2 parents 7e39a38 + 917f7ef commit b6799f8
Show file tree
Hide file tree
Showing 8 changed files with 111 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ subprojects {
}

dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}

test {
Expand All @@ -39,6 +41,7 @@ subprojects {
project(':module-application') {
dependencies {
implementation project(':module-core')
implementation project(':module-domain-s3')
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

@SpringBootApplication
public class JToonApplication {

public static void main(String[] args) {
SpringApplication.run(JToonApplication.class, args);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
3 changes: 3 additions & 0 deletions module-application/src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
spring:
profiles:
include: s3
3 changes: 3 additions & 0 deletions module-domain-s3/build.gradle
Original file line number Diff line number Diff line change
@@ -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'
}
38 changes: 38 additions & 0 deletions module-domain-s3/src/main/java/com/devtoon/jtoon/S3Uploader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.devtoon.jtoon;

import java.io.File;
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("${spring.cloud.aws.s3.bucket}")
private String BUCKET;

public void upload(String directory, MultipartFile file) {
String key = directory + File.separator + UUID.randomUUID();

try {
s3Template.upload(
BUCKET,
key,
file.getInputStream(),
ObjectMetadata.builder().contentType("multipart/form-data").build()
);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -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("${spring.cloud.aws.credentials.access-key}")
private String ACCESS_KEY_ID;

@Value("${spring.cloud.aws.credentials.secret-key}")
private String SECRET_ACCESS_KEY;

@Value("${spring.cloud.aws.region.static}")
private String REGION;

@Bean
public S3Client s3Client() {
AwsCredentials credentials = AwsBasicCredentials.create(ACCESS_KEY_ID, SECRET_ACCESS_KEY);

return S3Client.builder()
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.region(Region.of(REGION))
.build();
}
}

0 comments on commit b6799f8

Please sign in to comment.