Skip to content

Commit

Permalink
refactor: FileStoreService 인터페이스 분리
Browse files Browse the repository at this point in the history
  • Loading branch information
koo995 committed Oct 13, 2024
1 parent af268e6 commit e0d339c
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 103 deletions.
87 changes: 3 additions & 84 deletions src/main/java/flab/nutridiary/commom/file/FileStoreService.java
Original file line number Diff line number Diff line change
@@ -1,89 +1,8 @@
package flab.nutridiary.commom.file;


import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import flab.nutridiary.commom.exception.SystemException;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.UUID;

@RequiredArgsConstructor
@Service
public class FileStoreService {
private final AmazonS3 amazonS3;

@Value("${cloud.aws.s3.bucketName}")
private String bucketName;

public String uploadReviewImage(MultipartFile image) {
String directory = "review/";

String s3FileName = directory + generateS3FileName(image);
return uploadToS3(s3FileName, image);
}

public void deleteImageFromS3(String imageAddress){
String key = getKeyFromImageAddress(imageAddress);
try{
amazonS3.deleteObject(new DeleteObjectRequest(bucketName, key));
}catch (Exception e){
throw new SystemException("이미지 삭제 중 오류가 발생했습니다.");
}
}

private String getExtension(String fileName) {
return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
}

private String generateS3FileName(MultipartFile file) {
String extension = getExtension(file.getOriginalFilename());
return UUID.randomUUID().toString().substring(0, 10) + "_" + LocalDateTime.now() + "." + extension;
}

private ObjectMetadata getObjectMetadata(MultipartFile file, String extension) {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("image/" + extension);
metadata.setContentLength(file.getSize());
return metadata;
}

private String getS3FileUrl(String s3FileName) {
return amazonS3.getUrl(bucketName, s3FileName).toString();
}

private String uploadToS3(String s3FileName, MultipartFile file) {
String extension = getExtension(file.getOriginalFilename());
ByteArrayInputStream inputStream = null;
try {
inputStream = new ByteArrayInputStream(file.getBytes());
} catch (IOException e) {
throw new SystemException("이미지처리 중 오류가 발생했습니다.");
}
ObjectMetadata metadata = getObjectMetadata(file, extension);
amazonS3.putObject(new PutObjectRequest(bucketName, s3FileName, inputStream, metadata));
return getS3FileUrl(s3FileName);
}

private String getKeyFromImageAddress(String imageAddress){
try{
URL url = new URL(imageAddress);
String decodingKey = URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8);
return decodingKey.substring(1); // 맨 앞의 '/' 제거
}catch (MalformedURLException e){
throw new SystemException("이미지 주소가 올바르지 않습니다.");
}
}
public interface FileStoreService {
public String uploadReviewImage(MultipartFile image);
public void deleteImageFromS3(String imageAddress);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package flab.nutridiary.commom.file;


import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import flab.nutridiary.commom.exception.SystemException;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.UUID;

@Profile({"dev", "prod"})
@RequiredArgsConstructor
@Service
public class FileStoreServiceImpl implements FileStoreService {
private final AmazonS3 amazonS3;

@Value("${cloud.aws.s3.bucketName}")
private String bucketName;

public String uploadReviewImage(MultipartFile image) {
String directory = "review/";

String s3FileName = directory + generateS3FileName(image);
return uploadToS3(s3FileName, image);
}

public void deleteImageFromS3(String imageAddress){
String key = getKeyFromImageAddress(imageAddress);
try{
amazonS3.deleteObject(new DeleteObjectRequest(bucketName, key));
}catch (Exception e){
throw new SystemException("이미지 삭제 중 오류가 발생했습니다.");
}
}

private String getExtension(String fileName) {
return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
}

private String generateS3FileName(MultipartFile file) {
String extension = getExtension(file.getOriginalFilename());
return UUID.randomUUID().toString().substring(0, 10) + "_" + LocalDateTime.now() + "." + extension;
}

private ObjectMetadata getObjectMetadata(MultipartFile file, String extension) {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("image/" + extension);
metadata.setContentLength(file.getSize());
return metadata;
}

private String getS3FileUrl(String s3FileName) {
return amazonS3.getUrl(bucketName, s3FileName).toString();
}

private String uploadToS3(String s3FileName, MultipartFile file) {
String extension = getExtension(file.getOriginalFilename());
ByteArrayInputStream inputStream = null;
try {
inputStream = new ByteArrayInputStream(file.getBytes());
} catch (IOException e) {
throw new SystemException("이미지처리 중 오류가 발생했습니다.");
}
ObjectMetadata metadata = getObjectMetadata(file, extension);
amazonS3.putObject(new PutObjectRequest(bucketName, s3FileName, inputStream, metadata));
return getS3FileUrl(s3FileName);
}

private String getKeyFromImageAddress(String imageAddress){
try{
URL url = new URL(imageAddress);
String decodingKey = URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8);
return decodingKey.substring(1); // 맨 앞의 '/' 제거
}catch (MalformedURLException e){
throw new SystemException("이미지 주소가 올바르지 않습니다.");
}
}
}
6 changes: 3 additions & 3 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,6 @@ spring:
cloud:
aws:
s3:
endpoint: ${S3_END_POINT}
bucketName: ${S3_BUCKET_NAME}
regionName: ${AWS_REGION_NAME}
endpoint: https://kr.object.ncloudstorage.com
bucketName: nutridiary-image
regionName: kr-standard
8 changes: 0 additions & 8 deletions src/test/java/flab/nutridiary/SpringBootTestSupport.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package flab.nutridiary;

import com.amazonaws.services.s3.AmazonS3;
import flab.nutridiary.commom.config.S3Config;
import flab.nutridiary.commom.file.FileStoreService;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
Expand All @@ -13,12 +11,6 @@
@SpringBootTest
public abstract class SpringBootTestSupport {

@MockBean
protected S3Config s3Config;

@MockBean
protected AmazonS3 amazonS3;

@MockBean
protected FileStoreService fileStoreService;
}
8 changes: 0 additions & 8 deletions src/test/java/flab/nutridiary/TestContainerSupport.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package flab.nutridiary;

import com.amazonaws.services.s3.AmazonS3;
import flab.nutridiary.commom.config.S3Config;
import flab.nutridiary.commom.file.FileStoreService;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
Expand All @@ -19,12 +17,6 @@
public abstract class TestContainerSupport {
static final MySQLContainer<?> mysqlContainer;

@MockBean
protected S3Config s3Config;

@MockBean
protected AmazonS3 amazonS3;

@MockBean
protected FileStoreService fileStoreService;

Expand Down

0 comments on commit e0d339c

Please sign in to comment.