JAN's History

์Šคํ”„๋ง๊ณผ JPA๋ฅผ ์ด์šฉํ•œ ์›น๊ฐœ๋ฐœ_์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„ ๋ณธ๋ฌธ

์Šคํ”„๋ง

์Šคํ”„๋ง๊ณผ JPA๋ฅผ ์ด์šฉํ•œ ์›น๊ฐœ๋ฐœ_์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„

JANNNNNN 2024. 4. 3. 11:20

๐Ÿค”์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • ์‚ฌ์šฉ์ž ์š”์ฒญ(input)์„ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Model(ModelAndView)์— ๋‹ด๋Š” ์—ญํ• 
  • ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์กด์žฌ
  • Spring 2.5์—์„œ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์ปจํŠธ๋กค๋Ÿฌ ๋“ฑ์žฅ
    • @RequestMapping, @RequestParam, @ModelAttribute, and so on
  • ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ฒฝ์šฐ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š” ์—†์ด ๋‹จ์ˆœํžˆ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด ๋จ
@Controller
public class HelloWorldController {

@RequestMapping("/helloWorld")
public String helloWorld(Model model) {
	model.addAttribute("message", "Hello World!");
	return "helloWorld";
	}
}

@RequestMapping์ด Handler์˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ !

  • /hellowWorld Request๊ฐ€ ๋“ค์–ด์˜ค๋ฉด helloWorld ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ

@Controller

์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋Œ€์ƒ์ด ๋˜๋Š” ๋นˆ ์ค‘, Controller์˜ ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  • @Component : ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์—์„œ ์‚ฌ์šฉ
  • @Controller : ์Šคํ”„๋ง MVC ์ปจํŠธ๋กค๋Ÿฌ
  • @Repository : ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต
  • @Service : ์Šคํ”„๋ง ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ๋นˆ์˜ ์—ญํ• ์„ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด)

์˜ˆ์‹œ

๋งจ ์œ„์— @RequestMapping("/appintments")๋ฅผ ์ง€์ •ํ•ด๋‘ฌ์„œ ์•„๋ž˜์— @RequestMapping์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” value๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋จ!

value๊ฐ’์„ {}๋กœ ๋‹ด์•„์„œ ๊ทธ ๊ฐ’์„ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ.

RequestMapping

@RequestMapping ๋Œ€์ฒด: HTTP ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ๊ตฌ์ฒด์ ์ธ ๋ช…์‹œ

  • GetMapping
  • PostMapping
  • PutMapping
  • DeleteMapping
  • PatchMapping

ํ•˜๋‚˜์˜ RequestMapping์œผ๋กœ ๋‹ค์ˆ˜์˜ URL์„ ๋งคํ•‘

  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ์˜ ํŽธ์ด์„ฑ ์ œ๊ณต
@RequestMapping({"/welcome","/welcome2"})

Path Variable

@PathVariable

  • Spring MVC์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, URL ๊ฒฝ๋กœ์—์„œ ๋ณ€์ˆ˜ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ RESTful ์›น ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „๋‹ฌํ•œ URL์˜ ์ผ๋ถ€๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์˜ค๋Š” ๋ฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • "localhost:8080/appointments/13"์™€ ๊ฐ™์ด ์š”์ฒญ URL์— 13์ด๋ผ๋Š” ์ž์›์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • REST API๊ฐ€ ์ ์  ์ค‘์š”ํ•ด์ง → PathVariable ์‚ฌ์šฉ ๋นˆ๋„ ์ฆ๊ฐ€

value๊ฐ’์˜ {ownerId}, {petId}๋Š” ์ž…๋ ฅ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ๊ณ  ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ๋‹ค.

โž•PathVariable์ด ๋‹ค์ˆ˜์ผ ๊ฒฝ์šฐ, Map<>์œผ๋กœ ํ•œ ๋ฒˆ์— ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ!

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ @RequestMapping์„ ํด๋ž˜์Šค ์•ž๋‹จ์— ์ ์–ด ๊ณตํ†ต ๋ถ„๋ชจ๋ฅผ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋ฉ”์†Œ๋“œ argument ์‚ฌ์šฉ

Argument : ํ•จ์ˆ˜ ํ˜น์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์ „๋‹ฌ ํ˜น์€ ์ž…๋ ฅ๋˜๋Š” ์‹ค์ œ ๊ฐ’

Parameter : ํ•จ์ˆ˜ ํ˜น์€ ๋ฉ”์„œ๋“œ ์ •์˜์—์„œ ๋‚˜์—ด๋˜๋Š” ๋ณ€์ˆ˜ ๋ช…

์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ •์˜ํ•  ๋•Œ, handler ํ•จ์ˆ˜ ์ •์˜์— ๋‹ค์–‘ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค

  • HandlerApater๋Š” handler ์‹คํ–‰์— ํ•„์š”ํ•œ ์ธ์ž๋“ค์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ฆ
    • @PathVariable: Path(=url๋กœ) ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์„ ๋•Œ
    • @RequestParam: ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ
    • @RequestBody: ๋Œ€ํ‘œ์ ์œผ๋กœ ์š”์ฒญ Body์— ํฌํ•จ๋œ JSON๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ
    • @ModelAttribute: ์ •์˜ํ•œ (getter/setter๊ฐ€ ์ •์˜๋œ)DTO์— ์ž๋™ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ
    • @Valid: ์ž…๋ ฅ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํŒŒ๋ผ๋ฏธํ„ฐ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ฐฉ์‹์€ ๋‘๊ฐ€์ง€!

1. ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ 2.HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ• ๊นŒ?

  • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ข…๋ฅ˜
    • ์ฟผ๋ฆฌ์ŠคํŠธ๋ง(=url)
      • Ex) localhost:8080/name=jin&page=20
    • Get 
    • Post
  • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ ๋ฐฉ๋ฒ•
    • @RequestParam, @ModelAttribute
  • HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•
    • @RequestBody
      • ํด๋ผ์ด์–ธํŠธ๊ฐ€ Request์— JSONํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ฉด ์ด ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์กฐํšŒํ•˜๋ฉด๋จ!

@RequestParam

โž•Model model ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Spring MVC์—์„œ ์‚ฌ์šฉ๋˜๋Š” Model ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด Model ๊ฐ์ฒด๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ทฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Model์„ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์œผ๋กœ ๋„ฃ๊ณ , ์œ„์˜ Pet ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ "pet"์— ๋‹ด์•„ html์—์„œ pet์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฟŒ๋ ค์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

@RequestBody

HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์žˆ๋Š” ๋‚ด์šฉ์„ body๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ ์šฉ์ด ๋œ๋‹ค.

@ModelAttribute

ํผ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ : ์ฃผ๋กœ HTML ํผ์—์„œ ์ „์†ก๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์†Œ๋“œ์— ๋ฐ”์ธ๋”ฉํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์ด๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ „๋‹ฌ: ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์—์„œ ๋ทฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. @ModelAttribute๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ์ž๋™์œผ๋กœ ๋ทฐ๋กœ ์ „๋‹ฌ๋˜์–ด ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ ๊ฐ์ฒด ์ƒ์„ฑ: @ModelAttribute๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜์–ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด์—์„œ ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”์†Œ๋“œ(Method Level)์™€ ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž(Method Parameter Level)์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ๋ฉ”์†Œ๋“œ ๋ ˆ๋ฒจ → ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด์˜ ๋ชจ๋“  @RequestMapping ๋ฉ”์†Œ๋“œ์˜ Model์— ์‚ฝ์ž…๋˜์–ด ๋ฐ˜ํ™˜
      • MyController์— @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ๋Š” ๋ชจ๋‘ Model์— ์‚ฝ์ž…๋˜์–ด ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ๋œป!
    • @RequestMapping๊ฐ€ ๋ถ™์€ ํ•ธ๋“ค๋Ÿฌ์˜ ์‹คํ–‰ ์ „์— @ModelAttribute๊ฐ€ ๋ถ™์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋จ

์ด๊ฑธ ์™œ ํ•ด์•ผํ•˜๋ƒ ..?!?

  • Model ๊ฐ์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด view์— ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•จ.

์†์„ฑ ํ•˜๋‚˜ ์ถ”๊ฐ€ 

  • View์— ์ „๋‹ฌํ•ด์•ผํ•  ๊ฐ’์ด ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ์—๋Š”, ModelAttribute๋ฅผ ๋ฉ”์†Œ๋“œ๋ ˆ๋ฒจ์— ์ •์˜ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค!
  • ๊ทธ๋Ÿฌ๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ return ๊ฐ’์ด @ModelAttribute("์ด๋ฆ„")์— ๋ฐ”์ธ๋”ฉ ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๊ฐœ์˜ ์†์„ฑ ์ถ”๊ฐ€

  • @ModelAttribute๋ฅผ ์„ ์–ธํ•˜๊ณ  ์•„๋ž˜์— model.addAttribute๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

+) ์ฐธ๊ณ ๋กœ ์ €๋Š” ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ”๋˜ ๋ถ€๋ถ„์ด๋ผ ์—ฌ๋Ÿฌ๋ถ„๋“ค๋„ ๊ทธ๋Ÿด๊นŒ๋ด ์ ์–ด๋ด…๋‹ˆ๋‹ค..

@GetMapping("/user/{userId}")
public String getUserProfile(@PathVariable Long userId, @ModelAttribute("user") User user) {
    // userId๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง
    user = userService.getUserById(userId);
    return "userProfile";
}
HTTP ์š”์ฒญ (GET)       ----->    ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ (@GetMapping("/user/{userId}"))
                          |
                          |       @PathVariable๋กœ userId ๊ฐ’์„ ๋ฐ›์Œ
                          |
                          V
์„œ๋น„์Šค ๋ ˆ์ด์–ด (Service)  ----->    userId๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ
                          |
                          |
                          V
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (Database) ----->    userId์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ
                          |
                          |
                          V
์„œ๋น„์Šค ๋ ˆ์ด์–ด (Service)  ----->    ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ๋กœ ๋ฐ˜ํ™˜
                          |
                          |
                          V
์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ         ----->    @ModelAttribute๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ด
                          |
                          |
                          V
๋ชจ๋ธ์— ์ถ”๊ฐ€             ----->    ๋ฐ›์•„์˜จ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ชจ๋ธ์— ์ถ”๊ฐ€
                          |
                          |
                          V
๋ทฐ (View)               ----->    ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ํŽ˜์ด์ง€๋กœ ์ด๋™

์ด๋ ‡๊ฒŒ ๊ณผ์ •์ด ์ผ์–ด๋‚˜๋Š”๋ฐ, ์ €๋Š”@PathVariable Long userId, @ModelAttribute("user")) ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์ด ์žˆ์–ด์„œ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ค„ ์•Œ์•˜๋”๋‹ˆ ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งŒ ํ•ด๋‹น ๊ฐ’์ด ์ „๋‹ฌ๋˜์–ด ์‹คํ–‰๋œ๋‹ค๋„ค์š” ? 

โฉ๊ทธ๋ž˜์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ˜ธ์ถœ๋  ๋•Œ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค !

๋ ๋ผ์„œ @PathVariable๋กœ ์ถ”์ถœ๋œ ๊ฐ’์ด ๋จผ์ € ์‹คํ–‰๋˜๊ณ , @ModelAttribute๋กœ ์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‚˜์ค‘์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฐ”๋ณด์•ผ ..๐Ÿ˜‚

๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์–‘ํ•œ ๋ฆฌํ„ดํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ModelAndView object: ๋ชจ๋ธ๊ณผ ๋ทฐ ์ „๋‹ฌ
  • Model object : ๋ชจ๋ธ ์ „๋‹ฌ
  • Map object : ๋ชจ๋ธ๊ณผ ๋ทฐ ์ด๋ฆ„ ์ „๋‹ฌ
  • View object : ๋ทฐ ์ด๋ฆ„ ์ „๋‹ฌ
  • String :
    • @Controller → return ํƒ€์ž…์ด view์˜ ๋…ผ๋ฆฌ ์ด๋ฆ„์ด๋‹ค.(ex) jspํŒŒ์ผ์ด๋ฆ„)
    • @RestController → return ํƒ€์ž…์ด ๋ฐ์ดํ„ฐ
  • void : ํ˜„์žฌ ํ˜ธ์ถœํ•œ url์˜ ๊ฒฝ๋กœ๋กœ ๋ทฐ๋ฅผ ์ฐพ์Œ
    • (์š”์ฒญ: /person/new, ์‹คํ–‰: templates/person/new.html

๋งŒ์•ฝ์— returnํƒ€์ž…์„ String์œผ๋กœ ๊ทธ๋ƒฅ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

@RequestMapping(value = "/something", method = RequestMethod.PUT)
@ResponseBody
public String helloWorld() {
	return "Hello World";
}

@ResponseBody annotation์„ ์‚ฌ์šฉํ•˜๊ณ  String์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๋ฉด, ๊ทธ๋ƒฅ Hello world๋ผ๋Š” ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋œ๋‹ต๋‹ˆ๋‹ค~

๋งŒ์•ฝ์— Http์˜ Header์„ ์กฐํšŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

HttpEntity<?>

  • @RequestBody์™€ @ResponseBody์˜ ๊ธฐ๋Šฅ๊ณผ ๋”๋ถˆ์–ด ํ—ค๋” ์ •๋ณด๊นŒ์ง€ ์กฐํšŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
@RequestMapping("/something")
public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException {
    String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader"));
    byte[] requestBody = requestEntity.getBody();
    // do something with request header and body
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("MyResponseHeader", "MyValue");
    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}