스프링 시큐리티를 활용하여 회원가입 로직을 짜고 회원가입 테스트코드까지 작성해서 테스트코드가 통과하는것을 확인 했다. 이후 실제로 폼에 들어가 회원가입을 해보니 값을 입력하고 submit을 하니 Valid error로 값을 못받아왔다고 떴다.
난 분명 값을 다 보내주고 타임리프 문법도 확인해봤는데,,
그래서 컨트롤러에서 값을 찍어봤더니 실제로 값을 못받아 오고 있었다.
아래 두 사진은 나의 컨트롤러와 회원가입 폼이다.
로직에는 문제가 없는 것 같아 값을 받아오는 객체인 ModelAttribute쪽에 문제가 있는 것 같았고 구글링을 해보던 중 안주형님의 블로그 글을 찾게 되었다.
https://dkswnkk.tistory.com/457
@ModelAttribute을 사용하여 나는 DTO객체로 값을 받아오려고 했다. 하지만 ModelAttribute는 변화ㄴ이 아닌 바인딩을 시키기 때문에 변수들의 Setter함수가 없으면 저장이 되지 않는다고 한다.
그래서 내가 로그인할 때 사용하는 DTO에 들어가봤다. 실제로 내 DTO 클래스에 Getter만 선언해놓고 Setter를 선언을 하지 않았다. 그래서 Setter또한 어노테이션을 추가해줬다.
Setter를 추가해 준 이후 Username을 다시 찍어봤을 때 값이 잘 들어오는 것을 확인할 수 있다.
Entity에서 Setter사용 지양 하지만 DTO에서는?
나는 Entity객체에는 비즈니스 로직이 잇고 실제 데이터도 변경되기 때문에 Setter사용을 지양하는 편이 좋다고 알고 있었다. 그래서 DTO또한 Settor 사용을 지양해야 되는줄 알고있었다. 하지만 DTO(Data Transfer Objcect)는 이름에서 알수 있듯이 단순히 데이터를 전달해주는 객체이다. 그래서 Getter와 Setter 둘다 자유롭게 사용해도 괜찮다고 한다.
오류 해결 과정
1. 폼을 넘겨주는데에서 문제있는 줄 알고 전체 HTML을 지우고 그냥 간단한 문자(ADSFA)를 입력했더니 폼이 잘 나와서 thymeleaf문제인줄 알았음
2. 구글링 결과 thymeleaf 문법에는 이상이 없었고 Controller 단에서 값을 못가져오는 것 같다고 추측함.
3. 값을 찍어보니 실제로 폼에서 보내주는 데이터를 컨트롤러의 DTO로 못 가져오고 있었음
4. 값을 받아오기 위해 ModelAttribute를 파라미터에 추가해줌. 그런데도 똑같은 문제 발생.
5. 구글링 결과 ModelAttribute는 변수들의 Setter 함수가 없으면 저장을 못함.
6. 회원가입에 사용되는 DTO확인 결과 Setter 없는것 확인 후 추가
7. 오류 해결!!
오류를 해결하는 과정은 성장하는데 정말 많은 도움을 주는 것 같다. 하지만 해결할 때 너무 힘들어ㅜ