전처리,후처리 개념
핵심기능 : 회원가입
공통기능 : 전처리(EX-글자 수 제한), 후처리(EX-중복확인)를 AOP(Aspect Oriented Programming)라고 한다
유효성 검사하기
전처리->dependency에validation추가->컨틀롤러 signup함수의 매개변수에 @valid,BindingResult 클래스 추가
->dto에 가서 각종 원하는거 추가
if(bindingResult.hasError()){
Map<String,String> errorMap = new HashMap<>();
for(FieldError error : bindingResult.getFieldErrors()){
errorMap.put(error.getField(),error.getDefaultMessage());
}
}
에러가 발생하면 for문을 돌면서 map에 넣어준다
@ResponseBody 사용
프론트에서 적절치 못한 입력을 막을 수 있지만
웹이 아닌 postman이나 다른 루트를 이용해 요청을 할 수 있기 때문에 백에서도 막아줘야 한다
@controller-> string은 file을 리턴하는데(회원가입 성공 하면 로그인 페이지로)
@ResponseBody String을 해주면 컨트롤러에 있지만 데이터를 응답한다(실패하면 실패했다는 문자열)
원래 컨트롤러에서는 file을 리턴해야하는데 데이터를 리턴하게 되어있다
이렇게 코드를짜면 복잡해지니까 controller advice를 사용해야 한
글로벌 예외 처리하기
@ResponseBody를 지우고 오류가 났을때
throw new RuntimeException("유효성 검사 실패")으로 exception을 강제로 발생시킨다
->handler 패키지에서 핸들러를 를 따로 만들어서 관리
@RestController
@ControllerAdvice
public class Controller ExecptionHandler{
@ExceptionHandler(RuntimeException.class)
public String valiationException(RuntimException e){
return e.getMessage();
}
}
//@ExceptionHandler(RuntimeException.class) 런타임 오류 걸리면 다 여기로 가져온다
//주의해야할게 우리는 map에 담긴 getDefaultMessage()를 가져와야 하는데 핸들러 함수는 string을 리턴한다
hanlder->ex->customvalidationexception을 만들어줘야 한다
handler->controllerexceptionhandler에서 return e.getErrorMap();
authController->throw customvalidaitonException(errormap);
정리
AuthController ->
public String signup(@Valid SignupDto signupDto, BindingResult bindingResult)
//user모델에서 하나라도 에러 발생하면 발생한것들이 bindingResult에 담긴다
AuthController ->
if(bindingResult.hasErrors()){
Map<String,String> errorMap = new HashMap<>();
for(FieldError error : bindingResult.getFieldErrors()){
errorMap.put(error.getField(),error.getDefaultMessage());
}
throw new CustomValidationException(errorMap);
}
//bindingResult에 있는것들이 차례로 map에 담은 후 쓰로우
handler->ControllerExceptionHandler->
@ExceptionHandler(CustomValidationException.class)
//여기서 낚아채고
public Map<Stirng,String> validationException {return e.getErrorMap();}
//깔끔하게 map을 리턴하면서 에러 메시지 출력
//밑에는 미리 구현되어 있어야 한다
handler->ex->CustomValidationException->
public class CustomValidationException extends RuntimeException
//RuntimeException을 사용하면 string밖에 리턴이 안되니까 custom을 만들어서 사용
public CustomValidationException(String message,Map<String,String> errorMap){
super(message); // getter대신 이렇게 하면 자동으로 넘어간다
this.message=message;
this.errorMap=errorMap;
}
getErrorMap(){}//이건 따로 구현 필요
공통 응답 DTO 만들기
지금은 map으로 리턴하니까 defaultmessage밖에 리턴할 수 없다
web->dto->CMRespDto : @Data,@No,AllConstructor를 만들고
hadndler->return 타입을 map대신 CMRespDto로 바꾸자
공통 응답 DTO지만 상황따라 필요한게 달라진다 -> 제네릭 사용하자
public class CMRespDto<T> {
private int code; // 1(성공), -1(실패)
private String message;
private T data;
}
handler->CEH->
CMRespDto<?> validationException(CVE e){
return new CMRespDto<Map<String,String>> (-1,e.getM(),e.getErrorM());
}
제네릭 할때는 ?로 처리하면 return하는거 보고 알아서 타입을 결정해준다
공통 응답 Script만들기
util->Script->
js를 버퍼에 담고 리턴
hadndler->return 타입을 String으로 변경, return Script.back(e.getEM.toString());
CMRespDto, Script 비교
1. 클라이언트(브라우저)에게 응답할때는 Script가 좋음 (유저한테 보여주는 것)
2. Ajax통신, 모바일 통신 할때는 CMRespDto가 좋음 (개발자한테 보여주는 것)
'SpringBoot > Photogram(Meta)' 카테고리의 다른 글
ch3-3. SpringBoot-로그인 (0) | 2024.04.09 |
---|---|
ch3. springboot-회원가입 (0) | 2024.03.04 |
CH2 SpringBoot Controller (0) | 2024.02.16 |
1-환경설정 (0) | 2024.02.14 |