분류 전체보기 1341

Ch07. 스프링 MVC(웹 페이지 만들기) - PRG Post/Redirect/Get

지금까지의 등록은 새로고침 시 상품이 중복 저장되는 문제가 있다. 웹 브라우저의 새로 고침은 마지막에 서버에 전송한 데이터를 다시 전송한다. 상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 POST /add + 상품 데이터를 서버로 전송한다. 이 상태에서 새로 고침을 또 선택하면 마지막에 전송한 POST /add + 상품 데이터를 서버로 다시 전송하게 된다. POST, Redirect GET 새로 고침 문제를 해결하려면 상품 저장 후에 뷰 템플릿으로 이동하는 것이 아니라, 상품 상세 화면으로 리다이렉트를 호출해주면 된다. 웹 브라우저는 리다이렉트의 영향으로 상품 저장 후에 실제 상품 상세 화면으로 다시 이동한다. 따라서 마지막에 호출한 내용이 상품 상세 화면인 GET /items/{id}가 되는 것이..

Ch07. 스프링 MVC(웹 페이지 만들기) - 상품 수정

상품 수정 Controller @GetMapping("/{itemId}/edit") public String editForm( @PathVariable Long itemId, Model model ) { Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/editForm"; } 상품 수정 뷰 상품 수정 폼 상품 ID 상품명 가격 수량 저장 취소 상품 수정 Action Controller @PostMapping("/{itemId}/edit") public String edit( @PathVariable Long itemId, @ModelAttribute Item item ) { itemRepo..

Ch07. 스프링 MVC(웹 페이지 만들기) - 상품 등록 처리 (@ModelAttribute)

서버로 데이터를 전송하는 방식 content-type: application/x-www-form-urlencoded 메시지 바디에 쿼리 파리미터 형식으로 전달 itemName=itemA&price=10000&quantity=10 예) 회원 가입, 상품 주문, HTML Form 사용 상품 등록 처리 Controller V1 : @RequestParam + Model 사용 @PostMapping("/add") public String addItemV1( @RequestParam String itemName, @RequestParam int price, @RequestParam Integer quantity, Model model ) { Item item = new Item(itemName, price, qu..

Ch07. 스프링 MVC(웹 페이지 만들기) - 상품 등록 폼

상품 등록 Controller 상품 등록 뷰 상품 등록 폼 상품 입력 상품명 가격 수량 상품 등록 취소 속성 변경 - th:action HTML form에서 action에 값이 없으면 현재 URL에 데이터를 전송한다. 상품 등록 폼의 URL과 실제 상품 등록을 처리하는 URL을 똑같이 맞추고 HTTP 메서드로 두 기능을 구분한다. 상품 등록 폼: GET /basic/items/add 상품 등록 처리: POST /basic/items/add 이렇게 하면 하나의 URL로 등록 폼과, 등록 처리를 깔끔하게 처리할 수 있다.

Ch07. 스프링 MVC(웹 페이지 만들기) - 상품 상세

상품 상세 Controller 상품 상세 뷰 상품 상세 상품 ID 상품명 가격 수량 상품 수정 목록으로 속성 변경 - th:value th:value="${item.id}" 모델에 있는 item 정보를 획득하고 프로퍼티 접근법으로 출력한다. ( item.getId() ) value 속성을 th:value 속성으로 변경한다. 상품 수정 링크 th:onclick="|location.href='@{/basic/items/{itemId}/edit(itemId=${item.id})}'|" 목록으로 링크 th:onclick="|location.href='@{/basic/items}'|"

Ch07. 스프링 MVC(웹 페이지 만들기) - 상품 목록(타임리프)

상품 목록 Controller @Controller @RequestMapping("/basic/items") @RequiredArgsConstructor public class BasicItemController { private final ItemRepository itemRepository; //@Autowired //생성자가 하나라서 생략 가능 /* public BasicItemController(ItemRepository itemRepository){ this.itemRepository = itemRepository; } */ @GetMapping public String items(Model model){ List items = itemRepository.findAll(); model.addAt..

Ch07. 스프링 MVC(웹 페이지 만들기) - 상품 도메인 개발 & 상품 서비스 HTML

Item - Domain ItemRepository - 상품 저장소 @Repository //Component 스캔 대상 public class ItemRepository { private static final Map store = new HashMap(); //static private static long sequence = 0L; public Item save(Item item){ item.setId(++sequence); store.put(item.getId(), item); return item; } public Item findById(Long id){ return store.get(id); } public List findAll(){ return new ArrayList(store.valu..

Ch07. 스프링 MVC(웹 페이지 만들기) - 요구사항 분석하기

프로젝트 생성 요구사항 분석 상품 도메인 모델 상품 ID 상품명 가격 수량 상품 관리 기능 상품 목록 상품 상세 상품 등록 상품 수정 참고 React, Vue.js 같은 웹 클라이언트 기술을 사용하고, 웹 프런트엔드 개발자가 별도로 있으면, 웹 프론트엔드 개발자가 웹 퍼블리셔 역할까지 포함해서 하는 경우도 있다. > 웹 클라이언트 기술을 사용하면, 웹 프론트엔드 개발자가 HTML을 동적으로 만드는 역할과 웹 화면의 흐름을 담당한다. 이 경우 백엔드 개발자는 HTML 뷰 템플릿을 직접 만지는 대신에, HTTP API를 통해 웹 클라이언트가 필요로 하는 데이터와 기능을 제공하면 된다.

Ch06. 스프링 MVC(기본 기능) - 요청 매핑 헨들러 어뎁터 구조

대체 어디서 메시지 컨버터를 처리하는 것인가 모든 비밀은 애노테이션 기반의 컨트롤러, 그러니까 @RequestMapping을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter (요청 매핑 헨들러 어뎁터)에 있다. ArgumentResolver 애노테이션 기반의 컨트롤러는 매우 다양한 파라미터를 사용할 수 있다. HttpServletRequest , Model 은 물론이고, @RequestParam , @ModelAttribute 같은 애노테이션 그리고 @RequestBody , HttpEntity 같은 HTTP 메시지를 처리하는 부분까지 매우 큰 유연함을 보여주었다 이렇게 파라미터를 유연하게 처리할 수 있는 이유가 바로 ArgumentResolver 덕분이다. 애노테이션 기반 ..

Ch06. 스프링 MVC(기본 기능) - HTTP 메시지 컨버터

스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다. HTTP 요청: @RequestBody , HttpEntity(RequestEntity) , HTTP 응답: @ResponseBody , HttpEntity(ResponseEntity) , HTTP 메시지 컨버터는 HTTP 요청, HTTP 응답 둘 다 사용된다. canRead() , canWrite() : 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 체크 read() , write() : 메시지 컨버터를 통해서 메시지를 읽고 쓰는 기능 스프링 부트 기본 메시지 컨버터 0 = ByteArrayHttpMessageConverter 1 = StringHttpMessageConverter 2 = MappingJackson2HttpMes..