강의

멘토링

커뮤니티

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

qqaa님의 프로필 이미지
qqaa

작성한 질문수

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

컨트롤러에서 엔티티 조회후 서비스에서 데이터 변경할때 궁금한점이 있습니다.

작성

·

254

0

컨트롤러에서 엔티티 조회 한 후 서비스 계층에 파리미터로 엔티티를 넘기고 서비스 계층에서 해당 엔티티의

데이터를 변경 할 경우 파라미터로 넘어오는 엔티티는 서비스 계층의 영속성 컨텍스트와  관련이 없는 엔티티 이기 때문에 dirty checking이 발생하지 않을것이라고 생각했습니다. 

그런데 이를 직접 시험해 볼경우 서비스 계층에서 dirty checking 이 발생합니다.

어떻게 서비스 계층에서 더티 체킹이 되는걸까요??

 

controller

@GetMapping("/test")
public void test(@RequestParam("itemId") String itemId){
System.out.println("=======controller start=========");

Item item = em.find(Item.class, Long.valueOf(itemId));

itemService.change(item);

System.out.println("=======service end=========");
System.out.println("=======controller end=========");

}

service

 @Transactional
public void change(Item item){
System.out.println("=======service start=========");
item.setName("테스트");


}

 

구글 파일 업로드 링크입니다!

https://drive.google.com/file/d/1uboJa8w_Opbl59G_oE7mmXlpfKMJ7Fiq/view?usp=sharing

답변 1

2

안녕하세요. qqaa님, 공식 서포터즈 David입니다.

스프링부트의 경우 OSIV가 기본으로 켜져있습니다. 그리고 아래와 같이 동작합니다.

controller에서 find해서 가져온 Member는 영속 상태이고 transaction이 걸린 service에서 변경이 발생하니 변경감지가 발생한 것입니다.

 

자바 표준 ORM JPA 프로그래밍 책 p598-599

 

감사합니다.

 

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

감사합니다!

qqaa님의 프로필 이미지
qqaa

작성한 질문수

질문하기