[ SpringMVC์ ๋ํ์ฌ ]
Spring - Spring MVC๋ฅผ ์์์ผ ์์์ด ๊ฐ๋ฅํ๋ค.
์ฒ์์ ๋์ถฉ ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณด๋ คํ์ง๋ง,์ด๋ด์๊ฐ! ์๋ ๊ฒ์ด ๋ฏธ์ฝํ๋ ์์ํ ์ ์์๋ค.๊ทธ๋์ ๊ฐ์ฅ ๊ธฐ์ด์ ์ผ๋ก ์์์ผํ๋ ๊ฐ๋ ์ ์ฐจ๊ทผ์ฐจ๊ทผ ์ ๋ฆฌํด๋ณผ๊น ํ๋ค.๋๋ฅ, Spring MVC๋?์๋ง ์ ๋ณด์ฒ
post-this.tistory.com
[ Hello World ์ถ๋ ฅํ๊ธฐ ]
Spring - [IntelliJ] Hello World ์ถ๋ ฅํ๊ธฐ
[ Spring MVC์ ๋ํ์ฌ ] Spring - Spring MVC๋ฅผ ์์์ผ ์์์ด ๊ฐ๋ฅํ๋ค.์ฒ์์ ๋์ถฉ ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณด๋ คํ์ง๋ง,์ด๋ด์๊ฐ! ์๋ ๊ฒ์ด ๋ฏธ์ฝํ๋ ์์ํ ์ ์์๋ค.๊ทธ๋์ ๊ฐ์ฅ ๊ธฐ์ด์ ์ผ๋ก ์์์ผํ๋
post-this.tistory.com
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๊ฐ ์๋ค.
HTTP ์ํ ์ฝ๋ - HTTP | MDN
HTTP ์๋ต ์ํ ์ฝ๋๋ ํน์ HTTP ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์๋์ง ์๋ ค์ค๋๋ค. ์๋ต์ 5๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋์ด์ง๋๋ค: ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์๋ต, ์ฑ๊ณต์ ์ธ ์๋ต, ๋ฆฌ๋ค์ด๋ ํธ, ํด๋ผ์ด์ธํธ ์๋ฌ, ๊ทธ๋ฆฌ๊ณ
developer.mozilla.org
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์ ์๋ฆฌ์ ์ฐจ์ด ๊ทธ๋ฆฌ๊ณ ์ํ์ฝ๋
[Spring] @Controller์ @RestController ์ฐจ์ด
Spring์์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ง์ ํด์ฃผ๊ธฐ ์ํ ์ด๋ ธํ ์ด์ ์ @Controller์ @RestController๊ฐ ์์ต๋๋ค. ์ ํต์ ์ธ Spring MVC์ ์ปจํธ๋กค๋ฌ์ธ @Controller์ Restuful ์น์๋น์ค์ ์ปจํธ๋กค๋ฌ์ธ @RestController์ ์ฃผ์ํ ์ฐจ์ด์
mangkyu.tistory.com
- ๋ค์ํ Controller์ ๋ํด์
[Spring] Controller์ ์ข ๋ฅ์ ๋ค์ํ ์ ๋ต
1. Controller์ ์ข ๋ฅ 1) Servlet - javax.servlet.Servlet์ ์์ํ ํด๋์ค๋ฅผ ์ปจํธ๋กค๋ฌ๋ก ์ฌ์ฉํ๋ค. @Component("/home") // bean ์ด๋ฆ์ ์ด์ฉํ ํธ๋ค๋ฌ ๋งคํ ๋ฐฉ์ ์ด์ฉ public class HomeServlet extends HttpServlet { protected void
kimcoder.tistory.com
์ง๋ ฌํ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . ์ง๋ ฌํ(็ดๅๅ) ๋๋ ์๋ฆฌ์ผ๋ผ์ด์ ์ด์ (serialization)์ ์ปดํจํฐ ๊ณผํ์ ๋ฐ์ดํฐ ์คํ ๋ฆฌ์ง ๋ฌธ๋งฅ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ค๋ธ์ ํธ ์ํ๋ฅผ ๋์ผํ๊ฑฐ๋ ๋ค๋ฅธ ์ปดํจํฐ ํ๊ฒฝ
ko.wikipedia.org
๐ฑ @RequestParam ๊ฐ๋ ์ ๋ฆฌ
@RequestParam ์คํ๋ง์ด ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก, ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ๋งค์ฐ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค @ResponseBody @RequestMapping("/request-param") public String requestParamV2( @RequestParam("username") Strin
yummy0102.tistory.com
- HttpservletResponse์ ๋ํด์
์๋ธ๋ฆฟ(Servlet) - HttpservletResponse ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ, HTTP ์๋ต ๋ฐ์ดํฐ ๋จ์ ํ ์คํธ & HTML & API JSON
์ธํ๋ฐ ๊น์ํ ๋์ ์คํ๋ง ๊ฐ์์ด๋ฉฐ, ์น์ 2 - ์๋ธ๋ฆฟ(Servlet)๋ฅผ ์ ๋ฆฌํ๋ค. ์ค์ตํ ๊ต์ก์ผ๋ก ์์ธํ ์ค๋ช ์ด ๊ถ๊ธํ๋ฉด ์๊ฐ์ ๊ถ์ฅํ๋ค. (์ค์ต์ ๋ชจ๋ ์๋ ๋ฐฉ์์ด๋ฉฐ, ํ์ฌ๋ ์ข ๋ ํธํ๊ฒ ์ฌ์ฉํ
loopstudy.tistory.com
HTTP ์ํ ์ฝ๋ - HTTP | MDN
HTTP ์๋ต ์ํ ์ฝ๋๋ ํน์ HTTP ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์๋์ง ์๋ ค์ค๋๋ค. ์๋ต์ 5๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋์ด์ง๋๋ค: ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์๋ต, ์ฑ๊ณต์ ์ธ ์๋ต, ๋ฆฌ๋ค์ด๋ ํธ, ํด๋ผ์ด์ธํธ ์๋ฌ, ๊ทธ๋ฆฌ๊ณ
developer.mozilla.org
ResponseBody (Spring Framework 6.1.14 API)
Annotation that indicates a method return value should be bound to the web response body. Supported for annotated handler methods. As of version 4.0 this annotation can also be added on the type level in which case it is inherited and does not need to be a
docs.spring.io
- @ResponseStatus์ ๋ํ์ฌ
Spring์์ ํน์ HTTP ์๋ต ์ํ ๋ฐํํ๊ธฐ
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ํน์ HTTP ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ฒ๋ HTTP ์๋ต ์ํ๋ฅผ ๋ฐํํ๋ค. ํด๋ผ์ด์ธํธ๋ ์๋ต ์ฝ๋๋ฅผ ํตํด์ ์๋ฒ๊ฐ ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ์คํจํ๋์ง, ๊ฑฐ๋ถํ๋์ง, ์ฑ๊ณตํ๋์ง ์ ์ ์๋ค. Spring ๊ธฐ
devel-repository.tistory.com
'๐ท Spring > ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring - GET๊ณผ POST ๊ทธ๋ฆฌ๊ณ @GetMapping (5) | 2024.10.22 |
---|---|
Spring - Spring MVC๋ฅผ ์์์ผ ์์์ด ๊ฐ๋ฅํ๋ค. (3) | 2024.10.15 |