JAN's History
์คํ๋ง๊ณผ JPA๋ฅผ ์ด์ฉํ ์น๊ฐ๋ฐ_์ปจํธ๋กค๋ฌ ๊ตฌํ ๋ณธ๋ฌธ
๐ค์ปจํธ๋กค๋ฌ๊ฐ ๋ฌด์์ธ๊ฐ์?
- ์ฌ์ฉ์ ์์ฒญ(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
- ์ฟผ๋ฆฌ์คํธ๋ง(=url)
- ์์ฒญ ํ๋ผ๋ฏธํฐ ์กฐํ ๋ฐฉ๋ฒ
- @RequestParam, @ModelAttribute
- HTTP ๋ฉ์์ง ๋ฐ๋๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ
- @RequestBody
- ํด๋ผ์ด์ธํธ๊ฐ Request์ JSONํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ฉด ์ด ์ด๋ ธํ ์ด์ ์ผ๋ก ์กฐํํ๋ฉด๋จ!
- @RequestBody
@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๊ฐ ๋ถ์ ๋ฉ์๋๊ฐ ์คํ๋จ
- ๋ฉ์๋ ๋ ๋ฒจ → ํด๋น ์ปจํธ๋กค๋ฌ ๋ด์ ๋ชจ๋ @RequestMapping ๋ฉ์๋์ Model์ ์ฝ์
๋์ด ๋ฐํ
์ด๊ฑธ ์ ํด์ผํ๋ ..?!?
- 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);
}
'์คํ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง๊ณผ JPA๋ฅผ ์ด์ฉํ ์น๊ฐ๋ฐ_Spring Data JPA 1 (0) | 2024.04.04 |
---|---|
RESTful API ์ @RestController, @Controller์ ๋ํด์ ์์๋ณด์ (0) | 2024.04.04 |
์์๋ฅผ ํตํด ์์๋ณด๋ MVC ํจํด ์ด์ ๋ฆฌ (RequestMapping, addAttribute) (0) | 2024.04.02 |
์คํ๋ง๊ณผ JPA๋ฅผ ์ด์ฉํ ์น๊ฐ๋ฐ_AOP (0) | 2024.04.02 |
์คํ๋ง๊ณผ JPA๋ฅผ ์ด์ฉํ ์น๊ฐ๋ฐ_์คํ๋งMVC (0) | 2024.04.02 |