
상황 설정 상품을 저장하고 상품 상세 화면으로 리다이렉트 한 것 까지는 좋았다. 그런데 고객 입장에서 저장이 잘 된 것인지 안 된 것인지 확신이 들지 않는다. 그래서 저장이 잘 되었으면 상품 상세 화면에 "저장되었습니다"라는 메시지를 보여달라는 요구사항이 추가되었다면, 이를 해결해본다. BasicItemController에 추가 /** * 상품을 추가하는 메서드. * * @param item 추가할 상품 정보를 나타내는 객체 * @param redirectAttributes Spring MVC 리다이렉트 시 데이터를 전달하기 위한 객체 * @return 상품 추가 후 해당 상품 상세 정보 페이지로 리다이렉트 */ @PostMapping("/add") public String addItemV6(Item i..

PRG 사실 지금까지 진행한 상품 등록 처리 컨트롤러는 심각한 문제가 있다. (addItemV1 ~ addItemV4) 상품 등록을 완료하고 웹 브라우저의 새로고침 버튼을 클릭해보면 상품이 계속해서 중복 등록되는 것을 확인할 수 있다. 전체 흐름 다음 그림을 통해서 그 이유 확인 가능하다. POST 등록 후 새로 고침 웹 브라우저의 새로 고침은 마지막에 서버에 전송한 데이터를 다시 전송한다. 상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 POST /add + 상품 데이터를 서버로 전송한다. 이 상태에서 새로 고침을 또 선택하면 마지막에 전송한 POST /add + 상품 데이터를 서버로 다시 전송하게 된다. => 그래서 내용은 같고, ID만 다른 상품 데이터가 계속 쌓이게 된다. 이 문제의 해결법은 ..

상품 수정 상품 수정 폼 컨트롤러 BasicController 에 추가 /** * 상품 수정 폼을 불러오는 메서드. * * @param itemId 수정할 상품의 ID * @param model Spring MVC 모델 객체. 뷰로 데이터를 전달하기 위해 사용됨. * @return 상품 수정 폼 템플릿 이름 */ @GetMapping("/{itemId}/edit") public String editForm(@PathVariable Long itemId, Model model) { // 상품 ID를 사용하여 데이터베이스에서 해당 상품 정보를 조회. Item item = itemRepository.findById(itemId); // 조회한 상품 정보를 모델에 추가하여 뷰로 전달. model.addAttri..

상품 등록 처리 - @ModelAttribute 상품 등록 폼에서 전달된 데이터로 실제 상품을 등록 처리하기 - 상품 등록 폼은 다음 방식으로 서버에 데이터를 전달한다. POST - HTML Form addItemV1 - BasicItemController에 추가 @PostMapping("/add") public String addItemV1(@RequestParam String itemName, @RequestParam int price, @RequestParam Integer quantity, Model model) { Item item = new Item(); item.setItemName(itemName); item.setPrice(price); item.setQuantity(quantity); ..

상품 등록 폼 상품 등록 폼 BasicItemController에 추가 @GetMapping("/add") public String addForm() { return "basic/addForm"; } 상품 등록 폼 뷰 정적 HTML을 뷰 템플릿(templates) 영역으로 복사하고 다음과 같이 수정. /resources/static/addForm.html => /resources/templates/basic/addForm.html 상품 등록 폼 상품 입력 상품명 가격 수량 상품 등록 취소 이 부분 보면 th:action = "/basic/items/addForm" method = "post 이렇게 쓴다 보통 속성 변경 - th:action 취소

상품 상세 컨트롤러와 뷰 BasicItemController - 상세 조회 메서드 추가(GET) @GetMapping("/{itemId}") public String item(@PathVariable long itemId, Model model) { // 경로 변수로부터 받은 itemId를 사용하여 상품을 조회합니다. Item item = itemRepository.findById(itemId); // 조회한 상품을 모델에 추가합니다. 이후 뷰 템플릿에서 사용할 수 있습니다. model.addAttribute("item", item); // "basic/item" 뷰 템플릿을 호출하여 상품 상세 정보를 화면에 표시합니다. return "basic/item"; } 그래서 현재까지 최종 코드는 @Contro..

본격적으로 컨트롤러와 뷰 템플릿 개발 시작 BasicItemController @Controller @RequestMapping("/basic/items") @RequiredArgsConstructor public class BasicItemController { private final ItemRepository itemRepository; @GetMapping public String items(Model model) { // 상품 목록을 조회 List items = itemRepository.findAll(); // 조회한 상품 목록을 모델에 추가 model.addAttribute("items", items); // "basic/items" 뷰 템플릿을 호출하여 상품 목록을 화면에 표시 return..

부트스트랩 HTML, css 파일 참고로 /resources/static 에 넣어두었기 때문에 스프링 부트가 정적 리소스를 제공한다. http://localhost:8080/html/items.html 그런데 정적 리소스여서 해당 파일을 탐색기를 통해 직접 열어도 동작하는 것을 확인할 수 있다. 상품 목록 HTML resources/static/html/items.html 상품 상세 상품 ID 상품명 가격 수량 상품 수정 목록으로 상품 상세 HTML resources/static/html/item.html 상품 상세 상품 ID 상품명 가격 수량 상품 수정 목록으로 상품 등록 폼 resources/static/html/addForm.html 상품 등록 폼 상품 입력 상품명 가격 수량 상품 등록 취소 상품 ..