유저 탈퇴 기능을 개발하면서 유저 탈퇴 시 unactivated로 처리하기 위해 엔티티 값을 update하는 로직을 구현하였다.
기존 코드
save() 를 통해 기존의 엔티티 값 수정
@PostMapping("/quit")
public void quit() {
Optional<User> userWithAuth = userService.getUserWithAuthorities();
if (userWithAuth.isPresent()) {
User user = userWithAuth.get();
user.setActivated(false);
userRepository.save(user);
}
}
엔티티를 수정한 후, save() 메서드를 호출하면 영속성 컨텍스트는 변경된 내용을 감지하고 해당 엔티티를 데이터베이스에 반영한다.
코드리뷰로 영속성을 이용하고, ifPresent를 이용했으면 좋겠다는 피드백을 받아 다음과 같이 수정하였다.
수정 과정
JPA는 영속성 컨텍스트 라는 메모리 내에 엔티티를 관리하는 장소를 가지고 있다고 한다.
엔티티를 조회하면 영속성 컨텍스트 내에 해당 엔티티의 복사본이 생성되며, 이후 엔티티를 수정하면 영속성 컨텍스트가 변경 내용을 감지하여 자동으로 데이터베이스에 반영한다. 이를 Dirty Checking 이라고 한다.
@Transactional 을 이용하고 save() 메서드를 사용하지 않는 방식으로 수정하여
엔티티를 조회한 후에 필드를 변경하고 트랜잭션을 커밋하면, 변경 내용이 데이터베이스에 자동으로 반영되도록 수정하였다.
처음 코드에서 사용했던 userService의 getUserWithAuthorities 함수가 반환하는 User 엔티티는 영속성 유지가 되지 않았다.
따라서 userService에서 유저 탈퇴 로직을 실행하는 함수를 새로 생성하여 영속성이 유지되도록 구현하였다.
최종 코드
UserService.java
@Transactional
public void quit() {
SecurityUtils.getCurrentUserLogin()
.flatMap(userRepository::findOneByLogin)
.ifPresent(user -> {
user.setActivated(false);
});
}
ifPresent를 이용하여 코드를 간결하게 수정하고, 영속성 유지와 Transactional을 사용하여 save 메소드를 쓰지 않아도 엔티티를 업데이트 할 수 있었다.
AccountResource.java
컨트롤러이다
@PostMapping("/quit")
public void quit() {
userService.quit();
}
'BackEnd : Spring > SpringBoot' 카테고리의 다른 글
[Spring] 객체 지향 설계와 스프링 (0) | 2025.02.26 |
---|---|
[SpringBoot] JPA @ColumnDefault, @Builder.Default (0) | 2025.02.24 |
[SpringBoot] JpaRepository @Modifying, @Transactional (0) | 2024.07.02 |
[TalentTree 프로젝트] HttpSession : 로그인된 사용자 정보 가져오기 (0) | 2024.06.03 |
[Springboot] 연관관계 매핑 : 일대일 (0) | 2024.05.27 |