[Spring Boot - ๐ŸฑPetClinic๐Ÿถ] 10. Controller ๋ถ„์„(2)๐Ÿ”

์‘ค๋ฐยท2023๋…„ 4์›” 25์ผ

[Spring Boot - ๐ŸฑPetClinic๐Ÿถ]

๋ชฉ๋ก ๋ณด๊ธฐ
10/11

โš“๏ธ ๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ..

์ด์ „ ๊ธ€์—์„œ ํŒŒ์•…ํ•œ ๋‚ด์šฉ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด @Controller ํด๋ž˜์Šค์˜ ๊ฐ ๋ฉ”์„œ๋“œ๋Š” (ํ•„์š”ํ•  ๊ฒฝ์šฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ Model์— View ๋ Œ๋”๋ง์„ ์œ„ํ•œ ์ •๋ณด๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ ) ๋ Œ๋”๋ง์— ์‚ฌ์šฉํ•  View name์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (๋•Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ View ์š”์ฒญ์„ ์œ„ํ•œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.) Dispatcher Servlet์€ @Controller์—์„œ ๋ฐ˜ํ™˜๋ฐ›์€ View name์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ Œ๋”๋งํ•  View๋ฅผ ์ฐพ๊ณ  Model ์ •๋ณด๋ฅผ ์ด์šฉํ•ด View๋ฅผ ๋ Œ๋”๋งํ•œ ๋’ค Client์—๊ฒŒ ๋ Œ๋”๋งํ•œ View๋ฅผ ๋ณด๋‚ด์ค€๋‹ค.

๐Ÿ‘พ WelcomeController

@GetMapping("/") - index ํŽ˜์ด์ง€ ์š”์ฒญ

Index View ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ. Index ํŽ˜์ด์ง€์— ํ•ด๋‹นํ•˜๋Š” View name์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค.

๐Ÿ‘ผ๐Ÿป OwnerController

Pet Clinic์˜ ์ปจํŠธ๋กค๋Ÿฌ ์ค‘ ๊ฐ€์žฅ ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. owner ๊ด€๋ จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

MethodURI์„ค๋ช…
GET/owners/newowner ์ถ”๊ฐ€ ํŽ˜์ด์ง€ ์š”์ฒญ
POST/owners/newowner ์ถ”๊ฐ€ ์š”์ฒญ
GET/owners/findowner ์ฐพ๊ธฐ ํŽ˜์ด์ง€ ์š”์ฒญ
GET/owners/owner ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€ ์š”์ฒญ
GET/owners/{ownerId}/editowner ์ˆ˜์ • ํŽ˜์ด์ง€ ์š”์ฒญ
POST/owners/{ownerId}/editowner ์ˆ˜์ • ์š”์ฒญ
GET/owners/{ownerId}owner ์ƒ์„ธ์ •๋ณด ํŽ˜์ด์ง€ ์š”์ฒญ

@GetMapping("/owners/new") - owner๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ํŽ˜์ด์ง€ ์š”์ฒญ(initCreationForm)

public String initCreationForm(Map<String, Object> model)

owner ์ถ”๊ฐ€ View name์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ. Model์— ์™œ ๊ตณ์ด Owner ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์ฃผ๋‚˜ ํ–ˆ๋”๋‹ˆ ์—ฌ๊ธฐ์„œ ๋ฆฌํ„ดํ•˜๋Š” View๊ฐ€ owner ์ถ”๊ฐ€, ์ˆ˜์ • ๋ชจ๋‘์— ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด View์—์„œ ๋ Œ๋”๋งํ•  ๋•Œ input ํ•ญ๋ชฉ์— default๋กœ ๋“ค์–ด๊ฐˆ ์ •๋ณด๋“ค์ด null์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ input ํ•ญ๋ชฉ์„ ๋น„์šฐ๊ณ  ๋ Œ๋”๋งํ•œ๋‹ค.

@PostMapping("/owners/new") - owner ์ถ”๊ฐ€ ์š”์ฒญ(processCreationForm)

public String processCreationForm(@Valid Owner owner, BindingResult result) 

Request Body๋กœ ๋“ค์–ด์˜จ owner ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ. owner ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•œ ํ›„ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž…๋ ฅํ•œ ์ •๋ณด์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ owner ์ •๋ณด ์ž…๋ ฅ View๋กœ ๋˜๋Œ์•„๊ฐ€๊ณ , ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค๋ฉด ์ƒˆ owner ์ •๋ณด๋ฅผ Database์— ์ €์žฅํ•œ๋‹ค. ์ƒˆ owner ์ €์žฅ ํ›„ ์ €์žฅํ•œ owner ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์ฃผ์†Œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•œ๋‹ค.

@GetMapping("/owners/find") - ํŠน์ • owner ์ฐพ๊ธฐ ํŽ˜์ด์ง€ ์š”์ฒญ(initFindForm)

public String initFindForm()

owner ์ฐพ๊ธฐ๋ฅผ ์œ„ํ•œ View name์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ.

@GetMapping("/owners") - owner ์ฐพ๊ธฐ ์š”์ฒญ(processFindForm)

public String processFindForm(@RequestParam(defaultValue = "1") int page,
									Owner owner, BindingResult result, Model model)

owner ์ฐพ๊ธฐ ํŽ˜์ด์ง€์—์„œ ์ž…๋ ฅํ•œ last name์œผ๋กœ ํ•ด๋‹นํ•˜๋Š” owner๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ. last name์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ์ž…๋ ฅํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ชจ๋“  owner๋ฅผ ์ฐพ๋Š”๋‹ค. owner ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ last name์ด ์ผ์น˜ํ•˜๋Š” owner๊ฐ€ 1๋ช…์ผ ๊ฒฝ์šฐ ํ•ด๋‹น owner ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์ฃผ์†Œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•˜๊ณ , ์—ฌ๋Ÿฌ ๊ฑด์ผ ๊ฒฝ์šฐ ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ํ›„ owner ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” View๋กœ ์ด๋™ํ•œ๋‹ค.

@GetMapping("/owners/{ownerId}/edit") - ํŠน์ • owner ์ •๋ณด ์ˆ˜์ • ํŽ˜์ด์ง€ ์š”์ฒญ(initUpdateOwnerForm)

public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model model)

ํŠน์ • owner์˜ ์ƒ์„ธ ์ •๋ณด ์ˆ˜์ • View name์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ. View๋Š” owner ์ถ”๊ฐ€์— ์‚ฌ์šฉํ•˜๋Š” View์™€ ๊ฐ™๋‹ค. {ownerID}์— ๋งž๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ Model์— ๋„ฃ์–ด์ค€๋‹ค. Dispatcher Servlet์—์„œ Model์— ๋‹ด๊ฒจ์žˆ๋Š” owner ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์ˆ˜์ •ํ•  owner ์ •๋ณด๋ฅผ View์— ๋ Œ๋”๋งํ•œ๋‹ค.

@PostMapping("/owners/{ownerId}/edit") - ํŠน์ • owner ์ •๋ณด ์ˆ˜์ • ์š”์ฒญ(processUpdateOwnerForm)

public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result,
											@PathVariable("ownerId") int ownerId)

Request Body๋กœ ๋“ค์–ด์˜จ owner ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ. owner ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•œ ํ›„ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž…๋ ฅํ•œ ์ •๋ณด์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ owner ์ •๋ณด ์ž…๋ ฅ View๋กœ ๋˜๋Œ์•„๊ฐ€๊ณ , ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค๋ฉด {ownerId}์— ํ•ด๋‹นํ•˜๋Š” owner๋ฅผ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ๋“ค์–ด์˜จ ์ •๋ณด๋กœ ์ˆ˜์ •ํ•œ๋‹ค. owner ๊ฐฑ์‹  ํ›„ ํ•ด๋‹น owner ์ƒ์„ธ ํŽ˜์ด์ง€ ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์ฃผ์†Œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•œ๋‹ค.

@GetMapping("/owners/{ownerId}")

public ModelAndView showOwner(@PathVariable("ownerId") int ownerId)

owner ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ View name์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ. {ownerId}์— ํ•ด๋‹นํ•˜๋Š” owner๋ฅผ ์ฐพ์•„ Model์— ๋„ฃ์–ด์ค€๋‹ค. Dispatcher Servlet์€ Model์— ๋‹ด๊ธด owner ์ •๋ณด๋ฅผ ํ†ตํ•ด View๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

๐Ÿถ PetController

pet ๊ด€๋ จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. @Controller ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ‘์˜ @RequestMapping("/owners/{ownerId}") ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•  ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ ๊ฒฝ๋กœ์— ๋ฉ”์„œ๋“œ๋ณ„ ์ฒ˜๋ฆฌํ•  ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

MethodURI(/owners/{ownerId} + )์„ค๋ช…
GET/pets/newpet ์ถ”๊ฐ€ ํŽ˜์ด์ง€ ์š”์ฒญ
POST/pets/newpet ์ถ”๊ฐ€ ์š”์ฒญ
GET/pets/{petId}/editpet ์ˆ˜์ • ํŽ˜์ด์ง€ ์š”์ฒญ
POST/pets/{petId}/editpet ์ˆ˜์ • ์š”์ฒญ

@GetMapping("/pets/new") - ํŠน์ • owner์— pet์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ํŽ˜์ด์ง€ ์š”์ฒญ(initCreationForm)

public String initCreationForm(Owner owner, ModelMap model)

owner id๊ฐ€ {ownerId}์ธ owner์— pet์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด ์ž…๋ ฅ View name์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ. GET /owners/{ownerId}/pets/new ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด View ์—ญ์‹œ ์ถ”๊ฐ€, ์ˆ˜์ • ๋ชจ๋‘์— ์‚ฌ์šฉ๋˜๋ฏ€๋กœ owner์— pet ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด owner์— ์ถ”๊ฐ€ํ•œ ํ›„ Model์— ๋„ฃ์–ด์ค€๋‹ค.

@PostMapping("/pets/new") - ํŠน์ • owner์— pet ์ถ”๊ฐ€ ์š”์ฒญ(processCreationForm)

public String processCreationForm(Owner owner, @Valid Pet pet,
										BindingResult result, ModelMap model)

Request Body๋กœ ๋“ค์–ด์˜จ pet ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ. POST /owners/{ownerId}/pets/new ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. owner id๊ฐ€ {ownerId}์— ํ•ด๋‹นํ•˜๋Š” owner์— ์ƒˆ pet์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด๋ฆ„์˜ ๊ธธ์ด, ์ด๋ฆ„ ์ค‘๋ณต ์—ฌ๋ถ€ ๋“ฑ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ด์ƒ์ด ์žˆ์œผ๋ฉด ๋‹ค์‹œ pet ์ถ”๊ฐ€ View๋กœ ๋˜๋Œ์•„๊ฐ€๊ณ , ์ด์ƒ์ด ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€ํ•œ ๋’ค ํ•ด๋‹น owner ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์ฃผ์†Œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•œ๋‹ค.

@GetMapping("/pets/{petId}/edit") - ํŠน์ • owner์˜ ํŠน์ • pet ์ •๋ณด ์ˆ˜์ • ํŽ˜์ด์ง€ ์š”์ฒญ(intiUpdateForm)

public String initUpdateForm(Owner owner, @PathVariable("petId") int petId, ModelMap model)

ํŠน์ • owner์˜ ํŠน์ • pet์˜ ์ •๋ณด ์ˆ˜์ •์„ ์œ„ํ•œ View name์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ. GET /owners/{ownerId}/pets/{petId}/edit ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. owner id๊ฐ€ {ownerId}์ธ owner์˜ pet id๊ฐ€ {petId}์ธ pet์˜ ์ •๋ณด๋ฅผ ์ฐพ์•„ Model์— ๋‹ด๋Š”๋‹ค. Dispatcher Servlet์€ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฐพ์€ ์ˆ˜์ •ํ•  pet์˜ ์ •๋ณด๋ฅผ View์— ๋ Œ๋”๋งํ•œ๋‹ค.

@PostMapping("/pets/{petId}/edit") - ํŠน์ • owner์˜ ํŠน์ • pet ์ •๋ณด ์ˆ˜์ • ์š”์ฒญ(processUpdateForm)

public String processUpdateForm(@Valid Pet pet, BindingResult result, 
												Owner owner, ModelMap model)

ํŠน์ • owner์˜ ํŠน์ • pet์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ. POST /owners/{ownerId}/pets/{petId}/edit ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. Request Body๋กœ ๋„˜์–ด์˜จ pet์˜ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด owner id๊ฐ€ {ownerId}์— ํ•ด๋‹นํ•˜๋Š” pet id๊ฐ€ {petId}์ธ pet์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. ๋ฐ›์•„์˜จ pet ์ •๋ณด์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด pet ์ •๋ณด ์ˆ˜์ • View๋กœ ๋˜๋Œ์•„๊ฐ€๊ณ , ์—†์œผ๋ฉด ํ•ด๋‹น owner ์ƒ์„ธ ์ •๋ณด View๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•œ๋‹ค.

๐Ÿฅ VisitController

visit ๊ด€๋ จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

MethodURI์„ค๋ช…
GET/owners/{ownerId}/pets/{petId}/visits/newvisit ์ถ”๊ฐ€ ํŽ˜์ด์ง€ ์š”์ฒญ
POST/owners/{ownerId}/pets/{petId}/visits/newvisit ์ถ”๊ฐ€ ์š”์ฒญ

@GetMapping("/owners/{ownerId}/pets/{petId}/visits/new") - ํŠน์ • owner์˜ ํŠน์ • pet์— ๋ฐฉ๋ฌธ๊ธฐ๋ก ์ถ”๊ฐ€๋ฅผ ์œ„ํ•œ ํŽ˜์ด์ง€ ์š”์ฒญ(initNewVisitForm)

public String initNewVisitForm()

๋ฐฉ๋ฌธ ์ •๋ณด ์ž…๋ ฅ View name์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ. ์ด View๋„ visit ์ถ”๊ฐ€, ์ˆ˜์ •์— ๋ชจ๋‘ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋‚˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. ์ˆ˜์ •์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๋ฉ”์„œ๋“œ ๋‚ด์šฉ๊ณผ html ํŒŒ์ผ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

@PostMapping("/owners/{ownerId}/pets/{petId}/visits/new") - ํŠน์ • owner์˜ ํŠน์ • pet์— ๋ฐฉ๋ฌธ๊ธฐ๋ก ์ถ”๊ฐ€ ์š”์ฒญ(processNewVisitForm)

public String processNewVisitForm(@ModelAttribute Owner owner, @PathVariable int petId, 
												@Valid Visit visit, BindingResult result)

Request Body๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ๋ฐฉ๋ฌธ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ํ•ด๋‹น pet์— ๋ฐฉ๋ฌธ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ. owner id๊ฐ€ {ownerId}์ธ owner์˜ pet id๊ฐ€ {petId}์ธ pet์— ๋ฐฉ๋ฌธ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋ฐ›์•„์˜จ ์ •๋ณด์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐฉ๋ฌธ ์ •๋ณด ์ž…๋ ฅ View๋กœ ๋˜๋Œ์•„๊ฐ€๊ณ , ์˜ค๋ฅ˜๊ฐ€ ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ ํ›„ ํ•ด๋‹น owner ์ƒ์„ธ ์ •๋ณด ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•œ๋‹ค.

๐Ÿง‘๐Ÿปโ€โš•๏ธ VetController

vet ๊ด€๋ จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

MethodURI์„ค๋ช…
GET/vets.htmlvet ๋ชฉ๋ก ์กฐํšŒ ํŽ˜์ด์ง€ ์š”์ฒญ
GET/vetsvet ๋ชฉ๋ก ์š”์ฒญ

๋‘ ์š”์ฒญ ๋ชจ๋‘ Veterinarian์˜ ๋ชฉ๋ก ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์š”์ฒญ์ด์ง€๋งŒ, ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค.

@GetMapping("/vets.html") - Veterinarian ๋ชฉ๋ก ์กฐํšŒ ํŽ˜์ด์ง€ ์š”์ฒญ(showVetList)

public String showVetList(@RequestParam(defaultValue = "1") int page, Model model)

Veterinarian์˜ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•ด ์ฃผ๋Š” View name์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ. ModelAndView ๋ฐฉ์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ Veterinarian์˜ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” View๋ฅผ ๋ณด๋‚ด์ค€๋‹ค. Dispatcher Servlet์€ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Veterinarian์˜ ๋ชฉ๋ก์„ ์ฝ์–ด์™€ ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๋’ค View๋ฅผ ๋ Œ๋”๋งํ•œ ๋‹ค์Œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด์ค€๋‹ค.

@GetMapping("/vets") - Veterinarian ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ์š”์ฒญ(showResourcesVetList)

public @ResponseBody Vets showResourcesVetList()

Veterinarian์˜ ๋ชฉ๋ก์„ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ. ๋”ฐ๋กœ View๋ฅผ ๋ Œ๋”๋งํ•ด์„œ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ชฉ๋ก์„ ๋ณด๋‚ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ parsing ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์š”์ฒญ์ด๋‹ค. ์ด ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ด๊ฐ’์€ Veterinarian์˜ ๋ชฉ๋ก์ด ๋‹ด๊ธด ๊ฐ์ฒด๋ฅผ XML ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋„˜๊ธด๋‹ค.

๐ŸŽ‡ CrashController

์˜ค๋ฅ˜ ํŽ˜์ด์ง€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

MethodURI์„ค๋ช…
GET/oups์˜ค๋ฅ˜ ํŽ˜์ด์ง€ ์š”์ฒญ

@GetMapping("/oups") - ์˜ค๋ฅ˜ ํŽ˜์ด์ง€ ์š”์ฒญ

public String triggerException()

์˜ค๋ฅ˜ ํŽ˜์ด์ง€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ. Runtime Exception์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. Runtime Exception์ด ๋ฐœ์ƒํ•˜๋ฉด Dispatcher Servlet์€ ๋‚ด๋ถ€์ ์œผ๋กœ '/error' ์š”์ฒญ์„ ๋ฐœ์ƒ์‹œ์ผœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ error.html์„ ์ „ํ•ด์ค€๋‹ค. Runtime Exception์ด ๋ฐœ์ƒํ•  ๋•Œ error message๋ฅผ ์„ค์ •ํ•ด ์ฃผ๋ฉด error.html์— ํ•ด๋‹น error message๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ๋ณด๋‚ด์ค€๋‹ค.

๐Ÿ—’ Naming Convention

Pet Clinic์—์„œ๋Š” @Controller์˜ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ž‘์„ฑํ•  ๋•Œ์˜ naming convention์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Method name์„ค๋ช…
init{ํ–‰์œ„}Form(Creation, Find ๋“ฑ)์ถ”๊ฐ€๋ฅผ ์œ„ํ•œ View ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ
process{ํ–‰์œ„}Form(Creation, Find ๋“ฑ)์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ(์ €์žฅ, ์ฐพ๊ธฐ ๋“ฑ)
initUpdate{๋Œ€์ƒ}Form๋Œ€์ƒ ์ˆ˜์ •์„ ์œ„ํ•œ View ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ
processUpdate{๋Œ€์ƒ}Form๋Œ€์ƒ ์ˆ˜์ •์„ ์œ„ํ•œ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ
show{๋Œ€์ƒ}๋Œ€์ƒ ์กฐํšŒ๋ฅผ ์œ„ํ•œ View ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ

๐Ÿงฉ ๋งˆ๋ฌด๋ฆฌ

@Controller ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ„์„ํ•˜๋ฉฐ ํ•œ ๊ฐ€์ง€ View๋ฅผ ์ด์šฉํ•ด ์ถ”๊ฐ€, ์ˆ˜์ •์— ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค. xmlํŒŒ์ผ๋กœ ๋ชฉ๋ก์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ, Controller ๋‹จ์˜ naming convention๊ณผ ์–ด๋””๊นŒ์ง€๋ฅผ Controller์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.(Request Mapping, ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ, Request Body๋กœ ๋“ค์–ด์˜ค๋Š” Model Attribute๋ฅผ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ, View ๋ Œ๋”๋ง์„ ์œ„ํ•œ Model์— ๊ฐ์ฒด ์ถ”๊ฐ€ ๋“ฑ๋“ฑ..) ๋‹ค์Œ ๊ธ€์—์„œ๋Š” Pet Clinic์˜ Repository ๋ถ„์„์— ๋Œ€ํ•ด ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค. ์ง€๊ธˆ์€ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ํ™œ์šฉํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ธฐ๋ฅด๋Š” ๊ฒƒ์ด ๋” ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์ง€๋งŒ.. ์ด์™• ์‹œ์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ.. ๋์„ ๋ณด๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ์–ผ๋ฅธ ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ๋“ค์–ด๊ฐ€์•ผ์ง€...!

[์ฐธ๊ณ ]

@XmlElement ์„ค๋ช… -
https://fordeveloper2.tistory.com/7584?category=360944

profile
๊ฐœ๋ฐœ์ž์ง€๋ง์ƒ

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