[ SpringMVC์ ๋ํ์ฌ ]
[ Hello World ์ถ๋ ฅํ๊ธฐ ]
Hello, World๋ฅผ ์ถ๋ ฅํ๋ค.
๊ทธ๋ฐ๋ฐ @Controller๊ฐ ์๋ @RestController๋ฅผ ์ฌ์ฉํ์๋ค.
์ @RestController๋ฅผ ์ฌ์ฉํ๊ฑธ๊น?
@Controller
- @Controller๋ ์ฃผ๋ก view๋ฅผ ๋ฐํํ๋ค.
- ViewResolver๋ฅผ ํตํด view๋ฅผ ๋ฐํํ๋ค.
- AnnotationMethodHandlerAdapter ํธ๋ค๋ฌ ์ด๋ํฐ๊ฐ ์ฌ์ฉํ๋ค.
- ๋ฉ์๋ ๋จ์๋ก ์ค์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ํจ์จ์ด ์ข๋ค.
- @Controller๋ 200 OK(์ฑ๊ณต์ ์๋ฆฌ๋ ์ํ ์ฝ๋)๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณด๋ธ๋ค.
@RestController
- @Controller์ @ResponseBody๊ฐ ์ถ๊ฐ๋์๋ค.
- Controller๋ฅผ ํตํด Json ํํ๋ก ๋ฐํํด์ผํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
- HttpMessageConverter๋ฅผ ํตํด Json ํํ๋ก ๋ฐํํ๋ค.
- ๋ฐํ๋๋ ๊ฐ์ฒด๋ Json์ผ๋ก Serialize(์ง๋ ฌํ)๋์ด ๋ฐํ๋๋ค.
- @RestController๋ 200 OK(์ฑ๊ณต์ ์๋ฆฌ๋ ์ํ ์ฝ๋)๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณด๋ธ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก @Controller๋ View๋ฅผ ๋ฐํํ ๋ ์ฌ์ฉํ๊ณ , @RestController๋ Hello, World ๊ฐ์ ์ด๋ค Json ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ๋ ์ฌ์ฉํ๋ค๋ ๊ฑธ ์์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ @RestController๋ Json ๋ฐํ์ด ๋๋๊ฑธ๊น?
์ง๋ ฌํ
- ์ปดํจํฐ ๊ณผํ์ ๋ฐ์ดํฐ ์คํ ๋ฆฌ์ง ๋ฌธ๋งฅ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ค๋ธ์ ํธ ์ํ๋ฅผ ๋์ผํ๊ฑฐ๋ ๋ค๋ฅธ ์ปดํจํฐ ํ๊ฒฝ์ ์ ์ฅํ๊ณ ๋์ค์ ์ฌ๊ตฌ์ฑํ ์ ์๋ ํฌ๋งท์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์ด๋ค.
- ์๋ฐ ์์คํ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ์ ์๋ฐ ์์คํ ์์๋ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐ์ดํธ(byte) ํํ๋ก ๋ฐ์ดํฐ ๋ณํํ๋ ๊ธฐ์ ๊ณผ ๋ฐ์ดํธ๋ก ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ธฐ์ (์ญ์ง๋ ฌํ)์ ์์ธ๋ฌ์ ์ด์ผ๊ธฐํ๋ค.
์ง๋ ฌํ๋ฅผ ์ฝ๊ฒ ์ดํดํด๋ณด์๋ฉด, ์์คํ ๋ด๋ถ์์ ์ฒ๋ฆฌํ๊ธฐ ํธ๋ฆฌํ ์ด๋ค ๋ฐ์ดํฐ ํํ๋ก ์กด์ฌํ๋ค๊ฐ ์ฐ๋ฆฌ์๊ฒ ๋ณด์ฌ์ค ๋ ์ฐ๋ฆฌ๊ฐ ์ดํดํ ์ ์๋ ๋ชจ์ต์ผ๋ก ํํ๋ฅผ ๋ณํ์ํค๋ ๊ฒ์ ๋ปํ๋ ๊ฒ ๊ฐ๋ค.
Q. @Controller๋ Json ํํ๋ก ๋ฐํ์ ๋ชปํ๋?
A. ๊ทธ๊ฑด ์๋๋ค. ํ ์ ์๋ค. @ResponseBody๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด Json ํํ๋ก ๋ฐํ์ด ๊ฐ๋ฅํ๋ค. ๋ณธ๋ @Controller๋ ViewResolver๊ฐ ์๋ํ์ฌ view๋ฅผ ๋ฐํํ ์ ์๋๋ก ํด์ค๋ค. ํ์ง๋ง @ResponseBody๋ฅผ ๋ถ์ด๋ฉด @RestController์ฒ๋ผ HttpMessageConverter๊ฐ ๊ฐ์ ํ๊ฒ ๋์ด ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ์ฌ ์ ๋ฌํ๊ฒ ๋๋ค. ๋ํ MessageConverter์๋ ๋ฐ์ดํฐ์ ์ข ๋ฅ(๋จ์ ๋ฌธ์์ด์ธ์ง, ๊ฐ์ฒด์ธ์ง...)์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธMessageConverter๊ฐ ์๋ํ๊ฒ ๋๋ค.
// @ResponseBody๋ฅผ ๋ถ์ธ ์ฝ๋
@Controller
public class HelloController {
@GetMapping("")
@ResponseBody
public String helloWorld() {
return "Hello, World";
}
}
<๊ฒฐ๊ณผ>
๐
Http ์ํ ์ฝ๋
- ํน์ HTTP ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์๋์ง ์๋ ค์ค๋ค.
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ฑ๊ณต์๋ต์ 200 OK๊ฐ ์๋ค.
Q. @RestController์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐํ๋๋ ์ฑ๊ณต ์ํ ์ฝ๋๋ 200 OK๋ค. ๊ทธ๋ฐ๋ฐ ๋ค๋ฅธ ์ํ ์ฝ๋๋ก ๋ฐ๊พธ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋?
A. ResponseEntity๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์ฝ๋๋ฅผ ์ง์ ์ค์ ํ ์ ์๋ค.
1) ResponseEntity.ok()๋ฅผ ์ฌ์ฉํ ์ฝ๋ (200 OK)
// ์์ ์ถ์ฒ - mangkyu.tistory (๋ง๋๋ ๊ฐ๋ฐ์๋)
@GetMapping(value = "/users")
public ResponseEntity<User> findUserWithResponseEntity(@RequestParam String userName){
return ResponseEntity.ok(userService.findUser(userName));
}
2) ResponseEntity.status(HttpStatus.CREATED)๋ฅผ ์ฌ์ฉํ ์ฝ๋ (201 Created)
@GetMapping(value = "/users")
public ResponseEntity<User> findUserWithCreatedResponse(@RequestParam String userName){
return ResponseEntity.status(HttpStatus.CREATED).body(userService.findUser(userName));
}
์ฝ๋ ์ค๋ช
:
- @GetMapping โป users ๊ฒฝ๋ก๋ก ๋ค์ด์จ ์์ฒญ์ ํด๊ฒฐํ๊ณ ์๋ต์ ๋ฐํํ๋ค.
- ResponseEntity<User> โป User(User ์์ ์์ ์ด๋ค ์ ๋ณด๋ค, ์ด๋ฆ+๋์ด+์ฃผ์์ ๊ฐ์...) ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ฐ, ์ํ ์ฝ๋์ ํจ๊ป ๋ฐํํ๋ค๋ ๋ป. (ResponseEntity๋ก ๊ฐ์ธ์ ๋ฐํ)
- @RequestParam โป ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก ๋ฐ์ธ๋ฉ(๊ตฌ์ฒด์ ์ธ ๊ฐ์ ํ ๋นํ๋ ๊ณผ์ , ์ด๋ฆ = ๋ฏธ๋ + ๋์ด = 10์ธ + ์ฃผ์ = ์์ธํน๋ณ์์ ๊ฐ์...) ๊ทธ๋ฐ๋ฐ userName์ด ์์ ๋ถ์๋ค. ์ด ์๋ฏธ๋ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ผ๋ก userName์ด ๋ค์ด์ค๋ฉด(์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ) userName ๋ณ์์ ์ ์ฅํ๊ฒ ๋ค๋ ๊ฒ์ด๋ค. (๋ฏธ๋๋ผ๋ ๊ฐ์ด url๋ก๋ถํฐ ๋ฐ์์ค๋ฉด ๊ทธ ๊ฐ์ userName์ ์ ์ฅํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ทธ ์ฌ์ฉ์์ ๋ํ ๋ค๋ฅธ ์ ๋ณด๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋ฃ์ ์ ์๊ฒ ๋ง๋ ๋ค๋ ์๋ฏธ์ธ ๊ฒ ๊ฐ๋ค.)
- ResponseEntity.status โป ์๋ต์ํ ์ฝ๋๋ฅผ ์ค์ ํ๋๋ก ํ๋ค.
- HttpStatus.CREATED โป 201 Created๋ฅผ ์๋ฏธํ๋ค. ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋์์ผ๋ฉฐ, ์์์ด ์์ฑ๋์์์ ๋ํ๋ด๋ ์ฑ๊ณต ์ํ ์๋ต ์ฝ๋์ด๋ค.
- findUser(userName) โป userName์ ์ฐพ์์ User ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ผ๋ ๊ฒ์ด๋ค.
๊ฒฐ๋ก : users๋ก ๋ค์ด์จ ์์ฒญ์ ํด๊ฒฐํ ํ ์ฑ๊ณต์ ์ด๋ฉด 201 CREATED๋ฅผ ๋ฐํํ๋ฉฐ ๋ฐํํ ๋ User ๋ด์ฉ๋ ๊ฐ์ด ๋ด์์ ๋ฐํํด๋ผ.
Q. ๊ทธ๋ ๋ค๋ฉด @Controller๋ ์ํ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ณํํ ์ ์๋๊ฐ?
A. @RestController์ ๊ฐ์ด ResponseEntity.status๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, HttpServletResponse ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ์ํ ์ฝ๋๋ฅผ ์ค์ ํ ์ ์๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด HttpServletResponse response์ response.setStatus(HttpStatus.CREATED.value()); ์ฝ๋๋ฅผ ํตํด 201 CREATED๋ก ์ํ๋ฅผ ์ค์ ํ๋ ๊ฑธ ๋ณผ ์ ์๋ค.
@GetMapping("/users")
public String findUser(@RequestParam String userName, HttpServletResponse response) {
response.setStatus(HttpStatus.CREATED.value());
}
์ด๋ฒ์๋ @Controller์ @RestController์ ๋ํด ์์๋ดค์ต๋๋ค.
์๊ฐ๋ณด๋ค ์ ๋ฆฌํ๋๋ฐ ์ค๋๊ฑธ๋ ค์ ์กฐ๊ธ ๋นํฉ์ค๋ฌ์ ๋ค์...
๋ค ์ฒ์๋ณด๋ ๋ด์ฉ๋ค์ด๋ผ ํ๋์ ๊ฐ๋
์ ์ดํดํ๋ ค๋ฉด ๋ค๋ฅธ ๊ฐ๋
๋ค๋ ์ดํดํด์ผํ๊ณ
์ํ ์ฝ๋์ ๋ํ ๋ถ๋ถ๋ ๋ชฐ๋๋ค๊ฐ ์ผ๋จ๊ฒฐ์ ๊ฐ๋จํ ๋ฐฐ์ฐ๊ณ ๋์ด๊ฐ๊ฒ ๋๋ ์๊ฐ์ด์์ต๋๋ค.
์๋์ ์ถ์ฒ๋ฅผ ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค.
๋ธ๋ก๊ทธ์ ์ ๊ฐ ์ต๋ํ ์ดํดํ ๋ด์ฉ๊น์ง๋ง ์ ๋๊ฑฐ๋ผ
์ถ์ฒ์ ๋ค์ด๊ฐ์๋ฉด ๋ ๋ง์ ๋ด์ฉ์ด ์์ด ๊ณต๋ถํ์๋๋ฐ ๋์๋์ค๊ฒ๋๋ค.
๐ชฝ
ํ๋ฆฐ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์
- @Controller์ @RestController์ ์๋ฆฌ์ ์ฐจ์ด ๊ทธ๋ฆฌ๊ณ ์ํ์ฝ๋
- ๋ค์ํ Controller์ ๋ํด์
- HttpservletResponse์ ๋ํด์
- @ResponseStatus์ ๋ํ์ฌ
'๐ท Spring > ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring - GET๊ณผ POST ๊ทธ๋ฆฌ๊ณ @GetMapping (5) | 2024.10.22 |
---|---|
Spring - Spring MVC๋ฅผ ์์์ผ ์์์ด ๊ฐ๋ฅํ๋ค. (3) | 2024.10.15 |