Spring legacy

UriComponentBuilder

voider 2020. 9. 12. 13:52

UriComponentBuilder

게시물을 POST방식으로 처리하고 나서도 페이지나 검색 조건을 유지하기 위해서는 페이지 정보와 검색 조건, 검색 키워드 정보를 RedirectAttribute객체로 직접 지정해야 했다.

    @PostMapping("/modify")
    public String modify(BoardVO boardVO, PageInfo pageInfo,RedirectAttributes redirect) {
        log.info("/board/modify");
        log.info("BoardVO : " + boardVO);

        int result = boardService.modify(boardVO);

        log.info("MODIFY RESULT : " + result);

        redirect.addAttribute("no",boardVO.getBno());
        redirect.addAttribute("page", pageInfo.getPage());
        redirect.addAttribute("amount", pageInfo.getAmount());
        redirect.addAttribute("type", pageInfo.getType());
        redirect.addAttribute("keyword", pageInfo.getKeyword());

        return "redirect:/board/post";
    }

    @PostMapping("/remove")
    public String remove(Long bno, PageInfo pageInfo, RedirectAttributes redirect) {
        log.info("/board/remove");

        int result = boardService.remove(bno);
        log.info("result : " + result);

        redirect.addAttribute("page", pageInfo.getPage());
        redirect.addAttribute("amount", pageInfo.getAmount());
        redirect.addAttribute("type", pageInfo.getType());
        redirect.addAttribute("keyword", pageInfo.getKeyword());

        return "redirect:/board/list";
    }

이것은 수정/삭제 후에도 검색 조건과 페이지 정보를 유지하기 위해서 직접 redirect한 코드다. 보듯이 remove메서드와 modify메서드 여러 부분이 중복이다. 하나하나 지정하기도 귀찮은 일이고, 중복은 영 찝찝한 일이다. UriComponentBuilder객체를 이용하면 코드를 한 줄로 줄이고, 중복도 제거할 수 있다.

페이지 정보와 검색 정보를 관리하는 PageInfo 객체에 UriComponentBuilder를 이용해서 내가 필요한 Uri를 반환하는 메서드를 만들었다.

    public String getUrlList () {
        UriComponentsBuilder builder = UriComponentsBuilder.fromPath("")
                .queryParam("page", this.getPage())
                .queryParam("amount", this.getAmount())
                .queryParam("type", this.getType())
                .queryParam("keyword", this.getKeyword());
        return builder.toUriString();
    }

Key - Value 형식으로 지정하면 된다. 이 메서드는
?page=8&amount=10&type=tcw&keyword= 이런 uri 문자열을 반환한다.

아래는 UriComponentBuilder을 적용한 다음 remove와 modify메서드 코드다.

    @PostMapping("/modify")
    public String modify(BoardVO boardVO, PageInfo pageInfo,RedirectAttributes redirect) {
        log.info("/board/modify");
        log.info("BoardVO : " + boardVO);

        int result = boardService.modify(boardVO);

        log.info("MODIFY RESULT : " + result);

        redirect.addAttribute("no",boardVO.getBno());

        return "redirect:/board/post" + pageInfo.getUrlList();
    }

    @PostMapping("/remove")
    public String remove(Long bno, PageInfo pageInfo) {
        log.info("/board/remove");

        int result = boardService.remove(bno);
        log.info("result : " + result);

        return "redirect:/board/list" + pageInfo.getUrlList();
    }

중복되는 redirect를 모두 제거했다. remove메서드에서는 더 이상 RedirectAttribute객체를 사용하지 않아도 된다.