inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

변경 감지와 병합(merge)

updateItem() 메소드에 대해서 질문이 있습니다.

243

개발한입

작성한 질문수 17

2

안녕하세요? 김영한님 강의는 매우 잘 보고 있습니다.

다름이 아니라 변경감지와 병합 챕터를 보면서 정리 중에 있었는데 updateItem() 메소드를 아래와 같이 이해를 해도 될까요?

@PostMapping(value = "/items/{itemId}/edit")
public String updateItem(@ModelAttribute("form") BookForm form, @PathVariable String itemId) {

    Book book = new Book();

    book.setId(form.getId());
    book.setName(form.getName());
    book.setPrice(form.getPrice());
    book.setStockQuantity(form.getStockQuantity());
    book.setAuthor(form.getAuthor());
    book.setIsbn(form.getIsbn());

    itemService.saveItem(book);
    return "redirect:/items";
}

여기서 보면, 객체는 우리가 만든 새로운 객체일지라도 setId(item.getId()) 을 통해서 기존 DB내에 존재하던 book의 식별자를 넣어준다. 따라서 JPA에 한번 들어갔다 나온 객체로 볼 수 있다.

하지만, new() 를 통해서 내가 직접 생성한 객체이기 때문에 JPA가 이것을 관리하지 않는다.

정리하자면, JPA가 식별할 수 있는 식별자를 갖고 있으나, 사용자가 임의로 생성한 객체라 JPA가 직접 관리하지 않는 객체를 준영속 엔티티라 볼 수 있다.

이 준영속 엔티티를 처리하기 힘든 이유가 무엇일까?
영속성 컨텍스트 관리 하에 있는 영속상태 엔티티는 JPA에 의해 감지가 되기때문에 변경 감지가 일어난다.

하지만, 준영속 엔티티는 JPA가 기본적으로 감지하지 않으므로 변경 감지가 일어나지 않는다.

위의 코드에서도  itemService.saveItem(book); 이 없다면, JPA 트랜잭션 안으로 우리의 준영속 엔티티인 Book이 들어갈리가 없기에 해당 문구가 없으면 아무런 변화도 일어나지 않는다.

즉, 여기서 우리는 itemService.saveItem(book); 을 통해서 해당 객체를 영속성 컨텍스트에 올려놓고 변경감지를 강제한다고 볼 수 있다.

위의 내용처럼 정리해도 맞는 부분일까요? itemService.saveItem()내를 타고 들어가면 ItemRepository.save() 함수가 나오는데 em.persist()와 같이 영속성컨텍스트에 올리는 것을 이를 가능하게끔 한다고 생각해서 정리해봤습니다. 물론 뒤에 em.merge()를 통해서 병합처리를 하는거지만요.

spring-boot java 웹앱 spring JPA

답변 1

2

김영한

안녕하세요. 신수웅님

잘 정리하셨습니다.

단 강의에서 설명드리는 것 처럼, 상품을 update 할때는 merge는 가급적 사용하지 않는 것이 좋습니다^^

감사합니다.

sdk 설정 오류

0

49

2

오탈자 - @Transactional

0

55

1

src/test/resources 테스트 경로 문제

0

50

1

상품 등록후 H2 db 출력 순서 바꿀 수 있나요?

0

63

1

MemberRepositoryTest 실행오류

0

78

1

boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)

1

183

2

강의 마지막 QueryDSL 사용 부분 질문있습니다

1

137

2

클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.

0

51

1

도메인 모델 패턴 vs 트랜잭션 스크립트 패턴

0

71

1

기본 생성자

0

60

1

h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.

0

100

1

멤버서비스테스트 부분에서 막힙니다.

0

164

4

실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?

0

116

1

초반에 h2 다운로드 과정 꼭 필요한가요?

0

118

2

자신 필드에도 get으로 접근하는 이유가 있을까요?

0

112

1

24분 27초 연관관계 편의 메서드 위치

0

113

1

단건 주문만 가능하게 한건 의도한 부분이신가요?

0

108

2

빌드 툴, Gradle

0

58

1

h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다

0

75

2

Repository에서 EntityManager 주입 방식 차이

0

88

1

롬복과 사용자 정의 setter 메서드

0

71

1

주문 목록 조회 fetch join 질문드립니다

0

81

1

dirty checking 질문드립니다.

0

81

1

동시성 관련 질문입니다

0

73

1