-
Notifications
You must be signed in to change notification settings - Fork 0
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
Conversation
@CreatedDate | ||
@Column(updatable = false) | ||
private LocalDateTime createdAt; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Qbeom0925 해당 데이터는 삭제여부로 관리하지 않고, 즉시 삭제를 하는 것이 추후 관리 포인트를 늘리지 않는 것이라 판단하여 meta 데이터로 생성일시만을 두었습니다.
String fileKey = "dev/" + fileUrl; | ||
amazonS3.deleteObject(new DeleteObjectRequest(bucket, fileKey)); | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
log.error("S3 이미지 삭제 실패 fileUrl: {}", fileUrl); | ||
} |
There was a problem hiding this comment.
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로 하드코딩 해두었습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
확실히 실패에 대한 트래킹 목적의 로그를 남기는 것은 좋은 것 같습니다.
@NotNull | ||
Integer grade, | ||
@Schema( | ||
description = "학식에 대한 리뷰 내용을 1글자 이상 입력해주세요. 사진 리뷰인 경우 null로 보내주세요.", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nullable이면 NPE 발생해서 notNull로 수정했습니다.
|
||
public void deleteImage() { | ||
this.isDeleted = true; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이미지 객체에서 삭제 여부를 업데이트하는 로직이 ... 없더라구요?!@ 그래서 추가했습니다.
.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()))) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
store가 추가된 뒤로 leftJoin하면 NPE가 발생해서 innerJoin으로 변경했습니다.
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); | ||
} | ||
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
원본 이미지와 수정하는 이미지를 비교해서,
수정하는 이미지 list에 원본 이미지가 없다면 삭제하도록 하는 로직을 추가했습니다.
s3에서 이미지 삭제까지가 하나의 트랜잭셔으로 잡혀서 디비와 스토리지 간의 데이터 일관성을 유지할 수 있도록 했습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
데이터 일관성까지 고려해서 만드신것이 너무 멋집니다!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
메신저 통해서 이야기해주신 방향과 일치하는 구현방식인 것 같습니다! admin 패키지 추가되는 것은 향후에 백오피스 분리에도 좋을 것 같아 보입니다!!
고생하셨습니다 ㅎㅎ
String fileKey = "dev/" + fileUrl; | ||
amazonS3.deleteObject(new DeleteObjectRequest(bucket, fileKey)); | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
log.error("S3 이미지 삭제 실패 fileUrl: {}", fileUrl); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
확실히 실패에 대한 트래킹 목적의 로그를 남기는 것은 좋은 것 같습니다.
.leftJoin(image) | ||
.on(review.idx.eq(image.review.idx)) | ||
.leftJoin(reviewMark) | ||
.on(review.idx.eq(reviewMark.review.idx)) |
There was a problem hiding this comment.
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)
만 불러와도 좋을 것 같습니다!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
해당 부분 추가하였습니다.
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); | ||
} | ||
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
데이터 일관성까지 고려해서 만드신것이 너무 멋집니다!!
Quality Gate passedIssues Measures |
작업 내용
관련 이슈
#92
작업 확인 방법
swagger-ui를 통해 확인 가능합니다.
추가 정보 (선택 사항)
admin 스키마는 개발/운영 환경에 종속되지 않고 독립적으로 관리될 수 있도록 하기 위해 별도로 생성하였습니다.