[Spring MVC] [2] 5. ๊ฒ€์ฆ2 - Bean Validation

์œค๊ฒฝยท2021๋…„ 9์›” 21์ผ
0

Spring MVC

๋ชฉ๋ก ๋ณด๊ธฐ
19/26
post-thumbnail

[1] Bean Validation - ์†Œ๊ฐœ

๊ฒ€์ฆ ๊ธฐ๋Šฅ์„ ๋งค๋ฒˆ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ์• ๋…ธํ…Œ์ด์…˜์„ ์“ฐ์ž.

Bean Validation: ๊ฒ€์ฆ ๋กœ์ง์„ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณตํ†ตํ™”ํ•˜๊ณ  ํ‘œ์ค€ํ™” ํ•œ ๊ฒƒ
๊ตฌํ˜„์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ Bean Validation 2.0(JSR-380)์ด๋ผ๋Š” ๊ธฐ์ˆ  ํ‘œ์ค€์ด๋‹ค.

์ฆ‰, ๊ฒ€์ฆ ์• ๋…ธํ…Œ์ด์…˜๊ณผ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ์Œ
Bean Validation์€ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œ๊ณตํ•˜๊ณ  ๊ตฌํ˜„์ฒด๋Š” ๋ฐ”๊ฟ”๋ผ์šธ ์ˆ˜ ์žˆ์Œ.


[2] Bean Validation - ์‹œ์ž‘

jakarta.validation-api: Bean Validation ์ธํ„ฐํŽ˜์ด์Šค
hibernate-validator: ๊ตฌํ˜„์ฒด

๐Ÿ“Œ ๊ฒ€์ฆ ์• ๋…ธํ…Œ์ด์…˜
@NotBlank: ๋นˆ๊ฐ’ + ๊ณต๋ฐฑ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ํ—ˆ์šฉ X
@NotNull: null ํ—ˆ์šฉ X
@Range(min = 1000, max = 1000000): ๋ฒ”์œ„ ์•ˆ์˜ ๊ฐ’์ด์–ด์•ผ ํ•จ
@Max(9999): ์ตœ๋Œ€ ๊ด„ํ˜ธ ์•ˆ ๊ฐ’๊นŒ์ง€ ํ—ˆ์šฉ(์—ฌ๊ธฐ์„  9999)

๐Ÿ“Œ
javax.validation .constraints.NotNull
org.hibernate.validator .constraints.Range

javax.validation ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ํŠน์ • ๊ตฌํ˜„์— ๊ด€๊ณ„์—†์ด ์ œ๊ณต๋˜๋Š” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค

org.hibernate.validator ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ํ•˜์ด๋ฒ„๋„ค์ดํŠธ validator ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์ œ๊ณต๋˜๋Š” ๊ฒ€์ฆ ๊ธฐ๋Šฅ
(์‹ค๋ฌด์—์„œ ๋Œ€๋ถ€๋ถ„ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ validator๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•ด๋„ ๋จ)


[3] Bean Validation - ํ”„๋กœ์ ํŠธ ์ค€๋น„ V3

๐Ÿ“Œ ๋‹จ์ถ•ํ‚ค
command + R: ์›ํ•˜๋Š” ๋‹จ์–ด๋กœ ๋ณ€๊ฒฝ(์ผ๊ด„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)
command + shift + R: ๋””๋ ‰ํ† ๋ฆฌ ๋‹จ์œ„๋กœ ์›ํ•˜๋Š” ๋‹จ์–ด๋กœ ๋ณ€๊ฒฝ(์ผ๊ด„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)


[4] Bean Validation - ์Šคํ”„๋ง ์ ์šฉ

spring-boot-starter-validation ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„ฃ์œผ๋ฉด ์ž๋™์œผ๋กœ Bean Validator๋ฅผ ์ธ์ง€ํ•˜๊ณ  ์Šคํ”„๋ง์— ํ†ตํ•ฉ๋จ.

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ž๋™์œผ๋กœ ๊ธ€๋กœ๋ฒŒ Validator๋กœ ๋“ฑ๋กํ•œ๋‹ค.
๊ทธ๋ž˜์„œ Validator๊ฐ€ @NotNull ๊ฐ™์€ ์• ๋…ธํ…Œ์ด์…˜์„ ๋ณด๊ณ  ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
๋ฌผ๋ก , @Valid์™€ @Validated๋Š” ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ฒ€์ฆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด FieldError, ObjectError๋ฅผ ์ƒ์„ฑํ•ด BindingResult์— ๋‹ด์•„์ค€๋‹ค.

  1. @ModelAttribute ๊ฐ๊ฐ์˜ ํ•„๋“œ์— ํƒ€์ž… ๋ณ€ํ™˜ ์‹œ๋„
    2-1. ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด Validator ์ ์šฉ
    2-2. ์‹คํŒจํ–ˆ๋‹ค๋ฉด typeMismatch๋กœ FieldError ์ถ”๊ฐ€

๋ฐ”์ธ๋”ฉ์— ์„ฑ๊ณตํ•œ ํ•„๋“œ๋งŒ Bean Validator๊ฐ€ ์ ์šฉ๋œ๋‹ค.
ํƒ€์ž… ๋ณ€ํ™˜์— ์„ฑ๊ณตํ•ด ๋ฐ”์ธ๋”ฉ์— ์„ฑ๊ณตํ•œ ํ•„๋“œ์—ฌ์•ผ Bean Validator ์ ์šฉ์ด ์˜๋ฏธ์žˆ๋‹ค.

์ฆ‰, @ModelAttribute โ†’ ๊ฐ๊ฐ์˜ ํ•„๋“œ ํƒ€์ž… ๋ณ€ํ™˜ ์‹œ๋„ โ†’ ๋ณ€ํ™˜์— ์„ฑ๊ณตํ•œ ํ•„๋“œ๋งŒ BeanValidator ์ ์šฉ

Ex. itemName์— A๋ฅผ ๋„ฃ์—ˆ์„ ๋• ํƒ€์ž… ๋ณ€ํ™˜์ด ์„ฑ๊ณตํ•˜์ง€๋งŒ price์— ์ˆซ์ž ๋Œ€์‹  A๋ฅผ ๋„ฃ์œผ๋ฉด ํƒ€์ž… ๋ณ€ํ™˜์— ์‹คํŒจ


[5] Bean Validation - ์—๋Ÿฌ ์ฝ”๋“œ

๐Ÿ“Œ @NotBlank
NotBlank.item.itemName
NotBlank.itemName
NotBlank.java.lang.String
NotBlank

๐Ÿ“Œ @Range
Range.item.price
Range.price
Range.java.lang.Integer
Range

์ด ์ˆœ์„œ๋Œ€๋กœ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ฝ”๋“œ ์ƒ์„ฑ

BeanValidation ๋ฉ”์‹œ์ง€ ์ฐพ๋Š” ์ˆœ์„œ
1. ์ƒ์„ฑ๋œ ๋ฉ”์‹œ์ง€ ์ฝ”๋“œ ์ˆœ์„œ๋Œ€๋กœ messageSource์—์„œ ๋ฉ”์‹œ์ง€ ์ฐพ๊ธฐ
2. ์• ๋…ธํ…Œ์ด์…˜ message ์†์„ฑ ์‚ฌ์šฉ
3. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๊ฐ’ ์ œ๊ณต (๊ณต๋ฐฑ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ™์€)


[6] Bean Validation - ์˜ค๋ธŒ์ ํŠธ ์˜ค๋ฅ˜

@ScriptAssert(): BeanValidation์—์„œ ํŠน์ •ํ•„๋“œ fieldError๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ จ ์˜ค๋ฅ˜ objectError ์ฒ˜๋ฆฌ
ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์ด ๋„ˆ๋ฌด ์•ฝํ•ด(ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žฆ์Œ) ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ.

๊ทธ๋ƒฅ ์˜ค๋ธŒ์ ํŠธ ์˜ค๋ฅ˜ ๊ด€๋ จ ๋ถ€๋ถ„๋งŒ ์ง์ ‘ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜์ž.


[7] Bean Validation - ์ˆ˜์ •์— ์ ์šฉ

๋ชฉํ‘œ: ์ƒํ’ˆ ์ˆ˜์ •์—๋„ BeanValidation ์ ์šฉํ•˜๊ธฐ

edit()์˜ Item ๊ฐ์ฒด ๋ชจ๋ธ์— @Validated๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  editForm์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ฝ”๋“œ ์ถ”๊ฐ€


[8] Bean Validation - ํ•œ๊ณ„

ํ˜„์žฌ ์ˆ˜์ •์‹œ item์˜ id ๊ฐ’์€ ํ•ญ์ƒ ๋“ค์–ด์žˆ๋„๋ก ๋กœ์ง์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ๊ฒ€์ฆํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ HTTP ์š”์ฒญ์€ ์–ธ์ œ๋“  ์•…์˜์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด ์š”์ฒญํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„œ๋ฒ„์—์„œ ํ•ญ์ƒ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด HTTP ์š”์ฒญ์„ ๋ณ€๊ฒฝํ•ด item์˜ id ๊ฐ’์„ ์‚ญ์ œํ•˜๊ณ  ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์ข… ๊ฒ€์ฆ์€ ์„œ๋ฒ„์—์„œ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „!

์š”๊ตฌ์‚ฌํ•ญ์„ ์กฐ๊ธˆ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ ์ˆ˜์ •์‹œ์—๋Š” ์ˆ˜๋Ÿ‰์„ ๋ฌด์ œํ•œ์œผ๋กœ, id๊ฐ’์€ ํ•„์ˆ˜๋กœ ๋‘๋„๋ก ํ–ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋“ฑ๋ก์ด ์•ˆ๋œ๋‹ค. ๋“ฑ๋ก์‹œ์—๋Š” id์— ๊ฐ’๋„ ์—†๊ณ  quantity ์ˆ˜๋Ÿ‰ ์ œํ•œ ์ตœ๋Œ€ ๊ฐ’์ธ 9999๋„ ์ ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค.

ํ•œ๊ณ„: item์€ ๋“ฑ๋ก๊ณผ ์ˆ˜์ •์—์„œ ๊ฒ€์ฆ ์กฐ๊ฑด์˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ณ , ๋“ฑ๋ก๊ณผ ์ˆ˜์ •์€ ๊ฐ™์€ BeanValidation์„ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.


[9] Bean Validation - groups

๋“ฑ๋ก๊ณผ ์ˆ˜์ •์„ ๊ฐ™์ด ๊ฒ€์ฆํ•˜๋‹ˆ๊นŒ ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅด๊ฒŒ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

  • BeanValidation์˜ groups๊ธฐ๋Šฅ
  • Item์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ItemSaveForm, ItemUpdateForm ๊ฐ™์€ ํผ ์ „์†ก์„ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ

BeanValidation groups
: ๋“ฑ๋ก์‹œ ๊ฒ€์ฆํ•  ๊ธฐ๋Šฅ๊ณผ ์ˆ˜์ •์‹œ ๊ฒ€์ฆํ•  ๊ธฐ๋Šฅ์„ ๊ฐ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ  ์ ์šฉ

๐Ÿ“Œ groups๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @Valid๋Œ€์‹  @Validated๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์‹ค groups ๊ธฐ๋Šฅ์€ ์‹ค๋ฌด์—์„œ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ. (๋ณต์žก๋„๊ฐ€ ๋†’์Œ. ์‹ค๋ฌด์—์„œ๋Š” ๋“ฑ๋ก์šฉ ํผ ๊ฐ์ฒด์™€ ์ˆ˜์ •์šฉ ํผ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•ด ์‚ฌ์šฉํ•ด๋ฒ„๋ฆผ.)


[10] Form ์ „์†ก ๊ฐ์ฒด ๋ถ„๋ฆฌ - ํ”„๋กœ์ ํŠธ ์ค€๋น„ V4

์—ฌํƒœ ํ•ด์™”๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ  ๋ฒ„์ „ ์ผ๊ด„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธฐ


[11] Form ์ „์†ก ๊ฐ์ฒด ๋ถ„๋ฆฌ - ์†Œ๊ฐœ

์™œ ์‹ค๋ฌด์—์„œ Bean Validation groups๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋ƒ๋ฉด ๋“ฑ๋ก์‹œ ํผ์—์„œ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ Item ๋„๋ฉ”์ธ ๊ฐ์ฒด์™€ ๋”ฑ ๋งž์•„๋–จ์–ด์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์‹ค์ œ ์‹ค๋ฌด์—์„œ๋Š” ํšŒ์› ๋“ฑ๋ก์‹œ ํšŒ์› ๋ฐ์ดํ„ฐ๋งŒ ์ „๋‹ฌ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•ฝ๊ด€ ๋“ฑ ์ถ”๊ฐ€๋กœ ๋ฐ›๋Š” ์‚ฌํ•ญ์ด ๋งŽ๋‹ค.

๊ทธ๋ž˜์„œ Item์„ ์ง์ ‘ ์ „๋‹ฌ๋ฐ›๊ธฐ ๋ณด๋‹ค๋Š”, ๋ณต์žกํ•œ ํผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ๊นŒ์ง€ ์ „๋‹ฌํ•  ๋ณ„๋„์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ „๋‹ฌํ•œ๋‹ค.

  • โœ”๏ธ ํผ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์— Item ๋„๋ฉ”์ธ ๊ฐ์ฒด ์‚ฌ์šฉ
    HTML Form โ†’ Item โ†’ Controller โ†’ Item โ†’ Repository

์žฅ์ : Item ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ, ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๊นŒ์ง€ ์ง์ ‘ ์ „๋‹ฌํ•ด ์ค‘๊ฐ„ Item์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด ์—†์–ด ๊ฐ„๋‹จ
๋‹จ์ : ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ. ์ˆ˜์ •์‹œ ๊ฒ€์ฆ์ด ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๊ณ  groups๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

  • โœ”๏ธ ํผ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ๊ฐ์ฒด ์‚ฌ์šฉ
    HTML Form โ†’ ItemSaveForm โ†’ Controller โ†’ Item ์ƒ์„ฑ โ†’ Repository

์žฅ์ : ์ „์†กํ•˜๋Š” ํผ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์žกํ•ด๋„ ๋ณ„๋„์˜ ํผ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ. ๋“ฑ๋ก/์ˆ˜์ • ๋ณ„๋„์˜ ํผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ฆ์ด ์ค‘๋ณต๋˜์ง€ ์•Š์Œ
๋‹จ์ : ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ Item ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ณ€ํ™˜ ๊ณผ์ •์ด ์ถ”๊ฐ€(๊ฒฐ๊ตญ ์ฝ”๋“œ ๋Š˜์–ด๋‚จ)

์ˆ˜์ •์˜ ๊ฒฝ์šฐ ๋“ฑ๋ก๊ณผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค. ๋“ฑ๋ก์‹œ ํšŒ์› ์•„์ด๋””์™€ ์ฃผ๋ฏผ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›์ง€๋งŒ ์ˆ˜์ •์‹œ ์ด๋Š” ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๊ทธ๋ž˜์„œ (์ด ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ) ItemUpdateForm์ด๋ผ๋Š” ๋ณ„๋„์˜ ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ๋ฐ›์•˜๋‹ค.


[12] Form ์ „์†ก ๊ฐ์ฒด ๋ถ„๋ฆฌ - ๊ฐœ๋ฐœ

์œ„์—์„œ ๋งํ–ˆ๋“ฏ Item ๋Œ€์‹  ItemSaveForm์„ ์ „๋‹ฌ๋ฐ›์•„ @Validated๋กœ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  BindingResult๋กœ ๊ฒ€์ฆ ๊ฒฐ๊ณผ๋„ ๋ฐ›๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฐธ๊ณ ๋กœ @ModelAttribute("item")์— item ์ด๋ฆ„์„ ๋„ฃ์–ด์ค€ ๊ฒƒ์€ ItemSaveForm์˜ ๊ฒฝ์šฐ ๊ทœ์น™์— ์˜ํ•ด ์ด ์ด๋ฆ„์œผ๋กœ MVC Model์— ๋‹ด๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ทฐ ํ…œํ”Œ๋ฆฟ์—์„œ ์ ‘๊ทผํ•˜๋Š” th:object์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.


[13] Bean Validation - HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ

HttpMessageConverter์—๋„ @Valid, @Validated๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ
@ModelAttribute: HTTP ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ(URL ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง, POST Form)๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ
@RequestBody: HTTP ๋ฐ”๋””์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ๋–„ ์‚ฌ์šฉ. ์ฃผ๋กœ API JSON ์š”์ฒญ์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ

API์˜ ๊ฒฝ์šฐ 3๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•จ
1. ์„ฑ๊ณต ์š”์ฒญ: ์„ฑ๊ณต
2. ์‹คํŒจ ์š”์ฒญ: JSON์„ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ์ž์ฒด๋ฅผ ์‹คํŒจ
3. ๊ฒ€์ฆ ์˜ค๋ฅ˜ ์š”์ฒญ: JSON์„ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๊ณตํ–ˆ์œผ๋‚˜ ๊ฒ€์ฆ์—์„œ ์‹คํŒจ

์ด๋Š” HttpMessageConverter์—์„œ ์š”์ฒญ JSON์„ Item ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์‹คํŒจํ•œ ์ƒํ™ฉ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ปจํŠธ๋กค๋Ÿฌ ์ž์ฒด๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•˜๋‹ค.

๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•ด ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ–ˆ๊ณ  ObjectError์™€ FieldError๊ฐ€ ๋ฐ˜ํ™˜๋๋‹ค.

@ModelAttribute vs @RequestBody

HTTP ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” @ModelAttribute๋Š” ๊ฐ๊ฐ์˜ ํ•„๋“œ ๋‹จ์œ„๋กœ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค.
ํŠน์ • ํ•„๋“œ์— ํƒ€์ž…์ด ๋งž์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋‚˜๋จธ์ง€ ํ•„๋“œ๋Š” ์ •์ƒ ์ฒ˜๋ฆฌ

HttpMessageConverter๋Š” @ModelAttribute์™€ ๋‹ค๋ฅด๊ฒŒ ์ „์ฒด ๊ฐ์ฒด ๋‹จ์œ„๋กœ ์ ์šฉ๋œ๋‹ค.
๋”ฐ๋ผ์„œ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ ์ž‘๋™์— ์„ฑ๊ณตํ•˜์—ฌ Item ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ @Valid, @Validated๊ฐ€ ์ ์šฉ๋œ๋‹ค.

@ModelAttribute: ํ•„๋“œ ๋‹จ์œ„๋กœ ์ •๊ตํ•˜๊ฒŒ ๋ฐ”์ธ๋”ฉ ์ ์šฉ. ํŠน์ • ํ•„๋“œ๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋˜์ง€ ์•Š์•„๋„ ๋‚˜๋จธ์ง€ ํ•„๋“œ๋Š” ์ •์ƒ ๋ฐ”์ธ๋”ฉ. Validator๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒ€์ฆ๋„ ์ ์šฉ ๊ฐ€๋Šฅ.

@RequestBody: HttpMessageConverter ๋‹จ๊ณ„์—์„œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ดํ›„ ๋‹จ๊ณ„๋Š” ๋ฌด์šฉ์ง€๋ฌผ(์ง„ํ–‰ X). ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ X. Validator ์ ์šฉ X.


profile
๊ฐœ๋ฐœ ๋ฐ”๋ณด ์ด์‚ฌ ์ค‘

0๊ฐœ์˜ ๋Œ“๊ธ€