From 853267caa9b61b2d92cc20fc790764268c1efbfa Mon Sep 17 00:00:00 2001 From: sungchaewon Date: Sun, 22 Jun 2025 17:26:55 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20S3=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20Presigned?= =?UTF-8?q?UploadResponseDto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/FixLog/config/SecurityConfig.java | 2 ++ .../FixLog/controller/MypageMemberController.java | 10 ++++++---- .../FixLog/dto/s3/PresignedUploadResponseDto.java | 12 ++++++++++++ .../java/com/example/FixLog/service/S3Service.java | 8 +++++--- 4 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/example/FixLog/dto/s3/PresignedUploadResponseDto.java diff --git a/src/main/java/com/example/FixLog/config/SecurityConfig.java b/src/main/java/com/example/FixLog/config/SecurityConfig.java index ede3958..173c2fd 100644 --- a/src/main/java/com/example/FixLog/config/SecurityConfig.java +++ b/src/main/java/com/example/FixLog/config/SecurityConfig.java @@ -37,6 +37,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .requestMatchers(HttpMethod.GET, "/members/check-nickname").permitAll() .requestMatchers(HttpMethod.GET, "/", "/main", "/main/**").permitAll() .requestMatchers(HttpMethod.GET, "/posts/**").permitAll() + + .requestMatchers("/api/s3/**").permitAll() // h2-console (로컬 테스트용) .requestMatchers(HttpMethod.GET, "/h2-console/**").permitAll() // 배포 확인용 임시 허용 diff --git a/src/main/java/com/example/FixLog/controller/MypageMemberController.java b/src/main/java/com/example/FixLog/controller/MypageMemberController.java index 05d115e..e5ace04 100644 --- a/src/main/java/com/example/FixLog/controller/MypageMemberController.java +++ b/src/main/java/com/example/FixLog/controller/MypageMemberController.java @@ -16,6 +16,8 @@ import jakarta.validation.Valid; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; +import com.example.FixLog.dto.s3.PresignedUploadResponseDto; + import java.util.Map; @@ -55,9 +57,9 @@ public ResponseEntity> presignProfileImage( ) { if (member == null) throw new CustomException(ErrorCode.UNAUTHORIZED); - String key = s3Service.generateKey("profile", filename); - String uploadUrl = s3Service.generatePresignedUrl("profile", filename, 15); - String fileUrl = s3Service.getObjectUrl(key); + PresignedUploadResponseDto responseDto = s3Service.generatePresignedUploadUrl("profile", filename, 15); + String uploadUrl = responseDto.getPresignedUrl(); + String fileUrl = responseDto.getFileUrl(); PresignResponseDto dto = new PresignResponseDto(uploadUrl, fileUrl); return ResponseEntity.ok(Response.success("Presigned URL 발급 성공", dto)); @@ -86,4 +88,4 @@ public ResponseEntity> editBio( memberService.editBio(member, requestDto.getBio()); return ResponseEntity.ok(Response.success("소개글 수정 성공", "SUCCESS")); } -} \ No newline at end of file +} diff --git a/src/main/java/com/example/FixLog/dto/s3/PresignedUploadResponseDto.java b/src/main/java/com/example/FixLog/dto/s3/PresignedUploadResponseDto.java new file mode 100644 index 0000000..3571185 --- /dev/null +++ b/src/main/java/com/example/FixLog/dto/s3/PresignedUploadResponseDto.java @@ -0,0 +1,12 @@ +package com.example.FixLog.dto.s3; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class PresignedUploadResponseDto { + private String presignedUrl; // PUT 요청용 presigned URL + private String fileUrl; // 업로드 완료 후 접근 가능한 S3 URL +} + diff --git a/src/main/java/com/example/FixLog/service/S3Service.java b/src/main/java/com/example/FixLog/service/S3Service.java index afd6158..5af4290 100644 --- a/src/main/java/com/example/FixLog/service/S3Service.java +++ b/src/main/java/com/example/FixLog/service/S3Service.java @@ -4,6 +4,7 @@ import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; import com.amazonaws.services.s3.model.ObjectMetadata; +import com.example.FixLog.dto.s3.PresignedUploadResponseDto; import com.example.FixLog.exception.CustomException; import com.example.FixLog.exception.ErrorCode; import lombok.RequiredArgsConstructor; @@ -46,7 +47,7 @@ public String generateKey(String dirName, String filename) { return dirName + "/" + UUID.randomUUID() + "_" + filename; } - public String generatePresignedUrl(String dirName, String filename, int minutes) { + public PresignedUploadResponseDto generatePresignedUploadUrl(String dirName, String filename, int minutes) { String key = generateKey(dirName, filename); Date expiration = new Date(System.currentTimeMillis() + minutes * 60L * 1000L); @@ -55,10 +56,11 @@ public String generatePresignedUrl(String dirName, String filename, int minutes) .withExpiration(expiration); URL url = amazonS3.generatePresignedUrl(request); - return url.toString(); + + return new PresignedUploadResponseDto(url.toString(), getObjectUrl(key)); } public String getObjectUrl(String key) { return amazonS3.getUrl(bucket, key).toString(); } -} \ No newline at end of file +} From 02e5de5a6e5bd938ff1554ea08828623f963fa6d Mon Sep 17 00:00:00 2001 From: sungchaewon Date: Sun, 22 Jun 2025 17:30:36 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix(defaultImage)=20:=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/FixLog/util/DefaultImage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/FixLog/util/DefaultImage.java b/src/main/java/com/example/FixLog/util/DefaultImage.java index fa1fd90..701b2af 100644 --- a/src/main/java/com/example/FixLog/util/DefaultImage.java +++ b/src/main/java/com/example/FixLog/util/DefaultImage.java @@ -1,5 +1,5 @@ package com.example.FixLog.util; public class DefaultImage { - public static final String PROFILE = "https://dummyimage.com/200x200/cccccc/ffffff&text=Profile"; // 임시 기본 프로필 이미지 + public static final String PROFILE = "https://fixlog-bucket.s3.ap-northeast-2.amazonaws.com/default/profile.png"; } From d6bd8f8362ae3ee9696ed38868a5d5081d00e6ff Mon Sep 17 00:00:00 2001 From: sungchaewon Date: Sun, 22 Jun 2025 17:36:36 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix(defaultImage)=20:=20mainpage,=20post?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=94=94=ED=8F=B4=ED=8A=B8=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EA=B8=B0=EB=B3=B8=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=EB=A1=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/FixLog/service/MainPageService.java | 2 +- src/main/java/com/example/FixLog/service/PostService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/FixLog/service/MainPageService.java b/src/main/java/com/example/FixLog/service/MainPageService.java index efcb6eb..827cf8e 100644 --- a/src/main/java/com/example/FixLog/service/MainPageService.java +++ b/src/main/java/com/example/FixLog/service/MainPageService.java @@ -29,7 +29,7 @@ public MainPageService(PostRepository postRepository, MemberService memberServic // 이미지 null일 때 default 사진으로 변경 (프로필 사진, public String getDefaultImage(String image){ String imageUrl = (image == null || image.isBlank()) - ? "https://example.com/default-cover-image.png" : image; + ? "https://fixlog-bucket.s3.ap-northeast-2.amazonaws.com/default/profile.png" : image; System.out.println(imageUrl); return imageUrl; } diff --git a/src/main/java/com/example/FixLog/service/PostService.java b/src/main/java/com/example/FixLog/service/PostService.java index facfa92..a839803 100644 --- a/src/main/java/com/example/FixLog/service/PostService.java +++ b/src/main/java/com/example/FixLog/service/PostService.java @@ -51,7 +51,7 @@ public PostService(PostRepository postRepository, PostLikeRepository postLikeRep // 이미지 null일 때 default 사진으로 변경 (프로필 사진, public String getDefaultImage(String image){ String imageUrl = (image == null || image.isBlank()) - ? "https://example.com/default-cover-image.png" : image; + ? "https://fixlog-bucket.s3.ap-northeast-2.amazonaws.com/default/profile.png" : image; System.out.println(imageUrl); return imageUrl; }