KOSA Spring - 검색처리

채정윤·2025년 4월 21일

Spring

목록 보기
16/25

검색처리 게시판 예제

◻️ Criteria.java

package org.zerock.domain;

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

// Lombok 어노테이션: getter, setter, toString 메서드를 자동 생성
@ToString
@Setter
@Getter
public class Criteria {

  // 현재 페이지 번호
  private int pageNum;

  // 한 페이지당 출력할 데이터 수
  private int amount;

  // 검색 유형 (예: 제목, 내용, 작성자 등)
  private String type;

  // 검색 키워드
  private String keyword;

  // 기본 생성자: 페이지 번호는 1, 페이지당 데이터 수는 10으로 설정
  public Criteria() {
    this(1, 10);
  }

  // 모든 필드를 초기화하는 생성자
  public Criteria(int pageNum, int amount) {
    this.pageNum = pageNum;
    this.amount = amount;
  }

  // 검색 타입을 문자열 배열로 반환
  // 예: "TC" -> ["T", "C"]
  public String[] getTypeArr() {
    return type == null ? new String[] {} : type.split("");
  }
}

🔩 resources / Mapper.xml

<!-- 게시글 목록 페이징 처리 쿼리 -->
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO">
  <![CDATA[
  select 
    bno, title, content, writer, regdate, updatedate
  from 
    (
      -- 최신순 정렬 및 rownum으로 페이징
      select /*+INDEX_DESC(tbl_board pk_board) */
        rownum rn, bno, title, content, writer, regdate, updatedate 
      from 
        tbl_board
      where 
  ]]>
    <trim prefix="(" suffix=") AND " prefixOverrides="OR">
      <!-- 검색 조건 반복 처리 -->
      <foreach item='type' collection="typeArr">
        <trim prefix="OR">
          <choose>
            <when test="type == 'T'.toString()">
              title like '%'||#{keyword}||'%'
            </when>
            <when test="type == 'C'.toString()">
              content like '%'||#{keyword}||'%'
            </when>
            <when test="type == 'W'.toString()">
              writer like '%'||#{keyword}||'%'
            </when>
          </choose>
        </trim>
      </foreach>
    </trim>

  <![CDATA[
      -- 페이지 끝 번호까지 조회
      rownum <= #{pageNum} * #{amount}
    )
  -- 현재 페이지 시작 번호 이후부터 출력
  where rn > (#{pageNum} -1) * #{amount}   
  ]]>
</select>

<!-- 검색 조건 기반 전체 게시글 수 조회 -->
<select id="getTotalCount" resultType="int">
  select count(*) from tbl_board where
  <include refid="criteria"></include> <!-- 검색 조건 포함 -->
  bno > 0
</select>

🖱️ BoardServiceImpl.java

	@Override
	public int getTotal(Criteria cri) {
		return  mapper.getTotalCount(cri);
	}

🧑‍💼 Controller.java

	@GetMapping("/list")
	public void getList(Criteria cri, Model model) {
	    model.addAttribute("list", service.getList(cri));
	    model.addAttribute("pageMaker", new PageDTO(cri, service.getTotal(cri)));
	}
	
		@PostMapping("/modify")
	public String modify(BoardVO board, 
									@ModelAttribute("cri") Criteria cri, 
									RedirectAttributes rttr) {
		service.modify(board);
	    rttr.addAttribute("pageNum", cri.getPageNum());
	    rttr.addAttribute("amount", cri.getAmount());
	    rttr.addAttribute("type", cri.getType());
	    rttr.addAttribute("keyword", cri.getKeyword());
		
		return "redirect:/board/list";
	}
	
	@PostMapping("/remove")
	public String remove(@RequestParam("bno") Long bno, 
									@ModelAttribute("cri") Criteria cri,
									RedirectAttributes rttr) {
		service.remove(bno);
	    rttr.addAttribute("pageNum", cri.getPageNum());
	    rttr.addAttribute("amount", cri.getAmount());
	    rttr.addAttribute("type", cri.getType());
	    rttr.addAttribute("keyword", cri.getKeyword());
		
		return "redirect:/board/list";
	}

컨트롤러 흐름

  • 목록 조회: getList()에 Criteria cri 객체 전달하여 페이징/검색된 목록 반환
  • 페이지 정보 유지: 수정/삭제 후 기존 검색 조건과 페이지 정보 유지
    • @ModelAttribute("cri"): Criteria 객체 자동 바인딩
    • RedirectAttributes: 리다이렉트 시 파라미터 전달
      • Post-Redirect-Get 패턴에서 주로 사용
    • 4가지 파라미터 전달: pageNum, amount, type, keyword

@RedirectAttributes vs @RequestParam vs @ModelAttribute

특성@RedirectAttributes@RequestParam@ModelAttribute
용도리다이렉트 시 데이터 전달요청 파라미터 바인딩객체 바인딩 및 모델 데이터 추가
데이터 수명리다이렉트 이후 한 번의 요청까지만 유지현재 요청 내에서만 유지현재 요청 내에서 유지되며 뷰로 자동 전달
처리 데이터 형태addAttribute(): String 값단일 값복잡한 객체
URL 노출URL에 노출됨URL에 노출됨URL에 노출되지 않음
사용 예시rttr.addAttribute("page", 1)@RequestParam("id") Long id@ModelAttribute("user") User user

form안에 태그 비교 (<select> , <input type="hidden"> )

항목<select><input type="hidden">
사용자 입력사용자가 직접 선택사용자 입력 없음
화면 표시보임 (UI 요소)안 보임
용도사용자로부터 선택 받기자동으로 값 유지/전송
주 사용처검색 조건, 폼 입력페이징, 상태 유지, 자바스크립트 제어

0개의 댓글