Skip to content

Commit 28bff8b

Browse files
authored
fix : 회원 정보 수정 API Swagger 및 S3 이미지 삭제 버그 수정 (#201)
* fix : swagger 설정 변경 및 내 정보 수정 API 테스트 동작하도록 수정 - swagger 페이지에서 서버(배포 서버와 로컬 서버)를 선택할 수 있도록 함 * fix : 프로필 이미지 수정 시 더 이상 사용되지 않는 기존 이미지가 s3 버킷에서 삭제되지 않는 문제 수정 - 삭제할 버킷의 이미지의 변수가 새로운 이미지 URL을 참조하고 있었음 - 인코딩 문제 해결 * fix : oldImageUrl이 빈 문자열("")일 때에도 정상적으로 예외 처리하도록 수정
1 parent 1c0d96a commit 28bff8b

4 files changed

Lines changed: 28 additions & 7 deletions

File tree

src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.stereotype.Service;
3636

3737
import org.springframework.transaction.annotation.Transactional;
38+
import org.springframework.util.StringUtils;
3839
import org.springframework.web.multipart.MultipartFile;
3940

4041
import lombok.RequiredArgsConstructor;
@@ -106,10 +107,10 @@ public UserInfoResponse modifyUserInfo(AuthUser authUser, ModifyUserInfoRequest
106107
String oldImageUrl = user.getProfileImageUrl();
107108

108109
user.modifyProfileImage(profileImageUrl);
109-
if (oldImageUrl!=null) {
110-
s3Uploader.delete(user.getProfileImageUrl(), "profile");
111-
}
112110

111+
if (StringUtils.hasText(oldImageUrl)) {
112+
s3Uploader.delete(oldImageUrl, "profile");
113+
}
113114
}
114115

115116
return UserInfoResponse.builder()

src/main/java/org/ezcode/codetest/infrastructure/s3/S3Uploader.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.ezcode.codetest.infrastructure.s3;
22

33
import java.io.IOException;
4+
import java.net.URLDecoder;
5+
import java.nio.charset.StandardCharsets;
46
import java.util.UUID;
57

68
import org.ezcode.codetest.infrastructure.s3.exception.S3Exception;
@@ -78,7 +80,10 @@ public void delete(String fileUrl, String dirName) {
7880
if (dirName.equalsIgnoreCase("profile")) {
7981
fileName = extractKeyFromProfileUrl(fileUrl);
8082
}
81-
amazonS3.deleteObject(bucket, fileName); // S3 내 이미지 객체 제거.
83+
84+
String decodedFileName = URLDecoder.decode(fileName, StandardCharsets.UTF_8);
85+
amazonS3.deleteObject(bucket, decodedFileName); // S3 내 이미지 객체 제거.
86+
8287
log.info("S3에서 이미지 삭제 완료: {}", fileName);
8388
} catch (Exception e) {
8489
log.error("S3 이미지 삭제 실패: {}", fileUrl, e);

src/main/java/org/ezcode/codetest/infrastructure/swagger/config/SwaggerConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
@Server(
1717
url = "https://api.ezcode.my", // ← 슬래시 없이 호스트만!
1818
description = "Production server"
19+
),
20+
@Server(
21+
url = "http://localhost:8080",
22+
description = "Local Server"
1923
)
2024
},
2125
info = @Info(title = "API 문서", version = "v1"),

src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package org.ezcode.codetest.presentation.usermanagement;
22

3-
import org.ezcode.codetest.application.submission.dto.response.language.LanguageResponse;
43
import org.ezcode.codetest.application.usermanagement.user.dto.request.ModifyUserInfoRequest;
54
import org.ezcode.codetest.application.usermanagement.user.dto.request.ChangeUserPasswordRequest;
65
import org.ezcode.codetest.application.usermanagement.user.dto.response.ChangeUserPasswordResponse;
7-
import org.ezcode.codetest.application.usermanagement.user.dto.response.GrantAdminRoleResponse;
86
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserDailySolvedHistoryResponse;
97
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserInfoResponse;
108
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserProfileImageResponse;
@@ -26,6 +24,9 @@
2624
import org.springframework.web.multipart.MultipartFile;
2725

2826
import io.swagger.v3.oas.annotations.Operation;
27+
import io.swagger.v3.oas.annotations.Parameter;
28+
import io.swagger.v3.oas.annotations.media.Content;
29+
import io.swagger.v3.oas.annotations.media.Encoding;
2930
import io.swagger.v3.oas.annotations.tags.Tag;
3031
import jakarta.validation.Valid;
3132
import lombok.RequiredArgsConstructor;
@@ -46,7 +47,17 @@ public ResponseEntity<UserInfoResponse> getUserInfo(@AuthenticationPrincipal Aut
4647
return ResponseEntity.status(HttpStatus.OK).body(userService.getUserInfo(authUser));
4748
}
4849

49-
@Operation(summary = "내 정보 수정", description = "닉네임, 블로그, 깃허브, 소개 등 개인 정보를 추가하거나 수정합니다.")
50+
@Operation(
51+
summary = "내 정보 수정",
52+
description = "닉네임, 블로그, 깃허브, 소개 등 개인 정보를 추가하거나 수정합니다.",
53+
// ▼ 이 부분이 핵심입니다. Swagger에게 'request' 파트의 Content-Type을 강제합니다.
54+
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
55+
content = @Content(
56+
mediaType = MediaType.MULTIPART_FORM_DATA_VALUE,
57+
encoding = @Encoding(name = "request", contentType = MediaType.APPLICATION_JSON_VALUE)
58+
)
59+
)
60+
)
5061
@PutMapping(value = "/users", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
5162
public ResponseEntity<UserInfoResponse> modifyUserInfo(
5263
@AuthenticationPrincipal AuthUser authUser,

0 commit comments

Comments
 (0)