-- 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 시켜주고
이 값을 이용해 유지되도록 만들어 주기
# 어떤 것(제목or내용)으로 검색할지 옵션 선택한 값 유지되도록 해주기
# 어떤 내용으로 검색할지 입력한 값 유지되도록 해주기
# 화면 확인 – 옵션 박스와 검색 박스 값이 유지되는 것 확인!
검색 옵션 + 검색 값 유지 작업 완료
그런데....
내가 검색한 값으로만 결과가 나오고 끝나야 하는데
페이징 처리가 아직 안되어서 나머지 게시글도 뒤에 이어서 다 나온다.
3. 검색 결과 게시글 - 페이징 처리하기
3-1 : listCount (= 총 게시글 개수) 구해오는 작업 수정 필요
- 페이징 처리에 필요한 [ listCount = 총 게시글 개수 ] 계산 부분을 수정해주어야 한다.
- 처음 게시글 목록 조회를 하는 경우에는
- - 게시글 전체에 대해서 총 게시글 개수를 구해오는 것이 맞다.
- 하지만 검색 결과로 나온 게시글 목록에 대해서는
- - 게시글 전체가 아닌 검색 결과로 나온 게시글의 총개수를 구해와야 한다.
- 즉, 검색 작업이 이루어지는 경우에는 listCount가 달라지고
- 달라진 listCount를 이용하여 페이징 처리가 되어야 한다.
3-2 : 데이터 뭉쳐서 - 파라미터로 전달해주기
- 게시글 총 수 알아오는 메서드 ( selectListCount() ) 파라미터 수정
change method로 – Service- > 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가지
- prefix = 접두사, - prefix – 앞에다가 뭘 추가하겠다
- prefixOverrides – 앞에 이게 있으면 지워버리겠다
- suffix = 접미사 - suffix – 뒤에다가 뭘 추가하겠다.
- 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 )
'Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원 > 9월' 카테고리의 다른 글
22.09.08 - [ Spring ] @Component , @Autowired , injection , IoC 와 DI (0) | 2022.09.15 |
---|---|
22.09.07 - [ Spring ] DispatcherServlet, spring legacy 프로젝트 생성 및 구조 살펴보기 (0) | 2022.09.14 |
22.09.05 - [ 11차 시험! - 인터페이스 구현 ] (0) | 2022.09.07 |
22.09.02 - [ Mybatis ] 게시글 - { 작성, 전체조회, 페이징처리 } 작업 (0) | 2022.09.07 |
22.09.01 - [ Mybatis ] 회원가입, 로그인, 암호화 작업해보기 (0) | 2022.09.07 |