개발자의 오르막
SW 심화과정 22일차 본문
-- NOTE_페이지나누기.txt
# 0.
현재 132개의 글이 등록되어 있다고 하자...
한 페이지에 10개의 글을 보여준다고 할때
0.0 테이블에 입력되어진 글의 갯수를 세려면
어떤 SQL 문장을 이용해야 하나?
0.1. page의 갯수는? 14페이지
그리고 글 번호를 이용하여 페이지의 갯수를
구해내는 공식은?
[페이지수] = ( ( [레코드수] - 1 ) / [페이지당글수] ) + 1;
즉 ( ( 132 - 1 ) / 10 ) + 1 은 14.
1페이지 부터 14 페이지 까지 존재하게 된다.
현재 페이지를 [CP]
페이지 수를 [NP]
여기서 시작페이지를 [SP]
끝 베이지를 [EP] 라고 칭하자.
0.2.
....
....
....
1 2 3 4 5 >
와 같은 형태로 글 목록을 보여준다.
여기서 한번에 5개씩 끊어서 보여준다고 정할때
( 이를 blockSize 라고 하자 )
현재 페이지가 3이다
block이 시작되는 페이지는? 1
block이 끝나는 페이지는? 5
이를 이용하여 page의 갯수와 현재 page 번호를 이용하여
block의 시작페이지와 끝 페이지를 구하는 공식을
도출해 내자.
블럭사이즈를 [BS] 라고 하자. ( 여기서는 5다 )
[블럭시작] = ( ( [CP] -1 ) / [BS] ) * [BS] + 1
즉 ( ( 3 - 1 ) / 5 ) * 5 + 1 이므로 결과는 1
[블럭끝] = [블럭시작] + [BS] - 1 과 [EP] 중 작은값
5 와 14 중 작은 값이니까 5
[블럭시작] 을 [BB] 라고 하고
[블럭끝] 을 [BE] 라고 하자.
0.3 < 표시를 보일것인지 말것인지를 구하는 논리는?
( [BS] != 1 ) :
> 표시를 보일것인지 말것인지를 구하는 논리는?
( [BE] != [EP] ) :
---
DROP TABLE Temp10T;
CREATE TABLE Temp10T(
id NUMBER(3) ,
title VARCHAR2(7) );
INSERT INTO Temp10T VALUES (1,'abcde1');
INSERT INTO Temp10T VALUES (2,'bcdef2');
INSERT INTO Temp10T VALUES (4,'abcde4');
INSERT INTO Temp10T VALUES (5,'defgh5');
INSERT INTO Temp10T VALUES (6,'cdefg6');
INSERT INTO Temp10T VALUES (8,'bcdef8');
INSERT INTO Temp10T VALUES (9,'abcde9');
INSERT INTO Temp10T VALUES (10,'cdefg10');
INSERT INTO Temp10T VALUES (11,'defgh11');
INSERT INTO Temp10T VALUES (14,'bcdef14');
INSERT INTO Temp10T VALUES (15,'defgh15');
INSERT INTO Temp10T VALUES (16,'abcde16');
INSERT INTO Temp10T VALUES (17,'defgh17');
INSERT INTO Temp10T VALUES (18,'cdefg18');
INSERT INTO Temp10T VALUES (20,'efghi20');
INSERT INTO Temp10T VALUES (21,'abcde21');
INSERT INTO Temp10T VALUES (22,'bcdef22');
INSERT INTO Temp10T VALUES (23,'defgh23');
INSERT INTO Temp10T VALUES (25,'cdefg25');
INSERT INTO Temp10T VALUES (26,'abcde26');
INSERT INTO Temp10T VALUES (28,'cdefg28');
INSERT INTO Temp10T VALUES (30,'efghi30');
INSERT INTO Temp10T VALUES (31,'bcdef31');
INSERT INTO Temp10T VALUES (33,'abcde33');
INSERT INTO Temp10T VALUES (34,'efghi34');
INSERT INTO Temp10T VALUES (36,'bcdef36');
INSERT INTO Temp10T VALUES (37,'abcde37');
INSERT INTO Temp10T VALUES (39,'efghi39');
select * from temp10t where id > 0 and id <=10;
select * from temp10t where id > 10 and id <=20
예전 하이텔 같은 곳에서는 이렇게 쪼갰다.
페이지당 글 수가 들쑥날쑥하다.
1. 정렬을 시켜준다.
select * form temp10t where 0 = 0 order by id desc;
select rownum , id from temp10t where 0 = 0 order by id desc;
# 1. 정렬된 순서 보기
SELECT id, title FROM Temp10T ORDER BY id DESC;
# 2. rownum??
SELECT id, rownum FROM Temp10T;
SELECT id, rownum FROM Temp10T ORDER BY id DESC;
- rownum 은 order by 이전에 우선적으로 정렬됨으로 의미 없다.
- 따라서 order by 이후에 rownum 으로 쪼개는 건 무의미하다.
SELECT id, rownum FROM
( SELECT id FROM Temp10T where 0=0 ORDER BY id DESC );
- 그럼 order by 시켜놓고 그 다음에 rownum 을 붙이겠다.
# 3. rownum을 기준으로 페이지 나누기?
SELECT id, rownum FROM
( SELECT id FROM Temp10T ORDER BY id DESC )
WHERE rownum > 0 AND rownum <= 10;
- 이 때 record 는 뽑히지만,
SELECT id, rownum FROM
( SELECT id FROM Temp10T ORDER BY id DESC )
WHERE rownum > 10 AND rownum <= 20;
- 문제가 생김, where 절에서 10개를 가져오는데, 10 ~ 20 사이의 레코드 없음
- where이 먼저 적용되서, 데이터를 가져오는데,
rownum 은
# 4. rownum을 field로 굳혀놓고 나누기!!
SELECT id, rownum as sq FROM
( SELECT id FROM Temp10T ORDER BY id DESC );
SELECT id FROM
( SELECT id, rownum as sq FROM
( SELECT id FROM Temp10T ORDER BY id DESC ) )
WHERE sq > 0 AND sq <= 10;
SELECT id FROM
( SELECT id, rownum as sq FROM
( SELECT id FROM Temp10T ORDER BY id DESC ) )
WHERE sq > 10 AND sq <= 20;
# 5. 서브쿼리로 정리해서 깔끔하게!!
SELECT * FROM Temp10T WHERE id IN
(
SELECT id FROM
( SELECT id, rownum as sq FROM
( SELECT id FROM Temp10T ORDER BY id DESC ) )
WHERE sq > 10 AND sq <= 20
)
ORDER BY id DESC;
# 6. 나중의 검색을 위해서 0 = 0은 그냥 끼워 넣어준다.
( 검색을 어떻게 할지 생각해 보자 )
SELECT * FROM Temp10T WHERE id IN
(
SELECT id FROM
( SELECT id, rownum as sq FROM
( SELECT id FROM Temp10T WHERE 0 = 0 ORDER BY id DESC ) )
WHERE sq > 5 AND sq <= 10
)
ORDER BY id DESC;
- 검색 : 0 = 0 위치가 검색 조건이 들어갈 위치
여기에서 0 = 0 을 응용하여 검색기능에서의 나누기 시도한다.
SELECT * FROM Temp10T WHERE id IN
(
SELECT id FROM
( SELECT id, rownum as sq FROM
( SELECT id FROM Temp10T WHERE title like '%bc%' ORDER BY id DESC ) )
WHERE sq > 5 AND sq <= 10
)
ORDER BY id DESC;
MySQL 확인하기
DROP TABLE Temp10T;
CREATE TABLE Temp10T(
id int ,
title VARCHAR(7) );
INSERT INTO Temp10T VALUES (1,'abcde1');
INSERT INTO Temp10T VALUES (2,'bcdef2');
INSERT INTO Temp10T VALUES (4,'abcde4');
INSERT INTO Temp10T VALUES (5,'defgh5');
INSERT INTO Temp10T VALUES (6,'cdefg6');
INSERT INTO Temp10T VALUES (8,'bcdef8');
INSERT INTO Temp10T VALUES (9,'abcde9');
INSERT INTO Temp10T VALUES (10,'cdefg10');
INSERT INTO Temp10T VALUES (11,'defgh11');
INSERT INTO Temp10T VALUES (14,'bcdef14');
INSERT INTO Temp10T VALUES (15,'defgh15');
INSERT INTO Temp10T VALUES (16,'abcde16');
INSERT INTO Temp10T VALUES (17,'defgh17');
INSERT INTO Temp10T VALUES (18,'cdefg18');
INSERT INTO Temp10T VALUES (20,'efghi20');
INSERT INTO Temp10T VALUES (21,'abcde21');
INSERT INTO Temp10T VALUES (22,'bcdef22');
INSERT INTO Temp10T VALUES (23,'defgh23');
INSERT INTO Temp10T VALUES (25,'cdefg25');
INSERT INTO Temp10T VALUES (26,'abcde26');
INSERT INTO Temp10T VALUES (28,'cdefg28');
INSERT INTO Temp10T VALUES (30,'efghi30');
INSERT INTO Temp10T VALUES (31,'bcdef31');
INSERT INTO Temp10T VALUES (33,'abcde33');
INSERT INTO Temp10T VALUES (34,'efghi34');
INSERT INTO Temp10T VALUES (36,'bcdef36');
INSERT INTO Temp10T VALUES (37,'abcde37');
INSERT INTO Temp10T VALUES (39,'efghi39');
select * from temp10t order by id desc;
select * from temp10t order by id desc limit 10,10;
- 오라클에 비해 게시판만 보면 mysql 이 정점이 많다.
- limit 10, 10 은 10개 건너뛰고 10개 보여주어라.
StringBuffer find = new StringBuffer(" WHERE 0 = 0");
if( title != null ){
find.append(" AND title LIKE '%");
find.append( title );
find.append("%'");
}
if( user != null ){
find.append(" AND user ='");
find.append( title );
find.append("'");
}
if( content != null ){
find.append(" AND content LIKE '%");
find.append( content );
find.append("%'");
}
String subSql = "SELECT id FROM " +
"( SELECT id, rownum as sq FROM " +
"( SELECT id FROM Temp10T "+ find.toString() +
" ORDER BY id DESC ) )" +
"WHERE sq > 5 AND sq <= 10";
String countSql = "SELECT COUNT(*) FROM Temp10T " + find.toString();
String sql = "SELECT * FROM ("+ subSql +") ORDER BY id DESC";
그러면 아래와 같은 형태의 결과를 보게 될 것이다.
SELECT COUNT(*) FROM Temp10T WHERE 0 = 0 AND
user = 'root' AND content LIKE '%ab%'
....
SELECT * FROM Temp10T WHERE id IN
(
SELECT id FROM
( SELECT id, rownum as sq FROM
( SELECT id FROM Temp10T WHERE 0 = 0 AND
user = 'root' AND content LIKE '%ab%' ORDER BY id DESC ) )
WHERE sq > 0 AND sq <= 3
)
ORDER BY id DESC;
# 부트스트랩
- form 태그
- 그리드 태그 적용
# 자바스크립트
- script 함수
- op.onclick 은 op 포인터가 가리키는 개체의 onclick 이라는 변수(프로퍼티)
javascript 변수는 다 가리킬 수 있따.
onclick 은 이름없는 함수를 가리키게 된다.
가리키는 것과 호출하는 것은 다르다.
호출되는 시점? op 가 가리키는 객체에 click 상황이 벌어지면
onclick이 가리키는 함수가 호출된다.
이벤트처리의 두가지 방법
1. onXXX 속성을 이용하는 방법 : onclick="alert();"
2. onXXX 속성을 함수포인터로 쓰는 방법 : 아래 코드의 방법
(두번째 방법이 더 많이 쓰인다.)
# JSON
- json 에는 인스턴스와 클래스의 구분이 없다.
- 클래스 없이 만들어진 인스턴스가 JSON 객체의 개념
- 객체는 내부에 멤버변수를 가진다.
- doit 이라는 변수가 이 함수를 가리키는 형태
doit 을 함수 포인터 개념으로 보면 딱 맞는다.
- 멤버함수 안에서는 this. 를 쓸 수 있다. (java 의 this 개념과 같다)
- javascript 안에서 객체를 표현한 문법을 javascript object notation :
JSON- json 에는 인스턴스와 클래스의 구분이 없다.
- 클래스 없이 만들어진 인스턴스가 JSON 객체의 개념
- 객체는 내부에 멤버변수를 가진다.
- doit 이라는 변수가 이 함수를 가리키는 형태
doit 을 함수 포인터 개념으로 보면 딱 맞는다.
- 멤버함수 안에서는 this. 를 쓸 수 있다. (java 의 this 개념과 같다)
- javascript 안에서 객체를 표현한 문법을
javascript object notation : JSON
- 12번 파일에서 표기된 문자열을 컴파일하여 객체를 만들 수 있다.
- 자바스크립트의 eval 은 문장을 컴파일할 수 있다.
- javascript 안에서 요청/응답을 수행할 수 있는 객체가 있다면
그것을 이용해서 응답으로 받고 곧바로 컴파일 & 활용 가능하다.
- javascript 에서 요청, 응답을 수행할 수 있는 객체가 ajax이다.
- ajax는 javascript 로 요청/응답을 수행할 수 있는 객체이다.
- java로 요청, 응답을 수행하는 객체는 java.net.URL
- 이것을 정교하게 다듬은게 apache 의 httpClient
- setTimeout("문자열",시간);
- 시간 뒤에 ..을 컴파일해서 실행합니다.
- 웹은 기본적으로 가만히 있으면 변하지 않는다. (요청이 가야 응답이 온다)
- 최신의 정보로 새로고침을 해주어야 할 때가 있다.
- 위의 코드를 이용할 수 있고, 이것은 쓰레드와 유사한 효과도 낸다.
'교육과정 ( SW 개발자 심화과정 ) > Java' 카테고리의 다른 글
SW 심화과정 23일차 (0) | 2019.08.07 |
---|---|
SW 심화과정 21일차 (0) | 2019.08.05 |
SW 심화과정 18일차 (0) | 2019.08.02 |
SW 심화과정 17일차 (0) | 2019.07.31 |
SW 심화과정 16일차 (0) | 2019.07.30 |