스프링

TIL 20240118

개발자 백구 블로그 2024. 1. 18. 19:46

 

어제부터 겪었던 오류,, 흑흑 어제밤부터 오늘 오전까지 이 오류가 나서 고민했는데,,,

아무리 다시 내용을 고쳐보고 강의를 여러 번 봐도 에러가 개선되지 않았다.

 

에러처리 하는 부분에서 문제가 났다? 이런거 같은데,, 유효성? 왜???? 

대체 뭐가 문제인건지,, ㅠ

 

 

 

 

잘 안보이지만 

class org.springframework.validation.objecterror cannot be cast to class org.springframework.validation.fielderror (org.springframework.validation.objecterror and org.springframework.validation.fielderror are in unnamed module of loader 'app')

 

이라는 거였다!!

뭘 해도 400 코드 나온다..

 

그래서 마지막으로 import 부분을 봤는데

아니 글쎄! UserController부분에 signup @RequestBody 부분 import 부분이 swagger 부분으로 되어 있는 것이 아니겟는가,,

 

import org.springframework.web.bind.annotation.RequestBody

 

 

그래서 springframework로 import로 바꿔줬더니 

회원가입과 로그인이 정상적으로 작동되었다.

 

 

 

 

이런 간단한 문제라니,, 그래도 현타는 안왔다. 왜냐 해결은 했으니까!!!

아자아자 정 문제가 안되면 import 부분도 확인 꼭 하자라는 교훈을 얻었다!

 

 

 


저번 프로젝트에서 비밀번호 자릿수를 제한해두는 것은 했었는데

이런식으로 말이다!!

 

@field: NotBlank
@field: Pattern(
    regexp = "^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#\$%^&*])[a-zA-Z0-9!@#\$%^&*]{8,20}\$",
    message = "영문, 숫자, 특수문자를 포함한 8~20자리로 입력해주세요"
)
@JsonProperty("password")
private val _password: String?,

 

이메일 형식은 아무래도 스트링이니까,, 방법이 없을거라고 생각했는데 ㅋㅋㅋㅋㅋ 찾아보니까 있었다....

이메일 형식이 아니라면 아래의 메시지처럼 이메일 형식에 맞게 입력해달라고 뜬다!

 

@field: NotBlank
@field: Pattern(
    regexp = "^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+\$",
    message = "이메일의 형식에 맞게 입력해주세요"
)
@JsonProperty("email")
private val _email: String?,

 

 

 

 

짠!! 완성!! 얏호 원하는 방식, 그대로 나와서 뿌듯하다.

 

 


예외처리한 부분이 있었는데 fieldError 관련해서 한 거여서 이걸 뜯어보면 좋다고 하셨다.. 

 

@ExceptionHandler(MethodArgumentNotValidException::class)
protected fun handleValidationExceptions(ex: MethodArgumentNotValidException): ResponseEntity<BaseResponse<Map<String, String>>> {
    val errors = mutableMapOf<String, String>()
    ex.bindingResult.allErrors.forEach { error ->
        val fieldName = (error as FieldError).field
        val errorMessage = error.defaultMessage
        errors[fieldName] = errorMessage ?: "Not Exception Message"
    }
    return ResponseEntity(BaseResponse(ResultCode.ERROR.name, errors, ResultCode.ERROR.msg), HttpStatus.BAD_REQUEST)
}

 

여기에 남겨두고 바인딩이 뭔지,, 필드에러가 뭔지 리플랙션이 뭔지 찾아서 공부해야겠다!

 

 

바인딩(binding)이란 프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는 행위를 의미한다. 예를 들어 함수를 호출하는 부분에서 실제 함수가 위치한 메모리를 연결하는 것도 바로 바인딩이라고 한다.

 

리플랙션은 객체를 통해 클래스의 정보를 분석해내는 프로그램 기법으로, Java에서는 Reflection 을 이용해 실행중인 자바 프로그램 내부의 클래스,필드,메서드의 속성을 조회,수정할 수 있다고 한다.