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

이시열님의 프로필 이미지

작성한 질문수

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

변경 감지와 병합(merge)

변경감지에 대해 질문 있습니다.

해결된 질문

20.11.21 15:19 작성

·

238

1

jpa를 이용해 게시판을 만들고 있는 중 입니다.

저는 repository 계층을 인터페이스에 JpaRepository를 상속해서 사용하고 있는데 수정 작업 시

영속이나 준영속 신경 안 쓰고 무조건 save로 데이터를 처리하는건 좋지않은 방법인가요?

답변 2

3

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

2020. 11. 21. 18:51

안녕하세요. 이시열님

JPA에서 데이터 변경은 변경 감지를 통해서 하는 것이 맞습니다.

예를 들어서 다음 로직을 보시면, 왜 변경감지를 통해서 문제를 해결해야 하는지 이해가 되실꺼에요.

@Transactional

public void logic(Long id, String username, boolean updateFlag) {

  Member member = em.find(Member.class, id);

  member.setUsername(username);

  if(updateFlag) {

    repository.save(member);

  }

}

이렇게 되어 있을 때 이 메서드를 외부에서 다음과 같이 호출하면 어떻게 될까요?

logic(1, "change", true); //업데이트 되기를 기대

logic(1, "change", false); //업데이트 되지 않기를 기대

결과는 둘다 업데이트가 되어 버립니다. save 호출 여부와 무관하게 변경 감지가 동작하기 때문입니다.

정리하면 JPA를 사용하면 특별한 경우를 제외하고는 변경감지를 기준으로 개발해야 합니다.

감사합니다.

1

이시열님의 프로필 이미지
이시열
질문자

2020. 11. 22. 22:26

예시를 보니까 쉽게 이해가 됐습니다.

본업도 바쁘실텐데 이렇게 예제까지 적으며 설명해 주셔서 정말 감사드립니다. ^^