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/#464 이미지 s3 도입 #479

Merged
merged 26 commits into from
Oct 23, 2023
Merged

Feat/#464 이미지 s3 도입 #479

merged 26 commits into from
Oct 23, 2023

Conversation

hectick
Copy link
Collaborator

@hectick hectick commented Oct 10, 2023

🔥 연관 이슈

📝 작업 요약

application의 profile이 prod일때는 s3를, 그 외(테스트 포함)는 local 기존 경로에 이미지를 저장하도록 했습니다.
s3 -> 이미지 업로드 구현, 이미지 삭제 미구현
local -> 이미지 업로드 구현, 이미지 삭제 구현(프로필용)

s3 이용시 사용자에게 전달되는 이미지 주소는 {클라우드 프론트 도메인}/images/post/KakaoTalk_Photo_2023-09-13-10-03-02.jpeg입니다.
현재 시각 기준 테스트 서버에 현재 s3 브랜치가 반영되어 있으니 확인해보셔도 조하요

다음 커밋이 s3 반영한 커밋이구요. 그 이전은 환경에따라 localimageclinet <-> s3imageclient를 바꿔 사용하기 위한 구조 리팩터링입니다
image

그리고 imageService에서 데이터베이스에 post 이미지, comment 이미지 repository에 저장하는 로직도 넣어보려다가
너무 힘들어보여서 기존 상태를 유지하였읍니다. (imageService의 todo는 무시하셔도 좋다는 이야기~)

추후 해야할 일

테스트서버 관련해서 해야하는 일

  • 기존에 존재하는 이미지 파일 이주 -> 자동으로 하는 api 만들 예정
  • 테스트 서버 배포 스크립트

운영서버 관련해서 해야하는 일

  • 기존에 존재하는 이미지 파일 이주
  • 운영서버용 클라우드 프론트 만들기
  • 젠킨스 배포 스크립트 환경변수 수정(SERVER_TYPE, IMAGE_DOMAIN)
# 서버 접속해서 배포 파일의 Image domain 클라우드 프론트로 바꾸어 주어야 함.
image.domain=${IMAGE_DOMAIN}
# 다음 경로에 있는 이미지 수동 옮기기 필요
#file.dir=/home/ubuntu/2023-edonymyeon/resources/

@hectick hectick added the ❤️ Backend for BackEnd label Oct 10, 2023
@hectick hectick added this to the 6차 데모데이 milestone Oct 10, 2023
@hectick hectick self-assigned this Oct 10, 2023
@hectick hectick added ⚡️ feature New feature or request 🛠️ refactor labels Oct 10, 2023
@github-actions
Copy link

github-actions bot commented Oct 10, 2023

Unit Test Results

  67 files    67 suites   30s ⏱️
357 tests 357 ✔️ 0 💤 0
360 runs  360 ✔️ 0 💤 0

Results for commit d7cda0b.

♻️ This comment has been updated with latest results.

Copy link
Collaborator

@BackFoxx BackFoxx left a comment

Choose a reason for hiding this comment

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

멋져요 이리내!
S3용 이미지 저장 객체와 로컬로의 이미지 저장 객체를 갈아끼우기 쉬운 구조로 만들어준 덕분에
코드들이 한 눈에 들어오고 엄청 깔끔하다는 느낌을 받았습니다.

S3에 저장된 사진을 삭제하게 되면 S3에서는 물리적인 삭제를 하고,
DB 상에서는 이렇게 deleted 표시로 논리적인 삭제가 되는 건가요?
내일 캠퍼스에서 좀 더 자세히 봐야할 것 같네요!
image

@Override
public void delete(final String imagePath) {
throw new BusinessLogicException(UNSUPPORTED_METHOD_CALL);
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

뭔가 상태패턴 보는 것 같고 좋네요 이리내! 👍🏻

Copy link
Collaborator

@This2sho This2sho left a comment

Choose a reason for hiding this comment

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

고생하셨습니다. 이리 저리 내🙇‍♂️

답글을 남겨주신다면 어프로브를 드리겠습니다.


@Override
public void migrate(final File image, final String directory, final String storeName) {
System.out.println("아무것도 안하지롱");
Copy link
Collaborator

Choose a reason for hiding this comment

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

이리내 같네요 🚽

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

🫵


@RequiredArgsConstructor
@Service
public class ImageMigrationService {
Copy link
Collaborator

Choose a reason for hiding this comment

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

이 서비스는 migration 끝나면 제거할건가유?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

핫픽스 해야되지 않을까욤

@@ -12,4 +12,7 @@ public interface CommentImageInfoRepository extends JpaRepository<CommentImageIn
@Modifying //todo: 옵션.. 이대로 괜찮은가?
@Query("update CommentImageInfo c set c.deleted = true where c.id in :ids")
void deleteAllById(@Param("ids") List<Long> ids);

@Query(value = "select * from comment_image_info", nativeQuery = true)
Copy link
Collaborator

Choose a reason for hiding this comment

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

혹시 이거 findAll()을 안쓰고 native Query를 사용하는 이유 알려주실 수 있나염?

Copy link
Collaborator

Choose a reason for hiding this comment

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

JPARepo를 사용하면 삭제된 이미지는 where절에서 걸려서 조회 안되서 긍듯여

Copy link
Collaborator Author

@hectick hectick Oct 16, 2023

Choose a reason for hiding this comment

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

CommentImageInfo 클래스 들어가보면 아래처럼럼 where절이 붙어있는데요. 이렇게하면 쿼리가 db에 난사될때 where절이 디폴트로 붙어서 나간다고 해요.
image
where절을 개무시하고 deleted=true인 이미지들(soft delete된 이미지들) 것들도 다 s3로 이동하기 위해서 native하게 해주엇슴니다
이것도 이미지 이주가 끝나면 삭제되겠죵..

Copy link
Collaborator

Choose a reason for hiding this comment

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

오홍 그렇고만요 👍

Copy link
Collaborator

@jyeost jyeost left a comment

Choose a reason for hiding this comment

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

이리내상 ~~ 로컬에서는 잘 돌아가는 거 확인했습니다,,,
실 서버에서는.... 힘들어서...스루ㅜㅜ
깔끔하게 잘 구현해주셨습니다 !! 수고 많으셨어여!!!


private final ImageFileNameStrategy imageFileNameStrategy;

private final Domain domain;
Copy link
Collaborator

Choose a reason for hiding this comment

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

이미지 서비스가 생기면서 각각 서비스에서 사용하던
도메인을 한곳에서 관리하니 편하네여!!!!

@@ -128,7 +129,7 @@ private WriterDetailResponse getWriterResponse(final Member member) {
return new WriterDetailResponse(
member.getId(),
member.getNickname(),
domain.getDomain() + member.getProfileImageInfo().getStoreName()
imageService.findBaseUrl(ImageType.POST) + member.getProfileImageInfo().getStoreName()
Copy link
Collaborator

Choose a reason for hiding this comment

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

이미지 서비스에 이미지 타입과 파일 이름을 넘겨서 완성된 파일 경로를 가져오는 것은 어떤가요...??

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.

convert메서드 사용하면 안되는 건가염??

@@ -12,4 +12,7 @@ public interface CommentImageInfoRepository extends JpaRepository<CommentImageIn
@Modifying //todo: 옵션.. 이대로 괜찮은가?
@Query("update CommentImageInfo c set c.deleted = true where c.id in :ids")
void deleteAllById(@Param("ids") List<Long> ids);

@Query(value = "select * from comment_image_info", nativeQuery = true)
Copy link
Collaborator

Choose a reason for hiding this comment

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

JPARepo를 사용하면 삭제된 이미지는 where절에서 걸려서 조회 안되서 긍듯여

return true;
}

@Override
Copy link
Collaborator

Choose a reason for hiding this comment

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

어케 구현할지 궁금했는데 @Profile을 이용해서 완전 깔쌈하게 구현해주셨군여 !!!!
감덩감덩 쓰나미쓰나미

private String domain;

public List<String> removeDomainFromUrl(final List<String> imageUrls) {
public List<String> removeDomainFromUrl(final List<String> imageUrls, final String typeDirectory) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

이 메서드 명이 뭔가... 어색한것 같아여...
밑에는 convertToImageUrl()인데 얘도 맞춰서 convertToFileName이나 convertToStoredName같은 걸로 바뀌면 좋을 것 같아여

그럼 이 밑에 메서드랑보다 상위 메서드인게 더 잘 보일 것 같아염

Copy link
Collaborator

@This2sho This2sho left a comment

Choose a reason for hiding this comment

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

굳굳 👍

# Conflicts:
#	backend/src/main/java/edonymyeon/backend/comment/application/CommentService.java
#	backend/src/main/java/edonymyeon/backend/global/exception/ExceptionInformation.java
#	backend/src/main/java/edonymyeon/backend/image/ImageFileUploader.java
#	backend/src/main/java/edonymyeon/backend/member/application/MemberService.java
#	backend/src/main/java/edonymyeon/backend/post/application/PostReadService.java
#	backend/src/test/java/edonymyeon/backend/auth/application/AuthServiceTest.java
@hectick
Copy link
Collaborator Author

hectick commented Oct 18, 2023

마지막 리뷰 해주세염 @BackFoxx @jyeost @This2sho
케로씨 핫게시글 pr,호이씨 회원정보 수정pr이랑 꽤 충돌햇는데 유심히 살펴봐주세옴~
그리고 프로필 이미지 이주 로직도 추가햇습니다~


@RequiredArgsConstructor
@Component
public class ImageInfoFactory {
Copy link
Collaborator

Choose a reason for hiding this comment

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

오홍 네이밍 좋구여👍

Copy link
Collaborator

@This2sho This2sho left a comment

Choose a reason for hiding this comment

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

버저닝 변경된거 까지 확인했습니다. 👍
고생하셨어유 이리 저리 이리이리내씨

@hectick hectick merged commit 65cecf8 into dev Oct 23, 2023
@hectick hectick deleted the feat/#464_이미지_s3_도입 branch October 23, 2023 07:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

S3로 이미지 관리하기
4 participants