스프링 MVC - 웹 페이지 만들기

ttaho·2023년 5월 10일
1

Spring-MVC

목록 보기
6/6

요구사항 분석

  • 상품을 관리할 수 있는 서비스를 만들어보자.

상품 도메인 개발

Item - 상품 객체

  • 상품 도메인에는 상품id, 상품이름, 가격, 수량이 있다.
  • 생성자에서 상품이름, 가격, 수량을 받는다.

ItemRepository - 상품 저장소

  • 상품들은 DB를 사용하지 않고, 임시 저장소인 메모리에 저장시킨다 -> 서버 재시작시 초기화됨.
  • save -> 상품마다 id값을 1씩 증가시키면서 저장한다.
  • findByID -> id값에 해당하는 item을 찾는다.
  • findAll -> store안에 있는 모든 상품을 List형태로 가져온다.
  • update -> id값에 해당하는 item의 정보를 수정한다.
  • clearStore -> 임시 저장소를 비운다.

상품 목록

컨트롤러와 뷰 템플릿을 개발한다.

BasicItemController

  • @RequestMapping("/basic/items") -> 아래의 url은 기본적으로 /basic/items를 깔고간다.
  • @RequiredArgsConstructor -> ItemRepository의 생성자를 자동으로 생성해줌.
  • items -> 상품정보들을 모두 가져와서 model에 저장한 후, resources/static/templates/basic/items.html에 넘겨준다.
  • item -> 상품id로 해당 상품을 찾아온 후, 상품 상세페이지(item.html)로 상품정보를 item 이라는 이름으로 넘겨준다.

    여기서 return에 basic/item만 하고 앞의 경로는 생략 해준 이유는 스프링 자체에서 resources/static/templates까진 기본적으로 위의 @RequestMapping("/basic/items")
    처럼 해주기 때문이다.

  • addForm -> 상품등록 폼을 반환

  • addItemV1 -> item 객체를 생성해서 넘어온 파라미터들을 다 set해준 후 저장한다.
    그리고 model에 item을 저장하고 상품 상세페이지(item.html)에 넘겨준다.

  • addItemV2 - addItemV1에서는 파라미터값들을 하나하나 다 set해야 했지만 Item객체만으로도 가능하다. @ModelAttribute을 사용하여 "item" 이라는 이름으로 모델에 저장해준 후 넘겨 줄 수 있다. V1보다 엄청 간단하게 코딩할 수 있어 자주 쓸 것 같다.

  • editForm -> 상품id로 업데이트를 위한 상품의 정보를 가져와 model에 저장하고, 상품수정폼에 보내준다.

  • edit -> 수정하려는 상품 id와 수정할 내용들로 update 시킨 후, 그 상품의 상세정보 페이지를 반환하는 mapping을 한다. -> 리다이렉트..

  • @PostConstruct 초기화시 테스트용 데이터를 추가시키기 위한 생성자.

    • 리다이렉트
      상품 수정은 마지막에 뷰 템플릿을 호출하는 대신에 상품 상세 화면으로 이동하도록 리다이렉트를 호출한다.
      redirect:/basic/basic/items/{itemId}에서 itemId는 @PathVariable Long itemId의 값을 그대로 사용한다.

PRG (Post/Redirect/Get)

사실 위의 상품 등록 처리 컨트롤러는 심각한 문제가 있다. (addItemV1, addItemV2)


웹 브라우저의 새로고침은 마지막에 서버에 전송한 데이터를 다시 전송한다.
상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 POST/add + 상품 데이터를 서버로 전송한다.
이 상태에서 새로고침을 또 하게되면 내용은 같고 ID만 다른 상품 데이터가 계속 쌓인다.
이를 해결하기 위해 PRG(Post/Redirect/Get)를 사용해보자.

웹 브라우저의 새로고침은 마지막에 서버에 전송한 데이터를 다시 전송하므로, 상품 저장후에 뷰 템플릿으로 이동하는 것이 아니라, 상품 상세 화면으로 리다이렉트를 호출해주면 된다.
위의 그림대로 구성하면 새로고침 시 GET방식의 items/id이 호출되므로 상품 상세 화면 뷰 템플릿으로 이동한다.

RedirectAttributes

상품을 저장하고 상품 상세 화면으로 리다이렉트 한 것 까지는 좋았다.
그런데 고객 입장에서 저장이 잘 된 것인지 안 된 것인지 확신이 들지 않는다. 그래서 저장이 잘 되었으면 상품 상세 화면에 "저장되었습니다"라는 메시지를 보여달라는 요구사항이 왔다.

  • RedirectAttributes를 사용하면 URL 인코딩과 pathVariable, 쿼리 파라미터까지 처리해준다.
  • redirect:/basic/items/{itemId}
    • pathVariable 바인딩: {itemID}
    • 나머지는 쿼리 파라미터로 처리: ?status=true

뷰에 템플릿 메시지를 추가해주자.

  • ${param.status}: 타임리프에서 쿼리 파라미터를 편리하게 조회하는 기능
    • 원래는 컨트롤러에서 모델에 직접 담고 값을 꺼내야 한다. 그런데 쿼리 파라미터는 자주 사용해서 타임리프에서 직접 지원한다. status로 저장되어있는 true를 조건에 넣어주었다. 만족하면 저장완료!를 띄운다.
profile
백엔드 꿈나무

0개의 댓글