[Springboot] spring security BCryptPasswordEncoder "raw password cannot be null" 에러 해결
1. 문제상황
유저가 정보를 수정할 때 (클라이언트가 서버로 업데이트 리퀘스트를 날릴 때) 비밀번호값을 입력하는데
값을 입력해도 자꾸 "raw password cannot be null" 이 나왔다. 값을 입력했는데 null로 인식되는게 이상해서
1) 프론트단에서 값을 잘못 받았나
2) 백에서 유효성 검사를 하는 중에 에러가 난건가
3) BCryptPasswordEncoder가 제대로 안먹고 데이터가 꼬였나
4) 영속성 단계에서 내가 뭔가 잘못 설정했나?
라는 생각이 들어서 하나씩 원인이 될 수 있는 것들을 살펴봤다.
1) 프론트단에서 값을 제대로 받고 있는가
-> js, jsp 모두 제대로 값을 받고 있었다.
2) 유효성 검사 제대로 됐나?
-> 제대로 된 것 확인했다. 유효성 검사가 제대로 되어서 raw Password cannot be null이 아닌
@Valid bindingResult의 getDefaultMessage()를 통해 "공백일 수 없습니다" 라는 좀 더 깔끔한 (...) 에러 메세지를 얻었다.
3) 데이터가 꼬였나
-> DB에 관련 데이터 모두 날리고 메타데이터를 새로 넣어 시도해도 같은 에러가 났다.
4) 영속성 단계에서 뭔가를 잘못 설정했나
-> 이 단계에서는
1.비밀번호 받는다.->2.해당 값을 encoding 한다 -> 3.encoded password를 set 한다.
말고 따로 해줄게 없었다. 이 과정에 오류가 있다는 생각이 들지 않았다.
그래서 구글링해본 결과 인젝션이 제대로 일어나지 않은 것 같다는 추측이 든다.
해결 방법이 공통적으로 제시하는 것이 객체를 생성하는 방식을 다르게 하는 것이었기 때문이다.
예를 들어
"builder 패턴을 사용해보세요"
"생성자로 인젝션해보세요 필드 인젝션이 제대로 되지 않을 때가 있습니다"
이런 식이었다.
그래서 내일은 이 부분을 건드리면 에러가 해결될 것 같다..라고 작성한 다음 날, 에러가 해결되지 않았다.
그래서 그냥 처음부터 하나씩 따져봤다. 나는 이 코드가 초면이다.. 라는 마음으로 봐야한다.
한줄 한줄.. 이게 어떤 코드인지 짚어가면서 봐도 로직에 문제가 있는 것 같지 않았다. 열심히 뒤진 결과..
맥북에서 롬복이 제대로 먹지 않아서 난 에러였다. 현타가 오고.. 정말 어이없었지만
맥 os 가 익숙하지 않은 지금 시기의 해프닝이라고 생각하며 애써 웃어본다. ^____^ 에러 해결 완료!