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: 이미지 저장 로직 작성 및 initData초기 이미지 저장 #38

Merged
merged 7 commits into from
Jul 2, 2024

Conversation

DongHyeonka
Copy link
Member

📌 관련 이슈

✨ PR 세부 내용

  • 이미지 저장 entity 작성과 초기 이미지 저장 로직 작성

@DongHyeonka DongHyeonka self-assigned this Jul 2, 2024
Copy link
Member

@joon6093 joon6093 left a comment

Choose a reason for hiding this comment

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

일단 이미지 업로드 api 관련 코드가 지워지고 다시 리뷰 할게요. ㅎㅎ
그리고 패캐지명은 무조건 소문자로 작성해야해요. 카멜케이스로 작성하신거 수정 부탁드려요.
그리고 바뀐 엔티티에 맞추어서 DML문도 수정하셔야할 것 같네요.

Comment on lines 25 to 53
public List<Image> storeFiles(List<MultipartFile> multipartFiles) throws IOException { // 여러 개 이미지 업로드
List<Image> storeFileResult = new ArrayList<>();
for (MultipartFile multipartFile : multipartFiles) {
if (!multipartFile.isEmpty()) {
storeFileResult.add(storeFile(multipartFile));
}
}
return storeFileResult;
}

public Image storeFile(MultipartFile multipartFile) throws IOException { // 단일 이미지 업로드
if (multipartFile.isEmpty()) {
return null;
}

String originalFilename = multipartFile.getOriginalFilename();
String storeFileName = createStoreFileName(originalFilename);

ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(multipartFile.getSize());
metadata.setContentType(multipartFile.getContentType());

amazonS3.putObject(bucket, originalFilename, multipartFile.getInputStream(), metadata);

return Image.builder()
.originalFileName(originalFilename)
.storeFileName(storeFileName)
.build();
}
Copy link
Member

Choose a reason for hiding this comment

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

어차피 삭제할 코드이긴 하지만 리뷰를 해드리자면 ㅎㅎ
이렇게 FileStore에서 단일 이미지 업로드를 제공하는 메서드를 의존하는 다중 이미지 업로드를 제공하는 것도 나쁘지 않기는 하다고 생각해요.
하지만 단일 이미지 업로드만을 upload와 같은 메서드로 FileStore에서 제공하고, FileStore를 의존하는 FIleService와 같은 클래스에서 forEach로 upload 메서드를 사용하는게 더 좋다는 생각이에요~

그리고 이런 FileStore 같은 역할은 추상화해서 upload와 delet와 같은 책임을 가진 인터페이스를 두고 FileService에서는 인터페이스를 의존하는게 좀 더 객체지향적이라고 생각해요. OCP를 지킬 수 있거든요 ㅎㅎ

Copy link
Member Author

Choose a reason for hiding this comment

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

네 좋은 의견 감사합니다. 부족한 부분을 콕 집어주셨네요


@Builder
public PropensityProfileResponseDto(String result, String description, MbtiType mbtiType) {
public PropensityProfileResponseDto(String result, String description, MbtiType mbtiType, ImageDto image) {
Copy link
Member

Choose a reason for hiding this comment

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

ImageDto image의 이름으로 받는거보다는 imageDto라는 이름으로 받는 것을 추천해요. Dto를 사용하는 곳에서 잘못하면 오해를 할 수 있어요.

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 30 to 39
@OneToOne
@JoinColumn(name = "image_id")
private Image image;

@Builder
public WebDeveloperProfile(MbtiType mbtiType, String result, String description) {
public WebDeveloperProfile(MbtiType mbtiType, String result, String description, Image image) {
this.mbtiType = mbtiType;
this.result = result;
this.description = description;
this.image = image;
Copy link
Member

Choose a reason for hiding this comment

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

WebDeveloperProfile와 Image처럼 부모 자식 관계가 확실한 엔티티는 cascade와 orphanRemoval 를 이용하여 편하게 관리해도 된다고 생각해요.

Copy link
Member Author

Choose a reason for hiding this comment

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

1대1관계 매핑이니까 써도 무방하겠네요 좋은 의견 감사합니다! 그렇게 수정하겠습니다

List<WebDeveloperProfile> profileData = Arrays.asList(
WebDeveloperProfile.builder()
.mbtiType(MbtiType.ISTJ)
.result("철저한 데이터 관리형 백엔드 개발자")
.description("데이터의 정확성과 안정성을 최우선으로 하는 당신은 백엔드 개발의 수호자! 체계적이고 신뢰할 수 있는 방식으로 데이터를 관리하며, 버그는 당신에게 있어 전설 속 이야기일 뿐입니다. 당신의 코드는 그야말로 철옹성!")
.image(exampleImage)
Copy link
Member

Choose a reason for hiding this comment

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

ISTJ 만 image를 등록하지말고 전부 다 해야하지 않나용. 이러면 개발하는 프론트엔드측에서 ISTJ를 제외한 profile 에서 image url을 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.

넵 그럼 일단 아무런 이미지를 넣어서 샘플 데이터 넣어 놓겠습니다.

Comment on lines 20 to 24
@Column(name = "original_file_name", nullable = false)
private String originalFileName;

@Column(name = "store_file_name", nullable = false)
private String storeFileName;
Copy link
Member

Choose a reason for hiding this comment

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

s3에 직접 올리는 방식이니, Image 엔티티는 url만 저장하면 될거같네요

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 34 to 36
if (storedFile != null) {
imageRepository.save(storedFile);
}
Copy link
Member

Choose a reason for hiding this comment

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

Profile에서 cascade 설정을 해주었으면 ImageRepository를 사용해서 저장할 필요 없어요.

Copy link
Member Author

Choose a reason for hiding this comment

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

그건 몰랐는데 새로 하나 알게 됐네요! 수정하겠습니다. 리뷰를 통해서 많이 배우네요!

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class FileService {
Copy link
Member

Choose a reason for hiding this comment

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

ImageService라는 이름이 더 적절하다고 생각해요!
그리고 ImageService는 필요 없어 보이기도 하네요. InitData에서 Image 객체를 만들어서 Profile의 casecade 속성을 이용해서 담아주면 저장 될거에요.

Copy link
Member Author

Choose a reason for hiding this comment

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

넵 알겠습니다

Copy link
Member

@joon6093 joon6093 left a comment

Choose a reason for hiding this comment

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

잘 봤습니다! 고생하셧어요

@joon6093 joon6093 merged commit 39c0746 into team-meot-ppo:main Jul 2, 2024
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.

이미지 저장 로직 작성 및 initData에서 저장
2 participants