@Vaild
@Valid ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ ์์ฒญ ๊ฒ์ฆ ๋ก์ง์ ์ผ๋ฐ์ ์ผ๋ก Spring MVC์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ ๋ด์์ ์ํ๋๋ค.
์ด ์์ฒญ ๊ฒ์ฆ์ ์ปจํธ๋กค๋ฌ์์๋ง ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ๊ฐ๋ฅํ๊ณ , ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์ ๋ฐ์ธ๋ฉ๋๊ธฐ ์ ์ ๊ฒ์ฆ์ ์คํํ๋ค.
๋ฐ๋ผ์ @Valid ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ ์์ฒญ ๊ฒ์ฆ์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ ๋ด๋ถ์์ ์ด๋ฃจ์ด์ง๋ฉฐ, ์ปจํธ๋กค๋ฌ ๋ฉ์๋ ์คํ ์ ์ ์ํ๋๋ค.
๋์ ์๋ฆฌ
์ธ๋ถ์์ ๋ค์ด์ค๋ ๋ชจ๋ Request๋ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ํตํด์ Controller๋ก ๋ค์ด์จ๋ค.

Spring์ RequestMapping์ ํตํด ๋ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ argumentResolver๋ฅผ ํตํด์ ์ฒ๋ฆฌํ๋ค.
@Valid๊ฐ ์ปจํธ๋กค๋ฌ์์ ๋์ํ๋ ์ด์ ๋ argumentResolver ๊ณผ์ ์์ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ปจํธ๋กค๋ฌ์์ JSON ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ๋ @RequestBody๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
"HandlerMethodArgumentResolver Interface"์ ๊ตฌํ์ฒด, "RequestResponseBodyMethodProcessor"๊ฐ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
์ฆ, @RequestBody๋ RequestResponseBodyMethodProcessor๋ฅผ ํตํด์ ์ฒ๋ฆฌํ๊ฒ ๋๊ณ ,
RequestReponseBodyMethodProcessor๋ @Valid๊ฐ ๋ถ์ vaildation์ ์ฒ๋ฆฌํ๋ค.
resolveArgument()์์ ์ ํจ์ฑ์ด ๊ฒ์ฌ๋๋๋ฐ, ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด MethodArgumentNotValidException ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
๋์ ๊ณผ์
Dispatcher Servlet: ์์ฒญ์ ๋ฐ์ ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ค.
HandlerAdapter: ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ํ ์ด๋ํฐ๋ฅผ ์ ํํ๋ค.
HandlerMethod: ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
ArgumentResolver: ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ฃผ์ ํ๋ค.
@Valid ๊ฒ์ฆ: ArgumentResolver๊ฐ ๋งค๊ฐ๋ณ์ ๊ฐ์ ์ฃผ์ ํ๊ธฐ ์ ์ @Valid ์ด๋ ธํ ์ด์ ์ผ๋ก ๊ฒ์ฆํ๋ค.
์ปจํธ๋กค๋ฌ ๋ฉ์๋ ์คํ: ๊ฒ์ฆ์ ํต๊ณผํ๋ฉด ์ปจํธ๋กค๋ฌ ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค.
๋ง์ฝ @Valid ๊ฒ์ฆ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ค๋ฉด MethodArgumentNotValidException ๋๋ ConstraintViolationException์ ๊ฐ์ ์์ธ๊ฐ ๋ฐ์ํ๋ค.
Advice์ ExceptionHandler๋ฅผ ์ ์ํ๋ค๋ฉด ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ์ Advice์์ ์ ์๋ ExceptionHandler Method๊ฐ ํธ์ถ๋๋ค.
Last updated