[Spring][๊ฐœ๋…]๐Ÿ”ฅ Spring MVC ์™„์ „ ํ•ด๋ถ€! ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๊นŒ์ง€ ํ•œ ๋ฒˆ์— ์ดํ•ดํ•˜๊ธฐ ๐Ÿš€

๊น€์ƒ์šฑยท2024๋…„ 10์›” 21์ผ
post-thumbnail

๐Ÿš€ Spring Web MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ ํ๋ฆ„ ์™„์ „ ์ •๋ณต! ๐ŸŒ

์ง€๊ธˆ ๋ฐ”๋กœ ์ดํ•ดํ•˜์ž, ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์—์„œ ์‘๋‹ต๊นŒ์ง€์˜ ์ „ ๊ณผ์ •์„ ํ•œ๋ˆˆ์—!


๐Ÿ–ฅ๏ธ 1. Client (Web Browser)

ํด๋ผ์ด์–ธํŠธ: ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์ด ์š”์ฒญ์€ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋˜๊ณ  DispatcherServlet์—์„œ ๋ณธ๊ฒฉ์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

๐Ÿšฆ 2. DispatcherServlet - Spring MVC์˜ ์ง€ํœ˜์ž!

DispatcherServlet์€ Spring MVC์˜ ํ•ต์‹ฌ! ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์•™ ํ—ˆ๋ธŒ ์—ญํ• ์„ ํ•˜๋ฉฐ, ์š”์ฒญ์„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ผ์šฐํŒ…ํ•˜๊ฑฐ๋‚˜ ๋ทฐ(View)๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  • DispatcherServlet์€ DefaultAnnotationHandlerMapping์„ ํ†ตํ•ด ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”— 3. DefaultAnnotationHandlerMapping - ์ปจํŠธ๋กค๋Ÿฌ ์ฐพ๊ธฐ์˜ ๋‹ฌ์ธ!

DefaultAnnotationHandlerMapping: ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. @Controller์™€ @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ์š”์ฒญ์„ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
Tip: Spring 3.0 ์ด์ „์—๋Š” ์ด ์ž‘์—…์„ ์ˆ˜๋™์œผ๋กœ ํ–ˆ์ง€๋งŒ, ์ด์ œ๋Š” ์ž๋™์œผ๋กœ ์„ค์ •๋˜๋‹ˆ ํŽธ๋ฆฌํ•ด์กŒ์ฃ ! ๐Ÿ™Œ

๐Ÿง‘โ€๐Ÿ’ป 4. Controller - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ํ•ต์‹ฌ ํ”Œ๋ ˆ์ด์–ด

Controller: ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ๋งˆ๋ฒ•์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค! ๐Ÿ’ซ @Controller์™€ @RequestMapping์„ ์‚ฌ์šฉํ•ด ํŠน์ • URL์— ๋งž๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์š”์ฒญ์— ๋งž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋ทฐ(View)๋กœ ์ „๋‹ฌ๋˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ฃ !


๐Ÿ’ก Spring MVC์—์„œ์˜ ์™„๋ฒฝํ•œ ์š”์ฒญ ์ฒ˜๋ฆฌ! @Controller์™€ @RequestMapping ์™„์ „ ํ•ด๋ถ€ ๐Ÿš€

ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด ๋ชจ๋“  ๊ณผ์ •, ์•Œ๊ณ  ๋‚˜๋ฉด ๋” ์‰ฌ์›Œ์ง„๋‹ค!


๐Ÿท๏ธ 1. @Controller ์–ด๋…ธํ…Œ์ด์…˜ - ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ•ต์‹ฌ!

  • @Controller๋Š” ์ด ํด๋ž˜์Šค๊ฐ€ Spring MVC ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๐ŸŒŸ
    ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ ์ ˆํ•œ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ์ค‘์ถ”์ ์ธ ์—ญํ• ์„ ํ•˜์ฃ .
  • Spring 3.0 ์ดํ›„๋กœ ๊ถŒ์žฅ๋˜๋ฉฐ, ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— ์ ์šฉ๋˜์–ด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋“ค์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๐ŸŒ 2. @RequestMapping("/article") - ๊ฒฝ๋กœ ์„ค์ •์˜ ์‹œ์ž‘!

  • ํด๋ผ์ด์–ธํŠธ์˜ ์–ด๋–ค ์š”์ฒญ ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ• ์ง€ ์ •์˜ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ๋Š” "/article"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋งก๊ฒ ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค!
  • ์„ธ๋ถ€ ๊ฒฝ๋กœ๋Š” ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ์˜ @RequestMapping, @GetMapping, @PostMapping ๋“ฑ์œผ๋กœ ๊ตฌ์ฒดํ™”๋ฉ๋‹ˆ๋‹ค. ๐Ÿ›ค๏ธ

๐Ÿ› ๏ธ 3. ์ƒ์„ฑ์ž ์ฃผ์ž… - ์˜์กด์„ฑ ์ฃผ์ž…์˜ ํ•„์ˆ˜!

public BoardController(BoardService boardService) {
    this.boardService = boardService;
}
  • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด BoardService๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    Spring์˜ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection) ๋•๋ถ„์— ์„œ๋น„์Šค ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๐Ÿ™Œ

๐Ÿ”„ 4. @GetMapping("/write") - GET ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ!

  • @GetMapping์€ HTTP GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    /article/write๋กœ ๋“ค์–ด์˜ค๋Š” GET ์š”์ฒญ์€ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ“
  • @RequestParam์„ ์‚ฌ์šฉํ•ด ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” ์—ฌ๋Ÿฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Map<String, String>์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ค 5. Model ๊ฐ์ฒด - ๋ทฐ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ!

  • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ(View)๋กœ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” Model ๊ฐ์ฒด!
    model.addAttribute()๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ , ๋ทฐ์—์„œ ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๐Ÿ’ก

๐Ÿง‘โ€๐Ÿ’ป ์ฝ”๋“œ ์˜ˆ์‹œ

์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ๋กœ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณผ๊นŒ์š”?

@Controller
@RequestMapping("/article")
public class ArticleController {

    private final ArticleService articleService;

    public ArticleController(ArticleService articleService) {
        this.articleService = articleService;
    }

    @GetMapping("/write")
    public String writeArticle(@RequestParam Map<String, String> params, Model model) {
        model.addAttribute("page", params.get("page"));
        model.addAttribute("title", params.get("title"));
        model.addAttribute("content", params.get("content"));
        return "article/write";
    }
}

๐Ÿš€ ์„ค๋ช…

  • @Controller์™€ @RequestMapping("/article")์„ ์‚ฌ์šฉํ•ด /article ๊ฒฝ๋กœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • writeArticle ๋ฉ”์„œ๋“œ๋Š” /article/write ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„ Model ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ทฐ๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‚ด์šฉ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘€

๐Ÿ› ๏ธ Spring์—์„œ Controller ์„ค์ •, ์ˆ˜๋™ vs ์ž๋™? ์™„๋ฒฝ ๋น„๊ต ๐Ÿš€

์ง€๊ธˆ ๋‹น์žฅ ๋ฐฐ์›Œ๋ณด๋Š” Spring ์ปจํŠธ๋กค๋Ÿฌ ๋“ฑ๋ก ๋ฐฉ๋ฒ•์˜ ๋ชจ๋“  ๊ฒƒ!


๐Ÿท๏ธ 1. Controller Class ์ˆ˜๋™ ๋“ฑ๋ก ๋ฐฉ์‹

  • ์„ค๋ช…: Spring์—์„œ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋ฅผ XML ํŒŒ์ผ์„ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋นˆ(bean)์œผ๋กœ ์ง์ ‘ ๋“ฑ๋กํ•˜๊ณ , ๊ทธ ํด๋ž˜์Šค๊ฐ€ ์˜์กดํ•˜๋Š” ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑ์ž๋‚˜ ํ•„๋“œ์— ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๐ŸŽฏ

  • ์˜ˆ์‹œ ์ฝ”๋“œ:

    <bean class="com.example.web.controller.MyController">
        <constructor-arg ref="myService" />
    </bean>
    • class="com.example.web.controller.MyController": Spring ์ปจํ…Œ์ด๋„ˆ์— MyController๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋ก!
    • <constructor-arg ref="myService" />: ์ปจํŠธ๋กค๋Ÿฌ์— ํ•„์š”ํ•œ ์˜์กด์„ฑ ์„œ๋น„์Šค๋„ ๊ฐ™์ด ์ฃผ์ž…!

๐ŸŽฏ ์žฅ์ 

  • ์„ธ๋ถ€์ ์ธ ์ œ์–ด ๊ฐ€๋Šฅ: ๋นˆ ์ƒ์„ฑ ๋ฐ ์ฃผ์ž…์— ๋Œ€ํ•œ ์„ธ๋ฐ€ํ•œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™Œ

๐Ÿšจ ๋‹จ์ 

  • ๋ณต์žก์„ฑ: ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋งŽ์•„์ง€๋ฉด, XML์—์„œ ๋ชจ๋“  ๋นˆ์„ ์ˆ˜๋™ ๋“ฑ๋กํ•˜๋Š” ๊ฒŒ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๊ณ  ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

๐Ÿ” 2. Controller Class ์ž๋™ ์Šค์บ” - ๋” ์‰ฌ์šด ๊ด€๋ฆฌ!

  • ์„ค๋ช…: Spring์—์„œ XML ํŒŒ์ผ์„ ํ†ตํ•ด ์–ด๋…ธํ…Œ์ด์…˜์ด ๋‹ฌ๋ฆฐ ์ปจํŠธ๋กค๋Ÿฌ๋“ค์„ ์ž๋™ ์Šค์บ”ํ•˜์—ฌ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๐Ÿ’ก ์ผ์ผ์ด ์ˆ˜๋™ ๋“ฑ๋กํ•˜์ง€ ์•Š์•„๋„ Spring์ด ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค!

  • ์˜ˆ์‹œ ์ฝ”๋“œ:

    <context:component-scan base-package="com.example.web.controller" />
    • base-package="com.example.web.controller": ์ด ๊ฒฝ๋กœ ๋‚ด์—์„œ @Controller ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ์Šค์บ”ํ•˜์—ฌ ๋นˆ์œผ๋กœ ๋“ฑ๋ก!

๐ŸŒŸ ์žฅ์ 

  • ํŽธ๋ฆฌํ•จ: ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ž๋™์œผ๋กœ ์Šค์บ”ํ•ด ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๋ฏ€๋กœ, ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๋ณ„๋„์˜ ์„ค์ •์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿค–

โš ๏ธ ๋‹จ์ 

  • ์„ธ๋ฐ€ํ•œ ์ œ์–ด ์–ด๋ ค์›€: ์ˆ˜๋™ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋นˆ์˜ ์ƒ์„ฑ ๋ฐ ์ฃผ์ž… ๊ณผ์ •์„ ์„ธ๋ถ€์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๐Ÿ† ๋น„๊ต ๋ฐ ์š”์•ฝ

  • ์ˆ˜๋™ ๋“ฑ๋ก: XML์—์„œ ์ผ์ผ์ด ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ณต์žกํ•จ.
  • ์ž๋™ ์Šค์บ”: ํŒจํ‚ค์ง€ ์ „์ฒด๋ฅผ ์Šค์บ”ํ•ด @Controller ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ํŽธ๋ฆฌํ•จ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์Œ. ๐Ÿ’ผ

๐Ÿ’ก Tip: Spring 3.0 ์ดํ›„๋กœ๋Š” ์ž๋™ ์Šค์บ”์ด ํ›จ์”ฌ ๋ณดํŽธ์ ์ด๊ณ , ์ˆ˜๋™ ๋“ฑ๋ก๋ณด๋‹ค๋Š” ๋” ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!


๐ŸŒ Spring MVC์—์„œ @RequestMapping๊ณผ HTTP ๋ฉ”์„œ๋“œ์˜ ์™„๋ฒฝ ๋งคํ•‘ ๋น„๋ฒ•! ๐Ÿš€

URL๊ณผ ๋ฉ”์„œ๋“œ ๋งคํ•‘์˜ ๋ชจ๋“  ๊ฒƒ, ์ด์ œ ํ™•์‹คํ•˜๊ฒŒ ๋งˆ์Šคํ„ฐํ•˜์ž!


๐Ÿท๏ธ 1. @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜ - URL ๋งคํ•‘์˜ ํ•ต์‹ฌ!

  • @RequestMapping์€ ์š”์ฒญ URL๊ณผ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๐ŸŽฏ
    ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๊ฒฝ๋กœ์— ๋“ค์–ด์˜จ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋ฉ”์„œ๋“œ์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํด๋ž˜์Šค ๋ ˆ๋ฒจ๊ณผ ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ!
    • ๊ฐ™์€ ๊ฒฝ๋กœ๋ผ๋„ HTTP ๋ฉ”์„œ๋“œ(GET, POST ๋“ฑ)์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ฃ . ๐ŸŒ

๐Ÿ—‚๏ธ 2. ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ์˜ @RequestMapping - ๊ธฐ๋ณธ ๊ฒฝ๋กœ ์„ค์ •

  • ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ @RequestMapping("/article")๊ณผ ๊ฐ™์ด ์„ ์–ธํ•˜๋ฉด, ์ด ํด๋ž˜์Šค ๋‚ด ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ /article ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ์„ ์–ธ๋œ ๊ฒฝ๋กœ๋Š” ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ์—์„œ ์„ค์ •ํ•œ ๊ฒฝ๋กœ์™€ ์กฐํ•ฉ๋˜์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค! ๐Ÿ’ก
@Controller
@RequestMapping("/article")
public class ArticleController {

    private final Logger logger = LoggerFactory.getLogger(ArticleController.class);

    @GetMapping("/write")
    public String writeForm(Model model) {
        logger.debug("Rendering write form");
        model.addAttribute("formTitle", "Write an Article");
        return "article/write";
    }

    @PostMapping("/write")
    public String submitArticle(@ModelAttribute ArticleDto articleDto) {
        logger.debug("Article submitted: {}", articleDto);
        // ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ํ›„, ๋ทฐ๋ฅผ ๋ฆฌํ„ด
        return "redirect:/article/success";
    }
}

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…:

  • @RequestMapping("/article"): ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ด ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ /article ๊ฒฝ๋กœ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • @GetMapping("/write"): /article/write ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•  ์ž…๋ ฅ ํผ์„ ๋ Œ๋”๋งํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ“„
  • @PostMapping("/write"): ๊ฐ™์€ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ POST ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ๋˜์ฃ ! ๐Ÿš€

๐Ÿ’ป 3. HTTP ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ฅธ ๋ฉ”์„œ๋“œ ๋งคํ•‘ - ์ •ํ™•ํ•œ ์š”์ฒญ ์ฒ˜๋ฆฌ!

  • @GetMapping์€ GET ์š”์ฒญ์—๋งŒ ๋ฐ˜์‘ํ•˜๋ฉฐ, ์ฃผ๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ๋‚˜ ํผ ๋ Œ๋”๋ง ์‹œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • @PostMapping์€ POST ์š”์ฒญ์—๋งŒ ๋ฐ˜์‘ํ•˜๋ฉฐ, ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”„ ์ฐจ์ด์ :

  • GET ์š”์ฒญ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ํผ์„ ๋ Œ๋”๋งํ•  ๋•Œ ์‚ฌ์šฉ๋˜๊ณ ,
  • POST ์š”์ฒญ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„์— ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค! ๐Ÿ“ค

๐Ÿ’ก ์˜ˆ์‹œ ๋ถ„์„

์œ„์˜ ์ฝ”๋“œ๋Š” /article/write ๊ฒฝ๋กœ์— ๋Œ€ํ•œ GET๊ณผ POST ์š”์ฒญ์„ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • GET ์š”์ฒญ: ์‚ฌ์šฉ์ž๊ฐ€ ๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ ํผ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๐Ÿ“
  • POST ์š”์ฒญ: ์ œ์ถœ๋œ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฑฐ์นœ ํ›„ ์„ฑ๊ณต ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค!

๐Ÿ’ป Spring MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ, ์™„๋ฒฝ ๊ฐ€์ด๋“œ! ๐Ÿ› ๏ธ

์š”์ฒญ ์ •๋ณด, ์ฟ ํ‚ค, ์„ธ์…˜๊นŒ์ง€ ํ•œ ๋ฒˆ์— ๋‹ค๋ฃจ๋Š” ๋น„๋ฒ•!


๐Ÿ› ๏ธ 1. HttpServletRequest, HttpServletResponse, HttpSession

Servlet API ๊ฐ์ฒด ์ง์ ‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ!

  • HttpServletRequest: ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋กœ, ํŒŒ๋ผ๋ฏธํ„ฐ, ํ—ค๋”, ์„ธ์…˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • HttpServletResponse: ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ์ฝ”๋“œ ์„ค์ •, ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ „์†ก ๋“ฑ ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ์“ฐ์ž…๋‹ˆ๋‹ค!
  • HttpSession: ์‚ฌ์šฉ์ž ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ› ๏ธ

๐ŸŒ 2. Locale - ๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ์˜ ํ•„์ˆ˜!

Locale: ํ˜„์žฌ ์š”์ฒญ์˜ ๋กœ์ผ€์ผ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ, ๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ ๋“ฑ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์–ธ์–ด ์„ค์ •์— ๋”ฐ๋ผ ๋งž์ถค ์‘๋‹ต์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ—ฃ๏ธ


๐Ÿ”„ 3. InputStream, Reader - ์ŠคํŠธ๋ฆผ์œผ๋กœ ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ๋‚˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ์— ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ’พ

๐Ÿ“ค 4. OutputStream, Writer - ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ž‘์„ฑํ•˜๊ธฐ

์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ตํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๋‚˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค! ๐Ÿš€


๐Ÿ›ค๏ธ 5. @PathVariable - URI ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜ ๋ฐ›๊ธฐ

@PathVariable: URI ํ…œํ”Œ๋ฆฟ์—์„œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, /articles/{id} ๊ฒฝ๋กœ์—์„œ {id} ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@GetMapping("/articles/{id}")
public String getArticle(@PathVariable("id") Long articleId) {
    // articleId ์‚ฌ์šฉ
}

๐Ÿ“‘ 6. @RequestParam - ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ฒ˜๋ฆฌ

@RequestParam: ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ?name=value ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ž์ฃผ ์“ฐ์ด์ฃ ! ๐Ÿ’ก

@GetMapping("/search")
public String search(@RequestParam("query") String query) {
    // query ์‚ฌ์šฉ
}

๐Ÿงพ 7. @RequestHeader - ์š”์ฒญ ํ—ค๋” ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

@RequestHeader: HTTP ์š”์ฒญ ํ—ค๋” ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, User-Agent ํ—ค๋” ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

@GetMapping("/header")
public String getHeader(@RequestHeader("User-Agent") String userAgent) {
    // User-Agent ์‚ฌ์šฉ
}

๐Ÿช 8. @CookieValue - ์ฟ ํ‚ค ๊ฐ’ ์ฒ˜๋ฆฌํ•˜๊ธฐ

@CookieValue: HTTP ์š”์ฒญ์— ํฌํ•จ๋œ ์ฟ ํ‚ค ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค! ๐Ÿช

@GetMapping("/cookie")
public String getCookie(@CookieValue("sessionId") String sessionId) {
    // sessionId ์‚ฌ์šฉ
}

๐Ÿงฉ 9. @RequestBody - ๋ฐ”๋”” ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜

@RequestBody: HTTP ์š”์ฒญ์˜ Body ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค! ๐Ÿง‘โ€๐Ÿ’ป

@PostMapping("/submit")
public String submitData(@RequestBody DataDto data) {
    // data ๊ฐ์ฒด ์‚ฌ์šฉ
}

๐Ÿ› ๏ธ 10. Map, Model, ModelMap - ๋ทฐ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

Model ๊ฐ์ฒด๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ทฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์—์„œ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์ฃ !

@GetMapping("/view")
public String viewData(Model model) {
    model.addAttribute("key", "value");
    return "viewName";
}

๐Ÿ“ 11. ์ปค๋งจ๋“œ ๊ฐ์ฒด (DTO) - ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ฐ›๊ธฐ

DTO ๊ฐ์ฒด๋กœ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค! ๐ŸŽฏ

@PostMapping("/submit")
public String submitForm(@ModelAttribute FormDto form) {
    // form ๊ฐ์ฒด ์‚ฌ์šฉ
}

๐Ÿšจ 12. Errors, BindingResult - ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ

์œ ํšจ์„ฑ ๊ฒ€์ฆ ์‹คํŒจ ์‹œ, BindingResult๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜ ํ•ญ๋ชฉ์„ ํ™•์ธํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ›ก๏ธ

@PostMapping("/submit")
public String submitForm(@ModelAttribute FormDto form, BindingResult result) {
    if (result.hasErrors()) {
        return "formPage";
    }
    // ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ†ต๊ณผ
}

๐Ÿ”’ 13. SessionStatus - ์„ธ์…˜ ์ดˆ๊ธฐํ™”

SessionStatus: ์„ธ์…˜ ์†์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ์™„๋ฃŒํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ์„ธ์…˜์„ ๋๋‚ด๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค!


๐Ÿ” Spring MVC์—์„œ @RequestParam ์™„์ „์ •๋ณต! ํŒŒ๋ผ๋ฏธํ„ฐ ๋งคํ•‘์˜ ๋ชจ๋“  ๊ฒƒ ๐Ÿš€

ํผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ถ€ํ„ฐ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๊นŒ์ง€! Spring MVC์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋‹ค๋ฃจ๊ธฐ, ์ด์ œ ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ์ž!


๐ŸŽฏ 1. @RequestParam ์–ด๋…ธํ…Œ์ด์…˜ - ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์†์‰ฝ๊ฒŒ ๋งคํ•‘ํ•˜์ž!

  • @RequestParam์€ HTTP ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
    ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ’ก

๐Ÿ› ๏ธ ์ฃผ์š” ์†์„ฑ

  • value: ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • defaultValue: ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • required: ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•„์ˆ˜์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true๋กœ ํ•„์ˆ˜์ด์ง€๋งŒ, false๋กœ ์„ค์ •ํ•˜๋ฉด ์—†์–ด๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์š”! ๐Ÿ”„

๐Ÿ’ป ์˜ˆ์‹œ ์ฝ”๋“œ - ๊ฐ„๋‹จํ•œ ํผ ์ฒ˜๋ฆฌ

์•„๋ž˜ ์ฝ”๋“œ๋Š” ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค! ๐ŸŽฏ

@PostMapping("/submit")
public String handleForm(
    @RequestParam("name") String userName, 
    @RequestParam(value = "age", defaultValue = "25") int userAge,
    @RequestParam(value = "hobbies", required = false) String[] hobbies,
    Model model) {

    // ์ฝ˜์†”์— ์ž…๋ ฅ๋œ ๊ฐ’ ์ถœ๋ ฅ
    System.out.println("Name: " + userName + ", Age: " + userAge);
    if (hobbies != null) {
        System.out.println("Hobbies: " + Arrays.toString(hobbies));
    }

    // ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ทฐ์— ์ „๋‹ฌ
    model.addAttribute("userName", userName);
    model.addAttribute("userAge", userAge);
    model.addAttribute("hobbies", hobbies != null ? Arrays.toString(hobbies) : "No hobbies selected");

    return "formResult"; // ๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋กœ ์ด๋™
}

๐Ÿ”Ž ์ฝ”๋“œ ์„ค๋ช…

  • @RequestParam("name"): ํ•„์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ "name" ๊ฐ’์„ ๋ฐ›์•„ userName ๋ณ€์ˆ˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • @RequestParam(value = "age", defaultValue = "25"): ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ 25๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‚
  • @RequestParam(value = "hobbies", required = false): ์ทจ๋ฏธ ๊ฐ’์€ ์„ ํƒ ์‚ฌํ•ญ! null ํ—ˆ์šฉ์œผ๋กœ, ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์š”. ๐Ÿ’ก

๐ŸŒ ์š”์ฒญ ์˜ˆ์‹œ

  1. URL: /submit?name=John&age=30&hobbies=reading,traveling

    • ๊ฒฐ๊ณผ: ์ด๋ฆ„์€ John, ๋‚˜์ด๋Š” 30, ์ทจ๋ฏธ๋Š” reading๊ณผ traveling์ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๐ŸŽ’โœˆ๏ธ
  2. URL: /submit?name=Jane

    • ๊ฒฐ๊ณผ: ์ด๋ฆ„์€ Jane, ๋‚˜์ด๋Š” ๊ธฐ๋ณธ๊ฐ’ 25, ์ทจ๋ฏธ๋Š” ์„ ํƒ๋˜์ง€ ์•Š์Œ. ๐Ÿ˜Ž

๐Ÿ–ฅ๏ธ ์ฝ˜์†” ์ถœ๋ ฅ ์˜ˆ์‹œ

  • Name: John, Age: 30
  • Hobbies: [reading, traveling]

๐Ÿ“„ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€์—์„œ ํ‘œ์‹œ๋˜๋Š” ์ •๋ณด

  • ์ด๋ฆ„, ๋‚˜์ด, ์ทจ๋ฏธ๊ฐ€ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€์—์„œ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค!
    • ์ทจ๋ฏธ๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์œผ๋ฉด: "No hobbies selected"๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๐Ÿš€ Spring MVC์—์„œ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„๋ฒ•! Command Object ์™„์ „์ •๋ณต! ๐Ÿ“

ํผ ๋ฐ์ดํ„ฐ๋ฅผ DTO๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ๋ณต์žกํ•จ์€ ์‚ฌ๋ผ์ง€๊ณ , ๊น”๋”ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค!


๐ŸŽฏ 1. Command Object๋ž€? - DTO, VO ํ™œ์šฉํ•˜๊ธฐ

Spring MVC์—์„œ Command Object๋Š” ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ฐ›๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค!

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTML ํผ์„ ํ†ตํ•ด ์ œ์ถœํ•œ ๋ฐ์ดํ„ฐ๋ฅผ JavaBean ๊ฐ์ฒด๋กœ ์ž๋™ ๋งคํ•‘ํ•ด ์ฃผ์ฃ . ๐ŸŽฏ
  • DTO(Data Transfer Object)๋‚˜ VO(Value Object)๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ž…๋ ฅ๊ฐ’์„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋ฌถ์–ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”!

๐Ÿ’ป ์˜ˆ์‹œ ์ฝ”๋“œ - DTO์™€ Controller ์„ค์ •

DTO ํด๋ž˜์Šค

public class UserDto {
    private String name;
    private int age;
    private String[] hobbies;

    // Getter and Setter methods
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String[] getHobbies() {
        return hobbies;
    }

    public void setHobbies(String[] hobbies) {
        this.hobbies = hobbies;
    }

    @Override
    public String toString() {
        return "UserDto{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hobbies=" + Arrays.toString(hobbies) +
                '}';
    }
}

Controller ํด๋ž˜์Šค

@Controller
public class UserController {

    @PostMapping("/submitForm")
    public String submitForm(UserDto userDto, Model model) {
        // DTO ๊ฐ์ฒด๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ
        System.out.println(userDto);

        // ๋ชจ๋ธ์— DTO ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ทฐ๋กœ ์ „๋‹ฌ
        model.addAttribute("user", userDto);
        return "formResult"; // ๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋กœ ์ด๋™
    }
}

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  • UserDto ํด๋ž˜์Šค: ์ด ํด๋ž˜์Šค๋Š” ์ด๋ฆ„(name), ๋‚˜์ด(age), ์ทจ๋ฏธ(hobbies)๋ผ๋Š” ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ , ํผ์—์„œ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ•„๋“œ์—๋Š” getter์™€ setter ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • submitForm ๋ฉ”์„œ๋“œ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํผ์„ ์ œ์ถœํ•˜๋ฉด, UserDto ๊ฐ์ฒด๋กœ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ทฐ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์ฃ . ๐Ÿš€

๐Ÿ“ 2. HTML ํผ ์˜ˆ์‹œ - ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›์ž!

<form action="/submitForm" method="post">
    ์ด๋ฆ„: <input type="text" name="name" /><br/>
    ๋‚˜์ด: <input type="number" name="age" /><br/>
    ์ทจ๋ฏธ: 
    <input type="checkbox" name="hobbies" value="reading" /> ๋…์„œ
    <input type="checkbox" name="hobbies" value="traveling" /> ์—ฌํ–‰
    <input type="checkbox" name="hobbies" value="sports" /> ์šด๋™
    <br/>
    <input type="submit" value="์ „์†ก" />
</form>

๐Ÿ”„ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฆ„, ๋‚˜์ด, ์ทจ๋ฏธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ํผ์„ ์ œ์ถœํ•˜๋ฉด, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ UserDto ๊ฐ์ฒด๋กœ ์ž๋™ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค!
  2. ์ปจํŠธ๋กค๋Ÿฌ์˜ submitForm ๋ฉ”์„œ๋“œ์—์„œ UserDto ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ทฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  3. Model ๊ฐ์ฒด์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ทฐ์—์„œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๐ŸŽฏ

๐Ÿ“„ 3. ๋ทฐ์—์„œ ๊ฒฐ๊ณผ ์ถœ๋ ฅํ•˜๊ธฐ!

ํผ์—์„œ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์—์„œ ๊ฒฐ๊ณผ๋กœ ๋ณด์—ฌ์ฃผ์ž! ๐Ÿ’ก

<h1>ํผ ์ œ์ถœ ๊ฒฐ๊ณผ</h1>
<p>์ด๋ฆ„: ${user.name}</p>
<p>๋‚˜์ด: ${user.age}</p>
<p>์ทจ๋ฏธ: ${user.hobbies}</p>

๐Ÿ’ก Spring MVC์—์„œ @RequestBody ์™„์ „ ํ•ด๋ถ€! HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์œ ์ž์žฌ๋กœ ๋‹ค๋ฃจ์ž! ๐Ÿš€

JSON๋ถ€ํ„ฐ XML๊นŒ์ง€, ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ๋ํŒ์™• @RequestBody!


๐ŸŽฏ 1. @RequestBody ์–ด๋…ธํ…Œ์ด์…˜ - ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์ž!

  • @RequestBody๋Š” HTTP ์š”์ฒญ์˜ Body์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    ์ฃผ๋กœ JSON ๋˜๋Š” XML ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์„œ๋ฒ„์—์„œ ๊ฐ์ฒด๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋˜์ฃ ! ๐Ÿ“

๐Ÿ”„ 2. ๋ณ€ํ™˜์˜ ํ•ต์‹ฌ, HttpMessageConverter๋ž€?

  • Spring MVC๋Š” HttpMessageConverter๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด HTTP ์š”์ฒญ ๋ฐ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค!

    • Content-Type์ด application/json์ด๋ฉด JSON ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ ,
    • application/xml์ด๋ฉด XML ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์ค๋‹ˆ๋‹ค! ๐ŸŒ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด JSON ๋ฐ์ดํ„ฐ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ๊ฐ์ฒด๋ฅผ JSON ์‘๋‹ต์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    ์ด ๋ชจ๋“  ๊ณผ์ •์ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•œ ์„ค์ • ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿš€


๐Ÿง‘โ€๐Ÿ’ป 3. ์˜ˆ์‹œ ์ฝ”๋“œ - @RequestBody์™€ @ResponseBody์˜ ์กฐํ•ฉ

@RestController
public class UserController {

    @PostMapping("/user")
    public UserDto createUser(@RequestBody UserDto userDto) {
        // HTTP ์š”์ฒญ์˜ Body ๋ฐ์ดํ„ฐ๋ฅผ UserDto ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฒ˜๋ฆฌ
        System.out.println("Received User: " + userDto);

        // ์ฒ˜๋ฆฌ ํ›„ ์‘๋‹ต์œผ๋กœ ๋‹ค์‹œ ๋ฐ˜ํ™˜ (JSON ํ˜•ํƒœ)
        return userDto;
    }
}

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  • @RequestBody: ํด๋ผ์ด์–ธํŠธ๊ฐ€ POST ์š”์ฒญ์œผ๋กœ ๋ณด๋‚ธ JSON ๋ฐ์ดํ„ฐ๋ฅผ UserDto ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • @ResponseBody: ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜ํ•œ UserDto ๊ฐ์ฒด๋Š” ๋‹ค์‹œ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์‘๋‹ต์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • Spring์˜ HttpMessageConverter๊ฐ€ ์ž๋™ ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ”„

๐ŸŒ 4. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „์†กํ•  JSON ์˜ˆ์‹œ

{
    "name": "John",
    "age": 30,
    "hobbies": ["reading", "sports"]
}

๐Ÿ”„ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„

  1. ํด๋ผ์ด์–ธํŠธ๋Š” JSON ๋ฐ์ดํ„ฐ๋ฅผ POST ์š”์ฒญ์œผ๋กœ ์„œ๋ฒ„์— ๋ณด๋ƒ…๋‹ˆ๋‹ค!
  2. ์„œ๋ฒ„๋Š” @RequestBody๋ฅผ ํ†ตํ•ด JSON ๋ฐ์ดํ„ฐ๋ฅผ UserDto ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  3. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌ๋œ UserDto ๊ฐ์ฒด๋Š” @ResponseBody๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ JSON ์‘๋‹ต์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค!

๐Ÿš€ Spring MVC ์ปจํŠธ๋กค๋Ÿฌ ๋ฆฌํ„ด ํƒ€์ž… ์™„๋ฒฝ ์ •๋ฆฌ! ๋ฆฌํ„ด ๊ฐ’์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ์‘๋‹ต ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ๐ŸŒŸ

๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ๋•Œ, JSON ์‘๋‹ต์„ ์ „์†กํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ฆฌํ„ด ํƒ€์ž…์„ ํ•œ๋ˆˆ์— ์‚ดํŽด๋ณด์ž!


๐ŸŽฏ 1. ModelAndView - ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•˜์ž!

ModelAndView๋Š” ๋ทฐ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ(๋ชจ๋ธ)๋ฅผ ๋™์‹œ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋ฆฌํ„ด ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ์™€ ๋ทฐ ์ด๋ฆ„์„ ํ•œ ๋ฒˆ์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”!

@GetMapping("/greeting")
public ModelAndView greeting() {
    ModelAndView mav = new ModelAndView("greetView"); // ๋ทฐ ์ด๋ฆ„ ์„ค์ •
    mav.addObject("message", "Hello, World!"); // ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
    return mav; // ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐ˜ํ™˜!
}

๐Ÿ› ๏ธ 2. Model - ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ๋กœ ์ „๋‹ฌํ•˜๊ธฐ!

Model์€ ๋ทฐ์— ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋งŒ์„ ๋‹ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ทฐ ์ด๋ฆ„์€ String์œผ๋กœ ๋”ฐ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ“ฆ

@GetMapping("/welcome")
public String welcome(Model model) {
    model.addAttribute("message", "Welcome to Spring MVC");
    return "welcomeView"; // ๋ทฐ ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜!
}

๐Ÿ“„ 3. Map - Java์˜ ๋งต ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ!

Model๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ Map๋„ ๋ทฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Map ๊ฐ์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ทฐ ์ด๋ฆ„์€ ๋”ฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

@GetMapping("/info")
public String info(Map<String, Object> map) {
    map.put("info", "This is some information.");
    return "infoView"; // ๋ทฐ ์ด๋ฆ„ ๋ฐ˜ํ™˜!
}

๐Ÿ”— 4. String - ๋ทฐ ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜์ž!

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฆฌํ„ด ํƒ€์ž…! String์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋Š” Model ๋˜๋Š” Map์„ ํ†ตํ•ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽฏ

@GetMapping("/home")
public String home(Model model) {
    model.addAttribute("greeting", "Hello Home!");
    return "homeView"; // ๋ทฐ ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜
}

๐Ÿ‘๏ธ 5. View - ํŠน์ • ๋ทฐ ๊ฐ์ฒด ์ง์ ‘ ๋ฐ˜ํ™˜!

๋ทฐ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” View ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • JSP, Thymeleaf ๋“ฑ์˜ ๋ทฐ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”!

@GetMapping("/customView")
public View customView() {
    return new InternalResourceView("/WEB-INF/views/custom.jsp"); // JSP ํŒŒ์ผ ์ง์ ‘ ์ง€์ •!
}

โœจ 6. void - ์ง์ ‘ ์‘๋‹ต ์ฒ˜๋ฆฌํ•˜๊ธฐ!

void๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์‘๋‹ต ์ž์ฒด๋ฅผ ์ง์ ‘ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. HttpServletResponse๋กœ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜, ๋ทฐ ์ด๋ฆ„์„ URL์—์„œ ์ž๋™ ์ถ”๋ก ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@GetMapping("/autoView")
public void autoView(HttpServletResponse response) throws IOException {
    response.getWriter().write("Direct response content");
}

๐ŸŒ 7. @ResponseBody - ๊ฐ์ฒด๋ฅผ JSON, XML๋กœ ๋ณ€ํ™˜!

@ResponseBody๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Java ๊ฐ์ฒด๋ฅผ JSON ๋˜๋Š” XML๋กœ ๋ณ€ํ™˜ํ•ด ์‘๋‹ต์œผ๋กœ ์ง์ ‘ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ REST API์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, Spring์˜ HttpMessageConverter๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•ด์ค๋‹ˆ๋‹ค! ๐Ÿš€

@GetMapping("/api/data")
@ResponseBody
public DataDto getData() {
    return new DataDto("John", 25); // JSON์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์‘๋‹ต๋จ
}

๋ฉ‹์ง„ Velog ํฌ์ŠคํŒ…์„ ์œ„ํ•œ ์ž๊ทน์ ์ธ ์ œ๋ชฉ๊ณผ ์ด๋ชจ์ง€๋กœ ์ด๋ฒˆ์—๋„ Spring MVC์˜ View ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๋งค๋ ฅ์ ์œผ๋กœ ๊พธ๋ฉฐ๋ณผ๊ฒŒ! ๐Ÿ˜Ž


๐ŸŒ Spring MVC์—์„œ View ์ฒ˜๋ฆฌ์˜ ๋ชจ๋“  ๊ฒƒ! DispatcherServlet๋ถ€ํ„ฐ ViewResolver๊นŒ์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ๐Ÿš€

์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ๋ทฐ๋กœ ๋ณ€ํ™˜๋˜๋Š” ์ „์ฒด ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด์ž!


๐Ÿ–ฅ๏ธ 1. ํด๋ผ์ด์–ธํŠธ (Web Browser)

  • ์‚ฌ์šฉ์ž๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด HTTP ์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
    ์ด ์š”์ฒญ์€ URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„์˜ ํŠน์ • ๊ฒฝ๋กœ๋กœ ์ „๋‹ฌ๋˜์–ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
    ์ฆ‰, ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์€ ๋ทฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ฒซ๊ฑธ์Œ์ž…๋‹ˆ๋‹ค! ๐ŸŒ

๐Ÿšฆ 2. DispatcherServlet - ์š”์ฒญ์˜ ์ค‘์•™ ๊ด€์ œํƒ‘

  • DispatcherServlet์€ Spring MVC์˜ ์ค‘์‹ฌ๋ถ€๋กœ, ๋ชจ๋“  HTTP ์š”์ฒญ์„ ๋ฐ›์•„ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    ์š”์ฒญ์„ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‘๋‹ต์„ ์กฐ์ •ํ•˜๋Š” ์ค‘์•™ ํ—ˆ๋ธŒ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽฏ

๐Ÿง‘โ€๐Ÿ’ป 3. Controller - ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‘๋‡Œ

  • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•œ ํ›„, ModelAndView ๋˜๋Š” ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ DispatcherServlet์œผ๋กœ ๋‹ค์‹œ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ๋กœ ๋‹ด์•„ ๋ทฐ๋กœ ์ „๋‹ฌํ•  ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ› ๏ธ

๐Ÿ› ๏ธ 4. ModelAndView - ๋ฐ์ดํ„ฐ์™€ ๋ทฐ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๋‹ด์ž!

  • ModelAndView๋Š” ๋ชจ๋ธ ์ •๋ณด(๋ฐ์ดํ„ฐ)์™€ ๋ทฐ ์ •๋ณด(๋ทฐ ์ด๋ฆ„)๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
    • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ModelAndView๋ฅผ ํ†ตํ•ด ๋ทฐ ์ด๋ฆ„๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ DispatcherServlet์— ํ•œ ๋ฒˆ์— ๋„˜๊น๋‹ˆ๋‹ค. ๐ŸŽฏ
      ๋ฐ์ดํ„ฐ์™€ ๋ทฐ ์ด๋ฆ„์„ ํ•จ๊ป˜ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•, ๋ฐ”๋กœ ์ด๊ฒƒ! ๐Ÿš€

๐Ÿ” 5. ViewResolver - ๋ทฐ ํŒŒ์ผ์„ ์ฐพ์•„์ฃผ๋Š” ๋˜‘๋˜‘ํ•œ ๋„์šฐ๋ฏธ

  • ViewResolver๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ ๋ทฐ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, "home"์ด๋ผ๋Š” ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ViewResolver๋Š” ์ด๋ฅผ home.jsp ๊ฐ™์€ ์‹ค์ œ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ—‚๏ธ
      Spring MVC์˜ ๋ทฐ ๊ฒฐ์ • ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜์ฃ ! ๐Ÿ“

๐Ÿ‘๏ธ 6. View - ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ!

  • ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ, ViewResolver์— ์˜ํ•ด ์„ ํƒ๋œ ๋ทฐ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ HTML, JSON, XML ๋“ฑ์˜ ํ˜•์‹์œผ๋กœ ์‘๋‹ต๋ฉ๋‹ˆ๋‹ค.
    ์ฃผ๋กœ JSP, Thymeleaf ๊ฐ™์€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด ์‚ฌ์šฉ๋˜์–ด, ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ์ข… ํ™”๋ฉด์œผ๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽจ
    ํด๋ผ์ด์–ธํŠธ๋Š” ์™„์„ฑ๋œ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! ๐Ÿ’ป

๐Ÿ† Spring MVC์—์„œ View ์ฒ˜๋ฆฌ ์š”์•ฝ

  1. ํด๋ผ์ด์–ธํŠธ๋Š” HTTP ์š”์ฒญ์„ ์ „์†กํ•˜๊ณ , ์ด ์š”์ฒญ์ด DispatcherServlet์œผ๋กœ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค.
  2. DispatcherServlet์€ ์š”์ฒญ์„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  3. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ModelAndView ๋˜๋Š” ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  4. ViewResolver๋Š” ๋ฐ˜ํ™˜๋œ ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ ๋ทฐ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  5. ์ตœ์ข…์ ์œผ๋กœ ๋ทฐ(View)๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ Œ๋”๋ง๋˜์–ด ์‘๋‹ต์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค! ๐ŸŽฏ

๐Ÿ” Spring MVC์—์„œ ViewResolver์˜ ๋™์ž‘ ์›๋ฆฌ! ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ JSP ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋น„๋ฐ€ ๐Ÿš€

๋ทฐ ์ด๋ฆ„์— prefix์™€ suffix๋ฅผ ๊ฒฐํ•ฉํ•ด JSP ํŒŒ์ผ์„ ์ฐพ์•„๋‚ด๋Š” ๋˜‘๋˜‘ํ•œ ๋ฐฉ๋ฒ•!


๐Ÿ’ก 1. InternalResourceViewResolver๋ž€?

  • InternalResourceViewResolver๋Š” Spring MVC์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋กœ, ๋…ผ๋ฆฌ์ ์ธ ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    ์ด ๋ฆฌ์กธ๋ฒ„๋Š” prefix(์ ‘๋‘์‚ฌ)์™€ suffix(์ ‘๋ฏธ์‚ฌ)๋ฅผ ์‚ฌ์šฉํ•ด ๋ทฐ ์ด๋ฆ„์„ JSP ํŒŒ์ผ์ด๋‚˜ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๊ณผ ์—ฐ๊ฒฐํ•ด์ค˜์š”! ๐Ÿ’ผ

๐Ÿ› ๏ธ 2. prefix์™€ suffix ์†์„ฑ์˜ ์—ญํ• 

  • prefix: ๋ทฐ ํŒŒ์ผ์ด ์œ„์น˜ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "WEB-INF/views/"์™€ ๊ฐ™์€ ๊ฒฝ๋กœ์—์„œ ๋ทฐ ํŒŒ์ผ์„ ์ฐพ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ฃ !
  • suffix: ๋ทฐ ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ .jsp ๊ฐ™์€ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์„ค์ •ํ•˜์—ฌ JSP ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ“

๐Ÿ”„ 3. InternalResourceViewResolver์˜ ๋™์ž‘ ๋ฐฉ์‹

  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋…ผ๋ฆฌ์ ์ธ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ViewResolver๋Š” ๊ทธ ๋ทฐ ์ด๋ฆ„์— prefix์™€ suffix๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‹ค์ œ JSP ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

  • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋ทฐ ์ด๋ฆ„: "board/list"
  • prefix: "/WEB-INF/views/"
  • suffix: ".jsp"

๊ฒฐ๊ณผ์ ์œผ๋กœ /WEB-INF/views/board/list.jsp ๊ฒฝ๋กœ์— ์žˆ๋Š” JSP ํŒŒ์ผ์„ ์ฐพ์•„์„œ ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! ๐ŸŽฏ


๐Ÿ’ป 4. XML ์„ค์ • ์˜ˆ์‹œ

InternalResourceViewResolver๋Š” XML ์„ค์ •์—์„œ prefix์™€ suffix๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>
  • prefix: JSP ํŒŒ์ผ์ด ์œ„์น˜ํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • suffix: JSP ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„ค์ •์œผ๋กœ ๋ทฐ ์ด๋ฆ„์ด "board/list"์ผ ๋•Œ, "/WEB-INF/views/board/list.jsp" ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! ๐Ÿ’พ


๐ŸŒ 5. ์˜ˆ์‹œ ์‹œ๋‚˜๋ฆฌ์˜ค

  1. ์‚ฌ์šฉ์ž๊ฐ€ /list URL๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  2. ์ด ์š”์ฒญ์€ ์ปจํŠธ๋กค๋Ÿฌ์˜ list() ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  3. ์ปจํŠธ๋กค๋Ÿฌ๋Š” "board/list"๋ผ๋Š” ๋…ผ๋ฆฌ์  ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  4. ViewResolver๋Š” prefix์™€ suffix๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ /WEB-INF/views/board/list.jsp ํŒŒ์ผ์„ ์ฐพ์•„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽฏ

๐Ÿ–ผ๏ธ Spring MVC์—์„œ ๋ทฐ(View) ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•! ๐ŸŽฏ

ModelAndView ๊ฐ์ฒด์™€ String ๋ฐ˜ํ™˜ ๋ฐฉ์‹์œผ๋กœ ๋ทฐ๋ฅผ ์‰ฝ๊ฒŒ ์„ค์ •ํ•˜์ž!


๐ŸŽฏ 1. ModelAndView ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ๋ทฐ ์ด๋ฆ„ ์„ค์ •

  • ModelAndView๋Š” ๋ทฐ ์ด๋ฆ„๊ณผ ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋กœ, Spring MVC์—์„œ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    ๋ทฐ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋ ค๋ฉด ์ƒ์„ฑ์ž๋‚˜ setter ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ› ๏ธ

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•: ์ƒ์„ฑ์ž ์‚ฌ์šฉ

@GetMapping("/example1")
public ModelAndView example1() {
    // ๋ทฐ ์ด๋ฆ„์„ ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•˜์—ฌ ์ง€์ •
    ModelAndView mav = new ModelAndView("exampleView");
    return mav; // "exampleView"์ธ JSP๊ฐ€ ๋ Œ๋”๋ง๋จ
}
  • ์„ค๋ช…: ModelAndView์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋ทฐ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ–ˆ์–ด์š”. ์ด ์ด๋ฆ„์„ ๋ฐ”ํƒ•์œผ๋กœ JSP ํŒŒ์ผ์„ ์ฐพ์•„์„œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ’ป

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•: setter ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

@GetMapping("/example2")
public ModelAndView example2() {
    ModelAndView mav = new ModelAndView(); // ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ
    mav.setViewName("exampleView"); // setter๋กœ ๋ทฐ ์ด๋ฆ„ ์„ค์ •
    return mav;
}
  • ์„ค๋ช…: setViewName() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ทฐ ์ด๋ฆ„์„ ์„ค์ •ํ–ˆ์–ด์š”. ์ƒ์„ฑ์ž ๋ฐฉ์‹๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋ทฐ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ฃ ! ๐ŸŽฏ

๐Ÿง‘โ€๐Ÿ’ป 2. String ๋ฐ˜ํ™˜ ๋ฐฉ์‹์œผ๋กœ ๋ทฐ ์ด๋ฆ„ ์„ค์ •

  • ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ์—์„œ String ํƒ€์ž…์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ฐ„๋‹จํ•œ ๋ทฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•˜๋ฉฐ, ModelAndView๋ณด๋‹ค ์ฝ”๋“œ๊ฐ€ ๋” ๊น”๋”ํ•ด์ง‘๋‹ˆ๋‹ค! ๐Ÿ’ก
@GetMapping("/example3")
public String example3() {
    return "exampleView"; // String ํƒ€์ž…์œผ๋กœ ๋ทฐ ์ด๋ฆ„ ๋ฐ˜ํ™˜
}
  • ์„ค๋ช…: ๋ฉ”์„œ๋“œ๊ฐ€ String ํƒ€์ž…์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Spring์€ ์ด ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ด JSP ํŒŒ์ผ์„ ์ฐพ์•„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ–ฅ๏ธ

๐ŸŒŸ Spring MVC์—์„œ ๋ทฐ ์ด๋ฆ„์„ ์ž๋™์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๋น„๋ฒ•! RequestToViewNameTranslator๋ฅผ ์•Œ์•„๋ณด์ž! ๐Ÿš€

๋ทฐ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„, Spring์ด URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ทฐ๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์•„์ค€๋‹ค!


๐Ÿ” 1. ์–ธ์ œ ๋ทฐ ์ด๋ฆ„์ด ์ž๋™์œผ๋กœ ์ง€์ •๋ ๊นŒ?

  • Spring MVC์—์„œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด URL์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž๋™์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ด ๊ธฐ๋Šฅ์€ RequestToViewNameTranslator๊ฐ€ ๋‹ด๋‹นํ•˜๋ฉฐ, ์š”์ฒญ ๊ฒฝ๋กœ์—์„œ ๋ทฐ ์ด๋ฆ„์„ ์ถ”์ถœํ•˜๋Š” ์—ญํ• ์„ ํ•˜์ฃ ! ๐ŸŽฏ

๐Ÿ› ๏ธ 2. ์ž๋™ ๋ทฐ ์ด๋ฆ„ ์ง€์ •์˜ ์ฃผ์š” ์กฐ๊ฑด

  • Model์ด๋‚˜ Map ๊ฐ์ฒด๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋ทฐ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๋•Œ
  • ๋ฉ”์„œ๋“œ๊ฐ€ void๋ฅผ ๋ฆฌํ„ดํ•˜์ง€๋งŒ, HttpServletResponse ๊ฐ์ฒด๋กœ ์ง์ ‘ ์‘๋‹ตํ•˜์ง€ ์•Š์„ ๋•Œ

์ด ๊ฒฝ์šฐ, Spring์€ ์š”์ฒญ URL ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ์ถ”๋ก ํ•˜์—ฌ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŒ


๐Ÿ’ป 3. ์˜ˆ์‹œ ์ฝ”๋“œ - Map ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ทฐ ์ด๋ฆ„ ์ž๋™ ์ง€์ •

@GetMapping("/example")
public Map<String, Object> example() {
    Map<String, Object> model = new HashMap<>();
    model.put("message", "Hello, Spring!");
    return model; // ๋ทฐ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์Œ
}
  • ์„ค๋ช…: ์š”์ฒญ ๊ฒฝ๋กœ๊ฐ€ /example์ด๋ฏ€๋กœ, Spring์€ RequestToViewNameTranslator๋ฅผ ํ†ตํ•ด ๋ทฐ ์ด๋ฆ„์„ example๋กœ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค!
    ViewResolver๋Š” example.jsp์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ์ฐพ์•„ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ–ผ๏ธ

๐Ÿ”„ 4. RequestToViewNameTranslator์˜ ๋™์ž‘ ํ๋ฆ„

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ /example ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  2. ์ปจํŠธ๋กค๋Ÿฌ๋Š” Map ๊ฐ์ฒด๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ทฐ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. Spring MVC๋Š” URL ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ example์ด๋ผ๋Š” ๋ทฐ ์ด๋ฆ„์„ ์ž๋™์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. ViewResolver๋Š” ๊ฒฐ์ •๋œ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ”ํƒ•์œผ๋กœ example.jsp์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ์ฐพ์•„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ’ป

๐Ÿ† RequestToViewNameTranslator์˜ ํ•ต์‹ฌ ์—ญํ• 

  • RequestToViewNameTranslator๋Š” ๋ทฐ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ, ์š”์ฒญ URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์š”์ฒญ ๊ฒฝ๋กœ๊ฐ€ /hello4๋ผ๋ฉด, Spring์€ hello4๋ผ๋Š” ์ด๋ฆ„์˜ ๋ทฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•˜์ฃ ! ๐Ÿ’ก

๐ŸŽฏ 5. ๋™์ž‘ ์˜ˆ์‹œ ์‹œ๋‚˜๋ฆฌ์˜ค

  1. ์‚ฌ์šฉ์ž๊ฐ€ /example๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  2. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  Map ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. Spring์€ URL ๊ฒฝ๋กœ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•˜์—ฌ example.jsp๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽจ

๐Ÿš€ Spring MVC์—์„œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ทฐ ์„ค์ •! redirect:๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์›ํ•˜๋Š” ๊ณณ์œผ๋กœ ์ด๋™์‹œํ‚ค์ž! ๐ŸŒ

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ์˜ ๊ฐœ๋…๋ถ€ํ„ฐ RedirectAttributes๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ์˜ ๋ชจ๋“  ๊ฒƒ!


๐Ÿ”„ 1. ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ž€?

  • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ผ๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    Spring MVC์—์„œ ๋ทฐ ์ด๋ฆ„ ์•ž์— redirect: ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ด๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น URL๋กœ ๋‹ค์‹œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! ๐ŸŽฏ

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์„ค์ • ์˜ˆ์‹œ:

return "redirect:/article/list";
  • ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” /article/list๋กœ ์ž๋™์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฉ๋‹ˆ๋‹ค! ๐Ÿ’ก

๐Ÿ› ๏ธ 2. RedirectAttributes๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ

  • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ URL์— ํฌํ•จ์‹œ์ผœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
    ์ด๋ฅผ ์œ„ํ•ด Spring์€ RedirectAttributes ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋  ํŽ˜์ด์ง€์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ› ๏ธ

์˜ˆ์‹œ:

@PostMapping("/write")
public String write(BoardDto boardDto, HttpSession session, RedirectAttributes redirectAttributes) {
    // ์„ธ์…˜์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์™€ DTO์— ์„ค์ •
    MemberDto memberDto = (MemberDto) session.getAttribute("userinfo");
    boardDto.setUserId(memberDto.getUserId());

    // ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œ ์ „๋‹ฌํ•  ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •
    redirectAttributes.addAttribute("pgno", "1");
    redirectAttributes.addAttribute("key", "");
    redirectAttributes.addAttribute("word", "");

    // "/article/list"๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
    return "redirect:/article/list";
}
  • ์„ค๋ช…: RedirectAttributes๋ฅผ ํ†ตํ•ด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋  URL์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
    ์ตœ์ข… URL์€ /article/list?pgno=1&key=&word=์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค! ๐ŸŒ

๐ŸŒ 3. ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ๋ฆ„ ์˜ˆ์‹œ

  1. ์‚ฌ์šฉ์ž๊ฐ€ /write ๊ฒฝ๋กœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. RedirectAttributes๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€์ ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  /article/list๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ตœ์ข…์ ์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋œ ํŽ˜์ด์ง€๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ pgno, key, word ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ•จ๊ป˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๐ŸŽฏ

โš ๏ธ 4. ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

  • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋Š” ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ, ๋ธŒ๋ผ์šฐ์ €์˜ URL์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ POST-Redirect-GET (PRG) ํŒจํ„ด์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํผ ์ œ์ถœ ํ›„ ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์ค‘๋ณต ์ œ์ถœ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ›ก๏ธ

๐Ÿ’ก Spring MVC์—์„œ ๋ทฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•! ๐Ÿ› ๏ธ

Model, ModelAndView, @ModelAttribute๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋น„๋ฒ• ๊ณต๊ฐœ!


๐ŸŽฏ 1. Map, Model, ModelMap์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ

  • Map, Model, ModelMap์€ Spring MVC์—์„œ ๋ทฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    ์ฃผ๋กœ Model ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ addAttribute() ๋ฉ”์„œ๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” ๋ทฐ์—์„œ ๋ Œ๋”๋ง๋˜์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€์ฃ ! ๐ŸŽฏ

์‚ฌ์šฉ ์˜ˆ์‹œ:

@GetMapping("/example")
public String example(Model model) {
    model.addAttribute("message", "Hello, Spring MVC");
    return "exampleView"; // ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜
}
  • ์„ค๋ช…: ์œ„ ์ฝ”๋“œ์—์„œ๋Š” Model ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด "message"๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    ์ดํ›„ ๋ทฐ(exampleView)์—์„œ ์ด message ๊ฐ’์„ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ–ฅ๏ธ

๐Ÿง‘โ€๐Ÿ’ป 2. ModelAndView๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์™€ ๋ทฐ๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•˜๊ธฐ

  • ModelAndView๋Š” ๋ฐ์ดํ„ฐ(๋ชจ๋ธ)์™€ ๋ทฐ ์ด๋ฆ„์„ ํ•œ ๋ฒˆ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
    ์ด ๊ฐ์ฒด๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋ทฐ ์ด๋ฆ„๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด ๋” ์ง๊ด€์ ์ด์ฃ ! ๐Ÿ› ๏ธ

์‚ฌ์šฉ ์˜ˆ์‹œ:

@GetMapping("/example2")
public ModelAndView example2() {
    ModelAndView mav = new ModelAndView("exampleView");
    mav.addObject("message", "Hello, ModelAndView");
    return mav; // ๋ทฐ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜
}
  • ์„ค๋ช…: ModelAndView ๊ฐ์ฒด๋กœ ๋ทฐ ์ด๋ฆ„("exampleView")๊ณผ ๋ฐ์ดํ„ฐ("message")๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ทฐ์—์„œ "message" ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐ŸŒ

๐Ÿ” 3. @ModelAttribute๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ

  • @ModelAttribute๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.
    ์ฃผ๋กœ ๊ณตํ†ต์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋ธ์— ๋‹ด๊ฑฐ๋‚˜ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด์ฃ ! ๐Ÿ’ก

์‚ฌ์šฉ ์˜ˆ์‹œ:

@ModelAttribute("user")
public User addUser() {
    return new User("John", 30);
}
  • ์„ค๋ช…: ์ด ๋ฉ”์„œ๋“œ๋Š” User ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , Spring์€ ์ž๋™์œผ๋กœ "user"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    ์ดํ›„, ๋ชจ๋“  ๋ทฐ์—์„œ ์ด "user" ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! ๐Ÿ‘ค

๐Ÿ’ก Spring MVC์—์„œ Map, Model, ModelMap์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ! ๐Ÿš€

์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ทฐ(View)์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋น„๋ฒ• ๊ณต๊ฐœ!


๐ŸŽฏ 1. Map<String, Object>๋กœ ๋ทฐ์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ

  • Map์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์€ ํ‚ค-๊ฐ’ ์Œ์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    ์ž๋ฐ”์˜ ์ผ๋ฐ˜์ ์ธ Map ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ› ๏ธ

์‚ฌ์šฉ ์˜ˆ์‹œ:

@GetMapping("/example1")
public String example1(Map<String, Object> model) {
    model.put("message", "Hello from Map!");
    return "home"; // ๋ทฐ ์ด๋ฆ„ ๋ฐ˜ํ™˜
}
  • ์„ค๋ช…: Map ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด "message"๋ผ๋Š” ํ‚ค์— "Hello from Map!" ๊ฐ’์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ์—์„œ "message"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ“ฆ

๐Ÿง‘โ€๐Ÿ’ป 2. Model๋กœ ๋ทฐ์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ

  • Model์€ Spring MVC์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๋ทฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋” ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    addAttribute() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ๋ทฐ์—์„œ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ฃ ! ๐ŸŽฏ

์‚ฌ์šฉ ์˜ˆ์‹œ:

@GetMapping("/example2")
public String example2(Model model) {
    model.addAttribute("message", "Hello from Model!");
    return "home"; // ๋ทฐ ์ด๋ฆ„ ๋ฐ˜ํ™˜
}
  • ์„ค๋ช…: Model ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด "message"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ "Hello from Model!" ๊ฐ’์„ ๋ทฐ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐ŸŽจ

๐Ÿ”„ 3. ModelMap์œผ๋กœ ๋ทฐ์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ

  • ModelMap์€ Model๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ, Map์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
    addAttribute() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ , Map๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ› ๏ธ

์‚ฌ์šฉ ์˜ˆ์‹œ:

@GetMapping("/example3")
public String example3(ModelMap model) {
    model.addAttribute("message", "Hello from ModelMap!");
    return "home"; // ๋ทฐ ์ด๋ฆ„ ๋ฐ˜ํ™˜
}
  • ์„ค๋ช…: ModelMap ๊ฐ์ฒด๋กœ "message"์— "Hello from ModelMap!" ๊ฐ’์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” ๋ทฐ์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ—‚๏ธ

๐Ÿ’ก Spring MVC์˜ Model ๋ฉ”์„œ๋“œ ์ด์ •๋ฆฌ! ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ(View)์— ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๐Ÿš€

addAttribute๋ถ€ํ„ฐ mergeAttributes๊นŒ์ง€, Model ๊ฐ์ฒด์˜ ํ•„์ˆ˜ ๋ฉ”์„œ๋“œ ์™„๋ฒฝ ํ•ด๋ถ€!


๐ŸŽฏ 1. addAttribute(String name, Object value) - ์ด๋ฆ„๊ณผ ๊ฐ’์„ ํ•จ๊ป˜ ์ถ”๊ฐ€ํ•˜๊ธฐ!

  • ์ด๋ฆ„(name)๊ณผ ๊ฐ’(value)์„ ์ง€์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ Model์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    ์ด ๋ฐฉ์‹์€ ๋ทฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์ฃ ! ๐Ÿ› ๏ธ

์‚ฌ์šฉ ์˜ˆ์‹œ:

model.addAttribute("message", "Hello, Spring!");
  • ์„ค๋ช…: "message"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ "Hello, Spring!" ๊ฐ’์„ ๋ทฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ์—์„œ๋Š” message๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ’ฌ

๐Ÿ”„ 2. addAttribute(Object value) - ์ด๋ฆ„ ์—†์ด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์ด๋ฆ„ ์„ค์ •ํ•˜๊ธฐ!

  • ์ด๋ฆ„์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด, Spring์ด ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ์ž๋™์œผ๋กœ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค!
    ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ Model์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ฃ . ๐ŸŒ

์‚ฌ์šฉ ์˜ˆ์‹œ:

model.addAttribute(new User("John", 25));
  • ์„ค๋ช…: ์—ฌ๊ธฐ์„œ๋Š” User ๊ฐ์ฒด๋ฅผ Model์— ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ, Spring์ด ์ž๋™์œผ๋กœ user๋ผ๋Š” ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    ๋ทฐ์—์„œ user ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ‘ค

๐Ÿง‘โ€๐Ÿ’ป 3. addAllAttributes(Collection<?> values) - Collection ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•˜๊ธฐ!

  • Collection ํƒ€์ž…์˜ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— Model์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
    ๋ฆฌ์ŠคํŠธ๋‚˜ ์„ธํŠธ์™€ ๊ฐ™์€ ๋‹ค์ค‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ“ฆ

์‚ฌ์šฉ ์˜ˆ์‹œ:

List<String> messages = Arrays.asList("Message1", "Message2", "Message3");
model.addAllAttributes(messages);
  • ์„ค๋ช…: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ํ•œ ๋ฒˆ์— Model์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    ๋ทฐ์—์„œ ๊ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ“

๐Ÿ“„ 4. addAllAttributes(Map<String, ?> attributes) - Map ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•˜๊ธฐ!

  • Map ๊ฐ์ฒด๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— Model์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ์ „๋‹ฌํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ด์š”! ๐ŸŽฏ

์‚ฌ์šฉ ์˜ˆ์‹œ:

Map<String, Object> data = new HashMap<>();
data.put("message", "Hello, Spring!");
data.put("user", new User("John", 25));
model.addAllAttributes(data);
  • ์„ค๋ช…: message์™€ user ๋ฐ์ดํ„ฐ๋ฅผ Map์œผ๋กœ ํ•œ ๋ฒˆ์— Model์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ทฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŒ

๐Ÿ” 5. mergeAttributes(Map<String, ?> attributes) - ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉํ•˜๊ธฐ!

  • mergeAttributes()๋Š” ๊ธฐ์กด Model ๋ฐ์ดํ„ฐ์™€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ‘ํ•ฉํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    ์ด๋ฏธ ์žˆ๋Š” ์†์„ฑ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋งŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ› ๏ธ

์‚ฌ์šฉ ์˜ˆ์‹œ:

Map<String, Object> additionalData = new HashMap<>();
additionalData.put("status", "active");
model.mergeAttributes(additionalData);
  • ์„ค๋ช…: ๊ธฐ์กด status ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋งŒ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
    ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์—์š”! ๐Ÿ’ก

๐Ÿ›ก๏ธ 6. containsAttribute(String name) - ํŠน์ • ์†์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ!

  • containsAttribute()๋Š” Model์— ํŠน์ • ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
    ์†์„ฑ์ด ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ด์š”! ๐Ÿ”

์‚ฌ์šฉ ์˜ˆ์‹œ:

if (model.containsAttribute("message")) {
    // "message" ์†์„ฑ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฒ˜๋ฆฌ
}
  • ์„ค๋ช…: message ์†์„ฑ์ด Model์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์žˆ์œผ๋ฉด ๊ทธ์— ๋งž๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
    ์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ›ก๏ธ

๐Ÿ’ก Spring MVC์˜ Model ๋ฉ”์„œ๋“œ ์ด์ •๋ฆฌ! ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ(View)์— ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๐Ÿš€

addAttribute๋ถ€ํ„ฐ mergeAttributes๊นŒ์ง€, Model ๊ฐ์ฒด์˜ ํ•„์ˆ˜ ๋ฉ”์„œ๋“œ ์™„๋ฒฝ ํ•ด๋ถ€!


๐ŸŽฏ 1. addAttribute(String name, Object value) - ์ด๋ฆ„๊ณผ ๊ฐ’์„ ํ•จ๊ป˜ ์ถ”๊ฐ€ํ•˜๊ธฐ!

  • ์ด๋ฆ„(name)๊ณผ ๊ฐ’(value)์„ ์ง€์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ Model์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    ์ด ๋ฐฉ์‹์€ ๋ทฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์ฃ ! ๐Ÿ› ๏ธ

์‚ฌ์šฉ ์˜ˆ์‹œ:

model.addAttribute("message", "Hello, Spring!");
  • ์„ค๋ช…: "message"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ "Hello, Spring!" ๊ฐ’์„ ๋ทฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ์—์„œ๋Š” message๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ’ฌ

๐Ÿ”„ 2. addAttribute(Object value) - ์ด๋ฆ„ ์—†์ด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์ด๋ฆ„ ์„ค์ •ํ•˜๊ธฐ!

  • ์ด๋ฆ„์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด, Spring์ด ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ์ž๋™์œผ๋กœ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค!
    ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ Model์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ฃ . ๐ŸŒ

์‚ฌ์šฉ ์˜ˆ์‹œ:

model.addAttribute(new User("John", 25));
  • ์„ค๋ช…: ์—ฌ๊ธฐ์„œ๋Š” User ๊ฐ์ฒด๋ฅผ Model์— ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ, Spring์ด ์ž๋™์œผ๋กœ user๋ผ๋Š” ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    ๋ทฐ์—์„œ user ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ‘ค

๐Ÿง‘โ€๐Ÿ’ป 3. addAllAttributes(Collection<?> values) - Collection ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•˜๊ธฐ!

  • Collection ํƒ€์ž…์˜ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— Model์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
    ๋ฆฌ์ŠคํŠธ๋‚˜ ์„ธํŠธ์™€ ๊ฐ™์€ ๋‹ค์ค‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ“ฆ

์‚ฌ์šฉ ์˜ˆ์‹œ:

List<String> messages = Arrays.asList("Message1", "Message2", "Message3");
model.addAllAttributes(messages);
  • ์„ค๋ช…: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ํ•œ ๋ฒˆ์— Model์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    ๋ทฐ์—์„œ ๊ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ“

๐Ÿ“„ 4. addAllAttributes(Map<String, ?> attributes) - Map ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•˜๊ธฐ!

  • Map ๊ฐ์ฒด๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— Model์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ์ „๋‹ฌํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ด์š”! ๐ŸŽฏ

์‚ฌ์šฉ ์˜ˆ์‹œ:

Map<String, Object> data = new HashMap<>();
data.put("message", "Hello, Spring!");
data.put("user", new User("John", 25));
model.addAllAttributes(data);
  • ์„ค๋ช…: message์™€ user ๋ฐ์ดํ„ฐ๋ฅผ Map์œผ๋กœ ํ•œ ๋ฒˆ์— Model์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ทฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŒ

๐Ÿ” 5. mergeAttributes(Map<String, ?> attributes) - ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉํ•˜๊ธฐ!

  • mergeAttributes()๋Š” ๊ธฐ์กด Model ๋ฐ์ดํ„ฐ์™€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ‘ํ•ฉํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    ์ด๋ฏธ ์žˆ๋Š” ์†์„ฑ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋งŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ› ๏ธ

์‚ฌ์šฉ ์˜ˆ์‹œ:

Map<String, Object> additionalData = new HashMap<>();
additionalData.put("status", "active");
model.mergeAttributes(additionalData);
  • ์„ค๋ช…: ๊ธฐ์กด status ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋งŒ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
    ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์—์š”! ๐Ÿ’ก

๐Ÿ›ก๏ธ 6. containsAttribute(String name) - ํŠน์ • ์†์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ!

  • containsAttribute()๋Š” Model์— ํŠน์ • ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
    ์†์„ฑ์ด ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ด์š”! ๐Ÿ”

์‚ฌ์šฉ ์˜ˆ์‹œ:

if (model.containsAttribute("message")) {
    // "message" ์†์„ฑ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฒ˜๋ฆฌ
}
  • ์„ค๋ช…: message ์†์„ฑ์ด Model์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์žˆ์œผ๋ฉด ๊ทธ์— ๋งž๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
    ์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ›ก๏ธ

๐Ÿš€ Spring MVC์—์„œ ModelAndView๋กœ ๋ทฐ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์„ค์ •ํ•˜์ž! ๐ŸŒŸ

๋ทฐ ์ด๋ฆ„๊ณผ ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ ์ฒ˜๋ฆฌํ•˜๋Š” ModelAndView์˜ ํ•ต์‹ฌ ํ™œ์šฉ๋ฒ•!


๐ŸŽฏ 1. setViewName(String viewName) - ๋ทฐ ์ด๋ฆ„ ์„ค์ •ํ•˜๊ธฐ

  • setViewName() ๋ฉ”์„œ๋“œ๋Š” ๋ Œ๋”๋งํ•  ๋ทฐ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์–ด๋–ค ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ• ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”!

์‚ฌ์šฉ ์˜ˆ์‹œ:

mav.setViewName("home");
  • ์„ค๋ช…: ์—ฌ๊ธฐ์„œ๋Š” ๋ทฐ ์ด๋ฆ„์„ "home"์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Spring MVC๋Š” ์ด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด home.jsp๋‚˜ home.html ๋“ฑ์˜ ์‹ค์ œ ๋ทฐ ํŒŒ์ผ์„ ์ฐพ์•„์„œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ 

๐Ÿ”„ 2. addObject(String name, Object value) - ๋ทฐ์— ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • addObject() ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ทฐ์— ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฆ„-๊ฐ’ ์Œ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋ทฐ์—์„œ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐ŸŒ

์‚ฌ์šฉ ์˜ˆ์‹œ:

mav.addObject("message", "Welcome to Spring MVC!");
  • ์„ค๋ช…: "message"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ "Welcome to Spring MVC!" ๊ฐ’์„ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    ๋ทฐ์—์„œ message๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ’ฌ

๐Ÿ’ป 3. ModelAndView ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ ์ฝ”๋“œ

@GetMapping("/example")
public ModelAndView example() {
    // ModelAndView ๊ฐ์ฒด ์ƒ์„ฑ
    ModelAndView mav = new ModelAndView();

    // ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
    mav.addObject("message", "Welcome to Spring MVC!");

    // ๋ทฐ ์ด๋ฆ„ ์„ค์ •
    mav.setViewName("home");

    // ModelAndView ๊ฐ์ฒด ๋ฐ˜ํ™˜
    return mav;
}
  • ์„ค๋ช…:
    1. ModelAndView ๊ฐ์ฒด ์ƒ์„ฑ: ๋นˆ ModelAndView ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    2. ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€: "message"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ "Welcome to Spring MVC!" ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    3. ๋ทฐ ์ด๋ฆ„ ์„ค์ •: ๋ทฐ ์ด๋ฆ„์„ "home"์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    4. ๊ฐ์ฒด ๋ฐ˜ํ™˜: ๋งˆ์ง€๋ง‰์œผ๋กœ ModelAndView ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด Spring MVC๊ฐ€ ๋ทฐ์™€ ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ–ฅ๏ธ

๐ŸŽฏ 4. ์‹ค๋ฌด์—์„œ์˜ ํ™œ์šฉ - ๋™์  ๋ฐ์ดํ„ฐ์™€ ๋‹ค์–‘ํ•œ ๋ทฐ ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™”!

  • ModelAndView๋Š” ๋™์ ์ธ ๋ฐ์ดํ„ฐ์™€ ์ง€์ •๋œ ๋ทฐ๋ฅผ ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค!
  • ํŠนํžˆ ๋‹ค์–‘ํ•œ ๋ทฐ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๋ทฐ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด ์‘๋‹ตํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚ฌ ๋•Œ๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์ฃ ! ๐ŸŒ

๐ŸŒ Spring MVC์—์„œ @PathVariable๋กœ URI ๊ฒฝ๋กœ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜์ž! ๐Ÿš€

URL์—์„œ ๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ RESTful ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ!


๐ŸŽฏ 1. @PathVariable์ด๋ž€?

  • @PathVariable์€ URI ๊ฒฝ๋กœ์˜ ์ผ๋ถ€๋ฅผ ๋ณ€์ˆ˜๋กœ ์ถ”์ถœํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    ์ด๋ฅผ ํ†ตํ•ด RESTfulํ•œ ๋ฐฉ์‹์œผ๋กœ URL์—์„œ ๋™์ ์ธ ๊ฐ’์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ฃ ! ๐ŸŒ

๐Ÿ”„ 2. URI ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋™์  ๊ฒฝ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

  • URI ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด URL ๊ฒฝ๋กœ์— ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด, /users/{username} ๊ฒฝ๋กœ์—์„œ {username}์€ ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜๋กœ ๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค!

์˜ˆ์‹œ URL:

http://localhost/blog/123/45 

์œ„ URL์—์„œ 123์€ userId, 45๋Š” articleNo๋กœ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค! ๐Ÿ“ฆ


๐Ÿง‘โ€๐Ÿ’ป 3. @PathVariable์„ ์‚ฌ์šฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ

@PathVariable์„ ์‚ฌ์šฉํ•ด URL ๊ฒฝ๋กœ์—์„œ ๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ , ์ด๋ฅผ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž! ๐ŸŒŸ

์˜ˆ์‹œ ์ฝ”๋“œ:

@GetMapping("/blog/{userId}/{articleNo}")
public String viewArticle(@PathVariable("userId") String userId,
                          @PathVariable("articleNo") int articleNo,
                          Model model) {
    // ์ฒ˜๋ฆฌ ๋กœ์ง (์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•ด๋‹น article ์ •๋ณด ์กฐํšŒ)
    
    model.addAttribute("userId", userId);
    model.addAttribute("articleNo", articleNo);
    
    return "blog/view";
}
  • ์„ค๋ช…:
    1. URL ํ…œํ”Œ๋ฆฟ ์„ค์ •: /blog/{userId}/{articleNo} ๊ฒฝ๋กœ์—์„œ {userId}์™€ {articleNo}๋ฅผ ์‚ฌ์šฉํ•ด ๋™์  ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    2. @PathVariable๋กœ ๋ฐ์ดํ„ฐ ์ถ”์ถœ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ /blog/123/45๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, 123์€ userId, 45๋Š” articleNo๋กœ ๊ฐ๊ฐ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    3. ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€: userId์™€ articleNo๋ฅผ Model ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ทฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค!
    4. ๋ทฐ ๋ฐ˜ํ™˜: "blog/view"๋Š” ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, blog/view.jsp์™€ ๊ฐ™์€ ๋ทฐ ํŒŒ์ผ์ด ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค! ๐Ÿ–ฅ๏ธ

๐Ÿ’ป 4. ์‹ค๋ฌด์—์„œ์˜ ํ™œ์šฉ ์˜ˆ์‹œ

  • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„: /users/{username} ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ ์‚ฌ์šฉ์ž์˜ ํ”„๋กœํ•„ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ‘ค
  • ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ: /blog/{userId}/{articleNo} ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๊ฒŒ์‹œ๊ธ€ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ“
  • ์ œํ’ˆ ์ •๋ณด: /products/{productId} ๊ฒฝ๋กœ๋กœ ํŠน์ • ์ œํ’ˆ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ›’

๐Ÿ’ก Spring Web Application์˜ ๋™์ž‘ ์›๋ฆฌ ์™„๋ฒฝ ํ•ด๋ถ€! ๐Ÿš€

Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋˜๊ณ , ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๋‹จ๊ณ„!


๐ŸŒ 1. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰

  • Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Tomcat๊ณผ ๊ฐ™์€ WAS(Web Application Server) ์œ„์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • web.xml ํŒŒ์ผ์ด ๋กœ๋“œ๋˜๋ฉฐ, Spring MVC์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์„ค์ •ํ•˜๋Š”๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ› ๏ธ

๐Ÿ”ง 2. ContextLoaderListener ์ƒ์„ฑ - ๋ฃจํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ๋กœ๋”ฉ

  • ContextLoaderListener๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฃจํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์„œ๋น„์Šค, DAO, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋“ฑ์˜ ๊ฐ์ฒด๊ฐ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค! ๐ŸŒ

๐Ÿ—‚๏ธ 3. root-context.xml ๋กœ๋”ฉ - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ดˆ๊ธฐํ™”

  • root-context.xml ํŒŒ์ผ์„ ํ†ตํ•ด ์„œ๋น„์Šค ํด๋ž˜์Šค, DAO ๊ฐ์ฒด, ์—”ํ‹ฐํ‹ฐ๋“ค์ด ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
    ์ด๋“ค์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ› ๏ธ

๐Ÿšฆ 4. DispatcherServlet ์ƒ์„ฑ - ๋ชจ๋“  ์š”์ฒญ์˜ ์ค‘์•™ ๊ด€์ œํƒ‘

  • DispatcherServlet์€ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋กœ, Spring MVC์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
    ์ด Servlet์ด ์š”์ฒญ์„ ๋ฐ›์•„, ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค! ๐ŸŒ

โš™๏ธ 5. DispatcherServlet ์„ค์ • - servlet-context.xml ๋กœ๋”ฉ

  • servlet-context.xml ํŒŒ์ผ์„ ๋กœ๋”ฉํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ, ๋ทฐ ๋ฆฌ์กธ๋ฒ„, ๋ฉ”์‹œ์ง€ ๋ณ€ํ™˜๊ธฐ ๋“ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    ์ด ํŒŒ์ผ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ ˆ์ด์–ด ๊ตฌ์„ฑ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ“„

๐ŸŒ 6. ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ฒ˜๋ฆฌ - DispatcherServlet์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ

  1. ํด๋ผ์ด์–ธํŠธ์˜ HTTP ์š”์ฒญ์€ ๋จผ์ € DispatcherServlet์ด ๋ฐ›์Šต๋‹ˆ๋‹ค.
  2. DispatcherServlet์€ ์š”์ฒญ ๊ฒฝ๋กœ์— ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„ ์š”์ฒญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  3. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋ธ์— ๋‹ด์•„ ๋ทฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿš€

๐ŸŽฏ 7. ์ปจํŠธ๋กค๋Ÿฌ์˜ ์—ญํ•  - ์š”์ฒญ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ์ค€๋น„, ๋ทฐ ์ „๋‹ฌ

  • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์„œ๋น„์Šค์™€ DAO๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•œ ํ›„ ๋ทฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜๊ณ , ๋ชจ๋ธ ๋ฐ์ดํ„ฐ์™€ ๋ทฐ ์ด๋ฆ„์ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต๋ฉ๋‹ˆ๋‹ค! ๐Ÿ’ป

๐Ÿ› ๏ธ 8. ์„œ๋น„์Šค์™€ DAO ํ˜‘์—… - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ

  • ์„œ๋น„์Šค ํด๋ž˜์Šค๋Š” DAO๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • DAO๋Š” CRUD ์ž‘์—…(Create, Read, Update, Delete)์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์ด๋ฅผ ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    ์ด ๊ณผ์ •์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค! ๐Ÿ—„๏ธ

๐Ÿ”„ 9. ๋ทฐ ๋ Œ๋”๋ง - ์ตœ์ข… ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ

  • DispatcherServlet์€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜๋œ ๋ทฐ ์ด๋ฆ„์„ ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ํ†ตํ•ด ์‹ค์ œ ๋ทฐ ํŒŒ์ผ(JSP, Thymeleaf ๋“ฑ)๊ณผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ทฐ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ Œ๋”๋ง๋˜์–ด ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค! ๐Ÿ–ฅ๏ธ

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