๐Ÿ๏ธ Spring/Web MVC

์ด์ „๊นŒ์ง€์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํฌ์ŠคํŒ…์—์„œ๋Š” API ๋ฐฉ์‹์ด ์•„๋‹Œ ๊ธฐ๋ณธ์ ์ธ ํ™”๋ฉด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค๋ฃจ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ API ํ†ต์‹ ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ํ™”๋ฉด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด๋Ÿฐ ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ API ํ†ต์‹ ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ค ์‹์œผ๋กœ ์˜ˆ์™ธ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์ •ํ•˜๊ณ , ๊ทธ์— ๋งž๊ฒŒ json์œผ๋กœ ์˜ˆ์™ธ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” BasicErrorController๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ํ–ˆ์—ˆ๋‹ค. API ์˜ˆ์™ธ ๋˜ํ•œ ์ด๊ณณ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ฃผ๋Š”๋ฐ, ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” json์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์ด๋‹ค. Accept ํ—ค๋”๊ฐ€ application/json์ธ ๊ฒฝ์šฐ { "timestamp": "2022-01-07T13:17:21..
์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๊ต‰์žฅํžˆ ์‰ฝ๊ฒŒ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ErrorPage๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค. ์ด๋•Œ ๊ฒฝ๋กœ๋Š” "/error"์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด BasicErrorController๋ผ๋Š” ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค. ์˜ค๋ฅ˜ ํŽ˜์ด์ง€ ๋“ฑ๋ก ๋ฐฉ๋ฒ• BasicErrorController๋Š” ๊ธฐ๋ณธ์ ์ธ ๋กœ์ง์ด ๋ชจ๋‘ ๊ฐœ๋ฐœ๋˜์–ด ์žˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” BasicErrorController๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฃฐ๊ณผ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ๋œ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. ๋ทฐ ์„ ํƒ ์šฐ์„ ์ˆœ์œ„ ๋ทฐ ํ…œํ”Œ๋ฆฟ resources/templates/error/500.html resources/templates/error/5xx.html ์ •์  ๋ฆฌ์†Œ์Šค (static..
์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ํ•œ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ์˜ˆ์™ธ๋ฅผ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. Exception - ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ ์žˆ๋Š” ๊ทธ ์ผ๋ฐ˜์ ์ธ ์˜ˆ์™ธ response.sendError(HTTP ์ƒํƒœ ์ฝ”๋“œ, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€) 1. Exception์˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์ž๋ฐ”์˜ ๋ฉ”์ธ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ, main์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๋งŒ์•ฝ ์‹คํ–‰ ๋„์ค‘์— ์˜ˆ์™ธ๋ฅผ ์žก์ง€ ๋ชปํ•˜๊ณ  ์ฒ˜์Œ ์‹คํ–‰ํ•œ main() ๋ฉ”์„œ๋“œ๋ฅผ ๋„˜์–ด์„œ ์˜ˆ์™ธ๊ฐ€ ๋˜์ ธ์ง€๋ฉด, ์˜ˆ์™ธ ์ •๋ณด๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๋Š” ์ข…๋ฃŒ๋œ๋‹ค. ์ด๊ฑด ๋งŽ์ด๋“ค ๊ฒฝํ—˜ํ•ด ๋ณด์•˜์„ ๊ฒƒ์ด๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์š”์ฒญ๋ณ„๋กœ ๋ณ„๋„์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ• ๋‹น๋˜๊ณ , ์ด๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‹คํ–‰๋œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ, try catch๋กœ ์žก์ง€ ๋ชปํ•˜๊ณ  ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ๋ฐ–์œผ๋กœ ์˜ˆ..
์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ํ•„ํ„ฐ๋Š” ์„œ๋ธ”๋ฆฟ์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ณ , ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋ฅผ ์•Œ๊ณ  ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๋„๋ก ํ•˜์ž. ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ ๋“ฑ๊ณผ ๊ฐ™์€, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์Šคํ”„๋ง AOP๋กœ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์›น๊ณผ ๊ด€๋ จ๋œ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ๋Š” ํ•„ํ„ฐ ๋˜๋Š” ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์›น๊ณผ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ๋•Œ์—๋Š” HTTP์˜ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ํ•„ํ„ฐ๋‚˜ ์ธํ„ฐ์…‰ํ„ฐ๋Š” HttpServletRequest, HttpServletResponse๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•„ํ„ฐ์˜ ํ๋ฆ„ Http ์š”์ฒญ -> WAS -> ํ•„ํ„ฐ -> (๋””์ŠคํŒจ์ฒ˜)์„œ๋ธ”๋ฆฟ -> ์ปจํŠธ๋กค๋Ÿฌ ํ•„ํ„ฐ๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ์— ์„œ๋ธ”๋ฆฟ์ด ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์š”์ฒญ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Šฅ ๋“ฑ์˜ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ..
Bean Validation ๊ธฐ๋ณธ์ ์€ ๊ฒ€์ฆ ๋กœ์ง์„ ๊ณตํ†ตํ™”ํ•˜๊ณ , ํ‘œ์ค€ํ™” ํ•œ ๊ฒƒ์ด Bean Validation์ด๋‹ค. Bean Validation์€ ํŠน์ •ํ•œ ๊ตฌํ˜„์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ Bean Validation 2.0์ด๋ผ๋Š” ๊ธฐ์ˆ  ํ‘œ์ค€์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด, ๊ฒ€์ฆ ์• ๋…ธํ…Œ์ด์…˜๊ณผ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ์ด๋‹ค. ์ด๋Ÿฌํ•œ Bean Validation์„ ๊ตฌํ˜„ํ•œ ๊ธฐ์ˆ ๋“ค ์ค‘ ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ํ•˜์ด๋ฒ„๋„ค์ดํŠธ Validatior๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฆ„์— ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๊ฐ€ ๋ถ™์–ด์žˆ์ง€๋งŒ ORM๊ณผ๋Š” ๊ด€๋ จ์ด ์—†๋‹ค. ์•„๋ž˜๋Š” ์ฐธ๊ณ  ์‚ฌ์ดํŠธ๋‹ค Hibernate Validator 6.2.1.Final - Jakarta Bean Validation Reference Implementation: Reference Guide Validating data is a commo..
๋ฉ”์‹œ์ง€ ์ƒํ™ฉ์„ ํ•˜๋‚˜ ๊ฐ€์ •ํ•ด์„œ, ๊ฒŒ์‹œํŒ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž. ๋ชจ๋“  ๊ฒŒ์‹œํŒ์—์„œ ๊ฒŒ์‹œํŒ์— ๋‹ฌ๋ฆฐ ๊ธ€์„ "๋Œ“๊ธ€"์ด๋ผ๊ณ  ํ‘œ์‹œํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ ์ƒํ™ฉ์—์„œ ๋Œ“๊ธ€์„ "๋‹ต๊ธ€"๋กœ ๊ณ ์น˜๋ผ๋Š” ๋ช…๋ น์ด ๋–จ์–ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€์˜ ๋Œ“๊ธ€์„ ์ฐพ์•„ ๋‹ต๊ธ€๋กœ ๊ณ ์ณ์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ํ™”๋ฉด์ด ๋งŽ์œผ๋ฉด ๋งŽ์„์ˆ˜๋ก ํ•ด๋‹น ์ž‘์—…์€ ํž˜๋“ค๊ณ , ๋ˆ„๋ฝํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ฉ”์‹œ์ง€ ๊ธฐ๋Šฅ์ด๋ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 'messages.properties'๋ผ๋Š” ๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ์šฉ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  comment=๋‹ต๊ธ€ comment.writer=์ž‘์„ฑ์ž ... ์œ„์™€๊ฐ™์ด ์ž‘์„ฑํ•œ ํ›„, ๊ฐ HTML(ํƒ€์ž„๋ฆฌํ”„)๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ key๊ฐ’์œผ๋กœ ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (์ด๋Š” ๋ทฐ ํ…œํ”Œ..
ํ˜ผ์ž์„œ ๊ณต๋ถ€๋ฅผ ํ•˜๋˜ ์ค‘ @RequestBody๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ง€ ์•Š์•„์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. @RequestBody๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•  ๋•Œ๋Š” ObjectMapper๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋•Œ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ObjectMapper๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด setter๊ฐ€ ์—†์–ด๋„ ๋ฐ์ดํ„ฐ์— ๊ฐ’์ด ๋ฐ”์ธ๋”ฉ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ด€๋ จํ•ด์„œ๋Š” ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋“ค์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://bbbicb.tistory.com/46 @RequestBody ๋ชจ๋ธ์— ๊ธฐ๋ณธ์ƒ์„ฑ์ž, setter/getter๊ฐ€ ํ•„์š”ํ•œ๊ฐ€? ์„œ๋ก  ์ตœ๊ทผ์— Entity ๋ชจ๋ธ์˜ ์†์„ฑ์˜ ์„ฑ๊ฒฉ์„ ์ž˜ ์ƒ๊ฐํ•ด๋ณด๊ณ  ๋ถˆ๋ณ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์€ final๋กœ ์„ ์–ธํ•ด ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋ผ๋Š” ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•˜๋‹ค. ํ•œ๋ฒˆ..
๐Ÿง HttpMessageConverter @RequestBody๋‚˜ @ResponseBody๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋“ค์–ด์žˆ๊ฑฐ๋‚˜ ๋ฉ”์„ธ์ง€ ๋ฐ”๋””์— ์ž‘์„ฑ๋˜๋Š” ๋ฌธ์ž ํ˜น์€ JSON ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ String ๋˜๋Š” ๊ฐ์ฒด๋กœ ๋ฐ”๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋‚ด์šฉ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๊ฒŒ ํŽธ๋ฆฌํ•˜๋„๋ก ๋ณ€ํ™˜ํ•˜์—ฌ ์ฃผ๋Š” ์—ญํ• ์„ HttpMessageConverter๊ฐ€ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. HttpMessageConverter๋Š” @RequestBody, HttpEntity๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ถ™์–ด์žˆ๋Š” ๊ฒฝ์šฐ, ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜ํ™˜ ์‹œ @ResponseBody ํ˜น์€ HttpEntity๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง HttpMessageConverter ๊ตฌ์กฐ HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. public in..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring/Web MVC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (2 Page)