[B -2-26] 검색 처리 3

2019. 10. 4. 09:55Project B (SPMS)/Project B 파트4

반응형

UriComponentsBuilder

 

웹 페이지에서 매번 파라미터를 유지하는 일이 번거롭고 힘들면, 한 번쯤 UriComponentsBuilder 를 이용할 필요가 있다.

여러개의 파라미터들을 연결해서 URL의 형태로 만들어주는 기능을 갖고 있다.

 

URL을 만들어주면 리다이렉트를 하거나 폼 태그를 사용하는 상황을 많이 줄여줄 수 있다.

 

src/main/java

com.spms.domain

Criteria.java

 

...더보기
package com.spms.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;
	}
	
	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.setType("TC");
    cri.setKeyword("새로");

위와 같은 데이터를 갖는 Criteria의 getListLink()의 결과

?pageNum=3&amount=20&type=TC&keyword=%EC%83%88%EB%A1%9C

와 같이 GET 방식에 적합한 URL 인코딩된 결과로 만들어진다.

(가장 편리한 점은 한글 처리에 신경안써도 된다는 점이다.)

 


src/main/java

com.spms.controller

BoardController.java

@PostMapping modify()

@PostMapping remove()

...더보기
package com.spms.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.spms.domain.BoardVO;
import com.spms.domain.Criteria;
import com.spms.domain.PageDTO;
import com.spms.service.BoardService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {

	private BoardService boardService;

	@GetMapping("/list")
	public void list(Criteria cri, Model model) {
		log.info("list" + cri);
		boardService.getList(cri).forEach(board -> log.info(board));
		model.addAttribute("list", boardService.getList(cri));
		 
		int total = boardService.getTotal(cri); 
		log.info("total : " + total);
		model.addAttribute("pageMaker", new PageDTO(cri, total));

	}

	@GetMapping("/register")
	public void register() {

	}

	@PostMapping("/register")
	public String register(BoardVO board, RedirectAttributes rttr) {

		log.info("register : " + board);
		boardService.register(board);
		rttr.addFlashAttribute("result", board.getBno());
		return "redirect:/board/list";
	}

	@GetMapping({ "/get", "/modify" })
	public void get(@RequestParam("bno") Long bno, @ModelAttribute("cri") Criteria cri, Model model) {
		log.info("/get or modify");
		model.addAttribute("board", boardService.get(bno));
	}

	@PostMapping("/modify")
	public String modify(BoardVO board, @ModelAttribute("cri") Criteria cri, RedirectAttributes rttr) {
		log.info("modify:" + board);

		if (boardService.modify(board)) {
			rttr.addFlashAttribute("result", "success");
		}
		
		// UriComponentsBuilder 사용으로 인한 코멘트 처리
		/*
		 * 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 (boardService.remove(bno)) {
			rttr.addFlashAttribute("result", "success");
		}
		
		// UriComponentsBuilder 사용으로 인한 코멘트 처리
		/*
		 * 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();
	}
}

 

getListLink() 를 이용하면 modify()remove() 를 간단히 정리할 수 있다.

기존의 리다이렉트 시 들고갔던 속성들을 간단히 정리할 수 있다.

반응형

'Project B (SPMS) > Project B 파트4' 카테고리의 다른 글

[B -2-25] 검색 처리 2  (0) 2019.10.04
[B -2-24] 검색 처리 1  (0) 2019.10.03