Spring/SpringMVC 45

RedirectAttributes

이제 저장이 잘 되었으면 상품 상세 화면에 "저장되었습니다."라는 메시지를 보여주게 해보자. addItemV5에 있던 PostMapping는 주석처리 해주고 V6를 만들어 주자. // @PostMapping("/add") public String addItemV5(Item item) { itemRepository.save(item); return "redirect:/basic/items/" + item.getId(); } @PostMapping("/add") public String addItemV6(Item item, RedirectAttributes redirectAttributes) { Item savedItem = itemRepository.save(item); redirectAttributes...

Spring/SpringMVC 2022.05.05

PRG Post/Redirect/Get

상품 등록 처리 컨트롤러는 심각한 문제가 있는데, (addItemV1 ~ addItemV4) 상품 등록을 완료하고 웹 브라우저의 새로고침 버튼을 클릭하면 어떻게 될까? v4에서는 상품 저장하고 뷰를 보여 주었다. 상품 등록을 해서 새로고침을 하면 계속해서 상품 ID가 올라간다. 이상하다. @PostMapping("/add") public String addItemV4(Item item) { itemRepository.save(item); return "basic/item"; } 화면의 흐름은 아래와 같다. POST 등록 후 새로 고침 웹 브라우저의 새로 고침은 마지막에 서버에 전송한 데이터를 다시 전송하는 형식이다. 상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 POST / add + 상품 데이터를..

Spring/SpringMVC 2022.05.05

상품 수정

수정에 필요한 정보를 조회하고, 수정용 폼 뷰를 호출해보자. basic 폴더에 넣어주고 수정을 해주자. th:value 값을 넣어주자. // BasicItemController Class @GetMapping("/{itemId}/edit") public String editForm(@PathVariable Long itemId, Model model) { Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/editForm"; } 상품 수정이 잘 된다. edit도 GetMapping / PostMapping 둘 다 만들어 준다. @GetMapping("/{itemId}/edit") public..

Spring/SpringMVC 2022.05.04

상품 등록 처리 - @ModelAttribute

상품 등록 폼을 만들어 보자. 서버에 데이터를 전달해야 하는데 POST - HTML Form content-type: application/x-www-form-urlencoded 메시지 바디에 쿼리 파리미터 형식으로 전달 itemName=itemA&price=10000&quantity=10 예) 회원 가입, 상품 주문, HTML Form 사용 요청 파라미터 형식을 처리해야 해서 @RequestParam을 사용하자. BasicItemController의 save 부분을 만들어 보자. // BasicItemController Class @PostMapping("/add") public String save // BasicItemController Class @PostMapping("/add") // 파라미터..

Spring/SpringMVC 2022.05.04

상품 상세, 상품 등록 폼 뷰 & 컨트롤러

컨트롤러도 만들어주자. @GetMapping("/{itemId}") public String item(@PathVariable long itemId, Model model) { Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/item"; } 뷰는 아래와 같이 th:value를 넣어주고 작성 해준다. 상품 상세 상품 ID 상품명 가격 수량 상품 수정 목록으로 리터럴 표현식 써주고 템플릿 부분에서 (itemId=${item.id}) 이 부분이 {itemId}로 치환이 된다. 상품 수정 item.html의 전체 코드는 아래와 같다. 상품 상세 상품 ID 상품명 가격 수량 상품 수정 목록으로 속..

Spring/SpringMVC 2022.05.03

스프링MVC 프로젝트 - 도메인 개발 & 상품 서비스 HTML

계속해서 만들던 대로 프로젝트를 여기서 생성하자. 실행해보면 잘 나온다. // ItemServiceApplication package hello.itemservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ItemServiceApplication { public static void main(String[] args) { SpringApplication.run(ItemServiceApplication.class, args); } } 이제 welcome page를 추가..

Spring/SpringMVC 2022.05.03

요청 매핑 헨들러 어뎁터 구조

HTTP 메시지 컨버터는 스프링 MVC 어느 부분에서 사용이 되는지 궁금할 수 잇다. @RequestMapping을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter(요청 매핑 핸들러 어뎁터에 있다.) ArgumentResolver HttpServletRequest, Model @RequestParam, @ModelAttribute 같은 애노테이션 @RequestBody, HttpEntity 같은 HTTP 메시지를 처리하는 부분까지 큰 유연함을 보여주었다. ArgumentResolver 덕택에 파라미터를 유연하게 처리할 수 있었다. RequestMappingHandlerAdaptor는 ArgumentResolver를 호출해서 컨트롤러(핸들러)기 필요로 하는 여러 파라미터의 값을..

Spring/SpringMVC 2022.05.01

HTTP 응답 - HTTP API, 메시지 바디에 직접 입력 & HTTP 메시지 컨버터

HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 한다. HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다. HTML이나 뷰 템플릿 사용해도 HTTP 응답 메시지 바디에 HTML 데이터가 담겨서 전달됨. 정적 리소스나 뷰 템플릿 거치지 않고, 직접 HTTP 응답 메시지를 전달하는 경우를 말함 // ResponseBodyController Class package hello.springmvc.basic.response; import hello.springmvc.basic.HelloData; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframe..

Spring/SpringMVC 2022.05.01

HTTP 요청 메시지 - JSON & HTTP 응답 - 정적 리소스, 뷰 템플릿

HTTP API에서 주로 사용하는 JSON 데이터 형식을 알아보자. JSON 형식을 다루므로 ObjectMapper을 쓰자. 실행을 시켜주면 // RequestBodyJsonController Class package hello.springmvc.basic.request; import com.fasterxml.jackson.databind.ObjectMapper; import hello.springmvc.basic.HelloData; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.util.StreamUtils; import org.springframewo..

Spring/SpringMVC 2022.05.01