이번 포스트는 개인 프로젝트인 게시판 만들기에서 AWS S3와 연동 도중 발생한 작은 문제들에 관한 포스트이다.
1. API platform
API 개발중 API platform으로 주로 Insomnia를 사용했었다.
작성한 컨트롤러에서는 @RequestPart 에너테이션을 이용하여 json 타입과 form data 형식의 데이터들을 각각 받아주게 해주었는데
문제는 요청으로 보낼 각각의 데이터들에 어떤 타입의 데이터들인지 명시해주어 보내야 하는데 Insomnia에는 데이터 타입을 각각 지정해주는 기능이 없었다...
StackOverFlow에서 조차도 Postman으로 갈아타라는 답변밖에 얻을수 없었고,
결국 반강제적으로 사용이 익숙한 Insomnia를 버리고 Postman으로 갈아타버리게 되었다.
2. 같은 이름의 파일이 업로드 될 경우 기존의 파일 삭제
두번째 문제는 S3로 같은 경로, 같은 이름의 파일을 업로드 할 경우 기존의 파일에 새로운 파일이 덮어씌어지는 문제가 발생했다.
이를 해결하기 위해 파일을 저장할때 파일 이름을 적당히 코딩을 한뒤 저장해 줘야 했는데, 이때 기존의 파일이름 앞에 밀리세컨 단위의 시간을 넣어주어 해결 하게 되었다.
@Slf4j
public class S3StorageService implements StorageService {
...
...
@Override
public String store(MultipartFile multipartFile) {
// 파일의 경로와 이름 설정을 위한 메서드
String key = makeS3OBjectKey(BUCKET_POST_IMAGE_PATH, multipartFile);
PutObjectRequest request = createPutObjectRequest(BUCKET_NAME, key);
try {
final Path path = multipartFileToPath(multipartFile);
PutObjectResponse response = s3Client.putObject(request, path);
log.info("# File uploaded successfully. ETag: " + response.eTag());
return BUCKET_URL+key;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private String makeS3OBjectKey(String bucketCoffeeImagePath, MultipartFile multipartFile) {
final String fileName = multipartFile.getOriginalFilename();
String time = String.valueOf(System.currentTimeMillis());
//기존의 이름에 밀리세컨 단위의 시간을 앞에 넣어 유니크한 파일 이름으로 저장
return BUCKET_POST_IMAGE_PATH.concat("/")
.concat(time)
.concat(fileName);
}
...
...
}
3. 403 접근 불가
S3 서버와 버킷을 생성해 주고 처음 접근을 시도하자마자 발생한 문제이다.
403 Access Denied 에러가 발생하였는데 간단하게 버킷 정책을 설정해주니 해결되었다.
403 Access Denied 발생시 버킷 정책 변경 -
https://wakestand.tistory.com/300
4. Bean 생성 불가
이번 에러는 파일 업로드와는 무관한 에러이다.
위와 같이 빌더를 사용하기 위해 모든 에너테이션을 추가하게되면 가끔 Bean을 생성 할 수 없다는 에러가 발생하게되는데(지금 다시 시도해보니 또 잘 작동한다;;)
조금 귀찮더라도 필요한 에너테이션만을 사용하자.
'Projects > Personal project - 게시판 만들기' 카테고리의 다른 글
MockMVC - Multipart form data요청 테스트 (0) | 2023.06.10 |
---|---|
Mock test 단계에서 발생한 MockHttpServletResponse: body is empty (0) | 2023.06.08 |
JPQL문에서 Enum 사용하기 (0) | 2023.05.30 |
UnexpectedTypeException과 DTO에서 Enum타입 사용 (1) | 2023.05.24 |
DB연동 도중 발견된 버그들(Enumerated, AuditingEntityListener, Optional 메서드) (0) | 2023.05.22 |