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(#92): 이미지 삭제/조회 api 개발 및 리뷰 수정 로직 변경 #93

Merged
merged 3 commits into from
Feb 11, 2024

Conversation

dldmsql
Copy link
Member

@dldmsql dldmsql commented Feb 11, 2024

작업 내용

  • 유저 프로필 이미지 관련
  1. 피그마에 정의되어 있는 유저의 기본 프로필 사진을 S3 /user 폴더 아래 적재했습니다.
  2. 적재된 이미지의 imageKey를 갖는 별도의 테이블을 생성했습니다. ( 이 테이블은 admin 스키마에 존재합니다. )
  3. 기본 이미지로 사용되는 이미지 리스트를 조회하는 api를 새로 개발했습니다.
  • 리뷰 수정 시, 이미지 관련
  1. 리뷰 수정 시, 변경되는 이미지에 대해 s3에서 삭제하는 로직을 추가했습니다.
  • 리뷰 삭제 시, 이미지 관련
  1. 리뷰 삭제 시, 연관된 이미지들을 삭제 상태로 변경하는 로직을 추가했습니다.
  • 클라이언트가 이미지를 잘못 업로드 했을 경우
  1. s3에 적재된 이미지를 삭제할 수 있는 api를 새로 개발했습니다.

관련 이슈

#92

작업 확인 방법

swagger-ui를 통해 확인 가능합니다.

추가 정보 (선택 사항)

admin 스키마는 개발/운영 환경에 종속되지 않고 독립적으로 관리될 수 있도록 하기 위해 별도로 생성하였습니다.

@dldmsql dldmsql added Feature 기능 개발 Fix 에러 수정 labels Feb 11, 2024
@dldmsql dldmsql self-assigned this Feb 11, 2024
Comment on lines +26 to +28
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
Copy link
Member Author

Choose a reason for hiding this comment

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

@Qbeom0925 해당 데이터는 삭제여부로 관리하지 않고, 즉시 삭제를 하는 것이 추후 관리 포인트를 늘리지 않는 것이라 판단하여 meta 데이터로 생성일시만을 두었습니다.

Comment on lines +65 to +70
String fileKey = "dev/" + fileUrl;
amazonS3.deleteObject(new DeleteObjectRequest(bucket, fileKey));
} catch (Exception e) {
e.printStackTrace();
log.error("S3 이미지 삭제 실패 fileUrl: {}", fileUrl);
}
Copy link
Member Author

Choose a reason for hiding this comment

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

@Qbeom0925 S3에서 이미지 삭제 실패 시, 이유를 트랙킹하기 위해 로그를 남깁니다.
추가로 현재 S3에 prod 폴더가 없어서 dev로 하드코딩 해두었습니다.

Copy link
Member

Choose a reason for hiding this comment

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

확실히 실패에 대한 트래킹 목적의 로그를 남기는 것은 좋은 것 같습니다.

Comment on lines +18 to 21
@NotNull
Integer grade,
@Schema(
description = "학식에 대한 리뷰 내용을 1글자 이상 입력해주세요. 사진 리뷰인 경우 null로 보내주세요.",
Copy link
Member Author

Choose a reason for hiding this comment

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

nullable이면 NPE 발생해서 notNull로 수정했습니다.

Comment on lines +38 to +41

public void deleteImage() {
this.isDeleted = true;
}
Copy link
Member Author

Choose a reason for hiding this comment

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

이미지 객체에서 삭제 여부를 업데이트하는 로직이 ... 없더라구요?!@ 그래서 추가했습니다.

Comment on lines 37 to 46
.leftJoin(image)
.on(review.idx.eq(image.review.idx))
.leftJoin(reviewMark)
.on(review.idx.eq(reviewMark.review.idx))
.innerJoin(restaurant)
.on(
review.restaurant
.idx
.eq(restaurant.idx)
.and(restaurant.idx.eq(queryParam.restaurantIdx())))
Copy link
Member Author

Choose a reason for hiding this comment

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

store가 추가된 뒤로 leftJoin하면 NPE가 발생해서 innerJoin으로 변경했습니다.

Comment on lines +87 to +97
List<Image> alreadyImageList = review.getImages();
if (!alreadyImageList.isEmpty()) { // [1,2,3] <> [1,2,4] 3을 삭제
List<String> reqImgList = request.imageList();
for (Image alreadyImg : alreadyImageList) {
if (!reqImgList.contains(alreadyImg.getImageUrl())) {
s3Util.deleteImage(alreadyImg.getImageUrl());
imageCommServiceImpl.deleteImage(alreadyImg);
}
}
}

Copy link
Member Author

Choose a reason for hiding this comment

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

원본 이미지와 수정하는 이미지를 비교해서,
수정하는 이미지 list에 원본 이미지가 없다면 삭제하도록 하는 로직을 추가했습니다.
s3에서 이미지 삭제까지가 하나의 트랜잭셔으로 잡혀서 디비와 스토리지 간의 데이터 일관성을 유지할 수 있도록 했습니다.

Copy link
Member

Choose a reason for hiding this comment

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

데이터 일관성까지 고려해서 만드신것이 너무 멋집니다!!

Copy link
Member

@Qbeom0925 Qbeom0925 left a comment

Choose a reason for hiding this comment

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

메신저 통해서 이야기해주신 방향과 일치하는 구현방식인 것 같습니다! admin 패키지 추가되는 것은 향후에 백오피스 분리에도 좋을 것 같아 보입니다!!

고생하셨습니다 ㅎㅎ

Comment on lines +65 to +70
String fileKey = "dev/" + fileUrl;
amazonS3.deleteObject(new DeleteObjectRequest(bucket, fileKey));
} catch (Exception e) {
e.printStackTrace();
log.error("S3 이미지 삭제 실패 fileUrl: {}", fileUrl);
}
Copy link
Member

Choose a reason for hiding this comment

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

확실히 실패에 대한 트래킹 목적의 로그를 남기는 것은 좋은 것 같습니다.

Comment on lines 37 to 40
.leftJoin(image)
.on(review.idx.eq(image.review.idx))
.leftJoin(reviewMark)
.on(review.idx.eq(reviewMark.review.idx))
Copy link
Member

Choose a reason for hiding this comment

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

만약 해당 엔티티로 탐색 및 비즈니스 로직을 태운다면, image와 reviewMark에 대해서 isDeleted.eq(False)만 불러와도 좋을 것 같습니다!!

Copy link
Member Author

Choose a reason for hiding this comment

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

해당 부분 추가하였습니다.

Comment on lines +87 to +97
List<Image> alreadyImageList = review.getImages();
if (!alreadyImageList.isEmpty()) { // [1,2,3] <> [1,2,4] 3을 삭제
List<String> reqImgList = request.imageList();
for (Image alreadyImg : alreadyImageList) {
if (!reqImgList.contains(alreadyImg.getImageUrl())) {
s3Util.deleteImage(alreadyImg.getImageUrl());
imageCommServiceImpl.deleteImage(alreadyImg);
}
}
}

Copy link
Member

Choose a reason for hiding this comment

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

데이터 일관성까지 고려해서 만드신것이 너무 멋집니다!!

Copy link

sonarcloud bot commented Feb 11, 2024

@dldmsql dldmsql merged commit 64419e8 into develop Feb 11, 2024
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feature 기능 개발 Fix 에러 수정
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants