본문 바로가기
코딩

2022.03.30_36일차

by 흥뷰자 2022. 4. 23.

이징처리 밑에 번호 나오는 방식과 스크롤 내리면 추가되는 방식

스크롤 내리면 더보기뜨는건 ajax처리

 

ajax데이터 요청해서 밑에 계속 붙이는 방식

 

게시판에 보이는 글 순서 정렬 최신순부터

 

DB에 정렬하는 것 orderby컬럼기준 but 문제점 :DB레코드가 많을 수록 정렬 작업에 시간과 리소스가 소모가 됨. 사용자가 많으면 정렬 다 하면 시간이 엄청 늘어나겠지 서비스도 멈추고 다운되는 사태

컬럼에 있는거 누가 더큰지 다 비교하니까 이중포문 

 

데이터베이스 웹어플리케이션에서 가장 신경써야할 것: 속도 사용자편의에 가장중요

필요한 양만큼만 데이터를 가져오는것 다 가져올 필요 없으니까

orderby대신 index를 쓰는게 좋다. sql문

 


오라클에서의 인덱스 종류(DB의 내부 구조에 따라 어떻게 사용할지 달라짐)

B-TREE (가장 노멀. 많이씀) : OLTL 데이터베이스에서 사용 (Online Transaction Processiong = 쿼리문 insert, update, delete가 실시간으로 수정 자주 발생하는 DB) 

BITMAP : OLAP 데이터베이스에서 주로 사용 (insert, update, delete 별로 사용할 일 없는 것. 수정될 일이 없는 데이터. 그냥 DB저장하고 참고만 할 용도인 DB)

함수기반

어플리케이션 도메인

Index-Organized

 

* OLTL vs OLAP 

 

인덱스 특징 : 검색속도 향상 (잘쓰면), 쿼리 부하가 줄어 시스템 성능 향상, 인덱스 데이터베이스 공간 차지해서 추가 공간 필요, 처음 인덱스 생성하면 시간 많이 소요. 데이터 변경 작업 자주 일어나면 성능 나빠짐. 

정렬이 이미 된 것.

레코드가 적으면 인덱스 없이 Full Scan해도 처리 빠르지만 레코드가 많으면 인덱스를 쓰는 경우가 있으니까 필요할 때 쓰면 된다.

 

테이블 컬럼 단위에 생성되니까/ 하나의 컬럼을 인덱스로 생성할 수도 있고, 여러 컬럼에 하나의 인덱스를 생성할 수도 있다. 

인덱스 자동 생성되는 경우 테이블 생성 시 , 제약조건 (pimary key) 만들어놓거나, Unique를 사용하면 해당 칼럼을 기준으로 인덱스 만들어짐

 

우리가 인덱스 쓰는 경우 게시판 글을 정렬해야하니까. 

select * from board where bno > 0 order by bno desc;(내림차순)

인덱스 order by 대신 /*+ INDEX_DESC(board pk_board) */ 를 껴넣는다. 

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

(테이블이름)의 (인덱스로 쓸 컬럼)

테이블 이름

pk를 지정한다 = 인덱스를 만들겠다

 

bno index랑 실제 레코드를 연결해주는 게 rowid

rowid 실제 데이터가 저장되어 있는 주소. 모든 데이터가 갖는다 자바의 레퍼런트변수처럼 자신공간..

rowid10을하면 레코드 다 들어가니까 레코드 많으면 안좋아, 그래서 인덱스를 쓰는것

 

오라클에서 힌트 사용하기 : 힌트 풀스캔할지 인덱스쓸지 지정

select실행할 때 오라클의 옵티마이저가 알아서 판단해서 결정도 하지만 직접 지정해서 지정하는 게 힌트

 select 컬럼명, ... from 테이블명;

컬럼명 앞에 /*+ 힌트 */

--+ 힌트

를 적을수도

1. FULL힌트 : 전체스캔해라~~

/*+ FULL(테이블명) */ 

2. 인덱스써라(오름차손/내림차순으로) 

/*+ INDEX_ASC(테이블명 인덱스명) */ 인덱스명 또는 인덱스 따로생성안했으면    프라이머리키있으면 프라이머리키 이름

/*+ INDEX_DESC(테이블명 인덱스명) */

 

rownum 오라클db에서 제공

오더바이나 인덱스 써서 정렬한 다음에 한 페이지에 가져올 양을 잘라서 와야 함

bno로만 가져오면 중간에 삭제된 글은 가져오지 못하니까

새로운 넘버링을 기준으로 가져와야 하니까 이 때 사용. 

페이징 처리시 , 전체가 아닌 필요한 만큼의 데이터를 가져올 때 정렬된 레코드에 넘버링. 

실제 테이블에 저장되는 데이터가 아니고 가상의숫자. 테이블 정렬해놓은 결과에 가상으로 넘버링해주는 거

 

정렬 select * from board order by bno desc;

인덱스 select /*+ INDEX_DESC(board pk_board)*/ * from board;

동일한 결과 

select rownu, b.* from board b order by bno desc;

가져오겠다가 아니고

넘버링을 해주고 뒤에서  오더바이가 되니까 완전 섞인다 

 

select /*+ INDEX_DESC(board pk_board)*/ rownum r, b.* from board b;

인덱스로 이렇게 정렬 하고나서 로우넘을 붙여야 ..이러니까 bno가 섞이네

서브쿼리를 날려줘야 함 - 거른다음 또거르는것

select * from (select * from board); 한번 거른걸 다시 테이블로 가져와서 걸러

 

1페이지

select /*+ INDEX_DESC(board pk_board)*/

rownum r, b.* from board b

WHERE rownum > 0 and rownum <=10;

같은방식으로 2페이지 불러보면 안나옴 

rownum>10 rownum <=20;

왜냠 조건이 성립리 안되니까. 테이블에서 처음 나오는 값이 1이고 10보다 크지 않으니까 건너가.... 아예 제외시킴? 계속 rownum이 가져오는 데이터의 처음에 붙으니까 계속제외시키게 됨

조건을 먼저 검사해서 계속 1번을 붙이니까...rownum은 가상데이터라. 

최종

세번긁게되네


게시판 페이지 처리하려면 파라미터값이 필요하지

페이지 번호pageNum랑 한 페이지당 몇개 데이터를 보여줄지 listQty 변수와

묶어서 전달할 클래스 생성 

변수와 생성자들

기본생성자에는 첫페이지에 10개목록을 보여주도록 기본값을 세팅  

 

마이바티스에서 페이징 테스트 

매퍼에서 바로 페이징불러

크리테리아가 없으니까 컨트롤러에서 직접 생성해서


 

매퍼에 

2페이지에 10개보여줘

테스트끝났으니까 리스트 가져온ㄱㅓ 주석처리


화면에 페이지까지 보내주기

컨트롤러 list요청시 pageNum, listQty가 들어와야 함. 안들어오면 기본생성자로 넘어오겠지

페이지넘버요청 

http://localhost:8080/board/list?pageNum=1&listQty=10


페이지 화면처리

주소쳐서 들어오는 거 말이안되니까 

jsp페이지 아래에 번호들 출력/ 각 번호 클릭이벤트처리 onclick/ 전체 데이터 개수 반영해서 페이번호 조정

 

목록 조회해서 

수정삭제해도 페이지 번호가 유지되어야

컨텐트 들어갔다고 돌아와도 번호가 유지되어야

 

필요한 정보들 : 현재 페이지 번호 (page) / 이전과 다음으로 이동가능한 링크의 표시.. (prev), ...111, 112, 113, ... (next)/ 화면에서 보여지는 페이지의 시작번호와 끝 번호(startPage, endPage)

 

끝번호 endPage = (int)(Math.ceil(page/10.0)*10

시작번호 startPatge = endPage - 9

전체글의 페이지 개수 totalPage = Math.ceil((total*1.0)/amount)) 실수로 나눠야 소수점이 계산이 되니까/// 전체글(total)의 개수 보여줄 페이지수(10) 나눈 + 1 

if(totalPage<endPage){ endPage = totalPage; }

 

 

PageDTO 연산처리와 값변경되는 

보드컨트롤러

pageDTO는 list.jsp에서 필요한거니까

컨트롤러에서 생성해서 전달할거야


그러려면

화면으로 전체 글 개수 가져오기부터

매퍼부터 

서비스

컨트롤러

하단에 페이지 보일부분 추가

요청주소

http://localhost:8080/board/list?pageNum=1&listQty=2#

 

각각의 a태그에 클래스 속성 추가 

href를 값 들고 있는 애들처럼 변경 - 아래에 폼 태그 히든으로 숨겨놓고, 

그리고 그 값을 다시 스크립트로  (아이디로 불러서, 

눌렀을 때 맞는 페이지가 나오면 이동하게 자바스크립트로 제이쿼리

CDN붙여넣고 ready 안 재귀함수 속으로 다 이동

숨김 페이징 폼태그 가져오기 객체통으로가져와서 클릭한 애의 주소값으로 바꿔치기

페이지 눌렀을 때 이동처리

위에 했던 것도  수정해보기 . 동일하게 폼태그로 처리 

앞에 href 주소 지워주면 번호를 넣어준것

 

 

조회페이지로 이동하는거 리스트로 다시 돌아가면 보던 페이지로 가야하니까

컨텐트 페이지


그냥 수정삭제도 폼으로 처리하자

ㅅㅜ정 삭제부분도

 

파라미터 넘어가는 거 제조해서 돌려주는 메서드 만들기

댓글