인프런 커뮤니티 질문&답변

Sunny님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

JPA Update에 관한 질문입니다.

해결된 질문

작성

·

406

0

안녕하세요 김영한님! 제가 드리고싶은 질문은 두가지입니다.

예를 들어 게시글에는 이미지를 넣을 수 있으며 게시글과 이미지는 OneToMany관계로 이루어져있습니다.

그리고 Board(게시글) 엔티티에는 

@OneToMany(mappedBy = "board", Cascade.ALL, orphonRemoval = true, fetch = LAZY)

List<BoardImage> images = new ArrayList<>();

로 설정했습니다.

질문1.

예를 들어 이미지가 [image1, image2, image3](타입은 이미지객체타입) 에서

[image2, image3, image4] 로 update 할 경우에는

1. delete all & insert all 

2. 코드로 기존과 하나하나 비교하면서 delete1 & insert 4 인가?

주로 현업에서는 어떻게 사용하는지 궁금합니다.

질문2.

List<BoardImage> images = [image1, image2, image3] 을 갖고 있습니다. 여기서 update 메소드를 사용하여

this.images = List.of(image1, image3, image4)로 덮을경우에는 JPA에서 전부 delete하는지 궁금합니다.

감사합니다

답변 2

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. Sunny님

첫번째 질문은 고객이 1번 이미지를 삭제하고 4번 이미지를 추가한 것으로 이해됩니다.

2,3번 이미지를 손대지 않았기 때문에 이 경우 1번을 삭제하고 4번을 추가하는 것이 좋은 선택이라 생각합니다.

두번째 질문은 JPA에서는 컬렉션을 다른 컬렉션으로 교체하면 안됩니다. JPA는 이미 있는 컬렉션으로 엔티티가 있는지 없는지, 추가되었는지 관리하기 때문입니다. 교체하게 되면 전혀 의도하지 않은 결과가 나올 수 있습니다.

이경우 전체를 변경하고 싶으면 해당 컬렉션을 remove, clear 등으로 모두 비우시고 엔티티를 추가하면 됩니다.

그런데 이미지 파일 자체를 정교하게 관리하고 싶으면 cascade, orphonRemoval을 빼시고, 이미지 엔티티 전용 리포지토리를 만들어서 관리하는 것도 좋은 방법입니다.

감사합니다.

0

Sunny님의 프로필 이미지
Sunny
질문자

2번질문 답변 정말로 감사드립니다.

1번질문 정리하여 이해한다면 모두다 지우고 바꾸기 보다는 하나하나 비교한다음에 삭제하고 추가하란 말씀이시죠?

그렇다면 만약 바뀔 대상이 너무 많거나 또는 전부 다바꿔야할때는 어떻게 하나요? 그럴 때도 비교해가면서 update를 실시(비교하고 같으면 남기기, 다르면 삭제, 그리고 추가)해야하는지 궁금합니다.

김영한님의 프로필 이미지
김영한
지식공유자

클라이언트에서 서버로 전송하는 시점에 추가된 이미지, 삭제된 이미지 여부를 함께 보내주면 편리하게 작업하실 수 있을거에요.

감사합니다.

Sunny님의 프로필 이미지
Sunny
질문자

압도적으로 감사합니다 흑흑

Sunny님의 프로필 이미지

작성한 질문수

질문하기