From a3f50309a7acccb9f27029416ca5016e57c15286 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Fri, 27 Dec 2024 18:19:53 +0900 Subject: [PATCH 01/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/uggthon/team01/config/SwaggerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index 857f644..a03283f 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -11,7 +11,7 @@ // Swagger 접속 주소 // http://localhost:8080/swagger-ui/index.html#/ -// https://{ip-address}:8080/swagger-ui/index.html +// https://16.171.3.150:8080/swagger-ui/index.html @Configuration public class SwaggerConfig { From 1aaf255b6bf3b3440e8f9df3b45264a21cd46062 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Fri, 27 Dec 2024 21:41:02 +0900 Subject: [PATCH 02/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/uggthon/team01/config/SwaggerConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index a03283f..e67ac05 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -11,7 +11,7 @@ // Swagger 접속 주소 // http://localhost:8080/swagger-ui/index.html#/ -// https://16.171.3.150:8080/swagger-ui/index.html +// https://13.60.84.223:8080/swagger-ui/index.html @Configuration public class SwaggerConfig { @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() { localServer.setDescription("Local Server"); Server prodServer = new Server(); - prodServer.setUrl("https://16.171.3.150:8080/swagger-ui/index.html"); + prodServer.setUrl("https://13.60.84.223:8080/swagger-ui/index.html"); prodServer.setDescription("Production Server"); return new OpenAPI() From 46d27e489811b1417e78aafc2dcf56a8a1f50944 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Fri, 27 Dec 2024 21:44:11 +0900 Subject: [PATCH 03/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/uggthon/team01/config/SwaggerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index e67ac05..0ee0921 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() { localServer.setDescription("Local Server"); Server prodServer = new Server(); - prodServer.setUrl("https://13.60.84.223:8080/swagger-ui/index.html"); + prodServer.setUrl("http://13.60.84.223:8080/swagger-ui/index.html"); prodServer.setDescription("Production Server"); return new OpenAPI() From d245b442221c68e023c3f8efb5253fe3b0965638 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Fri, 27 Dec 2024 21:49:43 +0900 Subject: [PATCH 04/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/uggthon/team01/config/SwaggerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index 0ee0921..e67ac05 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() { localServer.setDescription("Local Server"); Server prodServer = new Server(); - prodServer.setUrl("http://13.60.84.223:8080/swagger-ui/index.html"); + prodServer.setUrl("https://13.60.84.223:8080/swagger-ui/index.html"); prodServer.setDescription("Production Server"); return new OpenAPI() From 5f1cba8941cf46bae14b8e9af6f08e24a0bdd2c6 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Fri, 27 Dec 2024 21:51:48 +0900 Subject: [PATCH 05/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 31ae8ad..f2d62a0 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -94,7 +94,7 @@ jobs: # 3. 최신 이미지를 컨테이너화하여 실행 - name: docker run new container - run: sudo docker run --name helfoome --rm -d -p 8080:8080 -e TZ=Asia/Seoul ${{ secrets.DOCKERHUB_USERNAME }}/team01 + run: sudo docker run --name team01 --rm -d -p 8080:8080 -e TZ=Asia/Seoul ${{ secrets.DOCKERHUB_USERNAME }}/team01 # 4. 미사용 이미지를 정리 - name: delete old docker image From 6934c3efa53f65df5a8055afd83b524116ec4a34 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Fri, 27 Dec 2024 23:05:38 +0900 Subject: [PATCH 06/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/uggthon/team01/config/SwaggerConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index e67ac05..5890d96 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -11,7 +11,7 @@ // Swagger 접속 주소 // http://localhost:8080/swagger-ui/index.html#/ -// https://13.60.84.223:8080/swagger-ui/index.html +// https://13.60.182.19:8080/swagger-ui/index.html @Configuration public class SwaggerConfig { @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() { localServer.setDescription("Local Server"); Server prodServer = new Server(); - prodServer.setUrl("https://13.60.84.223:8080/swagger-ui/index.html"); + prodServer.setUrl("https://13.60.182.19:8080/swagger-ui/index.html"); prodServer.setDescription("Production Server"); return new OpenAPI() From 685bb48fdad3b606b813e860f71bbcfaa970cbbb Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Fri, 27 Dec 2024 23:41:55 +0900 Subject: [PATCH 07/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0f6ae90..1ed4222 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -# JDK21 -FROM openjdk:21 +# JDK17 +FROM openjdk:17 # 인자 설정, jar 파일 복제 COPY build/libs/*.jar app.jar From 6d33d7c0006318305bc500eadcf1f5e5878b9f57 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 00:25:59 +0900 Subject: [PATCH 08/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1ed4222..7874d52 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,17 @@ # JDK17 FROM openjdk:17 +# 환경 변수 설정 +ENV SPRING_APPLICATION_NAME=team01 \ + SERVER_PORT=8080 \ + SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver \ + SPRING_DATASOURCE_URL=jdbc:mysql://database-uggthon.c7qi28ak2iln.eu-north-1.rds.amazonaws.com:3306/uggthon?serverTimezone=UTC&characterEncoding=UTF-8 \ + SPRING_DATASOURCE_USERNAME=admin \ + SPRING_DATASOURCE_PASSWORD=uggthon12 \ + SPRING_JPA_HIBERNATE_DDL_AUTO=update + # 인자 설정, jar 파일 복제 COPY build/libs/*.jar app.jar # 실행 명령어 -ENTRYPOINT ["java", "-jar", "app.jar"] +ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file From f98fef7dd5fa6686a6393514fe8a8575b7c64f28 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 00:32:05 +0900 Subject: [PATCH 09/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7874d52..e0cdd84 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ FROM openjdk:17 ENV SPRING_APPLICATION_NAME=team01 \ SERVER_PORT=8080 \ SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver \ - SPRING_DATASOURCE_URL=jdbc:mysql://database-uggthon.c7qi28ak2iln.eu-north-1.rds.amazonaws.com:3306/uggthon?serverTimezone=UTC&characterEncoding=UTF-8 \ + SPRING_DATASOURCE_URL="jdbc:mysql://database-uggthon.c7qi28ak2iln.eu-north-1.rds.amazonaws.com:3306/uggthon?serverTimezone=UTC&characterEncoding=UTF-8" \ SPRING_DATASOURCE_USERNAME=admin \ SPRING_DATASOURCE_PASSWORD=uggthon12 \ SPRING_JPA_HIBERNATE_DDL_AUTO=update From 110480ea20354ee8dfc32e78ffaaed111af42c0d Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 00:40:11 +0900 Subject: [PATCH 10/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b9fa8d7..c30b27a 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,7 @@ dependencies { compileOnly 'org.projectlombok:lombok' // DB - runtimeOnly 'com.mysql:mysql-connector-j' + runtimeOnly 'com.mysql:mysql-connector-java' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' From 6513c5092304a0c17fbabdfd9411c6bb31d8dc56 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 00:44:33 +0900 Subject: [PATCH 11/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c30b27a..9434dcb 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,7 @@ dependencies { compileOnly 'org.projectlombok:lombok' // DB - runtimeOnly 'com.mysql:mysql-connector-java' + implementation 'mysql:mysql-connector-java:8.0.33' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' From d0c71a7d5b1ebe5a3f0feb07a4621ef94203ab1b Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 00:54:58 +0900 Subject: [PATCH 12/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index e0cdd84..9eda918 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,6 @@ # JDK17 FROM openjdk:17 -# 환경 변수 설정 -ENV SPRING_APPLICATION_NAME=team01 \ - SERVER_PORT=8080 \ - SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver \ - SPRING_DATASOURCE_URL="jdbc:mysql://database-uggthon.c7qi28ak2iln.eu-north-1.rds.amazonaws.com:3306/uggthon?serverTimezone=UTC&characterEncoding=UTF-8" \ - SPRING_DATASOURCE_USERNAME=admin \ - SPRING_DATASOURCE_PASSWORD=uggthon12 \ - SPRING_JPA_HIBERNATE_DDL_AUTO=update - # 인자 설정, jar 파일 복제 COPY build/libs/*.jar app.jar From 35f4fd19719f83b9fe1f7e2e4c37e2dacc8ce318 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 01:27:09 +0900 Subject: [PATCH 13/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/uggthon/team01/config/SwaggerConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index 5890d96..fdc05e4 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -11,7 +11,7 @@ // Swagger 접속 주소 // http://localhost:8080/swagger-ui/index.html#/ -// https://13.60.182.19:8080/swagger-ui/index.html +// https://13.60.216.48:8080/swagger-ui/index.html @Configuration public class SwaggerConfig { @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() { localServer.setDescription("Local Server"); Server prodServer = new Server(); - prodServer.setUrl("https://13.60.182.19:8080/swagger-ui/index.html"); + prodServer.setUrl("https://13.60.216.48:8080/swagger-ui/index.html"); prodServer.setDescription("Production Server"); return new OpenAPI() From c174140458e9f5db903d7613197f8383dee5e982 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 01:52:52 +0900 Subject: [PATCH 14/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/uggthon/team01/config/S3Config.java | 33 ++++++ .../uggthon/team01/config/SwaggerConfig.java | 2 +- .../com/uggthon/team01/service/S3Service.java | 111 ++++++++++++++++++ 3 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/uggthon/team01/config/S3Config.java create mode 100644 src/main/java/com/uggthon/team01/service/S3Service.java diff --git a/src/main/java/com/uggthon/team01/config/S3Config.java b/src/main/java/com/uggthon/team01/config/S3Config.java new file mode 100644 index 0000000..b08fc81 --- /dev/null +++ b/src/main/java/com/uggthon/team01/config/S3Config.java @@ -0,0 +1,33 @@ +package com.uggthon.team01.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; + +@Configuration +public class S3Config { + + @Value("${aws.credentials.access-key}") + private String accessKey; + + @Value("${aws.credentials.secret-key}") + private String secretKey; + + @Value("${aws.region}") + private String region; + + @Bean + public AmazonS3Client amazonS3Client() { + BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + return (AmazonS3Client) + AmazonS3ClientBuilder.standard() + .withRegion(region) + .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) + .build(); + } +} diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index fdc05e4..d3c1b15 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() { localServer.setDescription("Local Server"); Server prodServer = new Server(); - prodServer.setUrl("https://13.60.216.48:8080/swagger-ui/index.html"); + prodServer.setUrl("http://13.60.216.48:8080/swagger-ui/index.html"); prodServer.setDescription("Production Server"); return new OpenAPI() diff --git a/src/main/java/com/uggthon/team01/service/S3Service.java b/src/main/java/com/uggthon/team01/service/S3Service.java new file mode 100644 index 0000000..84b9db2 --- /dev/null +++ b/src/main/java/com/uggthon/team01/service/S3Service.java @@ -0,0 +1,111 @@ +package com.uggthon.team01.service; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +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.CannedAccessControlList; +import com.amazonaws.services.s3.model.PutObjectRequest; + +import lombok.extern.slf4j.Slf4j; + +// 이 서비스는 데베에 저장하는 서비스 X +// S3에 실제 파일을 업로드 (이름 겹치치 않게 파일이름 = 날짜-파일이름 으로 변경해서 올리는 기능) +// 이미지를 업로드할 일이 생기면 본인 서비스에서 요기 함수 호출해서 s3에 파일 업로드하고 +// 파일 경로랑 원본 파일명은 호출한 서비스에서 따로 저장해주셔야됭미 + +@Slf4j +@Service +public class S3Service { + + private final AmazonS3 s3Client; + + @Value("${aws.s3.bucket}") + private String bucketName; + + public S3Service( + @Value("${aws.credentials.access-key}") String accessKey, + @Value("${aws.credentials.secret-key}") String secretKey, + @Value("${aws.region}") String region) { + BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey); + this.s3Client = + AmazonS3ClientBuilder.standard() + .withRegion(Regions.fromName(region)) + .withCredentials(new AWSStaticCredentialsProvider(awsCreds)) + .build(); + } + + // dirName은 S3의 어떤 폴더인지 같이 넣어주면 됨 예를들면 profileImage.. shopImage.....etc + public String upload(MultipartFile multipartFile, String dirName) throws IOException { + String originalFileName = multipartFile.getOriginalFilename(); + String uuid = UUID.randomUUID().toString(); + String uniqueFileName = uuid + "_" + originalFileName.replaceAll("\\s", "_"); + + String fileName = dirName + "/" + uniqueFileName; + log.info("fileName: " + fileName); + + File uploadFile = convert(multipartFile); + String uploadImageUrl = putS3(uploadFile, fileName); + removeNewFile(uploadFile); + return uploadImageUrl; + } + + private File convert(MultipartFile file) throws IOException { + File convertFile = new File(file.getOriginalFilename()); + if (convertFile.createNewFile()) { + try (FileOutputStream fos = new FileOutputStream(convertFile)) { + fos.write(file.getBytes()); + } + return convertFile; + } + throw new IllegalArgumentException("파일 변환에 실패했습니다: " + file.getOriginalFilename()); + } + + private String putS3(File uploadFile, String fileName) { + s3Client.putObject( + new PutObjectRequest(bucketName, fileName, uploadFile) + .withCannedAcl(CannedAccessControlList.PublicRead)); + return s3Client.getUrl(bucketName, fileName).toString(); + } + + // 전환할 때 임시파일이 생성돼서 삭제해야함 + private void removeNewFile(File targetFile) { + if (targetFile.delete()) { + log.info("파일이 삭제되었습니다."); + } else { + log.info("파일이 삭제되지 못했습니다."); + } + } + + public void deleteFile(String fileName) { + try { + // URL 디코딩을 통해 원래의 파일 이름을 가져옴 + String decodedFileName = URLDecoder.decode(fileName, "UTF-8"); + log.info("Deleting file from S3: " + decodedFileName); + s3Client.deleteObject(bucketName, decodedFileName); + } catch (UnsupportedEncodingException e) { + log.error("Error while decoding the file name: {}", e.getMessage()); + } + } + + public String updateFile(MultipartFile newFile, String oldFileName, String dirName) + throws IOException { + // 기존 파일 삭제 + log.info("S3 oldFileName: " + oldFileName); + deleteFile(oldFileName); + // 새 파일 업로드 + return upload(newFile, dirName); + } +} From d309fa1a6737ae53cbb01bc859732a1da6f8d6cf Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 02:09:03 +0900 Subject: [PATCH 15/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/uggthon/team01/config/SwaggerConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index d3c1b15..f29fb8b 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -11,7 +11,7 @@ // Swagger 접속 주소 // http://localhost:8080/swagger-ui/index.html#/ -// https://13.60.216.48:8080/swagger-ui/index.html +// https://16.171.7.237:8080/swagger-ui/index.html @Configuration public class SwaggerConfig { @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() { localServer.setDescription("Local Server"); Server prodServer = new Server(); - prodServer.setUrl("http://13.60.216.48:8080/swagger-ui/index.html"); + prodServer.setUrl("http://16.171.7.237:8080/swagger-ui/index.html"); prodServer.setDescription("Production Server"); return new OpenAPI() From 85356a31ef52f29432e6981d32b171e1a5f42431 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 02:41:47 +0900 Subject: [PATCH 16/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/uggthon/team01/config/SwaggerConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index f29fb8b..b40ab60 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -11,7 +11,7 @@ // Swagger 접속 주소 // http://localhost:8080/swagger-ui/index.html#/ -// https://16.171.7.237:8080/swagger-ui/index.html +// https://13.60.193.191:8080/swagger-ui/index.html @Configuration public class SwaggerConfig { @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() { localServer.setDescription("Local Server"); Server prodServer = new Server(); - prodServer.setUrl("http://16.171.7.237:8080/swagger-ui/index.html"); + prodServer.setUrl("http://13.60.193.191:8080/swagger-ui/index.html"); prodServer.setDescription("Production Server"); return new OpenAPI() From 98d1421aec0ad17908bdbc22a958ce5d5ddc2244 Mon Sep 17 00:00:00 2001 From: kkt9253 Date: Sat, 28 Dec 2024 03:35:47 +0900 Subject: [PATCH 17/19] =?UTF-8?q?:sparkles:=20Feat:=20API=20=EC=9E=91?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 6148 bytes src/.DS_Store | Bin 0 -> 6148 bytes src/main/.DS_Store | Bin 0 -> 6148 bytes .../com/uggthon/team01/config/AppConfig.java | 14 +++++ .../com/uggthon/team01/config/WebConfig.java | 17 ++++++ .../team01/controller/FileController.java | 34 ++++++++++++ .../team01/domain/dto/GenerateRequestDto.java | 13 +++++ .../domain/dto/GenerateResponseDto.java | 26 +++++++++ .../domain/dto/ImageUploadRequestDto.java | 11 ++++ .../uggthon/team01/domain/entity/Image.java | 21 +++++++ .../team01/repository/ImageRepository.java | 7 +++ .../com/uggthon/team01/service/AIService.java | 16 ++++++ .../uggthon/team01/service/FileService.java | 31 +++++++++++ .../com/uggthon/team01/util/S3Uploader.java | 52 ++++++++++++++++++ 14 files changed, 242 insertions(+) create mode 100644 .DS_Store create mode 100644 src/.DS_Store create mode 100644 src/main/.DS_Store create mode 100644 src/main/java/com/uggthon/team01/config/AppConfig.java create mode 100644 src/main/java/com/uggthon/team01/config/WebConfig.java create mode 100644 src/main/java/com/uggthon/team01/controller/FileController.java create mode 100644 src/main/java/com/uggthon/team01/domain/dto/GenerateRequestDto.java create mode 100644 src/main/java/com/uggthon/team01/domain/dto/GenerateResponseDto.java create mode 100644 src/main/java/com/uggthon/team01/domain/dto/ImageUploadRequestDto.java create mode 100644 src/main/java/com/uggthon/team01/domain/entity/Image.java create mode 100644 src/main/java/com/uggthon/team01/repository/ImageRepository.java create mode 100644 src/main/java/com/uggthon/team01/service/AIService.java create mode 100644 src/main/java/com/uggthon/team01/service/FileService.java create mode 100644 src/main/java/com/uggthon/team01/util/S3Uploader.java diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..04f882dfa48b942191a552ce4c10ab1c1c14cf43 GIT binary patch literal 6148 zcmeHKL2uJA82#LqrCCAr0Mafz@BP>NOid;O*qKTYL4Ol1fTZxD}>20v7w zM6^p&k~F7Nim~S3sUDh|FAdGkul-@Ge{rwDbuMzLtp6MFslo2m*_cU)eW+-tzBg1Z z9n%qJHl=640i97)SF}zVirbW9z6E{>Wf(L6t7o4tc-97gLG$_;#4cUJ3d{W5`2RIL zPm{bD4!?<3yK`g5aa^b8yz$@5(l3HynNNbnD}H(|Wg2eELHHtx%US=<6PXo3lEn)p zNTL{&*DsSSlI27$vnW?uUpKgJ*PZqER;$ryxbKY)hwFWBb$Fo42kW)ly?g(`qvP3W zdX~wL_~!_L{a?i`gB#$tWaj+AUu3Dw*v}1n!?Ji44w$#l?Ony-c1-Jlb>Lb%!25%T z#5gusX;fPWGIa$2c2KPXW&TuPjc0Idu+oSYgwRr;mI`yl5L%9U&+x_uD~(!C!dyOt z8CjScicq7Ye^1d#j5XTaI$#~BJJ8mTeLnw>{(S$hi|mtiz&h|>IUqVye>%aG%-Om% xIX-JWq_;>M%&Rmi2{LmWs{$Xzdq^tK=5YZyHdtvy4Z?m1C>v~M9r&jX`~)ENv<(0N literal 0 HcmV?d00001 diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4774b29c4553274629479fcbbabca34a511eb355 GIT binary patch literal 6148 zcmeHK!A`YnmcP#ct(^sZ@F9eFVf_wpZ0B8xn#e3J7$py8onM28C`{5??M>wJ*4lcZU>8b- zEALK@ywp#JNy{HxQ14XAD45!Qa2EDPo$}_Pj8i|1djpjac6%6dc^<}HIcmva+)Y%j zrw44iXm`q$@wm~bRh>q&HmN$}W?k9!$;2*hZSU@%bnc^mET1&>0{=@T8wRKFjK*v} zkKQ1TWPFQ0inkzz9wd-1@bQ9UpZUNp3p2nBFas;efY}?1rIq}8{%B@^8Td&CXn$}} z30;GkMzwWdqe=iox<)ENTV4GT9daPL1~ZN5K@mC?QKt%1VhB??2%V1Ou8Gey>U0q5 z&G;PiW??E6VG0l7sBjRjMsAq_W?-IyyzZ9i{6G4>{-00c9y7oU{3`~8)%MygoRT?P ymnKJNt%G`vNL|uoI*Kc(O3?3+f#@2{G@=KEF9M1NZkT~zW#9vKj$n!a literal 0 HcmV?d00001 diff --git a/src/main/.DS_Store b/src/main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bf98486846b738bd68b67547b4c8b5c56d791e66 GIT binary patch literal 6148 zcmeHK!AiqG5Z!I7Nhm@N3OxqA7LBEs;w8p<@M=U4Dm5`hqcJN@+8jzDXZ<0+#NW}G z-EBduCqbml!0emM&TN>sVK>7V+5whGjI3 ztKd$QK@k??+z&?=_;e~n8qMu6I!lJ-z}`F*SrI1La3m9wcnBev=Sdce(ih__&Sh?( zCM?Ue26k&Y?RMR^)9tylwlnQ@q}`d#EOTpncmHJYkUnPOSy9j7yOgq_aSktFEb5sA zqbwEKE%@f~^Eg6cfEXYKR*?aH)|t&!ERJd-28e-QF@WcT1B&QrtQ5+l0|waw05-ra z1#J2259pu+(9>8c1P=&Tseme#>lTCS&Vj3RnD=yirBJ0aF5e96=r?oSp>W-Ja7TtS z?kS{^7$62dGl0Dxh>iFE(a-(A45EP;AO=>G0p92beIIJmck5D>c-K0h*PtjES1DYi kfFZA9h{db81u6yn4jO=-#!4Z0K uploadFile(@RequestParam("file") MultipartFile file) throws IOException { + String imageId = fileService.uploadFile(file); + return ResponseEntity.ok(imageId); + } + + @PostMapping("/generate") + public ResponseEntity generateImages(@RequestBody GenerateRequestDto requestDto) { + GenerateResponseDto responseDto = aiService.generateImages(requestDto); + return ResponseEntity.ok(responseDto); + } + +} diff --git a/src/main/java/com/uggthon/team01/domain/dto/GenerateRequestDto.java b/src/main/java/com/uggthon/team01/domain/dto/GenerateRequestDto.java new file mode 100644 index 0000000..f169070 --- /dev/null +++ b/src/main/java/com/uggthon/team01/domain/dto/GenerateRequestDto.java @@ -0,0 +1,13 @@ +package com.uggthon.team01.domain.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class GenerateRequestDto { + private List scenario1; + private List scenario2; + private Long scenario3; // img아이디 + private List scenario4; +} \ No newline at end of file diff --git a/src/main/java/com/uggthon/team01/domain/dto/GenerateResponseDto.java b/src/main/java/com/uggthon/team01/domain/dto/GenerateResponseDto.java new file mode 100644 index 0000000..8f6d219 --- /dev/null +++ b/src/main/java/com/uggthon/team01/domain/dto/GenerateResponseDto.java @@ -0,0 +1,26 @@ +package com.uggthon.team01.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class GenerateResponseDto { + private List outfitOptions; + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class OutfitOption { + private String topImageUrl; + private String bottomImageUrl; + private String description; + } +} \ No newline at end of file diff --git a/src/main/java/com/uggthon/team01/domain/dto/ImageUploadRequestDto.java b/src/main/java/com/uggthon/team01/domain/dto/ImageUploadRequestDto.java new file mode 100644 index 0000000..8a0b185 --- /dev/null +++ b/src/main/java/com/uggthon/team01/domain/dto/ImageUploadRequestDto.java @@ -0,0 +1,11 @@ +package com.uggthon.team01.domain.dto; + +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +@Data +public class ImageUploadRequestDto { + + private MultipartFile file; + private String scenario; +} diff --git a/src/main/java/com/uggthon/team01/domain/entity/Image.java b/src/main/java/com/uggthon/team01/domain/entity/Image.java new file mode 100644 index 0000000..c911754 --- /dev/null +++ b/src/main/java/com/uggthon/team01/domain/entity/Image.java @@ -0,0 +1,21 @@ +package com.uggthon.team01.domain.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class Image { + + @Id + private String id; + + private String url; +} diff --git a/src/main/java/com/uggthon/team01/repository/ImageRepository.java b/src/main/java/com/uggthon/team01/repository/ImageRepository.java new file mode 100644 index 0000000..cbf6ecd --- /dev/null +++ b/src/main/java/com/uggthon/team01/repository/ImageRepository.java @@ -0,0 +1,7 @@ +package com.uggthon.team01.repository; + +import org.example.hak.domain.entity.Image; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ImageRepository extends JpaRepository { +} diff --git a/src/main/java/com/uggthon/team01/service/AIService.java b/src/main/java/com/uggthon/team01/service/AIService.java new file mode 100644 index 0000000..65b550d --- /dev/null +++ b/src/main/java/com/uggthon/team01/service/AIService.java @@ -0,0 +1,16 @@ +package com.uggthon.team01.service; + +import org.example.hak.domain.dto.GenerateRequestDto; +import org.example.hak.domain.dto.GenerateResponseDto; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +public class AIService { + + public GenerateResponseDto generateImages(GenerateRequestDto requestDto) { + RestTemplate restTemplate = new RestTemplate(); + String aiServerUrl = "http://ai-server-url.com/generate"; // AI 서버 URL + return restTemplate.postForObject(aiServerUrl, requestDto, GenerateResponseDto.class); + } +} diff --git a/src/main/java/com/uggthon/team01/service/FileService.java b/src/main/java/com/uggthon/team01/service/FileService.java new file mode 100644 index 0000000..aa7c91e --- /dev/null +++ b/src/main/java/com/uggthon/team01/service/FileService.java @@ -0,0 +1,31 @@ +package com.uggthon.team01.service; + + +import lombok.RequiredArgsConstructor; +import org.example.hak.domain.entity.Image; +import org.example.hak.repository.ImageRepository; +import org.example.hak.util.S3Uploader; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.UUID; + +@RequiredArgsConstructor +@Service +public class FileService { + + private final S3Uploader s3Uploader; + private final ImageRepository imageRepository; + + public String uploadFile(MultipartFile file) throws IOException { + String imageUrl = s3Uploader.upload(file); + String imageId = UUID.randomUUID().toString(); + + // DB 저장 로직 + Image image = new Image(imageId, imageUrl); // Image 객체 생성 + imageRepository.save(image); // DB에 저장 + + return imageId; + } +} \ No newline at end of file diff --git a/src/main/java/com/uggthon/team01/util/S3Uploader.java b/src/main/java/com/uggthon/team01/util/S3Uploader.java new file mode 100644 index 0000000..998d29a --- /dev/null +++ b/src/main/java/com/uggthon/team01/util/S3Uploader.java @@ -0,0 +1,52 @@ +package com.uggthon.team01.util; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.PutObjectRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.Objects; +import java.util.UUID; + +@Component +public class S3Uploader { + + private final AmazonS3 amazonS3; + + @Autowired + public S3Uploader(AmazonS3 amazonS3) { + this.amazonS3 = amazonS3; + } + + public String upload(MultipartFile file) throws IOException { + String bucketName = "your-bucket-name"; // 설정한 버킷명 사용 + String key = "images/" + UUID.randomUUID() + "-" + file.getOriginalFilename(); + + // MultipartFile을 File로 변환 + File convertedFile = convertMultipartFileToFile(file); + + try { + // S3에 파일 업로드 + amazonS3.putObject(new PutObjectRequest(bucketName, key, convertedFile)); + // 파일 업로드 후 URL 반환 + return amazonS3.getUrl(bucketName, key).toString(); + } catch (Exception e) { + throw new RuntimeException("S3 업로드 실패", e); + } finally { + // 업로드 완료됐으면 로컬 시스템에 저장된 파일 삭제 + convertedFile.delete(); + } + } + + // MultipartFile을 File로 변환하는 메서드 + private File convertMultipartFileToFile(MultipartFile file) throws IOException { + // 업로드된 파일의 원본 파일 이름을 가져옴 + File convertedFile = new File(Objects.requireNonNull(file.getOriginalFilename())); + // 파일을 로컬 시스템에 저장 + file.transferTo(convertedFile); + return convertedFile; + } +} \ No newline at end of file From 9fa994ac69a0a51d81e43d04be300240259c6c58 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 04:51:02 +0900 Subject: [PATCH 18/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4xm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/uggthon/team01/config/AppConfig.java | 8 +- .../uggthon/team01/config/SwaggerConfig.java | 4 +- .../com/uggthon/team01/config/WebConfig.java | 17 ++-- .../team01/controller/FileController.java | 41 ++++----- .../team01/domain/dto/GenerateRequestDto.java | 13 --- .../domain/dto/GenerateResponseDto.java | 26 ------ .../team01/dto/GenerateRequestDto.java | 13 +++ .../team01/dto/GenerateResponseDto.java | 26 ++++++ .../dto/ImageUploadRequestDto.java | 9 +- .../team01/{domain => }/entity/Image.java | 8 +- .../team01/repository/ImageRepository.java | 6 +- .../com/uggthon/team01/service/AIService.java | 15 ++-- .../uggthon/team01/service/FileService.java | 35 ++++---- .../com/uggthon/team01/util/S3Uploader.java | 83 ++++++++++--------- 14 files changed, 156 insertions(+), 148 deletions(-) delete mode 100644 src/main/java/com/uggthon/team01/domain/dto/GenerateRequestDto.java delete mode 100644 src/main/java/com/uggthon/team01/domain/dto/GenerateResponseDto.java create mode 100644 src/main/java/com/uggthon/team01/dto/GenerateRequestDto.java create mode 100644 src/main/java/com/uggthon/team01/dto/GenerateResponseDto.java rename src/main/java/com/uggthon/team01/{domain => }/dto/ImageUploadRequestDto.java (55%) rename src/main/java/com/uggthon/team01/{domain => }/entity/Image.java (73%) diff --git a/src/main/java/com/uggthon/team01/config/AppConfig.java b/src/main/java/com/uggthon/team01/config/AppConfig.java index db78a48..2959342 100644 --- a/src/main/java/com/uggthon/team01/config/AppConfig.java +++ b/src/main/java/com/uggthon/team01/config/AppConfig.java @@ -7,8 +7,8 @@ @Configuration public class AppConfig { - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } } diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index b40ab60..277756e 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -11,7 +11,7 @@ // Swagger 접속 주소 // http://localhost:8080/swagger-ui/index.html#/ -// https://13.60.193.191:8080/swagger-ui/index.html +// https://51.20.37.106:8080/swagger-ui/index.html @Configuration public class SwaggerConfig { @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() { localServer.setDescription("Local Server"); Server prodServer = new Server(); - prodServer.setUrl("http://13.60.193.191:8080/swagger-ui/index.html"); + prodServer.setUrl("http://51.20.37.106:8080/swagger-ui/index.html"); prodServer.setDescription("Production Server"); return new OpenAPI() diff --git a/src/main/java/com/uggthon/team01/config/WebConfig.java b/src/main/java/com/uggthon/team01/config/WebConfig.java index 0a3da31..86fb20a 100644 --- a/src/main/java/com/uggthon/team01/config/WebConfig.java +++ b/src/main/java/com/uggthon/team01/config/WebConfig.java @@ -6,12 +6,13 @@ @Configuration public class WebConfig implements WebMvcConfigurer { - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedOrigins("http://localhost:5173", "https://ug-gthon-team1-fe.vercel.app") - .allowedMethods("GET", "POST") - .allowedHeaders("*") - .allowCredentials(true); - } + @Override + public void addCorsMappings(CorsRegistry registry) { + registry + .addMapping("/**") + .allowedOrigins("http://localhost:5173", "https://ug-gthon-team1-fe.vercel.app") + .allowedMethods("GET", "POST") + .allowedHeaders("*") + .allowCredentials(true); + } } diff --git a/src/main/java/com/uggthon/team01/controller/FileController.java b/src/main/java/com/uggthon/team01/controller/FileController.java index bf2b593..1463085 100644 --- a/src/main/java/com/uggthon/team01/controller/FileController.java +++ b/src/main/java/com/uggthon/team01/controller/FileController.java @@ -1,34 +1,37 @@ package com.uggthon.team01.controller; -import lombok.RequiredArgsConstructor; -import org.example.hak.domain.dto.GenerateRequestDto; -import org.example.hak.domain.dto.GenerateResponseDto; -import org.example.hak.service.AIService; -import org.example.hak.service.FileService; +import java.io.IOException; + import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; +import com.uggthon.team01.dto.GenerateRequestDto; +import com.uggthon.team01.dto.GenerateResponseDto; +import com.uggthon.team01.service.AIService; +import com.uggthon.team01.service.FileService; + +import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor @RequestMapping("/api") public class FileController { - private final FileService fileService; - private final AIService aiService; - - @PostMapping("/file") - public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) throws IOException { - String imageId = fileService.uploadFile(file); - return ResponseEntity.ok(imageId); - } + private final FileService fileService; + private final AIService aiService; - @PostMapping("/generate") - public ResponseEntity generateImages(@RequestBody GenerateRequestDto requestDto) { - GenerateResponseDto responseDto = aiService.generateImages(requestDto); - return ResponseEntity.ok(responseDto); - } + @PostMapping("/file") + public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) + throws IOException { + String imageId = fileService.uploadFile(file); + return ResponseEntity.ok(imageId); + } + @PostMapping("/generate") + public ResponseEntity generateImages( + @RequestBody GenerateRequestDto requestDto) { + GenerateResponseDto responseDto = aiService.generateImages(requestDto); + return ResponseEntity.ok(responseDto); + } } diff --git a/src/main/java/com/uggthon/team01/domain/dto/GenerateRequestDto.java b/src/main/java/com/uggthon/team01/domain/dto/GenerateRequestDto.java deleted file mode 100644 index f169070..0000000 --- a/src/main/java/com/uggthon/team01/domain/dto/GenerateRequestDto.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.uggthon.team01.domain.dto; - -import lombok.Data; - -import java.util.List; - -@Data -public class GenerateRequestDto { - private List scenario1; - private List scenario2; - private Long scenario3; // img아이디 - private List scenario4; -} \ No newline at end of file diff --git a/src/main/java/com/uggthon/team01/domain/dto/GenerateResponseDto.java b/src/main/java/com/uggthon/team01/domain/dto/GenerateResponseDto.java deleted file mode 100644 index 8f6d219..0000000 --- a/src/main/java/com/uggthon/team01/domain/dto/GenerateResponseDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.uggthon.team01.domain.dto; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public class GenerateResponseDto { - private List outfitOptions; - - @Getter - @Setter - @NoArgsConstructor - @AllArgsConstructor - public static class OutfitOption { - private String topImageUrl; - private String bottomImageUrl; - private String description; - } -} \ No newline at end of file diff --git a/src/main/java/com/uggthon/team01/dto/GenerateRequestDto.java b/src/main/java/com/uggthon/team01/dto/GenerateRequestDto.java new file mode 100644 index 0000000..26b970f --- /dev/null +++ b/src/main/java/com/uggthon/team01/dto/GenerateRequestDto.java @@ -0,0 +1,13 @@ +package com.uggthon.team01.dto; + +import java.util.List; + +import lombok.Data; + +@Data +public class GenerateRequestDto { + private List scenario1; + private List scenario2; + private Long scenario3; // img아이디 + private List scenario4; +} diff --git a/src/main/java/com/uggthon/team01/dto/GenerateResponseDto.java b/src/main/java/com/uggthon/team01/dto/GenerateResponseDto.java new file mode 100644 index 0000000..8fa083e --- /dev/null +++ b/src/main/java/com/uggthon/team01/dto/GenerateResponseDto.java @@ -0,0 +1,26 @@ +package com.uggthon.team01.dto; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class GenerateResponseDto { + private List outfitOptions; + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class OutfitOption { + private String topImageUrl; + private String bottomImageUrl; + private String description; + } +} diff --git a/src/main/java/com/uggthon/team01/domain/dto/ImageUploadRequestDto.java b/src/main/java/com/uggthon/team01/dto/ImageUploadRequestDto.java similarity index 55% rename from src/main/java/com/uggthon/team01/domain/dto/ImageUploadRequestDto.java rename to src/main/java/com/uggthon/team01/dto/ImageUploadRequestDto.java index 8a0b185..da21959 100644 --- a/src/main/java/com/uggthon/team01/domain/dto/ImageUploadRequestDto.java +++ b/src/main/java/com/uggthon/team01/dto/ImageUploadRequestDto.java @@ -1,11 +1,12 @@ -package com.uggthon.team01.domain.dto; +package com.uggthon.team01.dto; -import lombok.Data; import org.springframework.web.multipart.MultipartFile; +import lombok.Data; + @Data public class ImageUploadRequestDto { - private MultipartFile file; - private String scenario; + private MultipartFile file; + private String scenario; } diff --git a/src/main/java/com/uggthon/team01/domain/entity/Image.java b/src/main/java/com/uggthon/team01/entity/Image.java similarity index 73% rename from src/main/java/com/uggthon/team01/domain/entity/Image.java rename to src/main/java/com/uggthon/team01/entity/Image.java index c911754..771f601 100644 --- a/src/main/java/com/uggthon/team01/domain/entity/Image.java +++ b/src/main/java/com/uggthon/team01/entity/Image.java @@ -1,7 +1,8 @@ -package com.uggthon.team01.domain.entity; +package com.uggthon.team01.entity; import jakarta.persistence.Entity; import jakarta.persistence.Id; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -14,8 +15,7 @@ @AllArgsConstructor public class Image { - @Id - private String id; + @Id private String id; - private String url; + private String url; } diff --git a/src/main/java/com/uggthon/team01/repository/ImageRepository.java b/src/main/java/com/uggthon/team01/repository/ImageRepository.java index cbf6ecd..5c13c2f 100644 --- a/src/main/java/com/uggthon/team01/repository/ImageRepository.java +++ b/src/main/java/com/uggthon/team01/repository/ImageRepository.java @@ -1,7 +1,7 @@ package com.uggthon.team01.repository; -import org.example.hak.domain.entity.Image; import org.springframework.data.jpa.repository.JpaRepository; -public interface ImageRepository extends JpaRepository { -} +import com.uggthon.team01.entity.Image; + +public interface ImageRepository extends JpaRepository {} diff --git a/src/main/java/com/uggthon/team01/service/AIService.java b/src/main/java/com/uggthon/team01/service/AIService.java index 65b550d..dc64edf 100644 --- a/src/main/java/com/uggthon/team01/service/AIService.java +++ b/src/main/java/com/uggthon/team01/service/AIService.java @@ -1,16 +1,17 @@ package com.uggthon.team01.service; -import org.example.hak.domain.dto.GenerateRequestDto; -import org.example.hak.domain.dto.GenerateResponseDto; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import com.uggthon.team01.dto.GenerateRequestDto; +import com.uggthon.team01.dto.GenerateResponseDto; + @Service public class AIService { - public GenerateResponseDto generateImages(GenerateRequestDto requestDto) { - RestTemplate restTemplate = new RestTemplate(); - String aiServerUrl = "http://ai-server-url.com/generate"; // AI 서버 URL - return restTemplate.postForObject(aiServerUrl, requestDto, GenerateResponseDto.class); - } + public GenerateResponseDto generateImages(GenerateRequestDto requestDto) { + RestTemplate restTemplate = new RestTemplate(); + String aiServerUrl = "http://ai-server-url.com/generate"; // AI 서버 URL + return restTemplate.postForObject(aiServerUrl, requestDto, GenerateResponseDto.class); + } } diff --git a/src/main/java/com/uggthon/team01/service/FileService.java b/src/main/java/com/uggthon/team01/service/FileService.java index aa7c91e..39b3958 100644 --- a/src/main/java/com/uggthon/team01/service/FileService.java +++ b/src/main/java/com/uggthon/team01/service/FileService.java @@ -1,31 +1,32 @@ package com.uggthon.team01.service; +import java.io.IOException; +import java.util.UUID; -import lombok.RequiredArgsConstructor; -import org.example.hak.domain.entity.Image; -import org.example.hak.repository.ImageRepository; -import org.example.hak.util.S3Uploader; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; -import java.util.UUID; +import com.uggthon.team01.entity.Image; +import com.uggthon.team01.repository.ImageRepository; +import com.uggthon.team01.util.S3Uploader; + +import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Service public class FileService { - private final S3Uploader s3Uploader; - private final ImageRepository imageRepository; + private final S3Uploader s3Uploader; + private final ImageRepository imageRepository; - public String uploadFile(MultipartFile file) throws IOException { - String imageUrl = s3Uploader.upload(file); - String imageId = UUID.randomUUID().toString(); + public String uploadFile(MultipartFile file) throws IOException { + String imageUrl = s3Uploader.upload(file); + String imageId = UUID.randomUUID().toString(); - // DB 저장 로직 - Image image = new Image(imageId, imageUrl); // Image 객체 생성 - imageRepository.save(image); // DB에 저장 + // DB 저장 로직 + Image image = new Image(imageId, imageUrl); // Image 객체 생성 + imageRepository.save(image); // DB에 저장 - return imageId; - } -} \ No newline at end of file + return imageId; + } +} diff --git a/src/main/java/com/uggthon/team01/util/S3Uploader.java b/src/main/java/com/uggthon/team01/util/S3Uploader.java index 998d29a..2d7bbe3 100644 --- a/src/main/java/com/uggthon/team01/util/S3Uploader.java +++ b/src/main/java/com/uggthon/team01/util/S3Uploader.java @@ -1,52 +1,53 @@ package com.uggthon.team01.util; -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.PutObjectRequest; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - import java.io.File; import java.io.IOException; import java.util.Objects; import java.util.UUID; -@Component -public class S3Uploader { - - private final AmazonS3 amazonS3; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; - @Autowired - public S3Uploader(AmazonS3 amazonS3) { - this.amazonS3 = amazonS3; - } +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.PutObjectRequest; - public String upload(MultipartFile file) throws IOException { - String bucketName = "your-bucket-name"; // 설정한 버킷명 사용 - String key = "images/" + UUID.randomUUID() + "-" + file.getOriginalFilename(); - - // MultipartFile을 File로 변환 - File convertedFile = convertMultipartFileToFile(file); - - try { - // S3에 파일 업로드 - amazonS3.putObject(new PutObjectRequest(bucketName, key, convertedFile)); - // 파일 업로드 후 URL 반환 - return amazonS3.getUrl(bucketName, key).toString(); - } catch (Exception e) { - throw new RuntimeException("S3 업로드 실패", e); - } finally { - // 업로드 완료됐으면 로컬 시스템에 저장된 파일 삭제 - convertedFile.delete(); - } - } +@Component +public class S3Uploader { - // MultipartFile을 File로 변환하는 메서드 - private File convertMultipartFileToFile(MultipartFile file) throws IOException { - // 업로드된 파일의 원본 파일 이름을 가져옴 - File convertedFile = new File(Objects.requireNonNull(file.getOriginalFilename())); - // 파일을 로컬 시스템에 저장 - file.transferTo(convertedFile); - return convertedFile; + private final AmazonS3 amazonS3; + + @Autowired + public S3Uploader(AmazonS3 amazonS3) { + this.amazonS3 = amazonS3; + } + + public String upload(MultipartFile file) throws IOException { + String bucketName = "your-bucket-name"; // 설정한 버킷명 사용 + String key = "images/" + UUID.randomUUID() + "-" + file.getOriginalFilename(); + + // MultipartFile을 File로 변환 + File convertedFile = convertMultipartFileToFile(file); + + try { + // S3에 파일 업로드 + amazonS3.putObject(new PutObjectRequest(bucketName, key, convertedFile)); + // 파일 업로드 후 URL 반환 + return amazonS3.getUrl(bucketName, key).toString(); + } catch (Exception e) { + throw new RuntimeException("S3 업로드 실패", e); + } finally { + // 업로드 완료됐으면 로컬 시스템에 저장된 파일 삭제 + convertedFile.delete(); } -} \ No newline at end of file + } + + // MultipartFile을 File로 변환하는 메서드 + private File convertMultipartFileToFile(MultipartFile file) throws IOException { + // 업로드된 파일의 원본 파일 이름을 가져옴 + File convertedFile = new File(Objects.requireNonNull(file.getOriginalFilename())); + // 파일을 로컬 시스템에 저장 + file.transferTo(convertedFile); + return convertedFile; + } +} From e812ec6edd9589a3f12f3f6d571587d1254d3f00 Mon Sep 17 00:00:00 2001 From: YoonHeeJun Date: Sat, 28 Dec 2024 04:52:41 +0900 Subject: [PATCH 19/19] =?UTF-8?q?:rocket:=20Deploy:=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4xm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/uggthon/team01/config/SwaggerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java index 277756e..5ee5c45 100644 --- a/src/main/java/com/uggthon/team01/config/SwaggerConfig.java +++ b/src/main/java/com/uggthon/team01/config/SwaggerConfig.java @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() { localServer.setDescription("Local Server"); Server prodServer = new Server(); - prodServer.setUrl("http://51.20.37.106:8080/swagger-ui/index.html"); + prodServer.setUrl("http://54.180.121.231:8080/swagger-ui/index.html"); prodServer.setDescription("Production Server"); return new OpenAPI()