이미지 파일과 첨부 파일을 같은 타입의 엔티티 콜렉션으로 사용시 발생하는 문제
안녕하세요, 배운 내용을 기반으로 스스로 개발 연습을 하고 있었습니다.
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 인턴이에요.
문제를 파악해보니 이미지 파일과 첨부 파일을 같은 타입의 엔티티 콜렉션으로 사용했을 때 발생하는 문제로 이해했습니다.
Article 엔티티에서는 이미지 파일과 첨부 파일을 UploadFile 엔티티로 관리하고자 했는데, 예상과는 다르게 이미지 파일과 첨부 파일 리스트가 합쳐져서 저장되는 현상이 발생하고 있습니다.
이 문제의 원인은 Article 엔티티에서 같은 컬럼에 이미지 파일과 첨부 파일을 동시에 저장하려고 하기 때문입니다. 엔티티를 같은 타입으로 사용하면 같은 테이블에 저장되는 것이 일반적이지요.
가장 간단하고 근본적인 해결책은 이미지 파일과 첨부 파일을 각각 다른 엔티티로 만들어서 따로 테이블을 관리하는 것입니다. 이렇게 하면 서로 다른 엔티티에 대한 관리가 용이해지고 혼선을 줄일 수 있습니다.
따라서 이미지를 저장하는 ImageFile 엔티티와 첨부 파일을 저장하는 AttachmentFile 엔티티를 만들고, Article 엔티티에서는 각각의 엔티티를 참조하는 방식으로 설계하는 것을 추천드립니다.
각각의 엔티티에는 필요한 속성과 관계 설정을 추가하여 사용하면 될 것 같습니다.
더 좋은 해결책이 있는지는 업무 환경과 상황에 따라 다를 수 있으니, 이런 방식도 가능하다고 함께 고려해보시면 좋을 것 같습니다.
더욱 자세한 내용이 필요하거나 다른 관련 질문이 있으시면 언제든지 물어보세요!
sdk 설정 오류
0
55
2
오탈자 - @Transactional
0
56
1
src/test/resources 테스트 경로 문제
0
50
1
상품 등록후 H2 db 출력 순서 바꿀 수 있나요?
0
64
1
MemberRepositoryTest 실행오류
0
81
1
boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)
1
184
2
강의 마지막 QueryDSL 사용 부분 질문있습니다
1
142
2
클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.
0
52
1
도메인 모델 패턴 vs 트랜잭션 스크립트 패턴
0
72
1
기본 생성자
0
61
1
h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.
0
103
1
멤버서비스테스트 부분에서 막힙니다.
0
166
4
실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?
0
116
1
초반에 h2 다운로드 과정 꼭 필요한가요?
0
120
2
자신 필드에도 get으로 접근하는 이유가 있을까요?
0
114
1
24분 27초 연관관계 편의 메서드 위치
0
113
1
단건 주문만 가능하게 한건 의도한 부분이신가요?
0
109
2
빌드 툴, Gradle
0
59
1
h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다
0
77
2
Repository에서 EntityManager 주입 방식 차이
0
90
1
롬복과 사용자 정의 setter 메서드
0
73
1
주문 목록 조회 fetch join 질문드립니다
0
82
1
dirty checking 질문드립니다.
0
83
1
동시성 관련 질문입니다
0
75
1





