๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [์Šคํ”„๋ง๋ถ€ํŠธ] '@ModelAttribute vs @RequestBody DTO ๋งคํ•‘ ๋ฐฉ์‹'

ybkยท2025๋…„ 10์›” 28์ผ

spring

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

๐Ÿ”” @ModelAttribute vs @RequestBody: Spring์—์„œ DTO ๋งคํ•‘ ๋ฐฉ์‹์˜ ์ฐจ์ด

1๏ธโƒฃ @ModelAttribute ์ผ€์ด์Šค

@PostMapping
public ResponseEntity<?> uploadDoc(@ModelAttribute DocDto docDto, HttpSession session) { ... }
  • ์—ฌ๊ธฐ์„œ Spring MVC๋Š” HTTP ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ(form-data, query string ๋“ฑ)๋ฅผ DTO์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

  • ๋™์ž‘ ๋ฐฉ์‹:

    1. DocDto ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋กœ ๊ฐ์ฒด ์ƒ์„ฑ
    2. setter ํ˜ธ์ถœ๋กœ ๊ฐ ํ•„๋“œ์— ๊ฐ’ ์ฃผ์ž…
  • ๊ทธ๋ž˜์„œ @Setter๊ฐ€ ์—†์œผ๋ฉด ๊ฐ’์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ , DTO์˜ ํ•„๋“œ๊ฐ€ ๋ชจ๋‘ null์ด ๋ฉ๋‹ˆ๋‹ค.

  • ์ฆ‰, @ModelAttribute์™€ ๋งคํ•‘ํ•˜๋ ค๋ฉด setter๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

์ด๊ฒŒ "Setter ์—†์ด ํ•˜๋‹ˆ๊นŒ ๋งคํ•‘์ด ์•ˆ๋˜๋”๋ผ"์˜ ์ด์œ ์ž…๋‹ˆ๋‹ค. โœ…


2๏ธโƒฃ @RequestBody ์ผ€์ด์Šค

@PostMapping("/list")
public ResponseEntity<?> tbDocList(@RequestBody DocDto docDto) { ... }
  • ์—ฌ๊ธฐ์„œ Spring MVC๋Š” JSON ์š”์ฒญ ๋ฐ”๋””๋ฅผ DTO์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

  • ๋™์ž‘ ๋ฐฉ์‹:

    1. Jackson์ด JSON์„ ์ฝ์–ด DTO ๊ฐ์ฒด ์ƒ์„ฑ
    2. ์ง์ ‘ ํ•„๋“œ์— ๊ฐ’ ์ฃผ์ž… ๋˜๋Š” Builder๋ฅผ ํ†ตํ•œ ๊ฐ์ฒด ์ƒ์„ฑ
  • ๋”ฐ๋ผ์„œ setter๊ฐ€ ์—†์–ด๋„ ๋งคํ•‘ ๊ฐ€๋Šฅ, ๋‹จ @Builder์™€ @JsonDeserialize(builder=...)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด builder ํŒจํ„ด์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ Jackson์€ reflection์„ ์‚ฌ์šฉํ•ด์„œ final์ด ์•„๋‹Œ ํ•„๋“œ์— ๊ฐ’์„ ๋ฐ”๋กœ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ RequestBody๋Š” Setter ์—†์ด๋„ DTO์™€ ๋งคํ•‘์ด ๋œ ๊ฒ๋‹ˆ๋‹ค. โœ…


3๏ธโƒฃ ์ •๋ฆฌ

์–ด๋…ธํ…Œ์ด์…˜๊ฐ’ ๋ฐ”์ธ๋”ฉ ๋ฐฉ์‹DTO์— ํ•„์š”ํ•œ ๊ฒƒ
@ModelAttribute๊ธฐ๋ณธ ์ƒ์„ฑ์ž + setter ํ˜ธ์ถœ@Setter ํ•„์š”
@RequestBodyJackson์ด JSON ์ฝ์–ด ๊ฐ์ฒด ์ƒ์„ฑsetter ์—†์–ด๋„ OK, Builder ๊ฐ€๋Šฅ

๐Ÿ’Ÿ ์ •๋ฆฌ

๐Ÿ’ก ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝํ•˜๋ฉด:
@ModelAttribute = setter ๊ธฐ๋ฐ˜ ๋ฐ”์ธ๋”ฉ, @RequestBody = Jackson์ด ์ง์ ‘ DTO ๋งคํ•‘

profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

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