Skip to content

Commit 7e79462

Browse files
committed
2 parents 01761f8 + f9cc0f4 commit 7e79462

4 files changed

Lines changed: 35 additions & 28 deletions

File tree

src/main/java/fitfit/domain/clothes/service/ClothesCommandServiceImpl.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import fitfit.global.apiPayload.exception.handler.MemberHandler;
1717
import fitfit.global.s3.S3Service;
1818
import lombok.RequiredArgsConstructor;
19+
import org.springframework.beans.factory.annotation.Value;
1920
import org.springframework.stereotype.Service;
2021
import org.springframework.transaction.annotation.Transactional;
2122
import org.springframework.util.StringUtils;
@@ -34,6 +35,9 @@ public class ClothesCommandServiceImpl implements ClothesCommandService {
3435
private final S3Service s3Service;
3536
private final JwtProvider jwtProvider;
3637

38+
@Value("${cloud.aws.s3.clothes-bucket}")
39+
private String clothesBucket;
40+
3741
@Override
3842
public ClothesResponseDTO.CreateClothesResponse createClothes(String authorization,
3943
ClothesRequestDTO.CreateClothesRequest requestDto) throws IOException {
@@ -50,7 +54,7 @@ public ClothesResponseDTO.CreateClothesResponse createClothes(String authorizati
5054
validateCreateClothesRequest(requestDto);
5155

5256
// 가상 피팅 이미지 업로드 -> 'fitting' 폴더
53-
String fittingImageUrl = s3Service.upload(requestDto.getFittingImage(), "fitting");
57+
String fittingImageUrl = s3Service.upload(requestDto.getFittingImage(), "fitting", clothesBucket);
5458

5559
// Clothes 엔티티 생성
5660
Clothes clothes = ClothesConverter.toClothes(requestDto, seller, category, fittingImageUrl);
@@ -59,7 +63,7 @@ public ClothesResponseDTO.CreateClothesResponse createClothes(String authorizati
5963
if (requestDto.getDisplayImages() != null && !requestDto.getDisplayImages().isEmpty()) {
6064
for (String displayImage : requestDto.getDisplayImages()) {
6165
if(displayImage != null && !displayImage.isEmpty()){
62-
String displayImageUrl = s3Service.upload(displayImage, "display");
66+
String displayImageUrl = s3Service.upload(displayImage, "display", clothesBucket);
6367
ClothesImage imageEntity = ClothesImage.builder()
6468
.imageUrl(displayImageUrl)
6569
.build();

src/main/java/fitfit/domain/member/service/MemberCommandServiceImpl.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
import fitfit.global.enums.MemberStatus;
2222
import fitfit.global.enums.Provider;
2323
import fitfit.global.enums.Style;
24+
import fitfit.global.s3.S3Service;
2425
import lombok.RequiredArgsConstructor;
2526
import lombok.extern.slf4j.Slf4j;
27+
import org.springframework.beans.factory.annotation.Value;
2628
import org.springframework.stereotype.Service;
2729
import org.springframework.transaction.annotation.Transactional;
2830

@@ -40,8 +42,10 @@ public class MemberCommandServiceImpl implements MemberCommandService{
4042
private final MemberTermRepository memberTermRepository;
4143
private final TermRepository termRepository;
4244
private final AccountCommandService accountCommandService; // 의존성 추가
45+
private final S3Service s3Service;
4346

44-
private static final String DEFAULT_BODY_IMG_URL = "https://fitfit-profile-img.s3.ap-northeast-2.amazonaws.com/default_body_img.jpg";
47+
@Value("${cloud.aws.s3.profile-bucket}")
48+
private String profileBucket;
4549

4650
@Override
4751
@Transactional
@@ -115,8 +119,9 @@ public MemberResponseDTO.MyProfileDetailDto updateProfile(String authorization,
115119

116120
member.updateNickname(req.nickname());
117121

118-
if(req.profileImgUrl() !=null){
119-
member.updateProfileImgUrl(req.profileImgUrl());
122+
if(req.profileImgUrl() != null && !req.profileImgUrl().isBlank() && req.profileImgUrl().startsWith("data:image")){
123+
String profileImgUrl = s3Service.upload(req.profileImgUrl(), "profile_images", profileBucket);
124+
member.updateProfileImgUrl(profileImgUrl);
120125
}
121126

122127
if(req.preferredStyles()!=null) {
@@ -147,8 +152,9 @@ public MemberResponseDTO.BodyInfoResDTO updateBodyInfo(String authorization, Mem
147152

148153
member.updateHeight(req.height());
149154
member.updateWeight(req.weight());
150-
if(req.bodyImgUrl()!=null){
151-
member.updateFullBodyImgUrl(req.bodyImgUrl());
155+
if(req.bodyImgUrl() != null && !req.bodyImgUrl().isBlank() && req.bodyImgUrl().startsWith("data:image")){
156+
String bodyImgUrl = s3Service.upload(req.bodyImgUrl(), "fitting_member_images", profileBucket);
157+
member.updateFullBodyImgUrl(bodyImgUrl);
152158
}
153159
return MemberConverter.toMemberBodyInfoResDTO(member);
154160
}
@@ -161,6 +167,14 @@ public void withdrawMember(String authorization) {
161167
Member findMember = memberRepository.findById(memberId)
162168
.orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND));
163169

170+
// S3에 저장된 이미지 삭제
171+
if (findMember.getProfileImgUrl() != null && !findMember.getProfileImgUrl().isBlank()) {
172+
s3Service.deleteFile(findMember.getProfileImgUrl());
173+
}
174+
if (findMember.getFullBodyImgUrl() != null && !findMember.getFullBodyImgUrl().isBlank()) {
175+
s3Service.deleteFile(findMember.getFullBodyImgUrl());
176+
}
177+
164178
findMember.updateStatus(MemberStatus.INACTIVE);
165179

166180
memberTokenRepository.deleteByMember(findMember);
@@ -299,11 +313,7 @@ private void updateMemberInfo(Member member, MemberRequestDTO.MemberSignupReques
299313
if (request.getStyleList() != null) {
300314
member.updatePreferredStyle(request.getStyleList());
301315
}
302-
if (request.getFullBodyImgUrl() != null) {
303-
member.updateFullBodyImgUrl(request.getFullBodyImgUrl());
304-
} else {
305-
member.updateFullBodyImgUrl(DEFAULT_BODY_IMG_URL);
306-
}
307-
316+
member.updateFullBodyImgUrl(request.getFullBodyImgUrl());
308317
}
309318
}
319+

src/main/java/fitfit/global/s3/S3Service.java

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@
55
import com.amazonaws.services.s3.model.ObjectMetadata;
66
import lombok.RequiredArgsConstructor;
77
import lombok.extern.slf4j.Slf4j;
8-
import org.springframework.beans.factory.annotation.Value;
98
import org.springframework.stereotype.Service;
109

1110
import java.io.ByteArrayInputStream;
12-
import java.io.IOException;
1311
import java.net.URL;
1412
import java.net.URLDecoder;
1513
import java.nio.charset.StandardCharsets;
@@ -23,11 +21,8 @@ public class S3Service {
2321

2422
private final AmazonS3Client amazonS3Client;
2523

26-
@Value("${cloud.aws.s3.bucket}")
27-
private String bucket;
28-
2924
// Base64 인코딩된 이미지를 S3에 업로드하는 메서드
30-
public String upload(String base64Image, String dirName) {
25+
public String upload(String base64Image, String dirName, String bucket) {
3126
// "data:image/jpeg;base64," 부분 제거
3227
String[] parts = base64Image.split(",");
3328
String data = parts[1];
@@ -56,16 +51,13 @@ private ObjectMetadata createMetadata(Long size, String contentType) {
5651
public void deleteFile(String fileUrl) {
5752
try {
5853
URL url = new URL(fileUrl);
59-
String path = url.getPath(); // URL에서 path(경로) 부분 추출 (e.g., "/bucket/key" 또는 "/key")
60-
String fileKey = path.substring(1); // 맨 앞의 "/" 제거
61-
62-
// Path-style URL(e.g., "bucket/key")인 경우, 경로 맨 앞의 버킷 이름을 제거하여 순수 키만 남김
63-
if (fileKey.startsWith(bucket + "/")) {
64-
fileKey = fileKey.substring(bucket.length() + 1);
65-
}
54+
String host = url.getHost(); // ex: bucket-name.s3.ap-northeast-2.amazonaws.com
55+
String bucketName = host.split("\\.")[0];
6656

57+
String fileKey = url.getPath().substring(1); // ex: /key -> key
6758
fileKey = URLDecoder.decode(fileKey, StandardCharsets.UTF_8);
68-
amazonS3Client.deleteObject(new DeleteObjectRequest(bucket, fileKey));
59+
60+
amazonS3Client.deleteObject(new DeleteObjectRequest(bucketName, fileKey));
6961
log.info("S3 파일 삭제 성공: {}", fileKey);
7062
} catch (Exception e) {
7163
log.error("S3 파일 삭제 실패. URL: {}, Error: {}", fileUrl, e.getMessage());

src/main/resources/application.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ logging:
4141
cloud:
4242
aws:
4343
s3:
44-
bucket: fitfit-clothes
44+
clothes-bucket: fitfit-clothes
45+
profile-bucket: fitfit-profile-img
4546
credentials:
4647
access-key: AKIAU3XHQYLTYOFDMQH5
4748
secret-key: 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

0 commit comments

Comments
 (0)