본문 바로가기
Back-End/Spring Data

7.웹 계층 개발 1(회원,상품)

by 두두리안 2021. 1. 1.
728x90

7.웹 계층 개발 1(회원,상품)

  • 목차
    • 1.홈 화면과 레이아웃
    • 2.회원 등록
    • 3.회원 목록 조회
    • 4.상품 등록
    • 5.상품 목록
    • 6.상품 수정

1.홈 화면과 레이아웃

HomeController

@Controller
@Slf4j
public class HomeController {

    @RequestMapping("/")
    public String home(){
        log.info("home controller");
        return "home";
    }

}
  • @RequestMapping("/") : localhost:8080 -> home.html 이동한다

MemberForm

@Getter @Setter
public class MemberForm {

    @NotEmpty(message = "회원 이름은 필수 입니다")
    private String name;

    private String city;

    private String street;

    private String zipcode;

}
  • 회원의 정보를 MemberForm 을 이용해서 만들어준다

MemberController(회원등록)

@Controller
@RequiredArgsConstructor
public class MemberController {

    private final MemberService memberService;

    @GetMapping("/members/new")
    public String createForm(Model model){
        model.addAttribute("memberForm",new MemberForm());
        return "members/createMemberForm";
    }

    @PostMapping("/members/new")
    public String create(@Valid MemberForm memberForm , BindingResult result){

        if (result.hasErrors()){
            return "members/createMemberForm";
        }

        Address address = new Address(memberForm.getCity(), memberForm.getStreet(), memberForm.getZipcode());

        Member member =new Member();
        member.setName(memberForm.getName());
        member.setAddress(address);

        memberService.join(member);
        return "redirect:/";
    }

}
  • MemberForm 의 객체를 가져와서 createMemberForm.html 으로 이동
  • form 에서 post 를 이용해서 값을 불러옴
  • @PostMapping("/members/new") 을 이용해서 가져온 데이터를 저장해주고 첫번째 페이지로 보냄
  • 에러가 있을 경우 BindingResult result 값 으로 가져온다
  • ! Member 엔티티 대신 MemberForm 을 넣은 이유는 화면에 맞는 데이터값을 가져오기 위해서 넣었다!
  • 서버사이드 에서 html 을 랜더링

MemberController (회원목록조회)

@Controller
@RequiredArgsConstructor
public class MemberController {

    private final MemberService memberService;

    @GetMapping("/members")
    public String list(Model model){
        List<Member> members =memberService.findMembers();
        model.addAttribute("members",members);
        return "members/memberList";
    }

}

ItemController (상품등록)

@Controller
@RequiredArgsConstructor
public class ItemController {

    private final ItemService itemService;

    @GetMapping("/items/new")
    public String createForm(Model model){
        model.addAttribute("form",new BookForm());
        return "items/createItemForm";
    }

    @PostMapping("/items/new")
    public String create(BookForm form){
        Book book=new Book();
        book.setName(form.getName());
        book.setPrice(form.getPrice());
        book.setStockQuantity(form.getStockQuantity());
        book.setAuthor(form.getAuthor());
        book.setIsbn(form.getIsbn());

        itemService.saveItem(book);
        return "redirect:/";

    }


}

ItemController (상품목록)

@Controller
@RequiredArgsConstructor
public class ItemController {

    private final ItemService itemService;

    @GetMapping(value = "/items")
    public String list(Model model) {
        List<Item> items = itemService.findItems();
        model.addAttribute("items", items);
        return "items/itemList";
    }


}
  • 목록을 조회할때는 GetMapping
  • model.addAttribute("members",members) view 에 key 값인 members 를 보낸다
  • 요구사항이 간단해서 member 엔티티를 가져왔지만 memberList 를 하나 만들어서 가져오는것이 좋다
  • 엔티티는 최대한 순수하게 설계하기
  • PostMapping 값셋팅 왠만하면 setter 를 쓰지말고 생성자,정적 팩토리 매서드 , builder 패턴을 사용하자

ItemController (상품수정)

@Controller
@RequiredArgsConstructor
public class ItemController {

    private final ItemService itemService;

    @GetMapping("/items/{itemId}/edit")
        public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) {
            Book item = (Book) itemService.findOne(itemId);
            BookForm form = new BookForm();
            form.setId(item.getId());
            form.setName(item.getName());
            form.setPrice(item.getPrice());
            form.setStockQuantity(item.getStockQuantity());
            form.setAuthor(item.getAuthor());
            form.setIsbn(item.getIsbn());
            model.addAttribute("form", form);
            return "items/updateItemForm";
        }
        /**
         * 상품 수정
         */
        @PostMapping(value = "/items/{itemId}/edit")
        public String updateItem(@PathVariable("itemId") String itemId, @ModelAttribute("form") BookForm form) {
            Book book = new Book();
            book.setId(form.getId());
            book.setName(form.getName());
            book.setPrice(form.getPrice());
            book.setStockQuantity(form.getStockQuantity());
            book.setAuthor(form.getAuthor());
            book.setIsbn(form.getIsbn());
            itemService.saveItem(book);
            return "redirect:/items";
        }


}
  • @PathVariable 는 URL 경로에 변수를 넣어준다 {itemId}
  • @ModelAttribute 붙은 객체가 자동으로 Model 객체에 추가되고 뷰로 이동한다

참고자료

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard (웹 애플리케이션개발)

728x90

'Back-End > Spring Data' 카테고리의 다른 글

9.웹 계층 개발 2(주문)  (0) 2021.01.01
8.변경감지 와 병합  (0) 2021.01.01
6.주문도메인개발  (0) 2020.12.30
5.상품도메인 개발  (0) 2020.12.30
4.회원도메인 개발  (0) 2020.12.30