[ 패키지 ]


  : 연관성이 있는 함수나 프로시저를 그룹으로 모아놓은 개념.
  

  [ 패키지 구성 ]
  : 선언부 + 몸체부
  
  **참고로 패키지 선언부에 선언되지 않아도 패키지 몸체부에서
    사용할 수 있다... BUT 권장사항이 아니다.
    
  [ 구문 형식 ]
  - 선언부 형식
  create (or replace) package 패키지명
  IS
    패키지 내 전역 변수 선언;
    procedure 프로시저1(매개변수1,...);
    procedure 프로시저2(매개변수1,...);
    function 함수1(매개변수1,..2)return 타입;
    ...
  end;
  - 몸체부 형식
  create (or replace) package body 패키지명
  IS
  procedure 프로시저 이름
  subprogram bodis : 실제 작동하게될 서브프로그램(프로시저, 함수)
  end;
  
  *패키지 실행 : 패키지는 여러 환경에서 호출되어 실행가능하다.
              패키지에 대한 실행권한을 가진 사용자만 실행시킬 수 있다.
exec 패키지명.프로시저or함수명;
select 패키지명.함수명(매개변수) from ~~
  *패키지 삭제 : 선언부와 몸체부를 모두 삭제할 수 있다. 또는 몸체만 삭제할 수도 있다.
      drop package 패키지명; -- 둘 다 삭제할 경우
      drop package body 패키지명; -- 몸체만 삭제할 경우


- 패키지 내에 전역 변수를 선언하고 해당 변수를 사용할 경우 초기화 작업이 필요한 경우가 있다.
  이런 경우를 지원하기 위해 
  패키지.프로시저 or 함수를 수행할 때 마다 한번 무조건 실행하게 해 초기화 작업등을 할 수 있도록 지원하는 것이 있는데
  이를 ONE_TIME_ONLY_PACKAGE 라고 한다.
 
  방식은, 단순히 패키지 바디의 맨 아래 부분에 BEGIN을 기술하고 초기화 작업등을 해주면 된다.


[ 서브프로그램의 함수 사용 ]


  
  서브프로그램
    - 프로시저
    - 함수
    
    [ 함수와 프로시저의 차이? ]

    - 프로시저는 in, out, in out모드를 사용해서 값을 반환하기도 하고,
      반환하지 않고 종료 할 수도 있다.
      VS
    - 함수는 어떤 작업을 수행한 후에, 결과를 반환한다.

    
    [ 함수의 구문 형식 ]
    create (or replace) function 함수명
    파라미터1 파라미터타입,
    파라미터2 파라미터타입,...
    return datatype
    is
    PL/SQL 블럭;

EX)





 [ 서브프로그램의 이해, 프로시저 ]


  : PL/SQL의 서브프로그램이란?
    -> <PL/SQL의 익명 블럭의 특징>
      : . 이름이 없는 PL/SQL 블럭
        . 저장해서 사용되지 않는다.
        . 사용할 때마다 컴파일이 필요하다.
        . 다른 응용프로그램에서 사용할 수 없다.
        . 값을 반환할 수 없다.
        . 매개변수를 사용할 수 없다.
        
    -> <서브프로그램의 특징>
      : . 이름이 있는 PL/SQL 블럭
        . DB에 저장해 반복적으로 사용할 수 있다.
        . 최초 실행될 때 한번만 컴파일 한다.
        . 다른 응용프로그램에서 사용할 수 있다.
        . 함수일 경우 값을 리턴(반환)할 수 있다.
        . 매개변수를 사용할 수 있다.
        
      ** "서브 프로그램"은 내장된 함수프로시저가 있다.
        - 프로시저
        - 함수
      ---------------------------------------------------------------------
      
      - 프로시저란??
        : 특정 처리를 위한 서브 프로그램의 한 유형이다.
        : 단독으로 실행 가능하며, 다른 응용 프로그램에서도 호출되어 실행 가능하다.
        
        - 프로시저 구문 형식)
          create procedure 프로시저명
            파라미터1(in,out,in out) 데이터타입, -- default는 in모드
              -- out : 값을 반환하겠다, in : 서브프로그램 내에 값 전달 in out : 서브프로그램 내에도 전달되고, 외부 응용프로그램에도 반환하기도 함
            파라미터2(in,out,in out) 데이터타입
          is
            변수 선언부;
          begin
            프로시저 본문 처리부;
          exception
            예외처리부;
          end;

EX)


[ 외부 변수 선언 및 전달과 out 타입을 통한 결과값 받기 예제 ]


[    ORACLE 예외처리 개념, 종류, 사용법 - (8)    ]




  - 에러 의 종류 ]
      1. 컴파일 에러 : PL/SQL 블럭이 파싱(Parsing)될 때 "사용자 오타" 등으로 인해 발생되는 에러.
        (Compile Error)
      2. 런타임 에러(=Exception)
          : PL/SQL 블럭이 실행되는 동안 발생하는 에러로 일반적으로 런타임에러를 "Exception"이라 부른다.
            종류)
              a. 오라클 예외 
                  : 오라클에서 제공되는 예외(Predefined ORACLE Exception과 Non-Predefined ORACLE Exception이 있다.)
                    ㄱ. Predefined ORACLE Exception 
                          : 사전에 정해진 예외
                          종류)
                            - ACCESS_INTO_NULL 
                                : 정의되지 않은 오브젝트 속성에 값을 할당하고자 했을 때 발생하는 예외.                      
                            - CASE_NOT_FOUND 
                                : CASE문의 when절에 해당되는 조건이 없고 else절도 없을 경우 발생
                            - COLLECTION_IS_NULL 
                                : 선언되지 않은 컬렉션(nested table, varray)에 존재하는 메서드
                                                   이외의 메서드를 사용했을 때 발생되는 예외.
                            - CURSOR_ALREADY_OPEN 
                                : 이미 열려진 커서를 열려고 시도 했을 때 발생하는 예외
                            - DUP_VAL_ON_INDEX 
                                : 유일인덱스에 중복값을 입력햇을 때 발생하는 예외.
                            - INVALID_CURSOR 
                                : 잘못된 커서 조작이 샐행될 때 발생되는 예외.
                            - INVALID_NUMBER 
                                : 문자를 숫자로의 변환 시 실패가 될 때 발생하는 예외.
                            - LOGIN_DENIED 
                                : 잘못된 사용자명이나 암호로 로그인시도시 발생하는 예외.
                            - NO_DATA_FOUND 
                                : PL/SQL Select문이 한 건도 리턴하지 못하는 경우 발생하는 예외.
                            - NOT_LOGGED ON 
                                : 접속되지 않은 상태에서 데이터베이스에 대한 요청이 PL/SQL 프로그램으로
                                  실행된 경우 발생되는 예외.
                            - PROGRAM_ERROR 
                                : PL/SQL이 내부적인 문제를 가지고 있는 경우 발생되는 예외.
                            - ROWTYPE_MISMATCH 
                                : 할당문에서 호스트 커서 변수와 PL/SQL 커서 변수의 데이터 형이 불일치할 때 발생되는 예외
                            - STORAGE_ERROR 
                                : PL/SQL이 실행될 때 메모리가 부족하거나 메모리상에 문제가 일어났을 대 발생하는 예외.
                            - SUBSCRIPT_BEYOND_COUNT 
                                : 컬렉션의 요소 갯수보다 더 큰 첨자 값으로 참조한 경우 발생
                            - SUBSCRIPT_OUTSIDE_LIMIT 
                                : 컬렉션의 첨자 한계를 벗어난 참조가 일어났을 때 발생
                            - SYS_INVALID_ROWD 
                                : 문자열을 ROWID로 변환할 때 무효한 문자열의 표현일 경우 발생되는 예외.
                            - TIMEOUT_ON_RESOURCE 
                                : 자원에 대한 대기시간이 초과했을 때 발생하는 예외.
                            - TOO_MANY_ROWS 
                                : PL/SQL select문이 두건이상의 행을 리턴햇을 때 발생되는 예외.
                            - VALUE_ERROR 
                                : 산술,변환,절삭 크기 제약에 에러가 생겼을 때 발생되는 예외.
                            - ZERO_DIVIDE
                                : 0으로 나누려 했을 때 발생하는 예외.
                  
                    ㄴ. Non-predefined ORACLE Exception
                          : 사전에 정해지지 않은 예외
              b. 사용자 정의 예외
                  : 사용자에 의해 정의되는 예외
                    사용자 정의 예외 사용 예)
                      declare (선언부에서)
                      예외명 exception;
                      begin부나 exception부에서 raise문을 이용해서 예외를 발생시킨다.
                      
                      - 예외처리부 형식)
                          -- 예외처리부 : 예외 발생시 어떻게 처리할 것인지에 예외처리 내용이 들어간다.
                        Exception
                          when 예외명 then
                            실행문...
                          when 예외명2 then
                            실행문...
                          when OTHERS then
                            실행문...

EX)


[    ORACLE 커서(CURSOR)    ]




 [  커서  ]
  : select문을 통해 결과값들이 나올 때 이 결과들은 메모리 공간에 저장하게 되는데
  
    이때, 이 메모리 공간을 "커서"라고 한다.
    
    즉, 
      - 커서란? : 쿼리문에 의해서 반환되는 결과값들을 저장하는 메모리 공간이다.
      - Fetch란 : 커서에서 원하는 결과값을 추출하는 것.
    
    왜사용하는가???!!  
커서는 로우를 기반으로 하는 작업이 된다!!! 라는 것입니다. 저러한 로우를 하나 SELECT해서 여러가지 처리를 한후 어떠어떠한 작업을 한다~~
           
이것을 가능하게 하는 것이 바로!!! 커서 입니다.
      
     물론 SQL구문만을 가지고 어거지로 어찌어찌 한다면~~ 가능할 겁니다.
        
     하지만 커서를 이용하시면 훨씬 빠르고 간단히 저러한 처리를 가능하게 할 수 있습니다.
    
여기까진 이론적으로고... 그냥 근본적으로는

-> select의 결과가 하나의 행(단일 튜플)일 경우는 into절을 이용해 변수에 저장할 수 있지만, 결과가 복수행(복수 튜플)일      경우는 into절로 이를 처리할 수가 없죠
    이렇게 여러 복수 행의 결과를 행단위로 처리를 하기 위해서 사용하는 것이 Cursor입니다.
   

1. 커서의 정의
 

커서란 SQL Plus에서 사용자가 실행한 SQL문의 단위를 의미합니다.


오라클에서 수행한 모든 쿼리문은 커서 단위로  처리합니다.

PL/SQL의 SQL문처럼 하나의 결과를 리턴하는 경우 커서 없이도 SQL문의 실행결과가 암시적으로 커서에 저장되므로 이를 암시적 커서라고 합니다.
 

SQL문을 수행한 후에 결과로 얻어지는 행이 여러 개일 경우에는 암시적은 커서에 정보를 저장할 수 없기에 에러가 발생합니다. 이럴 경우에는 반드시 명시적인 커서를 사용해야 합니다.


명시적인 커서는 PL/SQL 레코드(RECORD)와 PL/SQL의 테이블(TABLE)을 결합한 것으로서 프로그램 언어의 구조체 배열과 유사합니다

------------------------------------------------------------------------------------------------------
(오라클에서 CURSOR란 시스템 글로벌 영역의 공유 풀 내에 저장공간을 사용하여 사용자가 SQL 문을 실행시키면 결과값을 저장공간에 가지고 있다가 원하는 시기에 순차적으로 fetch해 처리하여 해당 결과 셋을 프로그래밍적으로 

접근할수 있게 도와주는 기능이다.)

   
      [ 커서의 종류 ]
      1. 묵시적 커서(Implicit Cursor)
        : 오라클에서 자동으로 선언해주는 SQL 커서.(사용자는 생성 유무를 알 수 없다.)
        
      2. 명시적 커서(Explicit cursor)
        : 사용자가 선언해서 생성한 후에 사용하는 SQL 커서, 주로 여러개의 행을 처리하고자
          할 경우 사용한다.
        
      [ 커서의 속성 ]
      1. %Found : 가져올 레코드가 있는 경우 true를 반환
      2. %isOpen : 커서가 오픈 상태일 경우 true를 반환
      3. %NotFound : 더이상 참조할 레코드가 없을 때 true를 반환
      4. %RowCount : 카운터 역할을 한다. 처음 오픈시 0, 패치발생할 때마다 1씩 증가
      
      [ 커서의 처리 단계 ](명시적 커서 기준)
      1. 명시적 커서 선언(커서 생성)
        EX) Cursor 커서이름
      2. 명시적 커서 오픈
        EX) Open 커서이름
      3. 커서에서 데이터 추출(데이터 행 가져오기)
        EX) Fetch 커서이름
      4. 커서 종료
        EX) Close 커서이름



[    ORACLE 반복문(basic loop, while, for, continue)    ]





[    ORACLE 조건문(IF,CASE)    ]






[    ORACLE TABLE TYPE(컬렉션), 바인드 변수 -(4)    ]



쿼리의 일부분 예를 들어 WHERE 절의 내용만 다른 쿼리를 실행해야 하는 경우가 종종 생길 것이다. 이러한 경우에 거의 비슷한 두번의 쿼리를 실행하는 비효율성을 해소하는 방법이 바로 바인드 변수의 사용이다.
바인드 변수는 입력 내용을 넣고 SQL로부터 출력 내용을 받아내는 방법으로, " 이 부분에 들어갈 정확한 값은 이후에 알려줄테니, 일단 내가 값을 넣었을 때 어떻게 실행할 것인지에 대해서 계획만 세워둬라 "는 명령을 오라클에 내리는 것이다.

select * into temp from row_test where no = :bind_no; 이 부분이 있을 때 :가 붙은 변수가 바인드 변수인대, 실행한 뒤에 바인드 변수에 입력할 값을 넣게 된다.
그에 따라 no = 1, no = 2 등 실행할 때마다 다양한 결과를 낼 수가 있게 된다.


[    ORACLE rowType 변수 및 복합변수 활용 예    ]



[    ORACLE PL/SQL 개념 - (1)    ]





[ PL/SQL(Procedural Language/SQL) ]

  : 오라클에서 제공하는 프로그래밍 언어
  : 일반 프로그래밍 언어적인 요소를 다 가지고 있고, 
    데이터베이스 업무를 처리하기 위한 최적화된 언어
    
    
    
   ** [ 프로시저(PL)의 기본 구조 ] **
   
     - 선언부(Declare) : 모든 변수나 상수를 선언하는 부분
     - 실행부(Executable) : BEGIN ~ END // 실재 로직이 수행되는 부분 
          ex) 제어문, 반복문, 함수정의 등의 로직을 기술하는 부분...
     - 예외처리부(Exception) : 실행도중에 에러 발생시 해결하기위한 명령들을 기술하는 부분
       (생략가능)
       
      ** Declare, begin, exception 키워드들은 ';' 을 붙이지 않는다. **
      ** 나머지 문장들은 ';'으로 처리하여 영역의 긑을 표시한다.
      
      
     - 익명 블록(Anonymous PL/SQL)
          : 주로 일회성으로 사용할 경우 많이 사용된다.
          
     - 저장 블록(Stored PL/SQL)
          : 서버에 저장해 놓고 주기적으로 반복해서 사용할 경우 사용된다.

EX)


[    ORACLE 뷰(View) & 인라인 뷰   ]





[ 인라인(Inline) 뷰(View) 란? ]

: select의 from절에 테이블이 바로 오는 것이 아니라, select절이 오는 방식


왜 사용할까?

-> 서브쿼리를 포함해 테이블 조인이 이루어질 경우 검색하는 필드명은 테이블.필드명처럼해서 길어지게 된다. 이게 서브쿼리를 통해

메인 쿼리로 올라갈 수록 그 길이는 점점 더 길어져 불편할 수 있는데

이때, from절에서 select문을 통해 추출한 필드명에 Alias를 줘서 간단하게 만들 수 있다.

이러한 목적 이외에도 예를들어, 전체 데이터에서 비교하는 것보다 rownum을 이용해서 10번째 튜플 정보만 가져와 그 중에서 조건을 따져 데이터를

가져온다면 비교하는 횟수가 줄어들게 할 수도 있다.

이때, rownum을 통해 가져오는 갯수를 제한하는 방식을 N-TOP 질의라고 한다.

EX)     select 사원명, 부서명 from ( select e.ename AS 사원명, d.dName AS 부서명 from emp e, dept d where e.deptno = d.deptno

where rownum <= 10

order by e.sal

);





'스터디 > DB(ORACLE)' 카테고리의 다른 글

ORACLE PL/SQL 개념 - (1)  (0) 2017.09.11
ORACLE 시퀀스(sequence)  (0) 2017.09.08
ORACLE 무결성 제약조건  (0) 2017.09.07
ORACLE DML( insert, update, delete, select )  (0) 2017.09.06
ORACLE DDL( create, drop, alter, truncate )  (0) 2017.09.06
[    ORACLE 무결성 제약조건    ]





[   ORACLE DML( insert, update, delete, select )   ]




--DML : Data Manipulation Language : ( select, insert, update, delete )

-- 1. select 문 : 데이터 검색
      -- 형식) select 컬럼 from 테이블 where 조건들.. group by having order by ...

-- 2. insert 문 : 데이터 삽입(튜플 삽입)
      -- 형식)

 - 단일행을 삽입하는 경우 : insert into 테이블(컬럼1,컬럼2,...) values(값1,값2,...)
 - 복수행을 삽입하는 경우 : insert into 테이블(컬럼1,컬럼2...) (select 컬럼1,컬럼2,... from ~ where ~);
      
-- 3. update 문 : 데이터 수정 
      -- 형식) update 테이블 set 컬럼1=값1 where 조건들...      

-- 4. delete 문 : 데이터 삭제(튜플 삭제)
      -- 형식) delete from 테이블 where 조건
      
delete * from 테이블명; 과 Truncate Table 테이블명과의 차이점?

: delete를 수행시 자동으로 commit이 이루어 지지 않기 때문에 rollback을 할 수 있지만
  
  truncate의 경우 데이터를 삭제 후 자동으로 commit까지 진행하기 때문에 rollback을 할 수 없다.



[   ORACLE 서브쿼리ANY,ALL,IN에 대하여...  ]




메인 쿼리 안에서 메인 쿼리의 중간 결과로 사용되는 쿼리문을 "서브쿼리"라고 하는데,

서브 쿼리를 작성할 때 고려해야할 점은, 서브쿼리의 결과값이 단일 튜플이 나올 수도 있지만 다중 튜플일 경우이다.

일반적으로 salary(급여)가 (13000,6000,7000) 이 중 하나인 경우( salary = 13000 or salary = 6000, salary = 7000 )는

간단하게 salary IN (서브 쿼리) 로 "IN"을 사용해 작성하면 되지만

">"와 같은 연산자는 IN을 사용할 수가 없는 단일 비교 연산자이다. 이러한 경우에는 ANY ALL을 사용하게 된다.

ANY는 해당 비교 연산의 or결과로 ALL은 and 결과로 연산이 되는데 예를들자면

salary > ANY(다중 튜플을 결과로하는 서브쿼리) 는 

salary > 13000 or salary > 6000 or salary > 7000 의 결과가 된다. 즉, salary > 6000을 만족하는 결과들이 될 것이고,

salary > ALL(다중 튜플을 결과로하는 서브쿼리) 는

salary > 13000 and salary > 6000 and salary > 7000의 결과임으로, salary > 13000 을 만족하는 결과가 나올 것이다.



다음 아래는 해당 내용에 대한 예제 코드와 주석문이다.



[    ORACLE 날짜함수, 변환함수, decode(), case()  ]  






[    JSP MVC패턴을 이용한 게시판 만들기 1(개요)    ]



 

전체적인 게시판 설게 구성도

 

클라이언트(브라우저에서의) 모든 요청은 FrontController에서 받게 되고, 요청을 받은 FrontController는 요청 분석을 해 필요한 처리르 담당하는 Command 객체를 지정하게 된다.

 

Command 객체들은 Service 인터페이스를 implements해 관리하며, 처리 요청을 받은 Command객체 내부에서는 DAO를 통해 DB에서 원하는 정보를 꺼내와 리턴하게 되고

 

꺼내온 정보를 담은 뒤 FrontController에서는 RequestDispatcher 를 이용해 forward시켜 원하는 화면(jsp 파일)으로 이동시켜 준다.

 

 

[ 테스트용 데이터베이스 구성 ]

 

STUDENT 테이블을 생성하고, mysql에서 auto_increment에 해당하는 sequence를 생성해 주도록 한다. 시퀀스는 삽입할 때마다 자동으로 컬럼을 증가시켜 넣어야하는 경우 주로 사용되는데

대표적으로 nextval : 다음에 삽입될 인덱스 번호, currval : 현재 마지막에 삽입된 인덱스 번호

등을 사용할 수 있다.

아래의 코드는 STUDENT 테이블을 생성하고 id를 기본키로 지정했고, 시퀀스를 이용해서 테스트용 데이터를 삽입했다

 

create table STUDENT(
  id varchar2(50) primary key,
  name varchar2(20) not null,
  address varchar2(100)
);

commit;

create sequence STUDENT_seq;

insert into STUDENT(id,name,address) values(STUDENT_seq.nextval,'hyr','seoul');

commit;

select * from STUDENT;

 

[  ORACLE DB 특수문자 제거, 숫자만 빼고 다 제거 쿼리문   ]





--치환할 문자를 |로 구분하여 입력 SELECT REGEXP_REPLACE('Stay Hungry, Stay Foolish. - Steve Jobs', 'Stay|Foolish|Steve', '') FROM DUAL --결과: Hungry, . - Jobs ; --문자를 제거만 할꺼면 3번재 파라미터는 생략가능 SELECT REGEXP_REPLACE('Stay Hungry, Stay Foolish. - Steve Jobs', 'Stay|Foolish|Steve') FROM DUAL --결과: Hungry, . - Jobs ; SELECT REGEXP_REPLACE('Stay Hungry, Stay Foolish. - Steve Jobs 2005', 'Stay|Foolish|Steve', '###') FROM DUAL --결과: ### Hungry, ### ###. - ### Jobs 2005 ; --특수문자 제거 SELECT REGEXP_REPLACE('Stay Hungry, Stay Foolish. - Steve Jobs', '[[:punct:]]') FROM DUAL --결과: Stay Hungry Stay Foolish Steve Jobs ; --숫자를 제외한 모든문자 제거 (숫자만) SELECT REGEXP_REPLACE('Stay Hungry, Stay Foolish. - Steve Jobs 2005', '[^[:digit:]]') FROM DUAL --결과: 2005 ; --$같은 특수문자를 치환하기 위해서는 Escape 문자(\)를 붙여 줘야함 SELECT REGEXP_REPLACE('$Stay Hungry, Stay Foolish. - Steve Jobs', '-|\$') FROM DUAL --결과: Stay Hungry, Stay Foolish. Steve Jobs





참조 : http://gent.tistory.com/82

출처: http://wjheo.tistory.com/entry/특수문자-제거-숫자만-빼고-다-제거 [IT world]

출처: http://wjheo.tistory.com/entry/특수문자-제거-숫자만-빼고-다-제거 [IT world]

[    JSP FrontController 패턴, Command 패턴, RequestDispatcher를 이용한 forward에 대하여...    ]





- FrontController 패턴이란?

모든 요청을 하나의 서블릿 파일에서 받아서 처리하는 방식


- Command 패턴?

FrontController에서 받은 요청을 분석해 어떤 처리가 필요한지에 따라서 각 처리에 필요한 Command 객체를

할당해 그곳에서 처리한 뒤 필요한 데이터를 가지고 FrontContrller로 보내주고 그 데이터를 request 객체 등에

세팅해 RequestDispatcher 객체를 통해서 화면 전환시 request, response 객체를 함께 전달해주는 방식

이때, RequetDispatcher 객체의 특징!!

: 현재 페이지의 request, response 객체를 그대로 전달할 수 있다.!



- frontControllerEx.jsp
: 하나는 insert.do로 하나는 delete.do 라는 uri로 요청을 하고 있다. 단 둘 다 .do로 끝나는 패턴을 채택하고 있다.



- FrontController.java
.do로 끝나는 모든 요청을 받을 수 있도록 @WebServlet을 통해 서블릿 맵핑이 되어 있다.
또한, get방식이든 post 방식이든 모두 actionDo라는 메서드를 수행하도록 되어 있고 해당 메서드에서는
요청받은 uri를 가지고 와서 어떤 작업이 필요한지 command를 분석한다.

분석하고 처리에 필요한 Service를 지정해 해당 service에서는 dao에 접근해 데이터를 처리하고 FrontController로 반환해준다.
service를 통해 가지고 온 데이터는 request 객체에 저장하고
해당 requets 객체와 response객체를 데이터를 뿌려줄 화면으로 전달하기 위해
RequestDispatcher 객체를 사용해서 전달해준다.
이 객체의 특징은 현재 페이지의 request, response 객체를 그대로 전달할 수 있다는 점이다!!


- Service 인터페이스
: 다형성 적인 측면과 코드의 관리적 측면 때문에 모든 커맨드 객체들을 포함할 수 있도록 Service 인터페이스를 만들고
모든 Command 객체들은 이 Service 인터페이스를 implements 하도록 구현한다. 이때 execute 메서드를 재구현 할 수 있도록
execute 메서드를 선언해 놓는다.


- 각 처리에 필요한 Command 클래스 중 하나
: Service 인터페이스를 구현하고 execute 메서드를 재정의한다.
실재로 이 커맨드 객체에서 dao를 통해 DB에 접근해서 원하는 데이터를 가지고 오는 작업을 해야하지만
현재 코드에서는 생략하도록 하였다.


- FrontController에서 request 객체에 세팅한 값들을 가지고오는 페이지이다.



[    JSP JSTL(Java Standard Tag Liarary)    ]


JSTL은 Java Standard Tag Libarary의 약자로

EL가 같이 사용되어 스크립트릿과 태그를 번갈아 가며 작업할 때의 불편함을 없애기 위해 나왔다.

아래는 사용 예제이다.

하지만, 그 전에 

1. http://tomcat.apache.org/taglibs/standard/ 로 들어간다.


가장 안정적인 버전은 JSTL 1.1 버전이니, 이걸 다운받도록 한다.


2. binaries를 클릭하고, 1.1.1.zip을 받는다.




 다운을 받고 압축을 풀어 lib 폴더에 들어간다.


 두 파일을 복사하여 STS 프로젝트의 WebContent 폴더안의 Web-INF 안의 lib 폴더에 복사한다.


이렇게 까지 하면 세팅 완료 이제 jstl을 사용할 수 있다.


jstl을 사용하려면 <%@taglib 을 등록해주어야 한다. 여기서는 대표적으로 코어(c) 태그 라이브러리만 예제를 사용해 보겠다.



[    JSP EL(Expression Language) 표현언어    ]




EL : Expression Language 표현언어로 표현식, 액션태그를 통해 출력하는 것을 좀더 편리하게 출력할 수 있도록 해준다.



예제를 보기 전에 프로젝트 전체에서 사용할 초기화 변수를 web.xml에 등록하고



객체를 쉽게 가져올 수 있음을 테스트하기 위해 StudentDTO 빈즈를 만들어 놓고...



본격적인 EL 예제)
ELPractice.jsp



- ELPractice2.jsp



[ JSP 파일업로드 ]




jsp에서 파일업로드를 지원하는 라이브러리는 다양한 것들이 있지만 대표적인 것이 cos.jar이다.

해당 라이브러리를 다운받는 사이트는 http://servlets.com/cos/   에서 스크롤을 내리다보면 다운로드가 있다.

해당 파일을 다운로드해서 압축을 풀어 lib에 들어가보면 cos.jar파일이 보이는데 해당 파일을

자신의 프로젝트의 WEB-INF/lib 폴더에 넣고 동기화를 해주면 된다.


- [ 파일 업로드 폼 ] : fileUploadForm.jsp



이때, 파일을 저장할 디렉토리가 필요함으로 프로젝트 WebContent 하위에 uploadFile 폴더를 하나 만들자

이제 이 폴더에 업로드한 파일이 저장되도록 할 것인데, 프로젝트 내에 위치했다해서 워크스페이스 내에 있는 것이 아니다!!

실제 파일의 위치는 자신의 톰캣 서버 내의 프로젝트 폴더 내에 위치하고 있다는 점을 알아야한다.

만약 정확히 모르겠다면 jsp페이지에서 절대경로를 찍어보면 된다.




- fileUpload.jsp 
: 파일 업로드




-fileCheck.jsp
: 파일 체크 페이지








-fileDown1.jsp
: 파일 다운 페이지


'스터디 > JSP' 카테고리의 다른 글

JSP JSTL(Java Standard Tag Liarary)  (0) 2017.08.18
JSP EL(Expression Language) 표현언어  (0) 2017.08.16
JSP 커넥션 풀(Connection Pool)  (0) 2017.08.16
JSP DB(데이터베이스)  (0) 2017.08.14
JSP 자바 빈즈(JAVA BEANS)  (0) 2017.08.14
커넥션 풀이란?

: jsp에서 데이터베이스와 관련된 처리를 할 때 가장 오래 걸리는 부분이 커넥션(Connection)을 생성하는 부분이다.

많은 사용자들이 요청할수록 그것은 더 심한데 그럴 경우 서버가 처음 로딩될 때 미리 일정량의 Connection 객체를

커넥션 풀에 생성해 두고 그곳에서 가져다 사용하고 반납하는 개념이다.

이때, 커넥션 풀에 생성한 커넥션들을 관리하는 객체가 DataSource라는 객체이다.


구현 방법)

먼저, 서버가 로딩될 때 생성해야 함으로 server의 context.xml 파일에서 작업을 한다.



- context.xml
이곳에 아래의 소스코드를 추가한다.
driverClassName, url, username, passowrd 등은 우리가 디비 연결시 필수적으로 필요했던 항목이고
maxActive는 미리 생성해놀 커넥션의 수이다.
maxWiat의 경우 미리 생성한 커넥션 이상의 요청이 들어왔을 때 추가로 커넥션을 생성할 때 최대 기다릴 수 
있는 시간을 설정하는 것이다. 즉 timeout 을 설정
type은 커넥션을 관리하는 DataSource이다.

- db 객체를 얻어오는 페이지



'스터디 > JSP' 카테고리의 다른 글

JSP EL(Expression Language) 표현언어  (0) 2017.08.16
JSP 파일업로드  (2) 2017.08.16
JSP DB(데이터베이스)  (0) 2017.08.14
JSP 자바 빈즈(JAVA BEANS)  (0) 2017.08.14
JSP 에러페이지에 대하여...  (0) 2017.08.11

+ Recent posts