개발자의 오르막

SW 심화과정 22일차 본문

교육과정 ( SW 개발자 심화과정 )/Java

SW 심화과정 22일차

계단 2019. 8. 6. 09:45

-- 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
Comments