반응형
문제
시큐리티에서 UserDetails 를 가져와서, 비밀번호를 수정하는 API를 만들고 있었다. 근데 업데이트 SQL문이 나가질 않는다..
문제의 코드다.
@PatchMapping("/password")
public ResponseEntity<?> updatePassword(
@AuthenticationPrincipal UserDetailsImpl userDetails,
@Valid @RequestBody UserPasswordUpdateRequestDto requestDto) {
userService.updatePassword(userDetails.getUser(), requestDto);
return ResponseEntity.ok().build();
}
/**
* 비밀번호 수정
*/
@Transactional
public void updatePassword(User user, UserPasswordUpdateRequestDto request) {
String encodedPassword = passwordEncoder.encode(request.getNewPassword());
validatePassword(request.getOldPassword(), user.getPassword());
user.updatePassword(encodedPassword);
}
private void validatePassword(String rawPassword, String userPassword) {
if (!passwordEncoder.matches(rawPassword, userPassword)) {
throw new IllegalArgumentException("잘못된 비밀번호");
}
}
아마 OSIV 문제인 것 같다. 그래서 서비스 계층에는 유저의 닉네임만 내려주고, 서비스 계층에서는 닉네임을 가지고 DB에서 유저를 가져오도록 변경을 해주었다.
/**
* 비밀번호 수정
*/
@Transactional
public void updatePassword(String nickname, UserPasswordUpdateRequestDto request) {
User user = userRepository.findByNickname(nickname)
.orElseThrow(IllegalArgumentException::new);
String encodedPassword = passwordEncoder.encode(request.getNewPassword());
validatePassword(request.getOldPassword(), user.getPassword());
user.updatePassword(encodedPassword);
}
private void validatePassword(String rawPassword, String userPassword) {
if (!passwordEncoder.matches(rawPassword, userPassword)) {
throw new IllegalArgumentException("잘못된 비밀번호");
}
}
Hibernate:
/* update
for sparta.ifour.movietalk.domain.user.entity.User */update users
set
created_at=?,
description=?,
login_id=?,
modified_at=?,
nickname=?,
password=?,
role=?
where
id=?
수정 SQL 문이 잘 요청된 것을 볼 수 있다.
반응형
'TIL ✍️' 카테고리의 다른 글
23년 11월 29일(수요일) - 41번째 TIL (1) | 2023.11.29 |
---|---|
23년 11월 28일(화요일) - 40번째 TIL (0) | 2023.11.28 |
23년 11월 23일(목요일) - 38번째 TIL (0) | 2023.11.23 |
23년 11월 22일(수요일) - 37번째 TIL (0) | 2023.11.22 |
23년 11월 21일(화요일) - 36번째 TIL (1) | 2023.11.21 |