@WebServlet(name="helloServlet", urlPatterns="/hello")
public classs HelloServlet extends HttpServlet {
@Override
protected void service(HttpsServletRequest request, HttpServletResponse response){
// ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง
}
}
ServletComponentScan@WebServlet ์๋ธ๋ฆฟ ์ ๋
ธํ
์ด์
protected void service(HttpsServletRequest request, HttpServletResponse response)logging.level.org.apache.coyote.http11=debugrequest.setAttribute(name, value)request.getAttribute(name)request.getSession(create: true)//http://localhost:8080/request-header?username=hello
@WebServlet(name = "requestHeaderServlet", urlPatterns = "/request-header")
public class RequestHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
printStartLine(request);
printHeaders(request);
printHeaderUtils(request);
printEtc(request);
response.getWriter().write("ok");
}
//start line ์ ๋ณด
private void printStartLine(HttpServletRequest request) {
System.out.println("--- REQUEST-LINE - start ---");
System.out.println("request.getMethod() = " + request.getMethod()); //GET
System.out.println("request.getProtocol() = " + request.getProtocol()); //HTTP / 1.1
System.out.println("request.getScheme() = " + request.getScheme()); //http
// http://localhost:8080/request-header
System.out.println("request.getRequestURL() = " + request.getRequestURL());
// /request-header
System.out.println("request.getRequestURI() = " + request.getRequestURI());
//username=hi
System.out.println("request.getQueryString() = " +
request.getQueryString());
System.out.println("request.isSecure() = " + request.isSecure()); //https ์ฌ์ฉ ์ ๋ฌด
System.out.println("--- REQUEST-LINE - end ---");
System.out.println();
}
//Header ํธ๋ฆฌํ ์กฐํ
private void printHeaderUtils(HttpServletRequest request) {
System.out.println("--- Header ํธ์ ์กฐํ start ---");
System.out.println("[Host ํธ์ ์กฐํ]");
System.out.println("request.getServerName() = " + request.getServerName()); //Host ํค๋
System.out.println("request.getServerPort() = " + request.getServerPort()); //Host ํค๋
System.out.println();
System.out.println("[Accept-Language ํธ์ ์กฐํ]");
request.getLocales().asIterator().forEachRemaining(locale -> System.out.println("locale = " + locale));
System.out.println("request.getLocale() = " + request.getLocale());
System.out.println();
System.out.println("[cookie ํธ์ ์กฐํ]");
if (request.getCookies() != null) {
for (Cookie cookie : request.getCookies()) {
System.out.println(cookie.getName() + ": " + cookie.getValue());
}
}
System.out.println();
System.out.println("[Content ํธ์ ์กฐํ]");
System.out.println("request.getContentType() = " +
request.getContentType());
System.out.println("request.getContentLength() = " +
request.getContentLength());
System.out.println("request.getCharacterEncoding() = " +
request.getCharacterEncoding());
System.out.println("--- Header ํธ์ ์กฐํ end ---");
System.out.println();
}
//Header ๋ชจ๋ ์ ๋ณด
private void printHeaders(HttpServletRequest request) {
System.out.println("--- Headers - start ---");
/*
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
System.out.println(headerName + ": " + request.getHeader(headerName));
}
*/
request.getHeaderNames().asIterator()
.forEachRemaining(headerName -> System.out.println(headerName + ": " + request.getHeader(headerName)));
System.out.println("--- Headers - end ---");
System.out.println();
}
//๊ธฐํ ์ ๋ณด
private void printEtc(HttpServletRequest request) {
System.out.println("--- ๊ธฐํ ์กฐํ start ---");
System.out.println("[Remote ์ ๋ณด]");
System.out.println("request.getRemoteHost() = " +
request.getRemoteHost()); //
System.out.println("request.getRemoteAddr() = " +
request.getRemoteAddr()); //
System.out.println("request.getRemotePort() = " +
request.getRemotePort()); //
System.out.println();
System.out.println("[Local ์ ๋ณด]");
System.out.println("request.getLocalName() = " +
request.getLocalName()); //
System.out.println("request.getLocalAddr() = " +
request.getLocalAddr()); //
System.out.println("request.getLocalPort() = " +
request.getLocalPort()); //
System.out.println("--- ๊ธฐํ ์กฐํ end ---");
System.out.println();
}
}getParameter ์ฝ๋@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[์ ์ฒด ํ๋ผ๋ฏธํฐ ์กฐํ] - start");
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName)));
System.out.println();
System.out.println("[๋จ์ผ ํ๋ผ๋ฏธํฐ ์กฐํ]");
String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println("age = " + age);
System.out.println("username = " + username);
System.out.println();
System.out.println("[์ด๋ฆ์ด ๊ฐ์ ๋ณต์ ํ๋ผ๋ฏธํฐ ์กฐํ]");
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("username = " + name);
}
response.getWriter().write("ok");
}
}request.getParameter() ๋ GET ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์๋ ์ง์ํ๊ณ POST HTML Form ํ์๋ ์ง์ํ๋ค.@WebServlet(name= "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream inputStream = req.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("helloData.getUsername() = " + helloData.getUsername());
System.out.println("helloData.getAge() = " + helloData.getAge());
}
}req.getInputStream()์ ์ฌ์ฉํด์ ์ธ์ฝ๋ฉ๋ ๋ฐ๋ ๋ฉ์์ง๋ฅผ ๋ฐ์์ StreamUtils ๋ฅผ ํตํด ๋์ฝ๋ฉํ ๋ฐ๋ ๋ฉ์์ง๋ฅผ ์ ์ฅํ ์ ์๋ค.ObjectMapper)์ด๋ผ๋ JSON ๋ณํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//[Status-line]
resp.setStatus(HttpServletResponse.SC_OK);
//[response-headers]
resp.setHeader("Content-Type", "text/plain");
resp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
resp.setHeader("Pragma", "no-cache");
resp.setHeader("my-header", "hello");
//[Header ํธ์ ๋ฉ์๋]
content(resp);
cookie(resp);
redirect(resp);
resp.getWriter().write("ok");
}
private void content(HttpServletResponse response) {
//Content-Type: text/plain;charset=utf-8
//Content-Length: 2
//response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
//response.setContentLength(2); //(์๋ต์ ์๋ ์์ฑ)
}
private void cookie(HttpServletResponse response) {
//Set-Cookie: myCookie=good; Max-Age=600;
//response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600์ด
response.addCookie(cookie);
}
private void redirect(HttpServletResponse response) throws IOException {
//Status Code 302
//Location: /basic/hello-form.html
//response.setStatus(HttpServletResponse.SC_FOUND); //302
//response.setHeader("Location", "/basic/hello-form.html");
response.sendRedirect("/basic/hello-form.html");
}
}@WebServlet(name = "responseBodyHtmlServlet", urlPatterns = "/response-html")
public class ResponseBodyHtmlServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//Content-Type: text/html;charset=utf-8
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println(" <div>์๋
?</div>");
writer.println("</body>");
writer.println("</html>");
}@WebServlet(name = "responseJsonServlet", urlPatterns = "/response-json")
public class ResponseJsonServlet extends HttpServlet {
ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//Content-Type: application/json
resp.setContentType("application/json");
resp.setCharacterEncoding("utf-8");
HelloData helloData = new HelloData();
helloData.setUsername("kim");
helloData.setAge(20);
//{"username":"kim", "age":"20}
String s = objectMapper.writeValueAsString(helloData);
resp.getWriter().write(s);
}
}@WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = req.getRequestDispatcher(viewPath);
dispatcher.forward(req, resp);
}
}@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/ save")
public class MvcMemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
System.out.println("member = " + member);
memberRepository.save(member);
//Model ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ค.
request.setAttribute("member", member);
String viewPath = "/WEB-INF/views/save-result.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
DispacherServlet ์ HttpServlet ์ ์์๋ฐ์์ ์ฌ์ฉํ๊ณ ์๋ธ๋ฆฟ์ผ๋ก ๋์DispacherServlet ์ ์๋์ผ๋ก ๋ฑ๋กํ๋ฉด์ ๋ชจ๋ ๊ฒฝ๋ก(urlPatterns=โ/โ)์ ๋ํด์ ๋งคํ ํ๋ค.@RequestMapping ์์ ์ฌ์ฉ@RequestMapping ์ด๋ํฐ@Component("/springmvc/old-controller")
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println("OldController.handleRequest");
return null;
}
}
BeanNameUrlHandlerMapping ์ ํตํด ๋งคํOldController ๋ฐํSimpleControllerHandlerAdapter ๋ฅผ ์คํํ๋ฉด์ ํธ๋ค๋ฌ ์ ๋ณด๋ ํจ๊ป ๋๊ฒจ์ค๋ค.SimpleControllerHandlerAdapter ๋ ํธ๋ค๋ฌ์ธ OldController ๋ฅผ ๋ด๋ถ์์ ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ก ModelAndView๋ฅผ ๋ฐํํ๋ค.InternalResourceViewResolver ๋ผ๋ ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ์๋์ผ๋ก ๋ฑ๋กํ๋ค[application.properties](http://application.properties) ์ ๋ฑ๋กํ spring.mvc.view.prefix, spring.mvc.view.suffix ์ค์ ์ ๋ณด๋ฅผ ์ฌ์ฉํด์ ๋ฑ๋กํ๋ค@Controller@RequestMapping@GetMapping, @PostMappingprivate Logger log = LoggerFactory.getLogger(getClass());@Slf4j Annotation ์ฌ์ฉ[application.properties](http://application.properties) - logging.level.hello,springmvc=debuglog.debug("data=" + data) X , log.debug("data={}, data) O @RequestMapping("/hello-basic")
public String helloBasic(){
log.info("helloBasic");
return "ok";
}
/**
* method ํน์ HTTP ๋ฉ์๋ ์์ฒญ๋ง ํ์ฉ
* GET, HEAD, POST, PUT, PATCH, DELETE
*/
@RequestMapping(value = "/mapping-get-v1", method = RequestMethod.GET)
public String mappingGetV1() {
log.info("mappingGetV1");
return "ok";
}
/**
* ํธ๋ฆฌํ ์ถ์ฝ ์ ๋
ธํ
์ด์
(์ฝ๋๋ณด๊ธฐ)
* @GetMapping
* @PostMapping
* @PutMapping
* @DeleteMapping
* @PatchMapping
*/
@GetMapping(value = "/mapping-get-v2")
public String mappingGetV2() {
log.info("mapping-get-v2");
return "ok";
}
/**
* PathVariable ์ฌ์ฉ
* ๋ณ์๋ช
์ด ๊ฐ์ผ๋ฉด ์๋ต ๊ฐ๋ฅ
* @PathVariable("userId") String userId -> @PathVariable userId
*/
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
log.info("mappingPath userId={}", data);
return "ok";
}
/**
* PathVariable ์ฌ์ฉ ๋ค์ค
*/
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long
orderId) {
log.info("mappingPath userId={}, orderId={}", userId, orderId);
return "ok";
}
/**
* ํ๋ผ๋ฏธํฐ๋ก ์ถ๊ฐ ๋งคํ
* params="mode",
* params="!mode"
* params="mode=debug"
* params="mode!=debug" (! = )
* params = {"mode=debug","data=good"}
*/
@GetMapping(value = "/mapping-param", params = "mode=debug")
public String mappingParam() {
log.info("mappingParam");
return "ok";
}
/**
* ํน์ ํค๋๋ก ์ถ๊ฐ ๋งคํ
* headers="mode",
* headers="!mode"
* headers="mode=debug"
* headers="mode!=debug" (! = )
*/
@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
log.info("mappingHeader");
return "ok";
}
/**
* Content-Type ํค๋ ๊ธฐ๋ฐ ์ถ๊ฐ ๋งคํ Media Type
* consumes="application/json"
* consumes="!application/json"
* consumes="application/*"
* consumes="*\/*"
* MediaType.APPLICATION_JSON_VALUE
*/
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {
log.info("mappingConsumes");
return "ok";
}
/**
* Accept ํค๋ ๊ธฐ๋ฐ Media Type
* produces = "text/html"
* produces = "!text/html"
* produces = "text/*"
* produces = "*\/*"
*/
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
log.info("mappingProduces");
return "ok";
}
@Slf4j
@RestController
public class RequestHeaderController {
@RequestMapping("/headers")
public String headers(HttpServletRequest request,
HttpServletResponse response,
HttpMethod httpMethod,
Locale locale,
@RequestHeader MultiValueMap<String, String> headerMap,
@RequestHeader("host") String host,
@CookieValue(value = "myCookie", required = false) String cookie){
log.info("request={}", request);
log.info("response={}", response);
log.info("httpMethod={}", httpMethod);
log.info("locale={}", locale);
log.info("headerMap={}", headerMap);
log.info("header host={}", host);
log.info("myCookie={}", cookie);
return "ok";
}
}
โป 1๋ฒ๊ณผ 2๋ฒ์ Parameter ์กฐํ, 3๋ฒ์ Body ์กฐํ
request.getParameter()@RequestParam@RequestParam ๋ ์๋ต ๊ฐ๋ฅ@RequestParam(required=true)@RequestParam Map<String, Object> paramMap@RequestParam String username;
@RequestParam int age;
HelloData data = new HelloData();
data.setUsername(username);
data.setAge(age);@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(),
helloData.getAge());
return "ok";
}@Slf4j
@Controller
public class RequestBodyStringController {
@PostMapping("/request-body-string-v1")
public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException{
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
response.getWriter().write("ok");
}
@PostMapping("/request-body-string-v2")
public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException{
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
responseWriter.write("ok");
}
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException{
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
return new HttpEntity<>("ok");
}
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) throws IOException{
log.info("messageBody={}", messageBody);
return "ok";
}
}์คํ๋งMVC ๋ด๋ถ์์ HTTP ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฝ์ด์ ๋ฌธ์๋ ๊ฐ์ฒด๋ก ๋ณํํด์ ์ ๋ฌํด์ฃผ๋๋ฐ, ์ด๋ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
@RequestBody String messageBody@Slf4j
@Controller
public class RequestBodyJsonController {
private ObjectMapper objectMapper = new ObjectMapper();
@PostMapping("/request-body-json-v1")
public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException{
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age ={}", data.getUsername(), data.getAge());
response.getWriter().write("ok");
}
@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException{
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age ={}", data.getUsername(), data.getAge());
return "ok";
}
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData data){
log.info("username={}, age ={}", data.getUsername(), data.getAge());
return "ok";
}
@ResponseBody
@PostMapping("/request-body-json-v4")
public String requestBodyJsonV4(HttpEntity<HelloData> httpEntity){
HelloData data = httpEntity.getBody();
log.info("username={}, age ={}", data.getUsername(), data.getAge());
return "ok";
}
@ResponseBody
@PostMapping("/request-body-json-v5")
public HelloData requestBodyJsonV5(@RequestBody HelloData data){
log.info("username={}, age ={}", data.getUsername(), data.getAge());
return data;
}
}ObjectMapper : Json ๋ฐ์ดํฐ๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ ๋ ์ฌ์ฉ@RequestBody HelloData data ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ์ ์ธ ์ ์๋์ผ๋ก data์ ๋ฉ์์ง ๋ฐ๋๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.@Controller
public class ResponseViewController {
@RequestMapping("/response-view-v1")
public ModelAndView responseView1(){
ModelAndView mv = new ModelAndView("response/hello")
.addObject("data", "hello!");
return mv;
}
@RequestMapping("/response-view-v2")
public String responseView2(Model model){
model.addAttribute("data", "hello!");
return "response/hello";
}
@RequestMapping("/response/hello")
public void responseView3(Model model){
model.addAttribute("data", "hello!");
}
}spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html@Slf4j
@Controller
public class ResponseBodyController {
@GetMapping("/response-body-string-v1")
public void responseBodyV1(HttpServletResponse response) throws IOException {
response.getWriter().write("ok");
}
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2(){
return new ResponseEntity<>("ok", HttpStatus.OK);
}
@ResponseBody
@GetMapping("/response-body-string-v3")
public String responseBodyV3(){
return "ok";
}
@GetMapping("/response-body-json-v1")
public ResponseEntity<HelloData> responseBodyJsonV1(){
HelloData helloData = new HelloData();
helloData.setUsername("oh");
helloData.setAge(20);
return new ResponseEntity<>(helloData, HttpStatus.CREATED);
}
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json-v2")
public HelloData responseBodyJsonV2(){
HelloData helloData = new HelloData();
helloData.setUsername("oh");
helloData.setAge(20);
return helloData;
}
}data[]data[], ๋ฏธ๋์ด ํ์
: */*String, ๋ฏธ๋์ด ํ์
: */*HashMapapplication/json ๊ด๋ จcontent-type: application/json EX
@RequestMapping
void hello(@RequestBody String data) {} -> StringHttpMessageConverter
HttpServletRequest, Model, @RequestParam, @ModelAttribute, HttpEntity์์ฒญ์ ๊ฒฝ์ฐ
@RequestBody์@HttpEntity๋ฅผ ์ฒ๋ฆฌํ๋ArgumentResolver๊ฐ ์๋๋ฐ ์ด๋ ๋ฐ๋์ ๋ฉ์์ง๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํด์ผํ๊ธฐ ๋๋ฌธ์ ์ดArgumentResolver๋ค์ด HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํด์ ํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.
์๋ต์ ๊ฒฝ์ฐ
@ReponseBody์@HttpEntity๋ฅผ ์ฒ๋ฆฌํ๋ReturnValueHandler๊ฐ ์๋๋ฐ ์ฌ๊ธฐ์ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ํธ์ถํด์ ์๋ต ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ ๋ค.
WebMvcConfigurer ๋ฅผ ์์ ๋ฐ์์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ฉด ๋๋ค.@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver>
resolvers) {
//...
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>>
converters) {
//...
}
};
}@ModelAttribute("name") ๋ค์๊ณผ ๊ฐ์ด ์ ์ธ ์model.addAttribute(โnameโ, ๊ฐ์ฒด) ์๋ ์คํ
๊ทธ๋ฆผ๊ณผ ๊ฐ์ด Redirect๋ฅผ ์ฌ์ฉํ์ง ์๊ณ View๋ฅผ ๋ฐํ๊ฐ์ผ๋ก ๋์์ค ์ํ์์ ์๋ก๊ณ ์นจ์ ํ๋ฉด PostRequest๊ฐ ๊ณ์ํด์ ์คํ๋๋ค.
โ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Redirect๋ฅผ ํตํด Get Method๋ฅผ ํธ์ถํด์ค๋ค.
@PostMapping("/add")
public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes){
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
// model.addAttribute("item", item);
return "redirect:/basic/items/{itemId}";
}