📖 학습내용
- Oracle DB Hint
- Paging
- 검색기능
1. Oracle DB Hint
Select 문을 실행할 때 힌트(hint)를 사용하여 개발자가 실행 조건을 걸어주는 것
- 힌트 구문에서 에러가 발생하여도 SQL 실행에 지장을 주지 않는다.
- Order By 절의 FullScan하는 단점을 극복할 수 있다.
- INDEX_ASC or DESC (테이블명 PK)를 사용하여 정렬을 생략
- FULL(테이블명)으로 FullScanning 가능
Order By
- order by 정렬은 데이터가 많은 경우 엄청난 성능의 저하를 가져오기 때문에 데이터가 적거나, 정렬을 빠르게 하는 방법이 있지 않으면 지양한다.
- 계획 설명에서 보이듯 테이블을 FULL로 scan 한 것을 볼 수 있다.
Hint(INDEXT 사용)
/*+ INDEX_DESC(테이블명 제약조건명) */
- 힌트를 적용하려면
/*+ */
와 같은 키워드 안에 작성하여 적용해야 한다.
- order by를 사용했을 때와 다르게 sort를 하지 않았고 제약조건을 사용하여 Range Scan을 했다.
- 힌트에서 자동으로 정렬을 해줘 order by 절로 정렬 하지않아도 정렬이 되어 있다.
ROWNUM
SQL이 실행된 결과에 넘버링을 해주는 역할
모든 SELECT문에 사용 가능
- ROWNUM을 선언하여 나오는 결과의 순서를 매긴다.
- 테이블에 존재하는 것이 아니라 가져온 데이터를 이용하여 순서를 매긴다.
- 위 예제는 Full Scan을 하면서 정렬이 되지 않았을 때 ROWNUM을 매기고 차후에 정렬이 되기 때문에 뒤죽박죽 상태란 것을 알 수 있다.
- Hint에 INDEX를 사용하여 기본 정렬 상태에서 ROWNUM을 적용한다면 순서에 맞게 매겨진다.
- 실행 계획에도 Full Scan이 아닌 Range Scan임을 확인 할 수 있다.
인라인 뷰(in-line view)
페이징 처리하기 위해 인라인뷰로 처리해야만 문제가 발생하지 않는다.
- 위와 같이 ROWNUM이 높은 순서대로 출력 된다.
- 이 때 2페이지부분을 구하기 위해 다시 쿼리문을 작성한다.
- 에러는 나오지 않지만 아무런 결과가 나오지 않는다.
- 그 이유는 ROWNUM은 새로운 데이터를 가져오는 순간 1로 시작되어 어떠한 조건이 1보다 큰 경우를 만족을 못하면 결과가 없게 된다.
- 위와 같이 FROM절에 인라인뷰를 이용하여 SELECT 문에는 ROWNUM의 총 갯수를 정해주고 정한 RN의 조건을 설정해 조건에 해당되는 데이터가 출력하게 쿼리문을 작성한다.
2. Paging
게시판의 기본 구조인 페이징 처리를 Mybatis 와 Spring을 활용해 구현
Mapper Test
- 페이징 처리를 위해 페이지 번호, 한 페이지의 글 갯수를 나타내 줘야 하기 때문에 객체를 생성
- 생성자를 생성해 각각의 파라미터 값을 선언
- 해당 도메인 객체를 가지는 BoardMapper 인터페이스에 메소드 등록
- VO객체를 사용하기 위해 List로 담아 선언
- 3페이지에 해당 되는 10개의 글을 출력하는 Test
Service Test
- 기존 getList() 메소드를 페이징 처리를 위해 Criterita 객체를 파라미터에 선언
- ServiceImpl 에서 또한 기존 getList() 메소드를 페이징 처리를 위해 Criteria 객체를 파라미터에 선언후 BoardMapper에 선언한 getListWithPaging 메소드 호출
- Serivce Test 또한 출력이 잘되는 것을 확인 할 수 있다.
Controller Test
- Service Test 까지 했으면, Web View와 직접적인 관련이 있는 Controller Test까지 진행한다.
- 페이징 처리 된 list를 호출 하기 위해 Criteria 파라미터를 선언하고 model 객체로 메소드를 담는다.
- get 방식으로 /board/list 까지 가져간다
- Controller 또한 에러 없이 Test가 됬다.
페이징 처리
- 페이징 처리를 위해 PageDTO 도메인 객체를 생성 한다.
- PageDTO에 기존에 만들었던 객체인 Criteria를 선언하여 페이지 관련된 값을 넘겨 받고, total을 선언하여 총 데이터 수를 입력한다.
- 파라미터 값을 넣어 연산이 가능한 로직을 작성한다.
- list에 Criteria 객체를 생성하고 Model객체를 생성하여 데이터를 담는다
- PageDTO를 선언하여 파라미터 값에 값을 선언후 pageMaker에 담는다.
- Model 객체로 pageMaker에 보낸 데이터를 el태그를 통해 페이지 뷰에 작성
- 이전, 현재, 다음 페이지의 el태그 선언
결과화면
3. 검색기능
Select문을 활용해 검색기능과 화면처리
- 페이징 처리에 검색 조건이 들어가면서 Criteria 객체에 type, keyword 변수가 추가 되고 삼항연산자를 사용하여 null이면 배열을 만들고 아니면 split을 이용해 각 타입을 분리한다.
- 위와 같이 작성하고 prefixOverrides를 사용해 맨 앞에온 OR은 지우고 괄호와 AND를 prefix와 suffix로 나타낸다.
- Criteria 객체에서 생성한 TypeArr의 type을 foreach를 통해 반복
- choose when 구문으로 조건별 LIKE를 선언해 키워드 입력 시 OR을 이용하여 구문을 생성
- 뷰 페이지에서 select option 태그를 사용해 pageMaker의 cri 객체의 type이 각 검색할 내용들이라면 selected 하고 아니면 공백을 둔다
- keyword를 입력하는 input 태그를 추가한다.
- 검색 이후 페이지를 이동해도 동일한 검색 list가 출력되어야 하기 때문에 hidden으로 type과 keyword 선언
결과화면