Programming/Refactoring

JPA의 변경감지를 이용한 회원 수정 메소드 변경

LazyCat 2024. 12. 12. 13:23
반응형

🤍JPA의 '변경감지'란?

영속성 컨텍스트에 의해서 관리되는 엔티티들은, 별도의 save 메소드를 호출하지 않고도 
엔티티의 상태가 변경되면 자동으로 DB에 반영됩니다.

또한 변경감지는 @Transactional 내에서 작동합니다.

 

🤍@Transactional 이 필요한 이유

@Transactional은 트랜잭션의 시작과 종료를 관리하며, JPA의 변경 감지(Dirty Checking)가 제대로 작동하도록 보장합니다.

 

트랜잭션이란?

- 여러 작업을 하나의 작업 단위로 묶음

- ACID(Atomiciy, Cosistency, Isolation, Durability) 속성 보장

- 작업 중 예외 발생시 롤백 처리

 

영속성 컨텍스트란?

- JPA에서 엔티티를 관리하는 캐시 영역

- 엔티티가 영속성 컨텍스트에 들어오면 영속상태가 됨

 

트랜잭션 관리

@Transactional이 선언된 메서드가 호출되면 다음과 같은 작업이 자동으로 이루어집니다:

  1. 트랜잭션이 시작됨.
  2. 영속성 컨텍스트가 활성화됨.
  3. 메서드가 끝나고 트랜잭션이 커밋되기 전에 JPA는 스냅샷과 현재 상태를 비교함.
    변경된 필드를 발견하면 UPDATE 쿼리를 생성
  4. flush()를 호출하여 변경 사항을 데이터 베이스에 반영
  5. 트랜잭션이 커밋됨

 

🤍프로젝트 리팩토링

기존 코드

    public Member editMember(MemberDto memberDTO) {
        Member member = authService.getMember();
        Optional.ofNullable(memberDTO.getName()).ifPresent(name->member.setName(name));
        Optional.ofNullable(memberDTO.getBirth()).ifPresent(birth->member.setBirth(birth));
        Optional.ofNullable(memberDTO.getFirstAddress()).ifPresent(first->member.setFirstAddress(first));
        Optional.ofNullable(memberDTO.getSecondAddress()).ifPresent(second->member.setSecondAddress(second));
        Optional.ofNullable(memberDTO.getImageUrl()).ifPresent(address->member.setImageUrl(address));
        memberRepository.save(member);
        return member;
    }

 

MemberDto를 받으며 모든 필드가 null인지 검사 후에 값을 셋팅하고

새로운 값이 입력된 member 객체를 save하며 기존 데이터에 덮어씌움

 

 

변경 코드

    @Transactional
    public void editMember(MypageRequest mypageRequest) {
        Member member = authService.getMember();
        member.upate(mypageRequest);
    }

 

JPA의 변경감지를 이용하여 코드의 간결성 강화

반응형