전후처리(공통기능)
1) 유효성 검사
ID는 20자 내외로 한다. 등등 전처리 과정을 설정하기 위해서는 @Valid 를 사용한다.(https://mvnrepository.com/ 에서 Spring boot starter validation 을 pom.xml에 디펜던시 추가)
41줄 : Controller에서 signupDto 값이 들어올 때 유효성 검사를 하겠다는 의미.
Controller와 DTO에서는 @Valid의 종류에서 @Size를 이용해 크기를 정한다. @NotBlank는 Null, 빈 문자열, 스페이스만 있는 문자열 불가 를 의미한다.(종류 참고 :https://bamdule.tistory.com/35)
이후에, DB쪽의 도메인 User에서도 @Column으로 동일하게 제약사항을 만듦
유효성 검사에서 에러가 날 때,
유효성 검사에서 오류가 발생하면 46줄의 BindingResult에 다 모아준다. 이때, 52줄의 BindingResult의 getFieldErrors라는 컬렉션에 모아준다. 그리고 for문을 돌면서 에러를 52줄의 error에 담는다.
53줄 : 그걸 50줄의 해시맵인 errorMap에 담아준다.
(key는 error.getField(), value는 error.getDefaultMessage())
2) 요청에 대한 분기
(1) 방법 1
오류가 발생했을 때 오류화면이 아닌 오류 메세지를 보여주도록 만들어본다.
@Controller이므로 pulbic String~ 이면 무조건 파일을 리턴한다.
45줄 : 이때, @ResponsBody를 String(리턴타입) 앞에 넣으면 @Controller임에도 데이터를 응답한다.
54줄 : 오류메시지(데이터)
61줄 : !!에러가 없을 때 화면페이지가 아닌 문자가 보임!!<<문제발생
(2) 방법2
방법1은 에러가 없을 때 문제가 있었으므로 데이터를 리턴하지 않고,
54줄: 에러가 발생할 경우 익셉션을 강제로 발동한다.
8줄 : @ControllerAdvice : 발생하는 모든 익셉션을 낚아챔
7줄 : 낚아챈 후 응답을 데이터로 할 예정이므로 @RestController
11줄 :@ExceptionHandler(RuntimeException.class)는 발동하는 모든 런타임익셉션을 가로채게 한다. (Controller에서 강제 발동한 런타임 익셉션을 낚아채 온다.)
14줄: 낚아채 오면 12줄의 함수가 실행되면서 런타임익셉션의 메세지를 가져와서 리턴한다.
(3)방법3-커스텀유효성검사익셉션을 만들어보자
이유 : 어떤 부분이 문제인지(예: 20자 이내여야 합니다/특수문자는 들어갈 수 없습니다 등)를 알려주는 에러메세지를 보여주기 위해
5줄 : 런타임익셉션을 상속한다.
8줄 : 먼저 커스텁익셉션 클래스를 만들고 시리얼넘버를 넣어주는데, 객체를 구분하기 위해 넣어준다.
10줄 : 컨트롤러에서 만들었던 에러들을 담은 Map
12줄 : 생성자를 만든다.
18줄 : errorMap에 대한 getter 만든다. 이때, message는 부모로부터 가져오면 되므로 14줄의 super()를 이용한다.
15~8줄 : ControllerExceptionHandler로 가서, 방법2에서의 RuntimeException을 커스텀익셉션으로 바꿔주고, 리턴타입을 오류를 담은 Map으로 바꿔준다.
컨트롤러에서도 바꿔준다.
3) 공통응답DTO
2개의 메시지를 같이 보여줄 수 있는 DTO를 만들어서 리턴한다.
제네릭??이 뭔지???? 불필요하게 변수 선언하지 말고 전역적으로 쓸 때 편하게??
공통으로 쓰는데,
제네릭 타입을 지정하지 않고 ?를 넣어서 추론하게 할 수 있다.
자바스크립트로 제어하기 >> 에러 발생 시, 에러메세지를 알람창으로 띄우고 가입화면으로 돌아가게 만든다.
StringBuffer가 뭐지???? 알아보기
CMRespDTO로 하는 방법과 Script 방법 비교
Script는 응답을 브라우져가 받는다. 클라이언트에게 응답할 때 좋음!!
CMRespDTO는 Ajax통신할 때, Android 통신할 때는 이 방법이 더 좋은데, 이때 개발자가 응답을 받을 때는 코드로 받는 이 방법이 좋은 것.