[Spring_4기 본캠프] Spring 숙련 - 과제 트러블 슈팅 | Day 45
1. 에러명 : PropertyValueException 에러
< 상황 >
회원을 생성하는 API 로직을 작성하고 첫 테스트 실행 시 PostMan에서 500 internal server 에러와 함께 생성이 되지 않는 문제가 발생했다.
로그창에 PropertyValueException 에러가 뜬 것을 확인하고 검색을 해보니 요청에 맞는 Java 객체가 매핑이 되지 않아 일어나는 문제라고 했다. 코드의 객체명과 테이블의 컬럼이름을 살펴봤다.
< 원인 >
데이터베이스로 사용중인 MySQL에서는 스네이크 표기법에 따라 username 으로 유저명을 설정해놨는데 코드에는 userName이라고 해놓은 것을 발견했다.
< 해결 >
컬럼명에 맞게 변수의 이름을 모두 username으로 수정해주고 재실행을 했더니 정상적으로 작동되는 것을 확인했다.
2. 에러명 : AuthorizeException ( custom exception )
< 상황 >
로그인 필터 로직을 작성하고 로그인 기능을 실행했더니 내가 만들어놓은 AuthorizeException에 걸려 로그인이 되지 않는 문제가 발생했다.
하지만 회원가입도 해놨고, 데이터가 있는 것도 확인했고, 로그인 기능은 원래 WHITE LIST 에 넣어놔서 검증이 필요하지 않는데 왜..?
라고 생각하며 코드를 다시 살펴봤다. login과 signup 두 경로를 검증에서 제외시켜놨는데 생각해보니 둘 다 기본 경로 users에서 auth로 옮겨놨다는 사실을 간과했다.
< 원인 >
검증에서 제외시킬 URL에 기본 경로인 /auth 를 작성해주지 않아서 자꾸 로그인 필터에 걸렸던 것이었다. 코드를 위와 같이 수정해주고 기대를 하며 다시 실행을 해봤는데도 작동이 되지 않았다. 그럼 대체 문제가 뭐였을까..?
< 문제 속의 문제 >
새로 만든 AuthController에 @RestController 애너테이션을 달아주는 것을 깜빡했다..
< 해결 >
애너테이션을 달아주고 재실행해보니 정상적으로 작동되는 것을 확인했다.
3. 유저 삭제 기능 불가
< 상황 >
현재 ERD 관계에서 일정(todos) 테이블이 유저(users) 테이블을 바라보고 있는 단방향(ManyToOne) 관계이기 때문에 id 식별값이 1인 유저가 일정을 하나 생성하게 되면 해당 일정이 삭제되기 전까진 유저 정보 삭제가 되질 않는다.
< 해결법 >
데이터를 삭제할 때는 통채로 데이터를 날려버리는 Hard Delete와 데이터베이스에는 남아있지만 삭제된 것으로 처리가 되는 Soft Delete 방식이 있다. 내가 원하는 건 사용자 정보가 사라지더라도 게시글의 정보에서 사용자가 알수없음이나 null로 처리가 되어 게시글은 그대로 남아있는 것을 원했다. CASCADE를 사용하거나 비즈니스 로직으로 구현이 가능한데, 아직 여기까지는 지식이 부족해서 해결하진 못했다.
다만 게시글이 삭제되면 유저 정보가 삭제되는 것은 확인했다.
◆ 정리
1. PropertyValueException ( 해결 완료 )
- 요청에 맞는 Java객체가 매핑이 되지 않아 PropertyValueException Err 발생
→ 컬럼명에 맞게 객체명을 userName에서 username으로 수정해준 후 정상 작동
2. AuthorizeException, Controller 인식 불가 ( 해결 완료 )
- 로그인 필터에서 검증을 제외할 URL로 설정한 로그인과 회원가입이 필터에 걸려 AuthorizeException Err 발생
→ WHITE LIST 에 검증을 제외할 URL을 수정하고, RestController 애너테이션을 달아준 후 정상 작동
3. 유저 삭제 기능 불가 ( 해결 실패 )
- 일정테이블이 유저테이블의 고유 식별자값을 참조하고 있어 게시글이 생성되면 해당 고유식별자를 가진 유저 정보 삭제 불가
→ 게시글을 삭제해 참조를 없애주면 유저 정보가 삭제되는 것은 확인했으나 참조 상태를 잠시 null로 바꿔주는 비즈니스 로직이나 CASCADE를 사용하지 못해 soft delete 기능을 구현하진 못함
Opinion
문제점을 알고 해결방법을 알고있는데도 기능을 구현하지 못해 문제를 파훼하지 못한다는 것은 꽤나 슬픈 일이다.
하지만 해결방법이 무엇인지는 알아냈으니 구현하는 법을 공부하고나면 언제든 내가 해결할 수 있어서 다행이라고 생각한다.
또, Hard Delete와 Soft Delete에 대한 개념을 알고나서 데이터가 어떻게 관리되는지 대략적으로 알게되어서 다음에 비슷한 기능을 구현한다고 하면 더 잘해낼 자신이 생겼다!