[B -2-26] 검색 처리 3
2019. 10. 4. 09:55ㆍProject 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 |