jnk1m
Foliage IT
jnk1m
전체 방문자
오늘
어제
  • 분류 전체보기 (209)
    • Today I Learned (34)
    • Java (47)
    • Database (15)
    • [NHN Academy] (27)
    • Spring (47)
    • HTML + CSS + JavaScript (11)
    • JSP (3)
    • Node.js (10)
    • React Native (2)
    • 기타 (8)
    • 스크랩 (5)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
jnk1m

Foliage IT

Spring

[Spring] Day11 (Note): 페이징 처리

2022. 3. 31. 00:24

 

2022/3/30

 

페이징 처리

웹 페이지 개발할 때 중요한 것: 최소한의 필요한 데이터만 빨리 찾아서 빠르게 가져오는 것. 동시에 여러 명의 사용자가 많은 데이터를 요청하면 속도가 느려질 수밖에 없다.
데이터가 적은 경우가 아니면 오더 바이는 속도 때문에 사용을 자제.
인덱스를 사용하는 게 좋다.

 

*order by의 문제점: 성능 저하.
->
해결법: 인덱스를 사용. 인덱스를 이용해서 정렬을 생략하는 방법. 인덱스는 이미 정렬된 구조를 가지고 있다.

 

1. Oracle에서의 인덱스

*OLTL: On-Line Trasaction Processing = insert, update, delete가 실시간으로 자주 발생하는 것.
*OLAP: insert, update, delete
가 별로 사용될 일이 없는 것. DB를 저장만 해놓고 참고하는 형태.

B-Tree (Normal Index): OLTL 데이터 베이스에서 사용 (우리 해당 사항)

BITMAP: OLAP 데이터 베이스에서 주로 사용

함수 기반

어플리케이션 도메인

Index-Organized

 

2. 인덱스 특징

- 검색 속도가 무척 빨라질 수 있다. (잘 써야 빠르다.)

- 사용 결과에 해당하는 쿼리 부하가 줄어들어 결국 시스템 전체 성능 향상 가능

- 인덱스가 데이터 베이스 공간을 차지해서 추가적인 공간 필요함

- 처음 인덱스 생성 시 시간 많이 소요될 수 있다.

- 데이터 변경 작업이 자주 일어날 경우에는 오히려 성능이 나빠질 수도 있다.

 

3. 자동으로 생성되는 인덱스

인덱스는 테이블의 컬럼 단위에 생성된다. 하나의 컬럼을 인덱스로 생성할 수도 있고, 여러 컬럼에 하나의 인덱스를 생성할 수도 있다. ex) board 테이블에 컬럼이 여섯 개, 프라이머리 키인 bno를 기준으로 인덱스가 자동으로 생성됨.

테이블 생성 시 제약조건 Primary Key 또는 Unique를 사용하면 자동으로 인덱스가 생성된다.

[order by]
select * from board where bno > 0 orderby bno desc;

[index]

인덱스: select /*+INDEX_DESC(board pk_board)*/ 이거를 위에 select와 * 사이에 껴 넣으면 됨.

select /*+INDEX_DESC(board pk_board)*/ * from board where bno > 0;

인덱스는 색인이다. PK를 지정하는 이유는 식별의 문제도 있지만 인덱스를 만들기 위함도 있음.

인덱스와 실제 데이터를 연결시켜주는 게 있는데 Row ID, 실제 데이터가 저장되어 있는 주소이다. 데이터 베이스 안의 주소에 해당, 모든 데이터는 ROW ID를 가지고 있다. 데이터를 찾는 걸 스캔이라고 한다.

레코드가 적으면 인덱스 없이 테이블 전체를 스캔 떠서 Full Scan해도 빨리 처리되지만 레코드가 많으면 인덱스를 사용하는 것이 좋을 수도 있다.

 

4. 오라클에서 인덱스 힌트 사용하기 (어떻게 사용할지 오라클에게 알려주는 것)

select /*+힌트*/ 컬럼명 … from 테이블 명;
select --+
힌트 컬럼명 … from 테이블 명;

힌트 종류

①  FULL 힌트 : 전체 스캔
/*+FULL (
테이블명) */

②  INDEX_ASC, INDEX_DESC 힌트
/*+INDEX_ASC(
테이블명 인덱스명) */

 

5. ROWNUM

페이징 처리 시, 전체가 아닌 필요한 만큼의 데이터를 가져오고 싶을 때 정렬된 레코드에 넘버링해주기 위해 사용. 로우넘은 가상의 넘버.

 

게시판 페이징 처리

페이징 처리를 위한 파라미터

①  페이지 번호: pageNum

②  한 페이지 당 몇 개의 데이터를 보여줄 것인지: listQty

-> 묶어서 전달하기 위해 클래스 생성

 

1 페이지

pageNum = 1

listQty = 10 (한 페이지에 10개 글 보여주기)
where rownum <= 10) pageNum * listQty
where r > 0 (pageNum -1) * listQty

rownum 1~10

2 페이지

pageNum = 2

listQty = 10
where rownum <= 20) pageNum * listQty
where r > 10 (pageNum -1) * listQty

rownum 11~20

3 페이지

pageNum = 3

listQty = 10

rownum= 21~30

 

페이징 화면 처리

- 브라우저 주소창에 페이지 번호 전달해서 결과 확인하고

- JSP 페이지에 페이지 번호 출력

- 각 페이지 번호에 이벤트 처리

-전체 데이터 개수를 반영해 페이지 번호 조절

* 페이징 화면 처리 시 필요한 정보들

-현재 페이지 번호 (page)

-이전과 다음으로 이동 가능한 링크의 표시 여부 (prev, next)

-화면에서 보이는 페이지의 시작 번호와 끝 번호 (startPage, endPage)

 

*끝 번호 endPage

10.0으로 나누는 이유는 정수/정수=정수, 소수점도 필요하니 정수 / 실수 = 실수로 나오게 하기 위해

 

ceil (올림)

 

*시작 번호

startPage = endPage – 9;

 

*끝 번호 추가 계산

전체 레코드 수 totalRecord -> 페이지 전체 수 amount = 10
readEnd = (int)Math.ceil((totalRecord * 1.0)/amount)) //
전체 글의 페이지 개수
if(readEnd < endPage){
       endPage = totalPage;}

 

* 이전 prev, 다음 next (boolean)

prev = startPage > 1; //true / false

next = endPage < totalPage; //

값만 담고 있는 건 VO 담고 연산도 하는 건 DTO

 

 

    'Spring' 카테고리의 다른 글
    • [Spring] Day12 (Note): 게시판 검색, REST
    • [Spring] Day11 (Code): 페이징 처리
    • [Spring] Day10 (Code)
    • [Spring] Day10 (Note): Ajax, CRUD 게시판

    티스토리툴바