Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

이미지 S3 업로드 기능 구현 #707

Merged
merged 13 commits into from
Nov 17, 2023
Merged

이미지 S3 업로드 기능 구현 #707

merged 13 commits into from
Nov 17, 2023

Conversation

kwonyj1022
Copy link
Collaborator

📄 작업 내용 요약

이미지 S3 업로드 기능 구현

🙋🏻 리뷰 시 주의 깊게 확인해야 하는 코드

@Profile이랑 @ConditionalOnProperty 붙은 부분 뭔가 덕지덕지 붙은 느낌인데 혹시나 중복된 설정인지(없어도 되는 설정이 있는지) 확인 부탁드립니다. 서브모듈은 제가 업데이트해 놓겠습니다!

📎 Issue 번호

@kwonyj1022 kwonyj1022 added backend 백엔드와 관련된 이슈나 PR에 사용 feature 기능 추가 시 labels Oct 17, 2023
@kwonyj1022 kwonyj1022 added this to the 최종 데모데이 milestone Oct 17, 2023
@kwonyj1022 kwonyj1022 requested review from apptie, JJ503 and swonny October 17, 2023 08:20
Copy link
Collaborator

@apptie apptie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve를 하지만 질문이 있습니다
그렇습니다


@Component
@ConditionalOnProperty(name = "aws.s3.enabled", havingValue = "false")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

질문

해당 로직을 @Profile이 아닌 @ComditionalOnProperty를 통해 사용해주신 이유가 있으실까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트와 로컬 환경뿐만 아니라 프로덕션 환경에서도 s3를 사용할지 말지를 제어할 수 있도록 하기 위해 @ComditionalOnProperty를 사용했습니다.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

칭찬

기존에 했던 방법보다 해당 방법이 더 좋네요!
기존에는 로컬에서만 가능하고 만약 s3에 문제가 생긴다면 다시 수정을 진행했어야 했는데, 해당 값만 수정하면 되니 더 편하네요.

import java.util.UUID;

@Component
@Profile("!local && !test")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

선택

@Profile("!local && !test")이 계속 반복되는 것 같은데 좀 의미있는 커스텀 어노테이션으로 변경할만할 것 같습니다
뭐 대충 @ProductProfile이나 뭐 그런 느낌으로?
물론 선택입니다

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋습니다! 이 생각은 못했네요

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

칭찬

우와 지토 좋은 아이디어 감사합니다

Comment on lines +73 to +75
} catch (final SdkException ex) {
throw new StoreImageFailureException("AWS 이미지 저장에 실패했습니다.", ex);
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

칭찬

예외 처리 👍

Comment on lines +38 to +39
@Mock
S3Client s3Client;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

질문

테스트 영역 AwsConfiguration에서 이미 S3Client를 빈으로 등록할 때 mock()을 통해 Mock bean을 등록해주었는데, 여기서 @Mock 어노테이션을 사용한 이유가 있을까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AWS_이미지_저장에_실패한_경우_예외가_발생한다, 유효한_이미지_파일인_경우_이미지_파일을_저장한다 테스트에서 s3client를 모킹했어야했기 때문입니다. 그런데 테스트영역 AwsConfiguration은 굳이 필요가 없었네요. 테스트용 AwsConfiguration을 삭제하도록 하겠습니다.

Copy link
Member

@JJ503 JJ503 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

엔초 고생 많으셨습니다!
간단한 질문들이 몇 가지 있지만 큰 코드 수정을 일으키진 않을 것 같아 approve 합니다!

pr과 관련해 궁금한 사항이 있는데, 조회에 대한 pr이 만약 늦게 머지가 된다면 이 pr이 먼저 머지되어도 괜찮을까요?
이미지 업로드는 모두 s3에 진행되는데 이에 대한 조회 쿼리가 없다보니 걱정이 되어 질문드립니다.

@@ -7,7 +7,10 @@

public interface StoreImageProcessor {

StoreImageDto storeImageFile(MultipartFile imageFile);
List<String> WHITE_IMAGE_EXTENSION = List.of("jpg", "jpeg", "png");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

질문

전에 클라이언트에서 jpg, jpeg만 와서 png는 넣을 지 말지 얘기했던 것 같은데, png도 그냥 하는 걸로 결정 됐었나요?
사소하긴 하지만, 기억이 나지 않아 여쭤봅니다.


@Component
@ConditionalOnProperty(name = "aws.s3.enabled", havingValue = "false")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

칭찬

기존에 했던 방법보다 해당 방법이 더 좋네요!
기존에는 로컬에서만 가능하고 만약 s3에 문제가 생긴다면 다시 수정을 진행했어야 했는데, 해당 값만 수정하면 되니 더 편하네요.

@@ -47,16 +48,16 @@ public StoreImageDto storeImageFile(MultipartFile imageFile) {
imageFile.transferTo(new File(fullPath));

return new StoreImageDto(originalImageFileName, storeImageFileName);
} catch (IOException ex) {
} catch (final IOException ex) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

칭찬

final 붙이기 감사합니다~

Comment on lines +25 to +26
@ProductProfile
@ConditionalOnProperty(name = "aws.s3.enabled", havingValue = "true")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

질문

로컬과 테스트에서는 해당 값이 false로 되어 있을 텐데 @ProductProfile을 해주는 것이 더 명확하고 실수를 방지할 수 있기에 둘 다 해준 것일까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 어노테이션을 통해 운영환경에서만 사용하는구나를 알 수 있도록 하기 위함도 있고, 역할이 조금 다르다고 생각하기도 했습니다.
@ProductProfile의 경우 운영, 로컬, 테스트 중 어느 환경인지에 대해 명시하기 위한 어노테이션이고, @ConditionalOnProperty는 S3를 사용하냐 마냐를 명시하기 위한 어노테이션이기 때문입니다.

Copy link
Collaborator

@swonny swonny left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

엔초 리뷰가 너무 늦어져서 죄송합니다 ㅠ_ㅠ
작업해주셔서 너무 감사해요
고생 많으셨습니다


@Component
@Profile("local || test")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

storeImageFile() 메서드 내부에 final이 누락된 것을 발견했습니다
물론 엔초의 작업은 아니겠지만.....
final을 붙여주시면 아주 감사하겠습니다 👍🏻

import java.util.UUID;

@Component
@Profile("!local && !test")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

칭찬

우와 지토 좋은 아이디어 감사합니다

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;

@ProductProfile
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

칭찬

엔초 멋집니다

@kwonyj1022 kwonyj1022 merged commit a97b42d into develop-be Nov 17, 2023
1 check passed
@kwonyj1022 kwonyj1022 deleted the feature/643 branch November 17, 2023 08:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend 백엔드와 관련된 이슈나 PR에 사용 feature 기능 추가 시
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

4 participants