본문 바로가기
✨ Back-end/etc

[Spring] 검증(Validation) -1 타임리프(thymeleaf)

by 환풍 2023. 9. 19.
728x90

join.html

타임리프를 써서 검증을 진행해보았다.

th:object를 해서 MemberVO에 있는 데이터들을 th:field에 매핑시켜줄 수 있다.

th:field를 사용하면 id, name, value 모두 자동으로 만들어준다.

맨 아래에 있는 완료 버튼을 누르면 submit하여 form의 action에 있는 joinCommit 컨트롤러를 찾아간다.

 

 

StringUtils는 org.springframework.util 사용하기

MemberController

컨트롤러에 도착하게 되면, 매개변수로 MemberVO와 Model을 추가한다.

MemberVO는 html에서 submit으로 name 값을 가져오기 위해 넣었고, Model은 html에 데이터를 뿌리기 위해 넣어준다.

errors라는 변수를 Map객체로 만들어 주고, 위 코드와 같이 html의 input 태그에서 값이 입력되었는지 확인한다.

StringUtils를 사용해서 텍스트가 넘어왔는지 검사했고, 나이는 비교연산을 통해 로직을 작성하였다.

만약 로직에서 벗어났다면 errors 맵 변수에 html에 뿌려줄 텍스트를 추가시켜 검증 실패시 다시 join.html로 리턴시켜준다.

 

join으로 mapping되는 컨트롤러에서 이전 joinCommit에서 model로 받아온 memberVO 데이터가 그대로 들어가있고, 이를 다시 ModelAttribute로 뿌려주어 html로 이동한다.

 

join.html

따라서 여기서 아무런 데이터도 넣지 않고, 나이만 100초과하여 완료 버튼을 누르게 되면

이렇게 컨트롤러에서 뿌려준 errors의 key 값들이 각각 배치되어 오류를 나타낸다. (비밀번호는 안나타남. 보안문제)

 

<div class="errorText" th:if="${errors?.containsKey('memPwd')}" th:text="${errors['memPwd']}"></div>

 이 <div>는 에러 메시지를 표시하기 위해 사용된다. Thymeleaf를 사용하여 errors 맵에 "memPwd" 등 키가 있는 경우에만 에러 메시지를 표시한다. 키가 존재하면 "memPwd" 등에 연관된 에러 메시지를 표시한다.

 

만약 빨간 밑줄 코드에 있는 errors?. 같이 ?가 없으면 어떻게 될까?

errors.containsKey() 를 호출했을 때 null이면 NullPointerException이 발생한다. 하지만, ?를 붙여

errors?.containsKey()를 해주면, NullPointerException이 발생하는 대신 null을 반환하는 SpringEL 문법이다.

 

하지만, 현재 field값에 대해 중복이 너무 많다. ex) memPwd, memName, memAge 등. 무슨 하나에 3개씩 들어가있는걸 보아서 보기가 복잡할 수 있다.

다음 검증 방법에 대해선 더 간편하게 알아보려고 한다.

그리고, 나이에 문자를 넣으면 이렇게 에러가 뜨는 것을 확인할 수 있다. 나이는 inteager 타입이기 때문인데, 이것도 처리 하는 방법을 다음 검증2에서 진행할 것이다.

 

또한, 일반적인 입력 필드와 달리 비밀번호 입력 필드에는 값이 표시되지 않는다. 이것은 보안상의 이유로, 비밀번호가 화면에 표시되지 않도록 하기 위함이다.

반응형

댓글