티스토리 뷰

| 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를 사용할 수 없는 상황에서 링크를 처리해야 하는 상황에 사용됩니다.