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

[BSVR-68] 미디어 업로드를 위한 presigned url 생성 컴포넌트 #16

Merged
merged 25 commits into from
Jul 16, 2024

Conversation

EunjiShin
Copy link
Collaborator

@EunjiShin EunjiShin commented Jul 9, 2024

📌 개요 (필수)

  • NCP object storage에 파일을 업로드하기 위해 Presigned url을 생성해요.

🔨 작업 사항 (필수)

  • 리뷰 미디어 확장자, 경기장 좌석 배치도 미디어 확장자 enum 추가
  • presigned url 생성 컴포넌트
  • presigned url을 위한 file name 생성 컴포넌트
  • 관련 custom exception
  • 관련 테스트코드

🌱 연관 내용 (선택)

  • 아직 NCP 크레딧이 안들어와서 NCP 세팅이 안된 상태!
  • 코드 리뷰를 위해 PR을 올렸지만, 실제 merge는 @pminsung12 이 NCP 세팅 커밋 추가해주면 잘 동작하는지 실행해본 후 진행할 예정~
    • NCP 세팅이 추가된 후 (application.yml 등), FIXME 주석 박혀있는 부분들 한 번 업데이트 해주어!

💻 실행 화면 (필수)

  • 아직 NCP 세팅이 안되어서 실행 화면이 없음!

@EunjiShin EunjiShin self-assigned this Jul 9, 2024
@github-actions github-actions bot added the size/M label Jul 9, 2024
Copy link

github-actions bot commented Jul 9, 2024

Test Results

36 tests  +16   36 ✅ +16   0s ⏱️ ±0s
12 suites + 5    0 💤 ± 0 
12 files   + 5    0 ❌ ± 0 

Results for commit d692dad. ± Comparison against base commit 0e873da.

♻️ This comment has been updated with latest results.

@github-actions github-actions bot added size/L and removed size/M labels Jul 9, 2024
@EunjiShin EunjiShin added the ❌ do not merge 아직 merge하면 안되는 상태 label Jul 9, 2024
import lombok.Getter;

@Getter
public enum ImageExtension {
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

1차 MVP에서는 영상을 관리하지 않기 때문에, 이미지 확장자만 추가했어!
안드에게 문의해보니 보통 사진이 jpg, jpeg, png로 들어온다고 답변 받아서 요 값들로 enum 생성한 상태!

import lombok.Getter;

@Getter
public enum StadiumSeatMediaExtension {
Copy link
Collaborator Author

@EunjiShin EunjiShin Jul 9, 2024

Choose a reason for hiding this comment

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

공연장 좌석 배치도를 관리하기 위한 확장자 enum!
1차 MVP에서 좌석 배치도는 디자인 파트에서 코드 삽입한 svg 파일만 사용할 수 있어.

@Service
@Builder
@RequiredArgsConstructor
public class FileNameGenerator {
Copy link
Collaborator Author

@EunjiShin EunjiShin Jul 9, 2024

Choose a reason for hiding this comment

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

presigned url 생성할 때 버켓과 키 값이 필요해. 키에 활용할 파일 이름 생성자를 컴포넌트로 분리했어.

private final ReviewStorageProperties reviewStorageProperties;
private final StadiumStorageProperties stadiumStorageProperties;

private static final long EXPIRE_MS = 1000 * 60 * 2L;
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

presigned url을 서버가 발급해주면 클라이언트가 해당 url로 바로 파일을 업로드하는 구조!
이때 발급한 Url이 얼마동안 유효한지 만료 시간을 정해주어야 해.
이미지 업로드 플로우를 생각해보면 url을 받고 바로 파일 업로드가 이루어질테니까, 넉넉하게 2분 정도로 설정했어~

Comment on lines +19 to +24
@Bean
@Primary
@Override
public AmazonS3 getAmazonS3() {
return Mockito.mock(AmazonS3.class);
}
Copy link
Collaborator Author

@EunjiShin EunjiShin Jul 9, 2024

Choose a reason for hiding this comment

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

PresignedUrlGenerator 테스트를 위해 추가한 Fake!
어차피 S3 메서드는 S3에서 잘 테스트해주었을테니까, 굳이 우리가 테스트를 위해 실제로 S3에 요청을 보낼 필요는 없다고 생각했어.

FakeAmazonS3Config가 ObjectStorageConfig를 상속받기 때문에, Test 프로파일이어도 실제 AmazonS3가 빈에 등록될 수 있어. 그래서 FakeConfig에는 @primary로 우선순위를 설정해서 빈이 먼저 등록되게 하고, @Profile("test")를 이용해서 테스트 프로파일일 때만 동작하게 처리했어.

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class FakeTimeUsecase implements TimeUsecase {
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

파일 이름 생성기에서 LocalDateTime.now()를 이용하기 때문에, 테스트하기 쉽도록 Fake 구현체를 만들었어.

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class PresignedUrlGeneratorTest {
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이걸 테스트하는게 맞을까? 뭘 테스트 해야 할까?? << 고민하다가, 예외 처리만 검증해주기로 결정..!
어차피 presigned url은 amazon s3 메서드를 사용하기 때문에, 인자만 잘 던져주면 잘 생성될 거라고 생각했어.
따라서 의도한대로 예외처리가 잘 되는지만 테스트 코드로 검증해주었어.

@EunjiShin EunjiShin marked this pull request as ready for review July 9, 2024 14:18
@EunjiShin EunjiShin removed the ❌ do not merge 아직 merge하면 안되는 상태 label Jul 16, 2024
@github-actions github-actions bot added size/XL and removed size/L labels Jul 16, 2024
Copy link

This PR exceeds the recommended size of 1000 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

Copy link

This PR exceeds the recommended size of 1000 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@EunjiShin EunjiShin merged commit d8309ce into main Jul 16, 2024
4 checks passed
@EunjiShin EunjiShin deleted the feat/BSVR-68 branch July 16, 2024 13:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants