JPA - 변경감지를 통한 데이터 멤버 수정시 주의사항

이형석·2024년 6월 6일
0

WelCheck 프로젝트 

목록 보기
18/22

JPA의 변경감지 기법을 통해 비밀번호 변경 로직을 구현하고 있었다.

[잠깐 설명]
JPA에서는 객체의 데이터멤버를 수정할 때, (persist(), find() 등과 달리) 수정한다는 별도의 트랜잭션 메서드를 실행하지 않고 변경감지 라는 기법을 통해 수정이 실행된다. 조금 자세히 설명하면, 객체가 데이터베이스에 저장되기 전 항상 그 상태가 영속성컨텍스트에도 저장된다. 그리고 임의로 식별자 값을 가지고 있는 객체에 대해 수정할 시, 트랜잭션이 commit되는 시점에 (영속성컨텍스트의) 마지막으로 저장되어 있는 상태와 현재 객체 상태를 비교하여 변경사항을 데이터베이스에 반영하는 것이다.

일단 구현하여 실행해보니 데이터베이스에 수정된 결과가 반영되지 않았다.
위 내용은 저렇게 대충 알고 있었지만 디테일하게 기억나지 않고 좀 가물가물했어서, 처음에는 데이터 멤버를 수정한 그 다음 처음으로 실행되는 트랜잭션이 commit되는 시점에 변경감지가 작동될 거라고 생각했다.
하지만 결과는 말한 것 처럼 제대로 작동되지 않았고, 내가 다시 생각해도 변경된 내용은 변경하는 메서드에서 실행되고 끝나버리는데 그 다음 트랜잭션이 어떻게 알고 변경해주나 라고 생각이 들었다.


결론은 @Transactional이란 어노테이션을 변경을 실행하는 메서드에 달아주어야 하는 것이었다. 이 어노테이션의 존재를 잊고 있었다.... 해당 메서드에 @Transactional 어노테이션을 달아줌으로써 그 메서드자체를 트랜잭션화(?)시켜줌으로써 해당 메서드가 끝날 때 트랜잭션이 함께 종료되며 변경감지가 실행되었다.

    @Transactional
    @Override
    public String findPassword(FindPasswordRequestDTO dto) {
        Member findMember = memberRepository.findByUserId(dto.getUserId());
        //1.랜덤비밀번호 생성
        String tmpPassword = UUID.randomUUID().toString();
        //2.유저의 비밀번호를 위 비밀번호로 변경
        findMember.changePassword(tmpPassword);
        return "success";
    }	//메서드와 트랜잭션이 함께 종료되며 변경감지가 일어남
profile
금융IT 개발자

0개의 댓글