Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원/9월

22.09.06 - [ Mybatis ] - 게시글 검색, 검색 게시글 페이징처리, 동적sql

giggs 2022. 9. 8. 09:36

 

-- INDEX --

 

 

1. 게시글 검색 작업 2. 검색한 값 유지 3. 검색 결과 게시글
페이징 처리
4. 동적sql
HashMap
<if test="" >
-검색 옵션 유지하기
-검색 값 유지하기
listCount 메서드 수정 if 
choose , when, otherwise
trim, where, set
foreach

 

 

 

 

 


 

 

 

 

 

1. 게시글 검색 

 

 

 

1-1. 검색 화면 폼 만들기

  • 제목으로 검색할지 내용으로 검색할지 - condition의 value로 입력해주고
  • 입력할 내용은 - keyword 의 value로 입력해주기

 

 

 

 

 

 


 

 

 

1-2 : 입력 받은 데이터로 게시글 검색하기

 

 

1. 컨트롤러 부분 수정

  • - 데이터를 담아줄 마땅한 vo가 존재하지 않으므로 Map으로 만들어서 전달
  • - 페이징 처리를 위해 pvo만 전달해주었던 게시글 조회 메서드 selectList에 map도 전달

 

 

 


 

 

2. dao 부분 수정

  • - 전달할 [ 객체 || map || 변수 ]가 없어서 비어있던 2번째 파라미터 부분에 이제 map 전달해서 sql 채우기

 

 


 

3. sql 부분 수정 - 동적 쿼리

  • 사용자가 선택한 값에 따라서  sql 문이 바뀌어야 한다.
  • 제목 중에서 검색을 하는 것인지 ( condition = title 인지 )
  • 내용 중에서 검색을 하는 것인지 ( condition = content 인지 )

 

 

 

 

 

, 상황에 따라서 sql문을 다르게 실행하게 해주어야 한다..

  • -- 지금까지는 여러 개의 sql 만들어 놓고(정적으로) 상황에 따라 선택해서 실행했었다.
  • -- mybatis를 이용하면 정적으로 다 만들어 놓을 필요 없이 동적으로 sql 선택할 수 있다!

 

 

수정 후

 


 

 

# 체크사항 - 1

  • <if test = "  여기 " >
  • 여기 부분에서는 #{condition} 이 아닌 변수 자체를 써주어야 한다.
  • <if tet= “ 여기 ” >
  • 그냥 condition 이라고 사용하면 – 우리가 볼 때는 변수인데
  • OGNL 표기법에 의해서 – 일단 Object로 처리하겠다.

 

 

 

  • # 객체로 먼저 탐색  -> 그다음 변수명으로 찾던지, key값으로 찾는 방식으로 작동한다!
  • #{} 이나 ${}로 값을 입력하지 않도록 주의

 


 

 

# 체크사항 - 2

  • #{ }을 사용하면 mybatis가 자동으로 문자열로 형 변환 작업해준 뒤 가져온다
  • 문자열이니까 ‘ ’ 붙여서 나온다 - 문자열 연결 시 || 콘캣해서 필요
  •  
  • ${}를 사용하면 값을 그대로 가져와 준다. - ‘ ’ 없이 처리된다! - ' ' 추가 필요
  • ${} 사용 시 주의 – 문자열처리되고 가져오는 것이 아니라 클라이언트가 입력한 그대로 가져오는 것이다.
  • sql인젝션 공격받을 가능성 있다. 사용 시에 주의하기
  •  
  • ( JSTL이랑 다른 것인데 문법이 비슷하게 생겼지만, 완전 별개다 )

 

 

 

 

게시글 검색 작업 완료! 

 

 

 

 


 

 

 

 

2. 검색한 값 유지하기 

  • 검색 값 유지라는 의미는 – 현재의 url의 내용이 변경되지 않는다는 것
  • 페이지는 바뀌어서 p의 값은 바뀌겠지만
  • 나머지 검색 요청할 때 요청했던 condition과 keyword 값은 변경되지 않는다는 것

 

 

 

 


 

 

1-1 : 검색 요청 시 클라이언트에게 입력받은 값을 value값으로 넣어주어서 유지시켜주기

  • condition( 제목/내용 어떤 걸로 검색할지 선택한 값 ) .
  • keyword( 검색할 내용) 을
  • View Page에서 value값으로 지정 - 유지되게 해 준다.

 

 

# 검색 요청 시 받았던 condition과 keyword값을

그대로 화면 쪽으로 forword 시켜주고

이 값을 이용해 유지되도록 만들어 주기

 

 

요청받을때 들어온 condition과 keyword를 그대로 forward 시켜준다.

 


 

 

# 어떤 것(제목or내용)으로 검색할지 옵션 선택한 값 유지되도록 해주기

 

 

 

 


 

# 어떤 내용으로 검색할지 입력한 값 유지되도록 해주기

 

 

 

 


 

 

# 화면 확인 – 옵션 박스와 검색 박스 값이 유지되는 것 확인!

 

 

 

 

 

 

검색 옵션 + 검색 값 유지 작업 완료

 

 

 


 

 

 

그런데....

내가 검색한 값으로만 결과가 나오고 끝나야 하는데

페이징 처리가 아직 안되어서 나머지 게시글도 뒤에 이어서 다 나온다.

 

 

 

 


 

 

 

3. 검색 결과 게시글 - 페이징 처리하기 

 

 

3-1 : listCount (= 총 게시글 개수) 구해오는 작업 수정 필요

  • 페이징 처리에 필요한  [ listCount  = 총 게시글 개수 ] 계산 부분을 수정해주어야 한다.
  • 처음 게시글 목록 조회를 하는 경우에는
  • - 게시글 전체에 대해서 총 게시글 개수를 구해오는 것이 맞다.
  •  
  • 하지만 검색 결과로 나온 게시글 목록에 대해서는
  • - 게시글 전체가 아닌 검색 결과로 나온 게시글의 총개수를 구해와야 한다.
  •  
  • 즉, 검색 작업이 이루어지는 경우에는 listCount가 달라지고
  • 달라진 listCount를 이용하여 페이징 처리가 되어야 한다.

 


 

 

3-2 : 데이터 뭉쳐서 - 파라미터로 전달해주기

  • 게시글 총 수 알아오는 메서드 ( selectListCount() ) 파라미터 수정

 

 

change methodService- > dao레이어까지 변경

 

 


 

3. 동적 쿼리문으로 수정 필요하다

  • 검색 작업이 없을 시에는 - 게시글 전체 수 조회하기
  • 제목으로 검색 요청이 있을 시에는 - keyword에 해당하는 검색 결과 게시글만 가지고 - 전체 수 조회하기
  • 내용으로 검색 요청이 있을 시에는 - keyword에 해당하는 검색 결과 게시글만 가지고 - 전체 수 조회하기

 

 

변경 전

 


 

 

변경 후

 

 

 

 

 

 

검색 게시글 - 페이징 처리 완료!

 

 

 


 

 

위의 쿼리문에서

만약 where 절의 내용이 없다면?

 

첫 번째 조건에는 and 없어야 하고

그다음 조건에는 and 필요하다.

 

이런 상황 외에도

여러 가지 조건과 상황에 맞춰

동적 쿼리들 사용해 주어야 한다.

 

 

 


 

 

 

4. 동적 쿼리 사용해보기 

 

 

  • Mybatis의 가장 큰 장점 2가지 = 매핑, 동적 sql

 

 

 

 

 

JSTL과 별 다를 게 없이 사용 가능하다~!

 

 

 

 


 

4-1 : < if >

  • <if test=" " > < /if > 

 

 

 

 

OGNL 방식으로 처리되기 때문에

x를 써놔도 x라는 객체를 찾고, 변수를 찾고, key를 찾게 작동하는데

예외적으로

[ and / or / null ] 은 그렇게 찾지 않고 우리가 아는 방식으로 처리된다.

 

 

 


 

 

 

4-2 : choose, when, otherwise

  • <choose>  <when></when>  <otherwise></otherwise> </choose>
  • else if eles if else 형식 원할 때는 이걸로 사용

 

 

 

 


 

 

 

4-3 : trim, where, set

  • trim 만 이해해도 괜찮다. - 추가하거나 자르는 거
  • where이나 set을 많이 사용하는 경우 편하게 추가하려고 where, set 도 있다.
  • <trim prefix="" prefixOverrides=""  suffix=""  suffixOverrides="" >

 

 

 


 

 

# trim에서 사용 가능한 키워드 4가지

 

  1. prefix = 접두사, - prefix – 앞에다가 뭘 추가하겠다
  2. prefixOverrides – 앞에 이게 있으면 지워버리겠다
  3. suffix = 접미사 - suffix – 뒤에다가 뭘 추가하겠다.
  4. suffixOverrides – 뒤에 이게 있으면 지워버리겠다.

 

 

 

# 사용 예시

  • trim을 이용하여 앞에 where을 추가하거나 (  prefix = "where" )
  • 앞에 and를 지워버리거나 할 수 있다. ( prefixOverrides = "and" )

 

 


 

# trim대신에 where로 바꿔도 똑같이 작동된다.

 

 

 

 


 

 

# set을 여러 번 사용해야 하는 경우 편하게 사용 가능

  • update table 뒤에 set이 들어갈 수도 안 들어갈 수도 있는 경우에 사용

 

 

 

 


 

 

 

4-4 : foreach 

  • 전달받은 list 중에 user01에 해당하는지 user02에 해당하는지 --- 알고 싶을 때 foreach로 작업
  • 체크해 볼 list에 몇 개가 있는지.
  • [ , ] 콤마를 몇 개를 찍어야 하는지를 자동으로 처리해줌
  • <foreach  item=""  index=""  collection=""     open==""   separator=""   close="" > <foreach> 

 

 

 

# index

  • index 에다가는 몇 번째 반복되고 있는지 체크되는 것이다. 변수 아무거나 지정가능 [ I ]

 

# collection

  • collection 에다가는 전달받은 list 적어주면 된다. [ memberList ]

 

 

# item

  • list에 있는 요소 한 개씩 뽑아가지고 item이라는 변수에 담아줄 것이다. [ x ]

 


 

# open

  • foreach가 시작될 때 맨 앞에 추가될 애를 써주면 된다.
  • 그럼 그 애 써주고 추가 추가된다 “ID in ( ”

 

#separator 

  • item이 하나하나 만들어질 때 - 하나 만들어지고  [ , ] 콤마 찍고 그 다음거 만들어져라 하기 위해 지정

 

 

# close 

  • foreach가 끝날 때 맨 뒤에 추가될 애를 써주면 된다. [ “ ) ”]

 

 

# open + separator + close 합치면  ID in ( A, B, C )