블로그 이미지
우디냥
"지금 잠을 자면 꿈을 꾸지만, 지금 공부하면 꿈을 이룰수있다"

calendar

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Notice

 AOP (Aspect Oriented Programming : 관점 지향 프로그래밍)
 - 기능을 핵심 비즈니스 로직과 공통 모듈로 구분하고, 핵심로직에 영향을 미치지 않고 사이
  사이에 공통모듈을 효과적으로 잘 끼워넣도록 하는 개발 방법.
 
DI (Dependency Injection : 종속객체 주입)
 - 클래스 간의 종속성을 연결해주기 위해 xml파일에 두 클래스의 종속관계를 정의
    xml파일은 class외부를 의미. ( 설정파일을 통해 객체에게 의존관계를 알려준다.)
posted by 우디냥
ㅁ Edit칸에 기본 설정을 한글로 설정해주는 property
       lmeMod  => keep.native

ㅁ Edit칸 자동 커서 움직임 설정 property 
       Action에 AutoSkip => True (자동 커서 설정)
       단, Mask랑 cleander는 설정안됌!

ㅁ Tab키를 눌렀을때 커서의 움직임 순서 설정
       1. 마우스 오른쪽 Tab Order
       2. ctrl + d

ㅁ Edit칸 영문과 숫자만 입력되게 설정
      UseIME => false
      ImeMod => english

ㅁ Edit칸 드래그 가능하게 설정
      Readonly => true
      Enable => true
posted by 우디냥


-  Select 후 데이터칸에서 오른쪽마우스 [ Fetch all rows ] 클릭  
       전체적인 데이터행들이 출력되어진다.
-  Data 출력 행 첫번째셀을 선택 오른쪽마우스 [ Save/show grid as a excel file...]
       엑셀로 저장 되어진다.
posted by 우디냥

Tomcat6.0버젼에서는 web.xml 파일에 servlet 기능이 주석처리 되어 있으므로 ,
servlet기능 구동을 위해서는 주석을 제거해줘야 한다.

▶ web.xml 설정
       - ctrl + f를 눌러 invoker를 찾아준다. 

    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>


-> 해당부분을 찾아 주석제거! 

    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>


-> 두번째 invoker 부분도 주석제거!

▶ context.xml 설정
      - web.xml을 설정하고도 tomcat 실행시 Exception이 일어난다면 context.xml을 확인
        context 태그를 수정해준다.
   
    <Contextreloadable = "true" privileged = "true">
     


위와 같이 변경해주면..
servlet이 실행된다.
 

posted by 우디냥
  • BENCHMARK(count,expr)

BENCHMARK() 함수는 수식 expr count 횟수 만큼 반복 실행한다. 이 함수는 MySQL이 수식을 얼마나 빨리 처리하는지를 계산할 때 사용할 수가 있다. 그 결과 값은 항상 0 이 된다. mysql 클라이언트 내부에서 이 함수를 의도적으로 사용할 수가 있는데, 이것은 쿼리 실행 횟수를 레포트한다:

mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye'));
+----------------------------------------------+
| BENCHMARK(1000000,ENCODE('hello','goodbye')) |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
1 row in set (4.74 sec)

레포트된 시간은 클라이언트 단에서의 경과 시간이며, 서버단에서의 CPU 경과 시간은 아니다. BENCHMARK() 함수를 여러 번 반복 실행하는 것이 좋으며, 이를 통해서 서버 머신이 얼마나 로드가 걸려 있는지 알 수가 있다.

  • CHARSET(str)

스트링 인수의 문자 셋을 리턴한다.

mysql> SELECT CHARSET('abc');
        -> 'latin1'
mysql> SELECT CHARSET(CONVERT('abc' USING utf8));
        -> 'utf8'
mysql> SELECT CHARSET(USER());
        -> 'utf8'
  • COERCIBILITY(str)

스트링 인수의 콜레션 코에시빌러티 (collation coercibility) 값을 리턴한다.

mysql> SELECT COERCIBILITY('abc' COLLATE latin1_swedish_ci);
        -> 0
mysql> SELECT COERCIBILITY(USER());
        -> 3
mysql> SELECT COERCIBILITY('abc');
        -> 4

리턴되는 값은 아래 테이블에 설명된 의미를 갖는다. 값이 낮을 수로 높은 우선 순위를 갖는다.

 

Coercibility

Meaning

Example

0

Explicit collation

Value with COLLATE clause

1

No collation

Concatenation of strings with different collations

2

Implicit collation

Column value

3

System constant

USER() return value

4

Coercible

Literal string

5

Ignorable

NULL or an expression derived from NULL


MySQL 5.0.3 이전 버전의 경우, 리턴 값은 아래의 의미를 갖고 있었으며, USER() 와 같은 함수는 코에시빌러티가 2가 된다:

 

Coercibility

Meaning

Example

0

Explicit collation

Value with COLLATE clause

1

No collation

Concatenation of strings with different collations

2

Implicit collation

Column value, stored routine parameter or local variable

3

Coercible

Literal string

  • COLLATION(str)

스트링 인수의 콜레션을 리턴한다.

mysql> SELECT COLLATION('abc');
        -> 'latin1_swedish_ci'
mysql> SELECT COLLATION(_utf8'abc');
        -> 'utf8_general_ci'
  • CONNECTION_ID()

커넥션에 대한 커넥션 ID (쓰레드 ID)를 리턴한다. 모든 커넥션은 고유의 ID를 가지게 된다.

mysql> SELECT CONNECTION_ID();
        -> 23786
  • CURRENT_USER, CURRENT_USER()

서버가 현재의 클라이언트를 인증하기 위해 사용한 MySQL 계정에 대한 사용자 이름과 호스트 이름의 조합을 리턴한다. 이 계정은 여러분의 접속 권한을 결정한다. MySQL 5.0.10 버전까지는, SQL SECURITY DEFINER 특성으로 정의된 스토어드 루틴내에서, CURRENT_USER()은 루틴의 생성자 (creator)를 리턴한다. 리턴 값은 utf8 문자 셋에 있는 스트링이 된다.

CURRENT_USER()의 값은 USER()의 리턴 값과는 다르다.

mysql> SELECT USER();
        -> 'davida@localhost'
mysql> SELECT * FROM mysql.user;
ERROR 1044: Access denied for user ''@'localhost' to
database 'mysql'
mysql> SELECT CURRENT_USER();
        -> '@localhost'

위의 예제는, 클라이언트가 davida (USER() 함수가 가리키는 것 처럼)의 사용자 이름을 지정하였더라도, 서버는 익명의 사용자 이름 (CURRENT_USER() 값의 빈 사용자 이름 부분으로 보여지는)을 사용해서 클라이언트를 인증하고 있음을 보여 주는 것이다. 그 이유 중의 하나는 davida에 대한 그랜트 테이블에 아무런 계정 정보도 없기 때문이다.

  • DATABASE()

디폴트 (현재) 데이터 베이스 이름을 utf8 문자 셋의 스트링 형태로 리턴한다. 만일 데폴트 데이터베이스 이름이 존재하지 않는다면, DATABASE()NULL 을 리턴한다. 스토어드 루틴내에서는, 루틴이 연결되어 있는 데이터 베이스가 디폴트 데이터베이스가 되며, 이것이 반드시 호출 문맥 (context)에 있는 디폴트 데이터 베이스가 될 필요는 없다.

mysql> SELECT DATABASE();
        -> 'test'
  • FOUND_ROWS()

SELECT 명령문은 서버가 클라이언트에게 리턴하는 열의 숫자를 제한하기 위한 LIMIT 구문을 포함할 수도 있다. 어떤 경우에는, LIMIT 구문 없이 얼마나 많은 수의 열이 리턴되는지 알고 있는 것이 바람직하다. 이렇게 열의 숫자를 세기 위해서는, SELECT 명령문 안에 SQL_CALC_FOUND_ROWS 옵션을 추가하고, 나중에 FOUND_ROWS() 함수를 선언한다:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

두 번째 SELECTLIMIT 구문이 없이 작성된 첫 번째 SELECT가 얼마나 많은 열을 리턴했는지를 나타내는 숫자를 리턴한다. (만일 이전 SELECT 명령문에 SQL_CALC_FOUND_ROWS 옵션이 포함되어 있지 않다면, FOUND_ROWS()LIMIT가 사용되었을 경우와는 다른 결과를 리턴한다.)

 

FOUND_ROWS()를 통해서 셀 수 있는 열은 의미가 없으며, SELECT SQL_CALC_FOUND_ROWS 명령문 다음에 나오는 명령문들에도 의미가 없게 된다. 만일 나중에 이 값을 참조하고자 한다면, 우선 저장을 해 둔다:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
mysql> SET @rows = FOUND_ROWS();

만일 여러분이 SELECT SQL_CALC_FOUND_ROWS를 사용한다면, MySQL은 결과 셋 전체에 얼마나 많은 열이 있는지를 계산하게 된다. 하지만, 이렇게 하면 LIMIT 를 사용하지 않고 쿼리를 다시 구동시키는 것 보다 속도가 빨라지게 되는데, 그 이유는 결과 셋을 클라이언트에 전달할 필요가 없기 때문이다.

 

SQL_CALC_FOUND_ROWS FOUND_ROWS()는 쿼리가 리턴하는 열의 수를 제한하고자 할 때 뿐만 아니라, 쿼리를 다시 구동 시키지 않고서 전체 결과 셋에 있는 열의 숫자를 파악하고자 할 때 유용하게 사용할 수가 있는 함수이다. 어떤 검색 결과에 대한 다른 섹션을 보여주는 페이지에 대한 링크를 가지고 있는 페이지 디스플레이를 표현하는 웹 스크립트가 한 가지 예가 된다. FOUND_ROWS()를 사용하면 여러분은 결과 값의 나머지에 대해서 다른 페이지가 얼마나 필요한지를 알아낼 수가 있다.

 

SQL_CALC_FOUND_ROWS FOUND_ROWS()의 사용은 단순한 SELECT 명령문에 대해서 보다 UNION 명령문에 대해서가 훨씬 복잡한데, 그 이유는 LIMITUNION 내의 여러 곳에서 발생할 수가 있기 때문이다. UNION 내의 개별적인 SELECT 명령문에 적용하거나, 또는 전체적으로 UNION 결과에 적용할 수도 있다.

 

UNION 에 대해서 SQL_CALC_FOUND_ROWS를 사용하는 것은, 이것이 글로벌 LIMIT 없이 리턴되는 열 카운트를 리턴하기 때문이다. UNION 과 함께 SQL_CALC_FOUND_ROWS를 사용하는 조건은 다음과 같다:

    • SQL_CALC_FOUND_ROWS 키워드는 반드시 UNION의 맨 처음 SELECT 에 나타나야 한다.
    • FOUND_ROWS()의 값은 UNION ALL 이 사용되는 경우에만 정확하게 된다. 만일 UNION ALL  없이 사용된다면, 중복 제거가 발생하고 FOUND_ROWS()의 값은 추정치가 된다.
    • 만일 LIMIT UNION 내에 나타나면, SQL_CALC_FOUND_ROWS 은 무시가 되고 UNION을 처리하기 위해 생성된 임시 테이블에 있는 열의 숫자가 리턴된다.

 

  • LAST_INSERT_ID(), LAST_INSERT_ID(expr)

가장 최근의 INSERT 또는 UPDATE 명령문에 의해 AUTO_INCREMENT 컬럼용으로 설정된 값 중에 맨 처음으로 자동 생성된 값을 리턴한다.

mysql> SELECT LAST_INSERT_ID();
        -> 195

생성된 ID 는 커넥션 별로 서버에 의해 관리된다. , 이 함수에 의해 주어진 클라이언트에 리턴되는 값은 클라이언트에 의해 AUTO_INCREMENT 컬럼에 영향을 주는 가장 최근의 명령문을 위해 클라이언트가 생성한 맨 처음의 AUTO_INCREMENT 값이 된다. 이 값은 다른 클라이언트에 의해서는 영향을 받지 않게 되는데, 다른 클라이언트가 자신의 고유 AUTO_INCREMENT 값을 생성한다고 하더라도 마찬가지가 된다. 이러한 특성으로 인해 각각의 클라이언트는 다른 클라이언트의 행동에는 상관없이 자신만의 고유 ID를 가질 수 있게 되며, 락 또는 트랜젝션이 필요 없게 되는 것이다.

 

LAST_INSERT_ID()의 값은 여러분이 열의 AUTO_INCREMENT 컬럼을 비-“magic (, NULL 0 이 아닌 값)으로 설정한다면 변경되지 않는다.

 

Important: 만일 여러분이 하나의 INSERT 명령문을이용해서 여러 개의 열을 삽입한다면, LAST_INSERT_ID()은 맨 처음 삽입된 열에 대한 값만을 리턴하게 된다. 이렇게 되는 이유는, 다른 서버들에 대응해서 동일한 INSERT 명령문을 쉽게 재 생성할 수 있도록 하기 위함이다.

예문을 보도록 하자:

mysql> USE test;
Database changed
mysql> CREATE TABLE t (
    ->   id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   name VARCHAR(10) NOT NULL
    -> );
Query OK, 0 rows affected (0.09 sec)
 
mysql> INSERT INTO t VALUES (NULL, 'Bob');
Query OK, 1 row affected (0.01 sec)
 
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
+----+------+
1 row in set (0.01 sec)
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)
 
mysql> INSERT INTO t VALUES
    -> (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
|  2 | Mary |
|  3 | Jane |
|  4 | Lisa |
+----+------+
4 rows in set (0.01 sec)
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+
1 row in set (0.00 sec)

비록 두 번째 INSERT 명령문이 3개의 새로운 열을 t 에 삽입하기는 하지만, 이렇게 삽입된 열중의 맨 처음 열을 위해 생성된 ID 2가 되며, 이 값이 뒤따라 나오는 SELECT 명령문을 위해 LAST_INSERT_ID()가 리턴하는 값이 되는 것이다.

 

만일 여러분이 NSERT IGNORE를 사용해서 그 열을 무시한다면, AUTO_INCREMENT 카운터는 증가하지 않게 되고 LAST_INSERT_ID()0 을 리턴하는데, 이것은 아무런 열도 삽입되지 않았다는 것을 의미하는 것이다.

 

만일 expr LAST_INSERT_ID()에 대한 인수 형태로 주어진다면, 그 인수의 값은 함수에 의해 리턴되고 LAST_INSERT_ID()에 의해 리턴되어야 할 다음 값으로 기억된다. 이것은 시퀀스를 시뮬레이트하기 위해 사용될 수가 있다:

 

  • 시퀀스 카운터를 가지고 있기 위한 테이블을 생성하고 초기화 시킨다:
mysql> CREATE TABLE sequence (id INT NOT NULL);
mysql> INSERT INTO sequence VALUES (0);
  •  아래와 같이 시퀀스 숫자를 생성하기 위해 테이블을 사용한다:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
mysql> SELECT LAST_INSERT_ID();

UPDATE 명령문은 시퀀스 카운터를 증가시키고 LAST_INSERT_ID()에 대한 다음 호출이 업데이트된 값을 리턴 하도록 만든다. SELECT 명령문은 그 값을 복구시킨다. mysql_insert_id() C API 함수 역시 이 값을 가져오는데 사용할 수가 있다. Section 22.2.3.36, “mysql_insert_id()를 참조할 것.

 

여러분은 LAST_INSERT_ID()를 호출하지 않고서도 시퀀스를 생성할 수 있지만, 위와 같은 방식으로 이 함수를 사용하는 것이 최종적으로 자동 생성된 값을 서버에서 유지 관리하는데 더 효율적이 된다. 여러 명의 클라이언트가 UPDATE 명령문을 실행해서 SELECT 명령문을 사용해서 자신들의 고유 시퀀스 값을 가져가기 때문에 이러한 방식이 더욱 안전한 것이다.

 

mysql_insert_id()INSERT UPDATE 명령문이 실행된이후에만 업데이트가 된다는 점을 알아두자. 따라서, 여러분은 SELECT 또는 SET과 같은 다른 SQL 명령문을 실행한 후에 LAST_INSERT_ID(expr)에 대한 값을 추출하기 위해 C API 함수를 사용할 수는 없게 된다.

  • ROW_COUNT()

ROW_COUNT()는 이전 명령문에 의해 업데이트, 삽입, 또는 삭제된 열의 숫자를 리턴한다. 이 값은 mysql_affected_rows() C API 함수로부터 얻는 열 카운트 값과 같은 값이 된다.

mysql> INSERT INTO t VALUES(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
|           3 |
+-------------+
1 row in set (0.00 sec)
 
mysql> DELETE FROM t WHERE i IN(1,2);
Query OK, 2 rows affected (0.00 sec)
 
mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)

ROW_COUNT() MySQL 5.0.1에서 추가되었다.

  • SCHEMA()

이 함수는 DATABASE()과 동일한 것이며, MySQL 5.0.2에서 추가가 되었다.

  • SESSION_USER()

SESSION_USER()USER()과 동일한 함수다.

  • SYSTEM_USER()

SYSTEM_USER()USER()과 동일한 함수다.

  • USER()

현재의 MySQL 사용자 이름과 호스트 이름을 utf8 문자 셋의 스트링 형태로 리턴한다.

mysql> SELECT USER();
        -> 'davida@localhost'

결과 값은 여러분이 서버에 접속을 할 때 지정한 사용자 이름을 가리키게 되며, 여러분이 접속한 클라이언트 호스트가 된다. 이 값은 CURRENT_USER()의 값과 다른 값이다.

여러분은 아래와 같이 사용자 이름만 얻을 수도 있다:

mysql> SELECT SUBSTRING_INDEX(USER(),'@',1);
        -> 'davida'
  • VERSION()

MySQL  서버 버전을 가리키는 스트링을 리턴한다. 스트링은 utf8 문자 셋을 사용한다.

mysql> SELECT VERSION();
        -> '5.0.23-standard'

만일 여러분의 버전 스트링이 -log 로 끝난다면, 이것은 로깅이 현재 활성화 되어 있음을 의미하는 것이다.

  • BENCHMARK(count,expr)

BENCHMARK() 함수는 수식 expr count 횟수 만큼 반복 실행한다. 이 함수는 MySQL이 수식을 얼마나 빨리 처리하는지를 계산할 때 사용할 수가 있다. 그 결과 값은 항상 0 이 된다. mysql 클라이언트 내부에서 이 함수를 의도적으로 사용할 수가 있는데, 이것은 쿼리 실행 횟수를 레포트한다:

mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye'));
+----------------------------------------------+
| BENCHMARK(1000000,ENCODE('hello','goodbye')) |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
1 row in set (4.74 sec)

레포트된 시간은 클라이언트 단에서의 경과 시간이며, 서버단에서의 CPU 경과 시간은 아니다. BENCHMARK() 함수를 여러 번 반복 실행하는 것이 좋으며, 이를 통해서 서버 머신이 얼마나 로드가 걸려 있는지 알 수가 있다.

  • CHARSET(str)

스트링 인수의 문자 셋을 리턴한다.

mysql> SELECT CHARSET('abc');
        -> 'latin1'
mysql> SELECT CHARSET(CONVERT('abc' USING utf8));
        -> 'utf8'
mysql> SELECT CHARSET(USER());
        -> 'utf8'
  • COERCIBILITY(str)

스트링 인수의 콜레션 코에시빌러티 (collation coercibility) 값을 리턴한다.

mysql> SELECT COERCIBILITY('abc' COLLATE latin1_swedish_ci);
        -> 0
mysql> SELECT COERCIBILITY(USER());
        -> 3
mysql> SELECT COERCIBILITY('abc');
        -> 4

리턴되는 값은 아래 테이블에 설명된 의미를 갖는다. 값이 낮을 수로 높은 우선 순위를 갖는다.

 

Coercibility

Meaning

Example

0

Explicit collation

Value with COLLATE clause

1

No collation

Concatenation of strings with different collations

2

Implicit collation

Column value

3

System constant

USER() return value

4

Coercible

Literal string

5

Ignorable

NULL or an expression derived from NULL


MySQL 5.0.3 이전 버전의 경우, 리턴 값은 아래의 의미를 갖고 있었으며, USER() 와 같은 함수는 코에시빌러티가 2가 된다:

 

Coercibility

Meaning

Example

0

Explicit collation

Value with COLLATE clause

1

No collation

Concatenation of strings with different collations

2

Implicit collation

Column value, stored routine parameter or local variable

3

Coercible

Literal string

  • COLLATION(str)

스트링 인수의 콜레션을 리턴한다.

mysql> SELECT COLLATION('abc');
        -> 'latin1_swedish_ci'
mysql> SELECT COLLATION(_utf8'abc');
        -> 'utf8_general_ci'
  • CONNECTION_ID()

커넥션에 대한 커넥션 ID (쓰레드 ID)를 리턴한다. 모든 커넥션은 고유의 ID를 가지게 된다.

mysql> SELECT CONNECTION_ID();
        -> 23786
  • CURRENT_USER, CURRENT_USER()

서버가 현재의 클라이언트를 인증하기 위해 사용한 MySQL 계정에 대한 사용자 이름과 호스트 이름의 조합을 리턴한다. 이 계정은 여러분의 접속 권한을 결정한다. MySQL 5.0.10 버전까지는, SQL SECURITY DEFINER 특성으로 정의된 스토어드 루틴내에서, CURRENT_USER()은 루틴의 생성자 (creator)를 리턴한다. 리턴 값은 utf8 문자 셋에 있는 스트링이 된다.

CURRENT_USER()의 값은 USER()의 리턴 값과는 다르다.

mysql> SELECT USER();
        -> 'davida@localhost'
mysql> SELECT * FROM mysql.user;
ERROR 1044: Access denied for user ''@'localhost' to
database 'mysql'
mysql> SELECT CURRENT_USER();
        -> '@localhost'

위의 예제는, 클라이언트가 davida (USER() 함수가 가리키는 것 처럼)의 사용자 이름을 지정하였더라도, 서버는 익명의 사용자 이름 (CURRENT_USER() 값의 빈 사용자 이름 부분으로 보여지는)을 사용해서 클라이언트를 인증하고 있음을 보여 주는 것이다. 그 이유 중의 하나는 davida에 대한 그랜트 테이블에 아무런 계정 정보도 없기 때문이다.

  • DATABASE()

디폴트 (현재) 데이터 베이스 이름을 utf8 문자 셋의 스트링 형태로 리턴한다. 만일 데폴트 데이터베이스 이름이 존재하지 않는다면, DATABASE()NULL 을 리턴한다. 스토어드 루틴내에서는, 루틴이 연결되어 있는 데이터 베이스가 디폴트 데이터베이스가 되며, 이것이 반드시 호출 문맥 (context)에 있는 디폴트 데이터 베이스가 될 필요는 없다.

mysql> SELECT DATABASE();
        -> 'test'
  • FOUND_ROWS()

SELECT 명령문은 서버가 클라이언트에게 리턴하는 열의 숫자를 제한하기 위한 LIMIT 구문을 포함할 수도 있다. 어떤 경우에는, LIMIT 구문 없이 얼마나 많은 수의 열이 리턴되는지 알고 있는 것이 바람직하다. 이렇게 열의 숫자를 세기 위해서는, SELECT 명령문 안에 SQL_CALC_FOUND_ROWS 옵션을 추가하고, 나중에 FOUND_ROWS() 함수를 선언한다:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

두 번째 SELECTLIMIT 구문이 없이 작성된 첫 번째 SELECT가 얼마나 많은 열을 리턴했는지를 나타내는 숫자를 리턴한다. (만일 이전 SELECT 명령문에 SQL_CALC_FOUND_ROWS 옵션이 포함되어 있지 않다면, FOUND_ROWS()LIMIT가 사용되었을 경우와는 다른 결과를 리턴한다.)

 

FOUND_ROWS()를 통해서 셀 수 있는 열은 의미가 없으며, SELECT SQL_CALC_FOUND_ROWS 명령문 다음에 나오는 명령문들에도 의미가 없게 된다. 만일 나중에 이 값을 참조하고자 한다면, 우선 저장을 해 둔다:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
mysql> SET @rows = FOUND_ROWS();

만일 여러분이 SELECT SQL_CALC_FOUND_ROWS를 사용한다면, MySQL은 결과 셋 전체에 얼마나 많은 열이 있는지를 계산하게 된다. 하지만, 이렇게 하면 LIMIT 를 사용하지 않고 쿼리를 다시 구동시키는 것 보다 속도가 빨라지게 되는데, 그 이유는 결과 셋을 클라이언트에 전달할 필요가 없기 때문이다.

 

SQL_CALC_FOUND_ROWS FOUND_ROWS()는 쿼리가 리턴하는 열의 수를 제한하고자 할 때 뿐만 아니라, 쿼리를 다시 구동 시키지 않고서 전체 결과 셋에 있는 열의 숫자를 파악하고자 할 때 유용하게 사용할 수가 있는 함수이다. 어떤 검색 결과에 대한 다른 섹션을 보여주는 페이지에 대한 링크를 가지고 있는 페이지 디스플레이를 표현하는 웹 스크립트가 한 가지 예가 된다. FOUND_ROWS()를 사용하면 여러분은 결과 값의 나머지에 대해서 다른 페이지가 얼마나 필요한지를 알아낼 수가 있다.

 

SQL_CALC_FOUND_ROWS FOUND_ROWS()의 사용은 단순한 SELECT 명령문에 대해서 보다 UNION 명령문에 대해서가 훨씬 복잡한데, 그 이유는 LIMITUNION 내의 여러 곳에서 발생할 수가 있기 때문이다. UNION 내의 개별적인 SELECT 명령문에 적용하거나, 또는 전체적으로 UNION 결과에 적용할 수도 있다.

 

UNION 에 대해서 SQL_CALC_FOUND_ROWS를 사용하는 것은, 이것이 글로벌 LIMIT 없이 리턴되는 열 카운트를 리턴하기 때문이다. UNION 과 함께 SQL_CALC_FOUND_ROWS를 사용하는 조건은 다음과 같다:

    • SQL_CALC_FOUND_ROWS 키워드는 반드시 UNION의 맨 처음 SELECT 에 나타나야 한다.
    • FOUND_ROWS()의 값은 UNION ALL 이 사용되는 경우에만 정확하게 된다. 만일 UNION ALL  없이 사용된다면, 중복 제거가 발생하고 FOUND_ROWS()의 값은 추정치가 된다.
    • 만일 LIMIT UNION 내에 나타나면, SQL_CALC_FOUND_ROWS 은 무시가 되고 UNION을 처리하기 위해 생성된 임시 테이블에 있는 열의 숫자가 리턴된다.

 

  • LAST_INSERT_ID(), LAST_INSERT_ID(expr)

가장 최근의 INSERT 또는 UPDATE 명령문에 의해 AUTO_INCREMENT 컬럼용으로 설정된 값 중에 맨 처음으로 자동 생성된 값을 리턴한다.

mysql> SELECT LAST_INSERT_ID();
        -> 195

생성된 ID 는 커넥션 별로 서버에 의해 관리된다. , 이 함수에 의해 주어진 클라이언트에 리턴되는 값은 클라이언트에 의해 AUTO_INCREMENT 컬럼에 영향을 주는 가장 최근의 명령문을 위해 클라이언트가 생성한 맨 처음의 AUTO_INCREMENT 값이 된다. 이 값은 다른 클라이언트에 의해서는 영향을 받지 않게 되는데, 다른 클라이언트가 자신의 고유 AUTO_INCREMENT 값을 생성한다고 하더라도 마찬가지가 된다. 이러한 특성으로 인해 각각의 클라이언트는 다른 클라이언트의 행동에는 상관없이 자신만의 고유 ID를 가질 수 있게 되며, 락 또는 트랜젝션이 필요 없게 되는 것이다.

 

LAST_INSERT_ID()의 값은 여러분이 열의 AUTO_INCREMENT 컬럼을 비-“magic (, NULL 0 이 아닌 값)으로 설정한다면 변경되지 않는다.

 

Important: 만일 여러분이 하나의 INSERT 명령문을이용해서 여러 개의 열을 삽입한다면, LAST_INSERT_ID()은 맨 처음 삽입된 열에 대한 값만을 리턴하게 된다. 이렇게 되는 이유는, 다른 서버들에 대응해서 동일한 INSERT 명령문을 쉽게 재 생성할 수 있도록 하기 위함이다.

예문을 보도록 하자:

mysql> USE test;
Database changed
mysql> CREATE TABLE t (
    ->   id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   name VARCHAR(10) NOT NULL
    -> );
Query OK, 0 rows affected (0.09 sec)
 
mysql> INSERT INTO t VALUES (NULL, 'Bob');
Query OK, 1 row affected (0.01 sec)
 
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
+----+------+
1 row in set (0.01 sec)
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)
 
mysql> INSERT INTO t VALUES
    -> (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
|  2 | Mary |
|  3 | Jane |
|  4 | Lisa |
+----+------+
4 rows in set (0.01 sec)
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+
1 row in set (0.00 sec)

비록 두 번째 INSERT 명령문이 3개의 새로운 열을 t 에 삽입하기는 하지만, 이렇게 삽입된 열중의 맨 처음 열을 위해 생성된 ID 2가 되며, 이 값이 뒤따라 나오는 SELECT 명령문을 위해 LAST_INSERT_ID()가 리턴하는 값이 되는 것이다.

 

만일 여러분이 NSERT IGNORE를 사용해서 그 열을 무시한다면, AUTO_INCREMENT 카운터는 증가하지 않게 되고 LAST_INSERT_ID()0 을 리턴하는데, 이것은 아무런 열도 삽입되지 않았다는 것을 의미하는 것이다.

 

만일 expr LAST_INSERT_ID()에 대한 인수 형태로 주어진다면, 그 인수의 값은 함수에 의해 리턴되고 LAST_INSERT_ID()에 의해 리턴되어야 할 다음 값으로 기억된다. 이것은 시퀀스를 시뮬레이트하기 위해 사용될 수가 있다:

 

  • 시퀀스 카운터를 가지고 있기 위한 테이블을 생성하고 초기화 시킨다:
mysql> CREATE TABLE sequence (id INT NOT NULL);
mysql> INSERT INTO sequence VALUES (0);
  •  아래와 같이 시퀀스 숫자를 생성하기 위해 테이블을 사용한다:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
mysql> SELECT LAST_INSERT_ID();

UPDATE 명령문은 시퀀스 카운터를 증가시키고 LAST_INSERT_ID()에 대한 다음 호출이 업데이트된 값을 리턴 하도록 만든다. SELECT 명령문은 그 값을 복구시킨다. mysql_insert_id() C API 함수 역시 이 값을 가져오는데 사용할 수가 있다. Section 22.2.3.36, “mysql_insert_id()를 참조할 것.

 

여러분은 LAST_INSERT_ID()를 호출하지 않고서도 시퀀스를 생성할 수 있지만, 위와 같은 방식으로 이 함수를 사용하는 것이 최종적으로 자동 생성된 값을 서버에서 유지 관리하는데 더 효율적이 된다. 여러 명의 클라이언트가 UPDATE 명령문을 실행해서 SELECT 명령문을 사용해서 자신들의 고유 시퀀스 값을 가져가기 때문에 이러한 방식이 더욱 안전한 것이다.

 

mysql_insert_id()INSERT UPDATE 명령문이 실행된이후에만 업데이트가 된다는 점을 알아두자. 따라서, 여러분은 SELECT 또는 SET과 같은 다른 SQL 명령문을 실행한 후에 LAST_INSERT_ID(expr)에 대한 값을 추출하기 위해 C API 함수를 사용할 수는 없게 된다.

  • ROW_COUNT()

ROW_COUNT()는 이전 명령문에 의해 업데이트, 삽입, 또는 삭제된 열의 숫자를 리턴한다. 이 값은 mysql_affected_rows() C API 함수로부터 얻는 열 카운트 값과 같은 값이 된다.

mysql> INSERT INTO t VALUES(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
|           3 |
+-------------+
1 row in set (0.00 sec)
 
mysql> DELETE FROM t WHERE i IN(1,2);
Query OK, 2 rows affected (0.00 sec)
 
mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)

ROW_COUNT() MySQL 5.0.1에서 추가되었다.

  • SCHEMA()

이 함수는 DATABASE()과 동일한 것이며, MySQL 5.0.2에서 추가가 되었다.

  • SESSION_USER()

SESSION_USER()USER()과 동일한 함수다.

  • SYSTEM_USER()

SYSTEM_USER()USER()과 동일한 함수다.

  • USER()

현재의 MySQL 사용자 이름과 호스트 이름을 utf8 문자 셋의 스트링 형태로 리턴한다.

mysql> SELECT USER();
        -> 'davida@localhost'

결과 값은 여러분이 서버에 접속을 할 때 지정한 사용자 이름을 가리키게 되며, 여러분이 접속한 클라이언트 호스트가 된다. 이 값은 CURRENT_USER()의 값과 다른 값이다.

여러분은 아래와 같이 사용자 이름만 얻을 수도 있다:

mysql> SELECT SUBSTRING_INDEX(USER(),'@',1);
        -> 'davida'
  • VERSION()

MySQL  서버 버전을 가리키는 스트링을 리턴한다. 스트링은 utf8 문자 셋을 사용한다.

mysql> SELECT VERSION();
        -> '5.0.23-standard'

만일 여러분의 버전 스트링이 -log 로 끝난다면, 이것은 로깅이 현재 활성화 되어 있음을 의미하는 것이다.

posted by 우디냥
└ᘐ 명령어 도움말 보기
       SHELL> man 명령어
       SHELL> 명령어 --help
 
└ᘐ 현재의 디렉토리 확인
       SHELL> pwd

└ᘐ 환경설정값 확인
       SHELL> export
       SHELL> env

└ᘐ language 설정 확인 및 수정
       SHELL> export |grep LANG                   -> 환경변수 LANG 값 확인
       SHELL> export LANG="en"                    -> 환경변수 LANG를 "en"으로 수정
       SHELL> export LANG="ko_KR.EUC-KR"   -> 환경변수 LANG를 "ko_KR.EUC-KR"으로 수정

└ᘐ 환경변수 PATH 확인
       SHELL> export|grep PATH
 
└ᘐ 권한변경 명령어
           - 읽기 권한 4 + 쓰기 권한 2 +  실행 권한 1  = 7
           - 일반적으로 php, js등 웹에 필요한건 644권한으로 주면 된다.
       SHELL> chmod 644 *.php  
                      -> *.php파일에 대해 파일소유자는 읽기+쓰기, 그룹은 읽기, 그외는 읽기
     [참조 사이트 : http://blog.naver.com/jiruchi?Redirect=Log&logNo=10025308648]
 
└ᘐ 명령어 or 파일 찾는 명령어
       SHELL> whereis 파일명 or 명령어
       SHELL> type 파일명 or 명령어
       SHELL> locate 파일명 or 명령어
 
└ᘐ 파일내용 보는 명령어
       SHELL> cat 파일명               // 파일 내용을 출력
       SHELL> more 파일명            // 한 화면씩 끊어서 출력
       SHELL> head 파일명            // 파일의 앞 부분만 출력
       SHELL> tail 파일명               // 파일의 뒷 부분만 출력   
       SHELL> tail -f 파일명            // 로그 모니터링시 -f 옵션

└ᘐ 빈 파일 생성하는 명령어
       SHELL> touch 생성파일명
  
└ᘐ 특정 파일에서 원하는 text내용을 찾는 명령어
         - 찾을 내용에 스페이스바가 있을 땐 " "로 묶어준다.
       SHELL> grep "찾을 내용" * |more      -> 현재 디렉토리 내의 파일에서 text 찾기
       SHELL> grep "찾을 내용" * -r |more   -> 현재 디렉토리 및 하위 디렉토리에서 찾기
                                                    └> 한 페이지씩 보여주라는 명령어

└ᘐ 파일 정보 보기 명령어
       SHELL> file 파일이름   -> 파일이 어떤 파일인지 정보를 알려준다.
                                                    
└ᘐ 파일 찾기 명령어
       SHELL> find /usr -name whereis   -> /usr 디렉하위에 whereis 라는 파일을 찾음
       SHELL> find . -name "*.php"   -> 현재 디렉토리 하위에 확장자가 php인 파일을 찾음
       SHELL> find /home/dnel -type f  
                 -> /home/dnel 디렉토리 하위에 일반파일(디렉토리나링크빼고)만 찾음
       SHELL> find /tmp -name core -type f -print | xargs /bin/rm -f
                 -> /tmp 디렉토리 밑에 core 란 파일을 찾아 삭제함(요주의-ㅁ-)
       SHELL> find . -type f -exec file '{}' \; -> 현재 디렉토리 하위에 파일들의 정보를 봄
       SHELL> find . -type f -name "*.bak" -exec rm -f '{}' \;
                 -> 현재 디렉토리 하위에 *.bak 파일을 삭제
       SHELL> find . -type f -name "*.bak" -ok rm -f '{}' \;
                 -> 현재 디렉토리 하위에 *.bak 파일을 삭제시 물어봄(-exec옵션의사용자의 실수방지용)
       SHELL> find /home/dnel -mtime 0   
                 -> /home/dnel 디렉토리에 24시간 이내 수정된 파일을 찾음
       SHELL> find /home/dnel -mtime 1  
                 -> /home/dnel 디렉토리에 48시간이내 수정된 파일을 찾음

└ᘐ  xargs의 활용
       SHELL> ls -1 |xargs file                    -> 현재 디렉토리의 파일 정보를 봄
       SHELL> ls -1 /home/dnel  |xargs file  -> /home/dnel 디렉토리의 파일 정보를 봄
       SHELL> ls -1 *.bak |xargs rm -f         -> 현재 디렉토리의 *.bak 파일을 삭제함(요주의)

└ᘐ 리다이렉션의 '>'과 '>>'의 차이
       SHELL> echo "a" > test.txt
       SHELL> more test.txt
       SHELL> echo "ab" > test.txt
       SHELL> more test.txt
       SHELL> rm test.txt
       SHELL> echo "a" >> test.txt
       SHELL> more test.txt
       SHELL> echo "ab" >> test.txt
       SHELL> more test.txt
     [참조 사이트 : http://blog.naver.com/orion_203?Redirect=Log&logNo=120002500166]  

◆ 기본 명령어 참조 사이트  
      -> http://blog.naver.com/sjtnrsudi?Redirect=Log&logNo=120046808457
posted by 우디냥
출처 : http://www.boxesandarrows.com/view/visio_replaceme 

AxureProduct: RP4 (Product Tour)
Elegance Tech
Product: LucidSpec (Product Tour)
iRise
Products: Studio, Shared Server, Manager, iDoc Express (Product Tour)
Serena
Product: Composer (Product Tour)
Simunication
Product: Enterprise Simulator (Product Tour)
Sofea
Product(s): Profesy


visio를 대신할 녀석들이란다..
필요할때 써봐야지!
posted by 우디냥
└ᘐ RRD (Round Robin Database)란?
      -> 효과적인 그래프를 그릴 수 있도록 도와주는 Tool
           RRDtool은 연속적으로 변하면서 반복적인 데이터의 흐름을 시간의 흐름에 따라 평균값을 저 장하는 방식으로 매우 간략한 하게 장기간 데이터를 보관하고 이를 그래프 파일로 생성을 합니다. 이런 연속적인 데이터의 예로는 네트워크의 흐름정보를 카운터 값으로 보관하고있는 MIB 정보, 사무실 온도, 자동차 도로의 교통 통행량, 날씨의 풍량 등(앞에서도 열거했죠)의 정보들이 있습니다. 암튼 이런 종류의 데이터들을  얼마 되지 않은 크기로 데이터베이스화 하고, 시간단위로 그래프화 하여 이것을 인터넷 상에서 실시간으로 보여 주거나 다른 프로그램에서 쓸 수 있도록 하는 툴입니다.
posted by 우디냥

# 해당 일부터 30일 날짜


SELECT TO_CHAR(TO_DATE(BB.DAY, 'YYYYMMDD') + NUM, 'YYYY-MM-DD') AS DAY
FROM (
SELECT ROWNUM AS NUM
FROM DICTIONARY A,(
SELECT B.DAY AS BDAY, C.DAY AS CDAY
FROM
  ( SELECT TO_CHAR(SYSDATE,'YYYYMM') || '01' AS DAY FROM DUAL ) B,
  ( SELECT TO_CHAR(LAST_DAY(SYSDATE),'YYYYMMDD') AS DAY FROM DUAL ) C
) B
WHERE ROWNUM <= TO_DATE(B.CDAY, 'YYYYMMDD') - TO_DATE(B.BDAY, 'YYYYMMDD')  + 1) AA,
( SELECT TO_CHAR(SYSDATE - TO_NUMBER(TO_CHAR(SYSDATE,'D')) + 1,'YYYYMMDD') AS DAY FROM DUAL ) BB

# 현재 날짜에서 일주일 날짜..

SELECT TO_CHAR(TO_DATE(BB.DAY, 'YYYYMMDD') + NUM-1, 'YYYY-MM-DD') AS DAY
FROM (
SELECT ROWNUM AS NUM
FROM DICTIONARY A,(
SELECT B.DAY AS BDAY, C.DAY AS CDAY
FROM
  ( SELECT TO_CHAR(SYSDATE - TO_NUMBER(TO_CHAR(SYSDATE,'D')) + 1,'YYYYMMDD') AS DAY FROM DUAL ) B,
  ( SELECT TO_CHAR(SYSDATE - TO_NUMBER(TO_CHAR(SYSDATE,'D')) + 7,'YYYYMMDD') AS DAY FROM DUAL ) C
) B
WHERE ROWNUM <= TO_DATE(B.CDAY, 'YYYYMMDD') - TO_DATE(B.BDAY, 'YYYYMMDD')  + 1) AA,
( SELECT TO_CHAR(SYSDATE - TO_NUMBER(TO_CHAR(SYSDATE,'D')) + 1,'YYYYMMDD') AS DAY FROM DUAL ) BB

# 시작일부터 끝일까지

SELECT TO_CHAR(TO_DATE('[SDATE]', 'YYYY-MM-DD') + NUM-1, 'YYYY-MM-DD') AS DAY
FROM (
SELECT ROWNUM NUM
FROM DICTIONARY
WHERE ROWNUM <= TO_DATE('[EDATE]', 'YYYY-MM-DD') - TO_DATE('[SDATE]', 'YYYY-MM-DD')  + 1
)

# 날짜계산

/* 어제 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE-1) AND TRUNC(SYSDATE-1)
+0.99999421
/* 오늘 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + 0.99999421
/* 내일 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE+1) AND TRUNC(SYSDATE+1)
+0.99999421
/* 금주 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE+1)-TO_CHAR(SYSDATE,'D')
AND TRUNC(SYSDATE+1)-TO_CHAR(SYSDATE,'D')
+6.99999421
/* 차주 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE+8)-TO_CHAR(SYSDATE, 'D')
AND TRUNC(TRUNC(SYSDATE)+14.99999421)-TO_CHAR
(SYSDATE, 'D')
/* 금월 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE+1)-TO_CHAR(SYSDATE,'DD')
AND TRUNC(LAST_DAY(SYSDATE))+0.99999421
/* 전월 */ 날짜칼럼 BETWEEN TRUNC(ADD_MONTHS(SYSDATE,-1)+1)-TO_CHAR
(SYSDATE,'DD')
AND TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE, -1)))
+0.99999421
/* 차월 */ 날짜칼럼 BETWEEN ADD_MONTHS(TRUNC(SYSDATE),1)-TO_CHAR
(SYSDATE,'DD')+1
AND LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE),1)
+0.99999421)


# 특정일 까지의 간격을 년, 개월, 일로 표현하기

SELECT
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('19970101', 'YYYYMMDD'))/12) "년",
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('19970101', 'YYYYMMDD')) -
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('19970101', 'YYYYMMDD'))/12) *
12) "개월",
TRUNC((MONTHS_BETWEEN(SYSDATE,TO_DATE('19970101', 'YYYYMMDD')) -
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('19970101', 'YYYYMMDD')))) *
30.5) "일"

#일주일 단위로 날짜 가져오기^^

SELECT TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD') - TO_NUMBER(TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD'),'D')) - 0,'YYYY-MM-DD') AS PRE,
TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD') - TO_NUMBER(TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD'),'D')) + 1,'YYYY-MM-DD') AS MON,
TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD') - TO_NUMBER(TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD'),'D')) + 2,'YYYY-MM-DD') AS TUE,
TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD') - TO_NUMBER(TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD'),'D')) + 3,'YYYY-MM-DD') AS WED,
TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD') - TO_NUMBER(TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD'),'D')) + 4,'YYYY-MM-DD') AS THU,
TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD') - TO_NUMBER(TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD'),'D')) + 5,'YYYY-MM-DD') AS FRI,
TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD') - TO_NUMBER(TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD'),'D')) + 6,'YYYY-MM-DD') AS SAT,
TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD') - TO_NUMBER(TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD'),'D')) + 7,'YYYY-MM-DD') AS SUN,
TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD') - TO_NUMBER(TO_CHAR(to_date('"+str_searchDay+"','YYYY-MM-DD'),'D')) + 8,'YYYY-MM-DD') AS NEX
FROM DUAL

-0 은 어제 +8은 담주 월요일입니다.

posted by 우디냥
└ᘐ RMI란?
       - Remote Method Invocation의 약자
       - 원격 함수 호출 기법 
          (클라이언트가 Socket나 다른 네트워크 기술과 관계없이 서버에 있는  함수를 직접
           호출해서 그 결과(반환값)를 가지고 가는 기법)
 
   * EJB는 여러대의 서버를 가지고 웹서버를 구성하는 방식
     즉, 여러대의 서버가 가지고 잇는 고유의 기능을 다른 서버에서 이용하는 방식은
                                                                                             => RMI방식을 이용해서 구현
 
     ▷ 구성
          Stub/Skeleton 
             - RMI를 구성하는 원격 메소드를  참조하기 위해서 구성된 내부적인 Proxy
                                        (클라이언트가 호출 가능한 함수)
               Marshalling 과 Unmashalling을 해주어서 원격 함수를 클라이언트가 참조(호출) 가능
               하도록 해주는 내부적인 기술을 가진다.
          Naming
             - RMI를 이용해서 원격 메소드(함수)를 찾아내는 기술
               JNDI(Java Naming Directory Interface)를 사용해서 구현
               즉, 원격 메소드를 내부 장치에 Hash Table기법으로 저장해놓고, 클라이언트가 이 Hash
                Table을 이용해서 자신이 필요로 하는 원격 함수를 검색하고 호출하도록 해주는 기술

     ▷ 주요 클래스
          1. Remote
               원격 객체가 되기 위해서 필요한 각종 기능을 포함한 인터페이스
               원격 인터페이스는 반드시 이 인터페이스를 상속받아서 만들어야 한다.
          2. UnicastRemoteObject
               해당 클래스가 원격 객체가 되기 위해 필요한 각종 기능을 포함한 클래스

└ᘐ 구성방식
          1. 원격 메소드를 포함한 인터페이스 제작  => 원격 인터페이스
               (인터페이스안의 메소드 RMI의 대상 -> 클라이언트가 호출 가능한 메소드)      
          2. 원격 인터페이스를 이용한 실제 구현 클래스 제작
               (실제적인 작업을 코딩하는 클래스)
          3. 서버는 원격객체를 등록
               (RMI Register에 등록)
          4. 클라이언트는 RMI Register에서 Naming 기법에 의해 필요한 원격 메소드를 검색하고,
             메소드를 호출함으로써 RMI를 실제 구현

     ▷ 원격 인터페이스 제작규칙
          1) 반드시 public 이어야 한다.
          2) Remote 인터페이스를 상속받아야 한다.
          3) 안에 있는 모든 함수(원격 호출 가능한 함수)는 반드시 RemoteException을 처리
          4) 함수의 반환값은 반드시 Serializable

     ▷ 실제 클래스 제작 규칙
          1) 반드시 public 이어야 한다.
          2) UnicastRemoteObject에서 상속받아야 한다.
          3) 원격 인터페이스를 이용해서 만들어야 한다.
          4) 반드시 생성자 함수를 가지고 있어야 하며
              생성자 함수는 반드시 RemoteException처리
          5) 필요한 함수들을 만들어 나간다.

posted by 우디냥
TAG rmi

티스토리 툴바