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

[Feat] 메뉴 폴더 저장(S3) #18

Merged
merged 27 commits into from
Dec 29, 2024
Merged

[Feat] 메뉴 폴더 저장(S3) #18

merged 27 commits into from
Dec 29, 2024

Conversation

david-parkk
Copy link
Member

@david-parkk david-parkk commented Dec 2, 2024

✏️ 작업 개요

⛳ 작업 분류

  • S3 업로드
  • 메뉴 폴더 저장
  • 메뉴 폴더 수정 삭제
  • 로깅 처리
  • 환경변수 추가

🔨 작업 상세 내용

  1. 메뉴 폴더 업로드 로직을 구현했습니다.
  2. V1에 사용했던 AWS sdk를 AWS에서 권장하는 Java 2.X으로 업그레이드 하였습니다.
  3. S3Client -> S3AsyncClient로 변경하였습니다.(문서에 정리 하였듯이 성능상 이점은 크게 없는 걸로 확인되고 있는데, AWS에서 최대한 권장하는 형태를 사용하고자 합니다)
  4. 각자 다른 로컬 개발환경을 위한 properties에 환경변수를 추가하였습니다.(나중에 yml로 전환할게요)
  5. form-data request를 format을 변경하였습니다.

💡 생각해볼 문제

  • AWS SDK에서 적합한 로직을 사용하고 싶은데, 좋은 가이드라인을 찾지 못해서 일단 AWS를 믿고 쓰기로 했습니다.
  • DTO를 추가했습니다. API를 개발하다보면 DTO를 request, response으로만 사용하게 되는 경우가 있는데, 메뉴 폴더 저장의 경우 request를 하나의 객체로 바인딩할 수 없기 때문에 받은 request를 DTO 으로 포장하도록 구현했습니다.
  • 객체 생성에 대해서 new builder of 메소드 from 메소드 등등 어떤것이 적절한 방법인지 고민하고 있습니다. 토의해보면 좋겠습니다. (builder는 캡슐화를 위반하는거 아닌가라는 생각이 드네요..) of 와 from 정적 메소드를 추가했습니다.
  • 메뉴와의 의존성은 아직 추가하지 않은 상태입니다.

- AWS SDK for Java 2.x 사용
- redis, mysql password 환경변수로 관리
- S3 configuration 설정
- FileUtil으로 UUID.random() 이아닌 시간값으로 식별자 분류
- S3 로직 AwsS3Service으로 분리
- userId 컬럼추가
- index -> customIndex 변경
- JsonInclude
- isSuccess JsonProperty 추가
- s3 업로드 로직 변경 (비동기 -> 비동기 + block)
- request(form-data)에 대해 하나의 DTO로 병합
- repository 추가
- service 메서드 주석 추가
@david-parkk david-parkk linked an issue Dec 2, 2024 that may be closed by this pull request
Copy link

github-actions bot commented Dec 2, 2024

Test Results

1 tests   1 ✅  0s ⏱️
1 suites  0 💤
1 files    0 ❌

Results for commit d5e8015.

♻️ This comment has been updated with latest results.

- s3 환경변수 추가
- redis 환경변수 추가
@david-parkk david-parkk force-pushed the KAN-20-feat/menu-folder branch from 6173b56 to 5eb7f8d Compare December 3, 2024 05:04
- s3 join 호출 위치 수정
- url response 반환 추가
- ApiUtil successOnly 추가(response가 없는 성공 메세지)
@david-parkk david-parkk reopened this Dec 26, 2024
- UserDetailImpl -> CusteomUserDetails
- 벌크 연산
- menuFolder update 함수reformat
- response 메뉴판 수정과 동일한 객체 사용
- 인텍스 기준 내림차순 정렬
- ErrorCode(글로벌) + 메세지 조합
return s3AsyncClient.putObject(objectRequest, asyncRequestBody)
.thenApply(resp -> getS3Url(name))
.exceptionally(ex -> {
throw new RuntimeException("이미지 업로드중 문제가 발생하였습니다", ex);
Copy link
Contributor

Choose a reason for hiding this comment

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

여기서 CustomException이 아닌 RuntimeException을 사용한건 의도하신 부분인가요?

Copy link
Member Author

Choose a reason for hiding this comment

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

처리 못한 부분입니다 수정하겠습니다!

@@ -15,4 +15,8 @@ public static <T> ApiResponse<T> success(T response) {
public static ApiResponse<?> error(ErrorResponse errorResponse) {
return new ApiResponse<>(false, null, errorResponse);
}

public static ApiResponse<Void> successOnly() {
Copy link
Contributor

Choose a reason for hiding this comment

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

👍

Copy link
Member Author

Choose a reason for hiding this comment

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

응답 객체가 없는 경우에 해당 메소드 호출로 통일하면 좋을 거 같습니다!

}

private MenuFolder findOneByOwn(Long userId, Long menuFolderId) {
MenuFolder menuFolder = findOne(menuFolderId);
Copy link
Contributor

Choose a reason for hiding this comment

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

현재 findOne, findOneByOwn 메소드 두 개로 분리되어 있는데, 서로 다른 예외를 다루기 위해서인가요?? 두 개의 메소드로 분리하신 이유가 궁금합니다.

Copy link
Member Author

Choose a reason for hiding this comment

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

비즈니스 로직측면에서 생각해보면 findOne 메소드를 단독으로 호출하는 경우가 없네요.. 하나로 합치는게 더 좋겠어요

import lombok.Builder;
import lombok.Getter;

@AllArgsConstructor(access = AccessLevel.PRIVATE)
Copy link
Contributor

Choose a reason for hiding this comment

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

👍

int fileExtensionIndex = originalFileName.lastIndexOf(FILE_EXTENSION_DELIMITER);
String fileExtension = originalFileName.substring(fileExtensionIndex);
String fileName = originalFileName.substring(0, fileExtensionIndex);
String now = String.valueOf(System.currentTimeMillis());
Copy link
Contributor

Choose a reason for hiding this comment

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

이런 방식으로 파일 이름 중복을 막을 수 있군요.. 👍 👍

Copy link
Member Author

Choose a reason for hiding this comment

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

예전에 UUID으로 만들었는데 파일이름 + 시간이 더 좋아보였어요.

menuFolderRepository.delete(menuFolder);
}

@Transactional
Copy link
Contributor

Choose a reason for hiding this comment

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

Transactional 어노테이션을 사용함으로써 Repository에서의 save메소드와 같은 별도의 처리를 하지 않는 방식으로 이해했는데 맞을까요?? 이에 대해 간략히 설명해주시면 감사하겠습니다 :D

Copy link
Member Author

Choose a reason for hiding this comment

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

맞아요 서비스단에서 하나의 트랜잭션으로 묶었기 때문에 레포 단에서는 트랜잭션을 고려하지 않았어요

}

@Transactional
public void deleteMenuFolder(Long userId, Long menuFolderId) {
Copy link
Contributor

Choose a reason for hiding this comment

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

메뉴판을 삭제하면 기존의 메뉴판들의 index가 조정되어야 할 것 같아요. 그리고 해당 메뉴판의 이미지는 S3에 계속 존재하는 건가요?

Copy link
Member Author

Choose a reason for hiding this comment

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

  • index 조정은 생각하지 못했네요..
  • S3 삭제는 아직 구현하지 않았어요

@You-Hyuk
Copy link
Contributor

여러 부분에서 제가 이해가 부족하여 여쭤보는게 많은 점 양해 부탁드립니다.. 그리고 이후 CustomException 이름 짓는 컨벤션이나 ErrorCode에 대해 얘기해봐도 좋을 것 같습니당

@david-parkk
Copy link
Member Author

david-parkk commented Dec 29, 2024

ErrorCode 관련해서 애매한 부분이 있었는데, 회의때 이야기 해봐요. 저도 리뷰 보면서 배우는게 많아서 서로 계속 물어보죠 ~ 🚗
리뷰 내용 반영할게요

- ErrorCode 등록
- 리뷰 반영
- findOne 메소드 findOneOwn 메소드와 통합
= 리뷰 반영
- utf-8 인코딩 추가(특수문자 처리)
- 일부 메소드 이름 변경
- 리뷰 반영
@david-parkk david-parkk force-pushed the KAN-20-feat/menu-folder branch from 4878ce6 to d5e8015 Compare December 29, 2024 10:31
@You-Hyuk You-Hyuk merged commit c9c8ca5 into develop Dec 29, 2024
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[KAN-20] 메뉴판 API 구현
2 participants