Spring 게시판 검색기능 구현 (내 프로젝트에 적용)

Back-End/Spring 2019. 8. 9. 17:15
728x90
반응형

검색창에서 작성자, 제목, 내용, 작성자+내용+제목의 옵션으로 글을 검색 할 수 있게 검색기능구현함

 

 

1.  게시판 view 페이지에 검색기능 관련 폼 태그 추가

 

memberboard.jsp 중 일부

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
//컨트롤러의 list.do로 맵핑되고, user_id, title, content값을 매개값으로 넘긴다.
 
//검색옵션은 작성자, 제목, 내용, 작성자+제목+내용으로 검색할 수 있도록 한다.
 
<form name="form1" method="post" action="list.do">
 
    <select name="search_option">
        <option value="user_id"
<c:if test="${map.search_option == 'user_id'}">selected</c:if>
>작성자</option>
 
        <option value="title" 
<c:if test="${map.search_option == 'title'}">selected</c:if>
        >제목</option>
 
        <option value="content" 
<c:if test="${map.search_option == 'content'}">selected</c:if>
        >내용</option>
 
        <option value="all" 
<c:if test="${map.search_option == 'all'}">selected</c:if>
        >작성자+내용+제목</option>
 
    </select>
    <input name="keyword" value="${map.keyword}">
    <input type="submit" value="조회">
</form>
cs

 

 

MemberBoardController.java (컨트롤러)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@RequestMapping("list.do")    //세부적인 url mapping
    public ModelAndView list(//RequestParam으로 옵션, 키워드, 페이지의 기본값을 각각 설정해준다.
            
            @RequestParam(defaultValue="1"int curPage,
 
            @RequestParam(defaultValue="user_id"String search_option, //기본 검색 옵션값을 작성자로 한다.
 
            @RequestParam(defaultValue=""String keyword //키워드의 기본값을 ""으로 한다.
 
            )
             throws Exception{
        
        //레코드 갯수를 계산
        int count = 1000;
        
        //페이지 관련 설정, 시작번호와 끝번호를 구해서 각각 변수에 저장한다.
        Pager pager = new Pager(count, curPage);
        int start = pager.getPageBegin();
        int end =  pager.getPageEnd();
             
//map에 저장하기 위해 list를 만들어서 검색옵션과 키워드를 저장한다.
        List<MemberBoardDTO> list = memberboardservice.listAll(search_optionkeyword, start, end);
        
        ModelAndView mav = new ModelAndView();
        Map<String,Object> map = new HashMap<>();    //넘길 데이터가 많기 때문에 해쉬맵에 저장한 후에 modelandview로 값을 넣고 페이지를 지정
        
        map.put("list", list);                         //map에 list(게시글 목록)을 list라는 이름의 변수로 자료를 저장함.
        map.put("pager", pager);
        map.put("count", count);
        map.put("search_option", search_option);
        map.put("keyword", keyword);
        mav.addObject("map", map);                    //modelandview에 map를 저장
        
        System.out.println("map : "+map);
        mav.setViewName("board/memberboard");                //자료를 넘길 뷰의 이름
        
        return mav;    //게시판 페이지로 이동
    
    }
cs

 

 

 

게시판 목록 기능 구현할때와 동일하게 서비스 -> dao를 거쳐서 mapper로 이동

 

boardMapper.xml 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<!-- 다른 mapper와 중복되지 않도록 네임스페이스 기재 -->
 
<mapper namespace="memberboard">
    
    <!-- rownum을 rn이란 문자로 줄여쓴다. 밑에 from문을 A로 줄여쓴다.  -->
                  <!-- 이 from문이 먼저 실행된 다음에 번호를 붙였기 때문에 일련번호가 다시 새로 매겨졌다. -->
                <!--  이 안쪽의 쿼리가 가장 중요함 -->
                
                
<select id="listAll" resultType="com.example.hansub_project.model.board.dto.MemberBoardDTO">
<!-- 결과는 boardDTO타입이 된 -->
        <include refid="paging_header" /
        
        <!-- ref는 다른테이블을 의미한다. -->
        <!-- 번호, 제목, 작성자, 이름, 날짜, 조회수 , 그리고 댓글의 갯수를 검색 -->
        <!-- board 테이블과 member 테이블로 부터 검색 -->
            select member_bno, user_id, reg_date, viewcnt, title, rcnt, content, recommend            
            from member_board
            <!-- bno의 내림차순으로 검색 -->
            <!-- where절은 (조건)은 include 태그를 이용했음 -->
        <include refid="search" />
            order by member_bno desc
        <include refid="paging_footer" />        
    </select>
    
    
    <sql id="paging_header">
    <!-- 게시물을 한페이지에 10개씩 볼 수 있게하는 쿼리 윗부분-->
        select *
        from (
            select rownum as rn, A.*
            from (    
    </sql>
    
    
    <sql id="paging_footer">
    <!-- 게시물을 한페이지에 10개씩 볼 수 있게하는 쿼리  아랫 부분-->
    <!-- 새로 매겨진 일련번호 1~10번 글까지 1페이지 -->
    <!-- 11~20번 글까지 2페이지.. -->
            ) A
        ) where rn between #{start} and #{end}    
    </sql>
    
 
    <sql id="search">
        <choose>
          
//작성자+제목+내용의 검색조건으로 게시물을 검색하는 쿼리
            <when test="search_option == 'all' ">
                where  
                      user_id like '%'||#{keyword}||'%'
                      or content like '%' || #{keyword}||'%'
                      or title like '%'||#{keyword}||'%'   
            </when>
            <otherwise>
 
//내가 지정한 조건 (작성자, 제목, 내용) 의 검색조건으로 게시물을 검색하는 쿼리
                where ${search_option} like '%'||#{keyword}||'%'
            </otherwise>
        </choose>
    </sql>
 
 
</mapper>
 
cs

 

 

 

아래 책은 제가 공부할때 활용했던 책으로 추천드리는 책이니 한번씩 읽어보시는것을 추천드립니다!! ㅎㅎ

토비의 스프링 3.1 세트:스프링의 이해와 원리 + 스프링의 기술과, 에이콘출판

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

728x90
반응형
: