- [Spring]- UriComponentsBuilder란? 목차
| UriComponentsBuilder
웹페이지에서 매번 파라미터를 유지하는 일이 번거롭고 힘들다면 한 번쯤 " UriCompoentsBuilder "라는 클래스를 이용하여 작성해보자 !
org.spring.framework.web.util.UriComponentsBuilder는 여러 개의 파라미터들을 연결하여 URL 형태로
만들어 주는 기능을 가지고 있습니다.
즉 Controller단에서 addAttribute로 하나 하나 속성을 지정해주지 않아도 이 class를 이용하면 손쉽고 간단하게 파라미터들을 전달할 수 있습니다.
(컨트롤러에서 리다이렉트 시 여러 파라미터들을 일일이 다 addAttribute를 하기엔 버거웠습니다.)
(이방법은 한글 처리에 신경쓰지 않아도 된다는 점이 유용합니다.)
예를들어 다음과 같은 Criteria 클래스가 있다고 가정해보겠습니다.
package org.zerock.domain;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.queryParam;
import org.springframework.web.util.UriComponentsBuilder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
//검색이 기준이 되는 클래스
@Setter
@Getter
@ToString
public class Criteria {
private int pageNum;
private int amount;
private String type;
private String keyword;
//생성자로 무조건 실행된다 1번은
//기본 페이지를 1페이지에 10개씩 보여준다는 의미.
public Criteria()
{
this(1,10);
}
//매개변수로 들어오는 값을 이용하여 조정할 수 있다.
public Criteria(int pageNum, int amount) {
this.pageNum = pageNum;
this.amount = amount;
}
//검색 조건이 각 글자 (T,W,C)로 구성되어 있으므로title,writer,content
//검색 조건을 배열로 만들어서 한 번에 처리하기 위함.
public String[] getTypeArr()
{
return type==null? new String[] {}: type.split("");
}
//UriComponentsBuilder를 이용하여 링크 생성
public String getListLink()
{
UriComponentsBuilder builder = UriComponentsBuilder.fromPath("")
.queryParam("pageNum", this.pageNum)
.queryParam("amount", this.getAmount())
.queryParam("type",this.getType())
.queryParam("keyword",this.getKeyword());
return builder.toUriString();
}
}
각 수정과 삭제할 때 페이지 번호, 개수, 검색 조건, 검색 키워드를 매번 넘겨줘야 하는 경우입니다.
->queryParam()이라는 메서드를 이용하여 필요한 파라미터들을 손쉽게 추가할 수 있습니다.
Criteria cri = new Criteria();
cri.setPageNum(3);
cri.setAmount(20);
cri.setKeyword("새로");
cri.setType("TC");
위와 같은 데이터를 가진 Criteria의 getListLink()의 결과는
" ?pageNum=3&amount=20&type=TC&keyword=%EC%83%88%EB%A1%9C "와 같이 GET방식에 적합한 URL 인코딩된 결과로 만들어 집니다.
다음과 같이 Controller의 일부에 cri.getListLink()를 넣어주면 됩니다.
//@ModelAttribute는 알아서 값을 "바인딩" OR "주입" 시켜줌
@PostMapping("/modify")
public String modify(RedirectAttributes rttr,BoardVO board,@ModelAttribute("cri") Criteria cri)
{
log.info("/modify");
log.info("modify:"+board);
if(boardService.modify(board))
{
rttr.addFlashAttribute("result", "success");
}
//POST방식으로 진행하는 수정과 삭제 처리는 페이지 관련 파라미터들을 처리하기 위해서는 변겨앻줄 필요가 있다.
//기존에 선언했던 방식 ( getListLink() 없이 )
rttr.addAttribute("pageNum", cri.getPageNum());
rttr.addAttribute("amount", cri.getAmount());
rttr.addAttribute("type", cri.getType());
rttr.addAttribute("keyword", cri.getKeyword());
//getListLin()방식 추가
return "redirect:/board/list" + cri.getListLink(); //redirect하는 이유는 수정한 뒤 list page에가 가게 하기 위해서이다.
}
@PostMapping("/remove")
public String remove(RedirectAttributes rttr,@RequestParam("bno") Long bno,@ModelAttribute("cri") Criteria cri)
{
log.info("remove할 bno 는 " + bno);
if(boardService.remove(bno))
{
rttr.addFlashAttribute("result", "삭제완료");
}
//삭제 후 원래 Page로 가기 위해서 선언
//기존에 선언 했던 방식 ( getListLink() 없이 )
/*
rttr.addAttribute("pageNum", cri.getPageNum());
rttr.addAttribute("amount", cri.getAmount());
rttr.addAttribute("type",cri.getType());
rttr.addAttribute("keyword", cri.getKeyword());
*/
//getListLink() 추가
return "redirect:/board/list" + cri.getListLink();
}
UriComponentsBuilder를 통해 생성된 URL은 화면에서도 유용하게 사용될 수 있습니다.
주로 JavaScript를 사용할 수 없는 상황에서 링크를 처리해야 하는 상황에 사용됩니다.
'Spring' 카테고리의 다른 글
[Spring]@Autowired와 @AllArgsConstructor의 차이 (0) | 2020.03.11 |
---|---|
[Spring Test]-IntStream의rangeClosed (0) | 2020.03.10 |
[Spring]addAttribute와 addFlashAttribute 차이점 (0) | 2020.03.08 |
[Spring]@Transactional이란? (1) | 2020.02.10 |
[Spring]GET,POST,PUT,DELE란? (0) | 2020.02.10 |