• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

이미지 파일과 첨부 파일을 같은 타입의 엔티티 콜렉션으로 사용시 발생하는 문제

23.07.15 23:49 작성 조회수 340

0

안녕하세요, 배운 내용을 기반으로 스스로 개발 연습을 하고 있었습니다.

Article이라는 엔티티에 본문에 첨부되어 뷰에서 보일 이미지 파일들과 버튼을 누르면 다운로드가 가능한 첨부 파일들을 동시에 넣고자 했습니다.

이미지 파일과 첨부 파일은 모두 UploadFile이라는 엔티티를 사용하였습니다.

서버에서 실험차 Article 엔티티를 작성해보니, 이미지 파일과 첨부 파일 리스트가 각각 적용 되는 것이 아니라 합쳐졌습니다.

예를 들어 이미지 파일을 2개 등록하고 첨부 파일을 3개 등록하였으면, imageFiles와 attachedFiles List의 사이즈가 각각 2, 3개 인 것이 아니라 똑같이 5, 5개였습니다.

이미지 파일과 첨부 파일이 다른 종류의 파일임에도 불구하고 결국 같은 엔티티를 공유하고 있어서 발생한 문제인걸까요?

현재 생각하고 있는 해결책은 이미지 파일과 첨부 파일을 각각 다른 엔티티로 만들어서 따로 테이블을 관리하면 되겠다고 생각중입니다.

하지만 혹시 이보다 더 좋거나 근본적인 해결책이 있지 않을까 싶어서 질문을 올려봅니다.

두 엔티티의 코드는 다음과 같은데 혹시 다른 코드가 더 필요한 것이라면 올리겠습니다!

// 게시글 엔티티
@Entity
@Getter
public class Article {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "article_id")
    private Long id;

    private String writer;
    private String title;
    @Lob
    private String content;

    @OneToMany(mappedBy = "article", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<UploadFile> imageFiles = new ArrayList<>();

    @OneToMany(mappedBy = "article", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<UploadFile> attachedFiles = new ArrayList<>();

    public static Article createArticle(ArticleAddForm articleAddForm, List<UploadFile> imageFiles, List<UploadFile> attachedFiles) {

        Article article = new Article();
        article.writer = articleAddForm.getWriter();
        article.title = articleAddForm.getTitle();
        article.content = articleAddForm.getContent();
        article.imageFiles.addAll(imageFiles);
        article.attachedFiles.addAll(attachedFiles);

        for (UploadFile imageFile : imageFiles) {
            imageFile.setArticle(article);
        }
        for (UploadFile attachedFile : attachedFiles) {
            attachedFile.setArticle(article);
        }

        return article;
    }
}

// 업로드 파일 엔티티 (이미지 파일, 첨부 파일의 엔티티로서 동시에 사용됨)
@Entity
@Getter
public class UploadFile {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "upload_file_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "article_id")
    private Article article;

    private String originalName;
    private String storeName;

    public UploadFile() {
    }

    public UploadFile(String originalName, String storeName) {
        this.originalName = originalName;
        this.storeName = storeName;
    }

    public void setArticle(Article article) {
        this.article = article;
    }
}

답변 1

답변을 작성해보세요.

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.17

안녕하세요, 인프런 AI 인턴이에요.

문제를 파악해보니 이미지 파일과 첨부 파일을 같은 타입의 엔티티 콜렉션으로 사용했을 때 발생하는 문제로 이해했습니다.

Article 엔티티에서는 이미지 파일과 첨부 파일을 UploadFile 엔티티로 관리하고자 했는데, 예상과는 다르게 이미지 파일과 첨부 파일 리스트가 합쳐져서 저장되는 현상이 발생하고 있습니다.

이 문제의 원인은 Article 엔티티에서 같은 컬럼에 이미지 파일과 첨부 파일을 동시에 저장하려고 하기 때문입니다. 엔티티를 같은 타입으로 사용하면 같은 테이블에 저장되는 것이 일반적이지요.

가장 간단하고 근본적인 해결책은 이미지 파일과 첨부 파일을 각각 다른 엔티티로 만들어서 따로 테이블을 관리하는 것입니다. 이렇게 하면 서로 다른 엔티티에 대한 관리가 용이해지고 혼선을 줄일 수 있습니다.

따라서 이미지를 저장하는 ImageFile 엔티티와 첨부 파일을 저장하는 AttachmentFile 엔티티를 만들고, Article 엔티티에서는 각각의 엔티티를 참조하는 방식으로 설계하는 것을 추천드립니다.

각각의 엔티티에는 필요한 속성과 관계 설정을 추가하여 사용하면 될 것 같습니다.

더 좋은 해결책이 있는지는 업무 환경과 상황에 따라 다를 수 있으니, 이런 방식도 가능하다고 함께 고려해보시면 좋을 것 같습니다.

더욱 자세한 내용이 필요하거나 다른 관련 질문이 있으시면 언제든지 물어보세요!