동적쿼리로 검색기능 구현하기

Luna·2023년 2월 14일
0

EZEN

목록 보기
32/40

검색

SQL
WHERE 절에서 1=1, 1=0 쓰는 이유?
1. 쿼리 디버깅 시, 주석처리가 편하다.
2. 동적쿼리에서 특정상황마다 WHERE절을 다르게 작성해줘야 할때 편리하다.
참고 : [SQL] WHERE절 1=1, 1=0 의미

검색 메뉴 만들기는 W3Schools BS Inputs2 참고

검색 동적쿼리

BoardDAOImpl.list()

	public List<BoardVO> list(PageObject pageObject) throws Exception {
		System.out.println("BoardDAOImpl.list()");
		// 결과가 전달되는 변수의 타입은 List 타입
		List<BoardVO> list = null; // 나중에 DB에서 꺼내서 채운다.
		try {
			// 1.확인 2.연결
			con = DB.getConnection();
			// 3. sql
			// 3-1 원본데이터 가져오기
			String sql = "SELECT no, title, writer, "
					+ " to_char(writeDate, 'yyyy-mm-dd') writeDate, hit "
					+ " FROM board ";
					// 검색 조건 처리
			String word = pageObject.getWord();
			String key = pageObject.getKey();
			if(word != null && !word.equals("")) {
				// 검색을 안하는 경우도 있기 때문에 WHERE(1=0과 )도 if문 안에 넣어준다.
				sql += " WHERE (1=0";
				if(key.indexOf("t") >= 0) sql += " OR title LIKE ? ";
				if(key.indexOf("c") >= 0) sql += " OR content LIKE ? ";
				if(key.indexOf("w") >= 0) sql += " OR writer LIKE ? ";
				sql += " ) ";
			}
			// 기존 sql에 이어붙이기
			sql += " ORDER BY no DESC";
			// 이중쿼리 처리 - SELECT 안에 SELECT
			// 3-2 순서번호 붙이기
			sql = " SELECT rownum rnum, no, title, writer, writeDate, hit "
					+ " FROM ( " + sql +  ")";
			// 3-3 페이지 데이터 조건문
			sql = " SELECT no, title, writer, writeDate, hit "
					+ " FROM ( " + sql +  ") "
					+ " WHERE rnum BETWEEN ? and ? ";
			System.out.println("BoardDAOImpl.list().sql : " + sql);
			// 4. 실행객체 & 데이터 세팅
			pstmt = con.prepareStatement(sql);
			int idx = 0;
			// '?'를 세팅
			if(word != null && !word.equals("")) {
				sql += " WHERE (1=0";
				if(key.indexOf("t") >= 0) pstmt.setString(++idx, "%"+word+"%");
				if(key.indexOf("c") >= 0) pstmt.setString(++idx, "%"+word+"%");
				if(key.indexOf("w") >= 0) pstmt.setString(++idx, "%"+word+"%");
				sql += " ) ";
			}
			pstmt.setLong(++idx, pageObject.getStartRow());
			pstmt.setLong(++idx, pageObject.getEndRow());
			// 5. 실행 -> rs
			rs = pstmt.executeQuery();
			// 6. 데이터 저장 - list 변수에 저장
			// rs가 null이 아니면 처리한다.
			if(rs != null) {
				// rs에 다음 데이터가 있으면 처리 한다.
				while(rs.next()) {
					// list가 null이면 한번만 생성
					if(list == null) list = new ArrayList<>();
					// 데이터를 담을 vo 객체를 생성
					BoardVO vo = new BoardVO();
					// rs의 데이터를 꺼내서 vo에 담는다.
					vo.setNo(rs.getLong("no"));
					vo.setTitle(rs.getString("title"));
					vo.setWriter(rs.getString("writer"));
					vo.setWriteDate(rs.getString("writeDate"));
					vo.setHit(rs.getLong("hit"));
					// 데이터가 담긴 vo를 list에 담는다.
					list.add(vo);
				} // end of while
			} // end of if
		} catch (Exception e) {
			e.printStackTrace(); // 개발자를 위한 오류 메시지
			throw new Exception("게시판 리스트 DB처리 중 오류 발생"); // 설정한 오류 메시지 담아서 표시
		} finally {
			// 7. 닫기
			DB.close(con, pstmt, rs);
		} // end of try~catch~finally
		return list;
	} // end of list()

검색 조건

검색 할 때 띄어쓰기만 검색해도 전체 검색결과 나오게 하기

if(word != null && !word.trim().equals(""))

검색 할 때 검색어 앞 뒤에 공백 넣어도 공백 제거하고 검색되게 하기
1. 검색

<!-- 검색 -->
<div> <!-- searchDiv -->
	<form class="form-inline" id="searchForm">
		<input name="perPageNum" value="${param.perPageNum }" type="hidden">
		<div class="form-group">
			<select class="form-control" id="key" name="key">
				<option selected="selected" value="t">제목</option> <!-- 먼저 선택 되어 있는 것 -->
				<option value="c">내용</option>
			 	<option value="w">작성자</option>
			 	<option value="tc">제목+내용</option>
			 	<option value="tw">제목+작성자</option>
			 	<option value="cw">내용+작성자</option>
			 	<option value="tcw">전체</option>
			</select>
		</div> <!-- end of form-group -->
		<div class="form-group">
	    	<input id="search" type="text" class="form-control" placeholder="Search" name="word" value="${param.word }">
		</div> <!-- end of form-group -->
		<button class="btn btn-default" type="submit">
			<i class="glyphicon glyphicon-search"></i>
		</button>
	</form> <!-- end of form-inline -->
</div> <!-- end of searchDiv -->
  1. 제이쿼리 함수 적용
// 앞뒤 공백 제거하고 검색
$("#searchForm").submit(function(){
	$("#search").val($("#search").val().trim());
});

수료 60%쯤 되니 강사님이 수업이 하기 싫으신지 수업도 대충하고 질문도 안받아준다. 물어봤더니 알아서 하라는식.. 덕분에 응용 실력만 점점 늘고 있는 것 같다. 고맙다고 해야 할 지^^..

0개의 댓글