[KOSTA] Spring 기반 Cloud 서비스 개발자 양성 과정 75일차 - Spring, Oracle DB Hint, Paging, Search

JUNBEOM PARK·2022년 5월 23일
0
post-thumbnail

📖 학습내용

  1. Oracle DB Hint
  2. Paging
  3. 검색기능

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

  • 10개 글 출력

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 선언

결과화면

profile
DB 엔지니어👍

0개의 댓글