[Springboot] SpringMVC์˜ Controller ๐Ÿ”—

๋ฐ•์ •ํ˜„ยท2023๋…„ 9์›” 27์ผ
0
post-thumbnail

Controller?

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” MVC๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ์—ฌ๊ธฐ์„œ Cotroller๋Š” ํ™”๋ฉด(View)์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Model)์„ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•œ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด์„œ โ€œ/index ๋กœ ๊ฐ€์ค˜~โ€ ๋ผ๊ณ  ์š”์ฒญํ•˜๋ฉด ์ฃผ์†Œ๋ฅผ ๋ฐ›์•„ ์–ด๋””๋กœ ๊ฐˆ์ง€ ๋ถ„์„ํ•˜๊ณ  ๋งž๋Š” ๊ธธ๋กœ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์ด๋‹ค.

์Šคํ”„๋ง์—์„œ๋Š” IoC์—์„œ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•˜๋ฏ€๋กœ @Controller ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ด ํด๋ž˜์Šค๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ์ธ์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. โ†’ ์ดํ•ด๊ฐ€ ์•ˆ๋œ๋‹ค๋ฉด? [์ •๋ฆฌ] Spring ์—์„œ ํ™•์ธํ•˜์ž.

servlet-context.xml ํŒŒ์ผ์„ ๋ณด๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ์–ด๋–ป๊ฒŒ ์ฃผ๊ณ ๋ฅผ ๋งคํ•‘ํ•ด์„œ ์—ฐ๊ฒฐํ•  ๊ฒƒ์ด์ง€์— ๋Œ€ํ•œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์„ค์ •์ด ๋“ค์–ด์žˆ์–ด ์„ค์ •ํ•œ ๊ฐ’์— ๋”ฐ๋ผ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Controller์˜ ์ข…๋ฅ˜

@Controllerํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ Controller์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
@RequestMapping์š”์ฒญ์— ๋Œ€ํ•ด ์–ด๋–ค Controller, ์–ด๋–ค ๋ฉ”์†Œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ๋งตํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
@RequestParamController ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์›น์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋งตํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
@ModelAttributeController ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๋ฆฌํ„ด๊ฐ’์„ Model ๊ฐ์ฒด์™€ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
@SessionAttributesModel ๊ฐ์ฒด๋ฅผ ์„ธ์…˜์— ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
@RequestPartMultipart ์š”์ฒญ์˜ ๊ฒฝ์šฐ, ์›น์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋งตํ•‘๊ฐ€๋Šฅํ•œ ์–ด๋…ธํ…Œ์ด์…˜(egov 3.0, Spring 3.1.x๋ถ€ํ„ฐ ์ถ”๊ฐ€)
@CommandMapController๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Mapํ˜•ํƒœ๋กœ ๋ฐ›์„ ๋•Œ ์›น์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋งตํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜(egov 3.0๋ถ€ํ„ฐ ์ถ”๊ฐ€)
@ControllerAdviceController๋ฅผ ๋ณด์กฐํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ Controller์—์„œ ์“ฐ์ด๋Š” ๊ณตํ†ต๊ธฐ๋Šฅ๋“ค์„ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์ „์—ญ์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜(egov 3.0, Spring 3.2.X๋ถ€ํ„ฐ ์ถ”๊ฐ€)

Controller์˜ ์ข…๋ฅ˜๋Š” ์œ„์™€ ๊ฐ™๋‹ค. ๊ทธ ์ค‘์— ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” Cotroller์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

1) @Controller

์ด ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ธํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.


2) @RequestMapping()

์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • uri๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด Controller์—์„œ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ• ์ง€ ์ •์˜ํ•œ๋‹ค.

์ด๋•Œ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ํŠน์ • ๋ฉ”์†Œ๋“œ์™€ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด@RequestMapping()์ด๋‹ค.

  • value: ์š”์ฒญ๋ฐ›์„ url๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • method: ์–ด๋–ค ์š”์ฒญ์œผ๋กœ ๋ฐ›์„์ง€ ์ •์˜ํ•œ๋‹ค. (GET, POST, PUT โ€ฆ)

๊ทธ๋Ÿฌ๋‚˜ method๋Š” ํ•ญ์ƒ ์„ค์ •ํ•ด์ฃผ๊ธฐ์—๋Š” ๋ถˆํŽธํ•˜๋ฏ€๋กœ @GetMapping์ด๋‚˜ @PostMapping์„ ์‚ฌ์šฉํ•œ๋‹ค.

@Controller
@RequestMapping("/board")
public class BoardController {
}

๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด @RequestMapping("/board")๋ผ๊ณ  ํ–ˆ๋‹ค๋ฉด uri์— http:/localhost:8080/board ๋กœ ์˜ค๋Š” ์ฃผ์†Œ๋Š” ๋ชจ๋‘ BoardController๊ฐ€ ๋ฐ›๊ฒŒ ๋œ๋‹ค.


3) @GetMapping()

์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด @RequestMapping์˜ HTTP Method๋ฅผ ๊ฐ„๋‹จํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. @GetMapping์ด๋‚˜ @PostMapping์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฒŒ HTTP Method์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

URL์— ๋ณ€์ˆ˜๋ฅผ ํฌํ•จ์‹œ์ผœ ์š”์ฒญํ•˜์—ฌ ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค.

์บ์‹ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค ( ํ•œ ๋ฒˆ ์ ‘๊ทผํ•œ ํ›„์— ๋˜‘๊ฐ™์€ ์š”์ฒญ์„ ํ•  ๋•Œ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ์‹œํ‚ค๋Š” ๊ฒƒ์„ ์บ์‹ฑ์ด๋ผ ํ•จ)

๋ทฐ๋กœ ์ด๋™ํ•ด๋ผ

๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜ํ•ด๋ผ

ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ


4) @PostMapping()

HTTP Post Method.

URL์˜ ๋ณ€์ˆ˜์— ๋ณ€์ˆ˜๋ฅด ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์š”์ฒญํ•˜์—ฌ get๋ฐฉ์‹๋ณด๋‹ค ๋ณด์•ˆ์ด ์ข‹๋‹ค.

์ „์†กํ•˜๋Š”๋ฐ ๊ธธ์ด์ œํ•œ์ด ์—†๊ณ  ์บ์‹ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์„œ๋ฒ„์— ๋ฆฌ์†Œ์Šค๋ฅผ ๋“ฑ๋ก(์ €์žฅ)ํ•  ๋•Œ ์‚ฌ์šฉ


4) @PathVariable

์ตœ๊ทผ HTTP API๋Š” ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ์— ์‹๋ณ„์ž๋ฅผ ๋„ฃ๋Š” ์Šคํƒ€์ผ์„ ์„ ํ˜ธํ•œ๋‹ค. ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‹๋ณ„์ž๋ฅผ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งคํ•‘๋˜๋Š” ๋ถ€๋ถ„์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

@GetMapping("/detail/{id}")
    public String detail(@PathVariable("id") Long id) {
      return "board/boardDetail";
		}

์œ„์™€ ๊ฐ™์ด PathVariable์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ localhost:8080/detail/108 ๋กœ ์ž…๋ ฅํ•˜๋ฉด id๊ฐ€ id(ํŒŒ๋ผ๋ฏธํ„ฐ)๋กœ ๋งค์นญ๋˜์–ด ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์ค‘ ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.


5) @ReponseBody()

๋ทฐํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ๊ฐ’๋งŒ ๋ณด๋‚ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

@GetMapping("/ajax1")
    public @ResponseBody String ajax(){
        return "ajax1๋ฐ˜ํ™˜๊ฐ’";
}


5) @RestController()

@RestCotnroller๋Š” @Cotroller์— @ResponseBody๊ฐ€ ๊ฒฐํ•ฉ๋œ ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

์ฆ‰, @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜์„ ๋”ฐ๋กœ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๋ฌธ์ž์—ด๊ณผ JSON ๋“ฑ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ทฐํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” @Controller์™€ ๋‹ฌ๋ฆฌ @RestController๋Š” ๋ทฐํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ(๊ฐ’)๋งŒ ๋ฆฌํ„ดํ•œ๋‹ค.

@RestController("/ajax1")
    public String ajax(){
        return "ajax1๋ฐ˜ํ™˜๊ฐ’";
}


6) @RequestParam

@RequestParam ์–ด๋…ธํ…Œ์ด์…˜์€ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ์‹œ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์„ Handler(Controller)์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ 1:1 ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

@Controller
public class TestController {
    @GetMapping("/")
    public String getTestPage(@RequestParam("name") String name) {
        System.out.println("์ด๋ฆ„ : " + name);
        return "test";
    }
}

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ /?name=test ๋กœ ์š”์ฒญํ•œ๋‹ค๋ฉด ์œ„ ํ•ธ๋“ค๋Ÿฌ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ name์— โ€œtestโ€๊ฐ€ ๋งคํ•‘๋œ๋‹ค.


6) @ModelAttribute

์‚ฌ์šฉ์ž์—๊ฒŒ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ์ฒด์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ์ด ๊ณผ์ •์„ @ModelAttribute ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•  dto ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
  2. dto์— @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor๋ฅผ ์ž๋™์œผ๋กœ ์ ์šฉํ•ด์ค€๋‹ค. (๊ฐ’์„ ์„ธํŒ…ํ•˜๊ธฐ ์œ„ํ•œ setter๊ฐ€ ํ•„์š”ํ•จ)
  3. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ public String board1(@ModelAttribute BoardDto boardDto){return โ€œโ€;}์„ ํ†ตํ•ด BoardDto๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ž๋™์œผ๋กœ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค.
    1. BoardDto๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
    2. ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์œผ๋กœ BoardDto๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐพ๋Š”๋‹ค.
    3. ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ setter๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ์ž…๋ ฅํ•œ๋‹ค.
    4. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์ด boardTitle์ด๋ฉด setBoardTitle() ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐพ์•„ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ’์„ ์ž…๋ ฅํ•œ๋‹ค.
    • ํ”„๋กœํผํ‹ฐ๋ž€? ๊ฐ์ฒด์— getBoardTitle(), setBoardTitle() ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด๋Š” boardTitle์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. boardTitle ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด setBoardTitle()์ด ํ˜ธ์ถœ๋˜๊ณ , ์กฐํšŒํ•˜๋ ค๋ฉด getBoardTitle()์ด ํ˜ธ์ถœ๋œ๋‹ค.

@RequestParam๊ณผ @ModelAttribute์˜ ์ฐจ์ด๋Š” 1:1 ๋งคํ•‘์ด๋ƒ ๊ฐ์ฒด ๋งคํ•‘์ด๋ƒ์ด๋‹ค.

@ModelAtrribute๋ฅผ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ @RequestParam๋„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์–ด ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šคํ”„๋ง์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ์ œ๊ณตํ•œ๋‹ค.

  • String, int, Integer์™€ ๊ฐ™์€ ๋‹จ์ˆœ ํƒ€์ž…์˜ ๊ฒฝ์šฐ : @RequestParam
  • argument resolver๋กœ ์ง€์ •ํ•ด๋‘” ํƒ€์ž… ์™ธ์˜ ๋‚˜๋จธ์ง€ : @ModelAttribute

Spring MVC Model์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ Controller๊ฐ€ ํ•˜๋Š” ์—ญํ• ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.


๐Ÿ“š Reference

MangKyu, https://mangkyu.tistory.com/49
It is True, https://ittrue.tistory.com/244

profile
๊ฐœ๋ฐœ์„ ๊ฐœ๋ฐœ๊ดด๋ฐœํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•œ ๋…ธ๋ ฅ

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