728x90
코틀린으로 @Valid를 처음 사용한다면, 아마 다들 @Valid가 동작하지 않아서 해결 방법을 찾으실 거라 생각합니다.
오늘은 해당 해결 방법을 알아보도록 하겠습니다.
먼저 작동하지 않는 코드부터 살펴보겠습니다.
@Controller
class MemberController(
private val memberService: MemberService,
) {
@GetMapping("/members/new")
fun createForm(model: Model): String {
model.addAttribute("memberForm", MemberForm("","","",""))
return "members/createMemberForm"
}
@PostMapping("/members/new")
fun create(@Valid memberForm: MemberForm, bindingResult: BindingResult): String{
val address = Address(memberForm.city!!, memberForm.street!!, memberForm.zipcode!!)
memberService.join(Member(name = memberForm.name!!, address = address))
return "redirect:/"
}
}
data class MemberForm(
@NotEmpty(message = "회원 이름은 필수입니다.")
val name: String? = null,
val city: String?= null,
val street: String?= null,
val zipcode: String?= null,
) {
}
위 코드를 실행하면 @Valid는 당연히 동작하지 않습니다.
해당 이유를 알아보기 위해 코틀린의 코드를 자바 코드로 디컴파일 해보도록 하겠습니다.
자바 코드에는 생성자의 파라미터에 @NotEmpty가 붙어있는 것을 알 수 있습니다.
해당 이유은 코틀린 공식문서를 통해 알 수 있습니다.
https://kotlinlang.org/docs/annotations.html#annotation-use-site-targets
(사용 타겟 대상을 지정하지 않으면 사용 중인 주석의 @Target 주석에 따라 대상이 선택됩니다.
적용 가능한 대상이 여러 개 있는 경우 다음 목록에서 첫 번째 적용 대상이 사용됩니다.)
즉 이로 인해 @Valid가 작동하지 않는 것입니다.
이를 해결하기 위해 다음과 같이 적용될 부분을 명시해 줄 수 있습니다.
다음은 지원하는 전체 target 목록입니다.
저는 다음과 같이 사용했습니다.
data class MemberForm(
@field:NotEmpty(message = "회원 이름은 필수입니다.")
val name: String? = null,
val city: String?= null,
val street: String?= null,
val zipcode: String?= null,
) {
}
Reference
https://kotlinlang.org/docs/annotations.html#annotation-use-site-targets
https://devlog-wjdrbs96.tistory.com/407
728x90
'코틀린 > web' 카테고리의 다른 글
[코틀린][스프링 MVC] - 기본 생성자 없는 Data Class가 @RequestBody에 매핑되는 이유 (0) | 2022.08.13 |
---|