반응형
🤍JPA의 '변경감지'란?
영속성 컨텍스트에 의해서 관리되는 엔티티들은, 별도의 save 메소드를 호출하지 않고도
엔티티의 상태가 변경되면 자동으로 DB에 반영됩니다.
또한 변경감지는 @Transactional 내에서 작동합니다.
🤍@Transactional 이 필요한 이유
@Transactional은 트랜잭션의 시작과 종료를 관리하며, JPA의 변경 감지(Dirty Checking)가 제대로 작동하도록 보장합니다.
트랜잭션이란?
- 여러 작업을 하나의 작업 단위로 묶음
- ACID(Atomiciy, Cosistency, Isolation, Durability) 속성 보장
- 작업 중 예외 발생시 롤백 처리
영속성 컨텍스트란?
- JPA에서 엔티티를 관리하는 캐시 영역
- 엔티티가 영속성 컨텍스트에 들어오면 영속상태가 됨
트랜잭션 관리
@Transactional이 선언된 메서드가 호출되면 다음과 같은 작업이 자동으로 이루어집니다:
- 트랜잭션이 시작됨.
- 영속성 컨텍스트가 활성화됨.
- 메서드가 끝나고 트랜잭션이 커밋되기 전에 JPA는 스냅샷과 현재 상태를 비교함.
변경된 필드를 발견하면 UPDATE 쿼리를 생성 - flush()를 호출하여 변경 사항을 데이터 베이스에 반영
- 트랜잭션이 커밋됨
🤍프로젝트 리팩토링
기존 코드
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의 변경감지를 이용하여 코드의 간결성 강화
반응형
'Programming > Refactoring' 카테고리의 다른 글
@AllArgsConstructor 와 @Builder (0) | 2024.12.08 |
---|---|
DTO와 엔티티의 역할, 비즈니스 로직의 위치 (0) | 2024.12.05 |