-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MATE-90 : [FEAT] S3 연결 및 파일(이미지) 관리 서비스 구현 (#92)
* MATE-90 : [FEAT] S3 파일 관리 설정 * MATE-90 : [FEAT] S3 파일 업로드, 삭제 서비스 구현 * MATE-90 : [FEAT] 굿즈 거래글 파일 업로드, 삭제 로직 추가 및 기존 로직 수정 * MATE-90 : [FEAT] 메이트 구인글 파일 업로드, 삭제 로직 추가 및 기존 로직 수정 * MATE-90 : [FEAT] 회원 프로필 파일 업로드, 삭제 로직 추가 및 기존 로직 수정 * MATE-90 : [TEST] S3 파일 관리 서비스 테스트 * MATE-90 : [TEST] 굿즈 거래글 S3 파일 관리 서비스 테스트 수정 * MATE-90 : [TEST] 메이트 구인글 S3 파일 관리 서비스 테스트 수정 * MATE-90 : [TEST] 회원 S3 파일 관리 서비스 테스트 수정 * MATE-90 : [REFACTOR] IOException을 도메인의 컨트롤러, 서비스가 아닌 FileService에서 처리하도록 수정 * MATE-90 : [REFACTOR] 도메인 서비스에서 @value Bucket 의존성 제거 * MATE-90 : [REFACTOR] application.yml 삭제 * MATE-90 : [CHORE] deploy.yml 설정 * MATE-90 : [CHORE] deploy.yml 수정 * MATE-90 : [CHORE] deploy.yml 수정 * MATE-90 : [CHORE] deploy.yml 수정 * MATE-90 : [CHORE] deploy.yml 수정 * MATE-90 : [CHORE] deploy.yml 수정 * MATE-90 : [CHORE] deploy.yml 수정 * MATE-90 : [CHORE] deploy.yml 수정 * MATE-90 : [FIX] Revert c73e2ea부터 9a092a7까지 되돌림
- Loading branch information
Showing
21 changed files
with
325 additions
and
279 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
33 changes: 33 additions & 0 deletions
33
src/main/java/com/example/mate/common/config/S3Config.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package com.example.mate.common.config; | ||
|
||
import com.amazonaws.auth.AWSStaticCredentialsProvider; | ||
import com.amazonaws.auth.BasicAWSCredentials; | ||
import com.amazonaws.services.s3.AmazonS3Client; | ||
import com.amazonaws.services.s3.AmazonS3ClientBuilder; | ||
import org.springframework.beans.factory.annotation.Value; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
|
||
@Configuration | ||
public class S3Config { | ||
|
||
@Value("${cloud.aws.credentials.access_key}") | ||
private String accessKey; | ||
|
||
@Value("${cloud.aws.credentials.secret_key}") | ||
private String secretKey; | ||
|
||
@Value("${cloud.aws.region.static}") | ||
private String region; | ||
|
||
@Bean | ||
public AmazonS3Client amazonS3Client() { | ||
BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); | ||
|
||
return (AmazonS3Client) AmazonS3ClientBuilder | ||
.standard() | ||
.withRegion(region) | ||
.withCredentials(new AWSStaticCredentialsProvider(credentials)) | ||
.build(); | ||
} | ||
} |
46 changes: 0 additions & 46 deletions
46
src/main/java/com/example/mate/common/utils/file/FileUploader.java
This file was deleted.
Oops, something went wrong.
89 changes: 89 additions & 0 deletions
89
src/main/java/com/example/mate/domain/file/FileService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
package com.example.mate.domain.file; | ||
|
||
import com.amazonaws.services.s3.AmazonS3; | ||
import com.amazonaws.services.s3.model.ObjectMetadata; | ||
import com.example.mate.common.error.CustomException; | ||
import com.example.mate.common.error.ErrorCode; | ||
import lombok.Getter; | ||
import lombok.RequiredArgsConstructor; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.beans.factory.annotation.Value; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
import org.springframework.web.multipart.MultipartFile; | ||
|
||
import java.util.UUID; | ||
|
||
@Slf4j | ||
@Service | ||
@RequiredArgsConstructor | ||
@Transactional | ||
public class FileService { | ||
|
||
// 파일명에서 허용하지 않는 문자들에 대한 정규식 | ||
private static final String FILE_NAME_REGEX = "[^a-zA-Z0-9.\\-_]"; | ||
private static final String FILE_NAME_REPLACEMENT = "_"; | ||
|
||
private final AmazonS3 amazonS3; | ||
|
||
@Getter | ||
@Value("${cloud.aws.s3.bucket}") | ||
private String bucket; | ||
|
||
// 파일 업로드 | ||
public String uploadFile(MultipartFile file) { | ||
String fileName = getFileName(file); | ||
|
||
ObjectMetadata metadata = new ObjectMetadata(); | ||
metadata.setContentLength(file.getSize()); | ||
metadata.setContentType(file.getContentType()); | ||
|
||
try { | ||
amazonS3.putObject(bucket, fileName, file.getInputStream(), metadata); // 파일 저장 | ||
} catch (Exception e) { | ||
throw new CustomException(ErrorCode.FILE_UPLOAD_ERROR); | ||
} | ||
return amazonS3.getUrl(bucket, fileName).toString(); // 파일 저장된 URL 반환 | ||
} | ||
|
||
// 파일 삭제 | ||
public void deleteFile(String imageUrl) { | ||
String key = extractKeyFromUrl(imageUrl); | ||
try { | ||
amazonS3.deleteObject(bucket, key); // 파일 삭제 | ||
} catch (Exception e) { | ||
throw new CustomException(ErrorCode.FILE_DELETE_ERROR); | ||
} | ||
} | ||
|
||
/** | ||
* S3 URL에서 객체 키를 추출 | ||
* | ||
* @param imageUrl S3 URL | ||
* @return 추출된 객체 키 | ||
*/ | ||
private String extractKeyFromUrl(String imageUrl) { | ||
return imageUrl.replace("https://" + bucket + ".s3.ap-northeast-2.amazonaws.com/", ""); | ||
} | ||
|
||
/** | ||
* 파일명에서 허용되지 않는 문자를 제거하고, UUID 를 추가한 새로운 파일명을 생성 | ||
* | ||
* @param file 업로드할 파일 | ||
* @return UUID 를 포함한 새로운 파일명 | ||
*/ | ||
private static String getFileName(MultipartFile file) { | ||
String uuid = UUID.randomUUID().toString(); | ||
return uuid + FILE_NAME_REPLACEMENT + cleanFileName(file.getOriginalFilename()); | ||
} | ||
|
||
/** | ||
* 파일 이름에서 허용되지 않는 문자를 대체 문자로 변경합니다. | ||
* | ||
* @param fileName 원본 파일명 | ||
* @return 대체된 파일명 | ||
*/ | ||
private static String cleanFileName(String fileName) { | ||
return fileName.replaceAll(FILE_NAME_REGEX, FILE_NAME_REPLACEMENT); | ||
} | ||
} |
20 changes: 8 additions & 12 deletions
20
...mate/common/utils/file/FileValidator.java → ...ample/mate/domain/file/FileValidator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.