본문으로 바로가기

Spring - UriComponentsBuilder의 사용

category 웹/Spring 2019. 3. 27. 18:27

2019/03/24 - [웹/Spring] - RedirectAttributes의 addAttribute VS addFlashAttribute 차이점

 

RedirectAttributes의 addAttribute VS addFlashAttribute 차이점

스프링 프레임워크를 이용한 게시글을 만들다가 성공 여부를 뷰에 넘겨줄 때 Redirect을 할 일이 생겼는데 addAttribute와 addFlashAttribute가 있었습니다. RedirectAttributes의 addAttribute와 addFlashAttrib..

dlwjdcks5343.tistory.com

이전 시간에 리다이렉트 시 URL에 파라미터로 전달할 때 두 가지 방식의 차이점을 봤습니다.

 

이번엔 프로젝트 진행하다가 불편한 점이 있었습니다.

 

바로 매번 파라미터를 유지하는 일이 번거롭고 힘들었다는 것입니다. 

 

즉 컨트롤러에서 리다이렉트 시 여러 파라미터들을 일일이 다 addAttribute를 사용 하기 불편했다는 겁니다.

 

이를 해결하기 위한 방안으로 org.springframework.web.util.UriComponentsBuilder를 사용합니다.

 

이는 여러 개 파라미터들을 연결하여 하나의 URL 링크로 만들어서 반환해줍니다.

 

각 수정과 삭제할 때 페이지 번호, 개수, 검색 조건, 검색 키워드를 매번 넘겨줘야 하는 경우입니다.

 

우선 Criteria라는 검색조건 유지 클래스에서    

package org.zerock.domain;

import org.springframework.web.util.UriComponentsBuilder;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Criteria {
	
	private int pageNum; //페이지 번호
	private int amount; //한페이지당 개수
	
	private String type;
	private String keyword;
	
	public Criteria() {
		this(1,10);
	}
	
	public Criteria(int pageNum,int amount) {
		this.pageNum=pageNum;
		this.amount=amount;
	}
	//검색 조건이 (T,W,C)로 구성되어 검색 조건을 배열로 만듬 Mybatis 동적 태그 활용
	public String[] getTypeArr() {
		return type == null ? new String[] {}: type.split("");
	}
	
	//UriCOmponentsBuilder 여러개의 파라미터를 연결해서 하나의 URL을 제공
	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();
	}
}

 

getListLink() 메서드를 만들어줍니다. 이는 UriComponentsBuilder를 이용한 여러 파라미터를 하나의 URL로 제공합니다.

 

UriComponentsBuilder 객체 생성 후 파라미터들을 만들어줍니다.

 

후 Uri문자열로 반환시켜줍니다. 

 

이를 컨트롤러에서 사용하게 되면 

 

아래와 같습니다.

 

@PostMapping("/modify")
	public String modify(BoardVO board,@ModelAttribute("cri") Criteria cri, RedirectAttributes rttr) {
		log.info("modify:"+board);
		if(service.modify(board)) {
			rttr.addFlashAttribute("result","success");
		}
		
		/*rttr.addAttribute("pageNum",cri.getPageNum());
		rttr.addAttribute("amount",cri.getAmount());
		rttr.addAttribute("type",cri.getType());
		rttr.addAttribute("keyword",cri.getKeyword());*/
		
		return "redirect:/board/list" + cri.getListLink();
	}
	
	@PostMapping("/remove")
	public String remove(@RequestParam("bno") Long bno,@ModelAttribute("cri") Criteria cri,RedirectAttributes rttr) {
		log.info("remove...."+bno);
		if(service.remove(bno)) {
			rttr.addFlashAttribute("result","success");
		}
		/*rttr.addAttribute("pageNum",cri.getPageNum());
		rttr.addAttribute("amount",cri.getAmount());
		rttr.addAttribute("type",cri.getType());
		rttr.addAttribute("keyword",cri.getKeyword());*/
		return "redirect:/board/list" + cri.getListLink();
	}

주석처리 한 부분을 제거하고 return에 url을 아까 만들어두었떤 메서드를 이용하여 추가해줍니다.

 

이렇게 되면 일일이 addAttribute를 사용할 필요가 없어 편리합니다.

 

 

' > Spring' 카테고리의 다른 글

REST AJAX 댓글 등록 처리  (2) 2019.04.28
REST 방식  (0) 2019.03.31
스프링프레임워크 게시글 Github  (0) 2019.03.26
RedirectAttributes의 addAttribute VS addFlashAttribute 차이점  (2) 2019.03.24
스프링 MVC 프레임워크  (0) 2019.02.03