과거 Tomcat 5.0 버전 까지는 커넥션 풀링을 구현하려면, DBCP, Collections, Pool library를 각각 설치해야 했지만, 자카르타 톰캣에서는 다음과 같이 하나의 라이브러리로 제공하고 있다.


Tomcat5.5의 경우 톰캣경로 /common/lib/naming-factory-dbcp.jar

Tomcat6.0의 경우 톰캣경로 /lib/tomcat-dbcp.jar


테스트환경

==============

Oracle 11g

Tomcat 6.0

Eclipse

==============





1. Context configuration


Tomcat Server - server.xml 설정

<Resource name="jdbc/myoracle" auth="Container"

                  type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"

                  url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"

                  username="scott" password="비밀번호" maxActive="20" maxIdle="10"

                  maxWait="-1"/>


2. web.xml configuration

[출처] Oracle DBCP Connection pool Eclipse환경|작성자 bench87


Project - web.xml 설정

<web-app>

....


<resource-ref>

                     <description>Oracle Datasource example</description>

                     <res-ref-name>jdbc/myoracle</res-ref-name>

                     <res-type>javax.sql.DataSource</res-type>

                     <res-auth>Container</res-auth>

</resource-ref>


</web-app


3. Code example


text page 작성 - jdbc6.0.jsp

<%@ page import="javax.naming.*,

                 java.sql.*,

                 javax.sql.*"  %>

<%

response.setContentType("text/html;");


Connection conn= null;

Statement stmt = null;

ResultSet rs   = null;


try {

    Context initContext = new InitialContext();

    Context envContext  = (Context)initContext.lookup("java:/comp/env");

    DataSource ds = (DataSource)envContext.lookup("jdbc/oracleDB");

    System.out.println("[DataSource] :: " + ds.toString());

    conn = ds.getConnection();


   

    // 

    stmt = conn.createStatement();


    // ResultSet 

    String query =

        "SELECT * FROM TEMPLET";

    rs = stmt.executeQuery(query);

%><table border="1" cellspacing="0">

<tr>

<td>Seq</td>

<td>Str1</td>

<td>Str2</td>

</tr>

<%

    while(rs.next()) {

%><tr>

<td><%=rs.getInt(1)%></td>

<td><%=rs.getString(2)%></td>

<td><%=rs.getString(3)%></td>

</tr>

<%

    } // end while

%></table><%


    rs.close();



    stmt.close();


} catch (SQLException e) {

    out.println("err:"+e.toString());

} finally {

   // conn.close();

}

%>

'Server Enterprise > JDBC & DBCP' 카테고리의 다른 글

PreparedStatement 객체 재사용하기  (0) 2016.06.22
[Oracle] JDBC Connection  (0) 2013.07.17
DBCP 에서 JNDI 설정 방법  (0) 2012.07.20

Unique Key를 생성하는 방법은 DBMS마다 차이가 있다.
MS-SQL은 IDENTITY를, MySQL은 auto_increment와 같이 쉽게 사용할 수 있는 방법이 있는데 오라클에서는 Sequence를 사용하여 다음과 같이 유사하게 구현할 수 있다


------------------------------------------------------------------------------------------

1. 자동증가컬럼을 사용하고자 하는 MYTABLE테이블을 생성한다.


       CREATE TABLE MYTABLE
               (ID NUMBER, NAME VARCHAR2(20));


2. CREATE SEQUENCE 라는 문장을 사용하여 SEQ_ID라는 이름의 시퀀스를 만든다.


       CREATE SEQUENCE SEQ_ID INCREMENT BY 1 START WITH 10000;

      -- INCREMENT BY 1 : 증가값은 1
      -- START WITH 10000 :  10000부터 증가


3.  테이블에 데이터 입력시에는 NEXTVAL이라는 슈도 칼럼(Pseudo-column)을 이용하여 시퀸스를 사용한다.


       INSERT INTO MYTABLE VALUES( SEQ_ID.NEXTVAL, '홍길동');

       -- CURRVAL : 현재 값을 반환 합니다. . 
       -- NEXTVAL : 현재 시퀀스값의 다음 값을 반환 합니다. 


------------------------------------------------------------------------------------------

sequence와 trigger를 통해서 auto-increment를 생성 할 수 있다.


먼저, auto-increment를 시행해볼 table을 만든다.


CREATE TABLE templet(

seq NUMBER PRIMARY KEY,

str1 VARCHAR2(256) NOT NULL,

str2 VARCHAR2(256) NOT null

)


seq가 1로부터 시작해서 1씩 증가할 수 있도록 sequence를 생성한다. 


CREATE SEQUENCE templet_sequence

START WITH 1

INCREMENT BY 1;


테이블에 insert 할 때마다 seq column에 이 sequence 를 적용시킬 수 있도록 trigger를 걸어보도록 하자.


CREATE OR REPLACE TRIGGER templet_trigger

BEFORE INSERT

ON templet

REFERENCING NEW AS NEW

FOR EACH ROW

BEGIN

SELECT TEMPLET_SEQUENCE.NEXTVAL INTO :new.seq FROM dual;

END;


이제 테이블에 새로운 row가 insert 될 때마다 이 test_trigger가 실행될 것이고, 결과적으로 seq가 자동으로 1씩 증가하게 된다.

오라클의 Tablespace.

테이블이 저장되는 공간.

오라클에서는 테이블스페이스라고 하여 테이블이 저장될 공간을 먼저 만들고 나서 테이블을 생성 한다

각각의 테이블을 테이블스페이스별로 나누어서 관리와 퍼포먼스의 향상을 가지고 오는것 이다


테이블스페이스를 생성하면 정의된 용량만큼 미리확보한 테이블 스페이스가 생성 되어지고 생성되어진 테이블 스페이스에 테이블 데이터가 저장 된다.


테이블스페이스 생성

create tablespace webacc

datafile 'C:\oracle\product\10.2.0\oradata\orcl\test.dbf' size 100m

default storage

(INITIAL    10K

NEXT      10K

MINEXTENTS 2

MAXEXTENTS 50

PCTINCREASE 50)

;


테이블스페이스 자동확장
alter tablespace webacc
add datafile 'C:\oracle\product\10.2.0\oradata\orcl\test02.dbf' size 200m
autoextend on next 10m
maxsize 500m
;

Oracle을 사용하다보면 종종 유저 Lock이 걸리곤 한다. 


일단 root 권한인 sys로 oracle에 접속하자

sqlplus sys/manager as sysdba;


유저 락 해제

alter user soctt2 account unlock;


유저의 락을 해제하면 비번과 권한설정을 새로 해주어야 한다.

alter user scott2 identified by tiger2;

grant create session to scott2;

grant create sequence to scott2;

grant create table to scott2;

grant drop any table to scott2;


그리고 테이블을 생성/삭제 하려는데, 테이블스페이스의 권한설정이 새로 생성한 scott2에게 없다고 에러를 낸다.

그럴 때는 scott2 유저에게 테이블스페이스의 권한까지 주자.

alter user scott2 quota unlimited on webacc;


이렇게하면 에러가 나지 않을 것이다

Java 멤버

자바의 클래스 안에는 변수와 메소드가 올 수 있는데, 이들 클래스와 메소드를 멤버라 부른다

멤버변수 (Member Variable)는 클래스 안에서 선언된 변수를 말하는데, 초기화를 시켜주지 않아도 객체를 생성 할 때 각 자료형의 기본 값으로 초기화 된다.


기본적으로 변수(Variable)란 데이터를 저장하는 공간이자 물리적인 메모리 공간을 가리키는 주소이다.

변수(Variable)는 그리하여 위에서 언급했던 멤버안의 멤버변수와 지역 변수 이다.


멤버 변수는 3가지로 나뉘는데 클래스 변수와 인스턴스 변수로 나뉘어진다.

클래스변수 - 선언시 static 키워드가 선언된 메소드로 자바 어플리케이션 종료 시 까지 남아있으며 클래스의 모든 인스턴스들이 사용 할 수 있는 변수

종단변수 - 선언시 final 키워드가 선언되며, 더이상의 변수가 아닌 상수 개념으로서의 값이 변하지 않는 변수

인스턴스변수 - 클래스의 멤버로 선언되나 static 키워드는 선언되지 않은 메소드로 인스턴스가 참조될 때만 사용 가능하게 되는 변수


지역변수 - 메소드 안에서 선언되며 메소드 시작시 생성, 메소드 종료시 삭제되는 등 메소드의 라이프사이클과 함께 한다.

그리고 지역변수는 그 메소드 내에서만 사용이 유효하다.



'Server Enterprise > Java' 카테고리의 다른 글

[decompile] java decompiler  (0) 2014.12.30
[Encode] 한글 인코딩  (0) 2014.08.15
[Image Object] width, height  (0) 2014.03.11
[Java] System.getProperty() 에 관하여  (0) 2013.06.14
POJO 개념  (0) 2013.01.05

객체지향 프로그래밍 (Object-Oriented Programming) 캡슐화 (Encapsulation)

캡슐화(Encapsulation)는 클래스의 꼭 필요한 부분만 (필드 또는 메소드) 외부에 접근할 수 있도록 공개하고 그 외에는 접근하지 못하도록 접근을 차단하는 정보은닉(Inforamion Hiding)의 개념이다. 접근 제어자(Access Modifier)라고 하는 키워드를 통해서 클래스의 정보를 통제할 수 있다. 접근 제어자의 종류에는 private, protected, public이 있고 아무것도 명시 하지 않을 수도 있다.


접근 제어자는 필드와 메소드에 사용할 수 있는데, 기본적으로 필드는 private, protected를 쓰도록 하고 굳이 public으로 필드에 접근 시키고 싶다면 getter/setter 메소드를 만들어서 접근하도록 한다. 메소드는 필요에 따라 다 쓰면 된다.


명칭에서도 의미하듯이 private는 내부에서만 사용이 가능하고 외부에서는 접근이 제한된다. public은 외부에서 접근이 가능하다.

protected는 다른 클래스에서 참조할 때 private로 작용하고 상속(Inheritance)받은 클래스에서는 public 으로 동작되게 한다.


기존 필드에 있는 매개변수 들은 이름 왼쪽에 private를 모두 붙여주고, getter/setter 메소드에는 모두 public을 붙여주면 된다.

getter/setter 메소드는 필드에 선언된 변수(Variable)에 값을 저장하거나(set) 가져오는(get) 역할을 하는 메소드이다.


this.variable 처럼 this. 키워드는 클래스 자신의 객체를 의미하는 키워드이다. 위의 예에서는 setter에서 파라미터로 넘겨오는 변수와 필드에 있는 변수를 구분시켜준다.


좀더 부가적인 개념인 POJO에 대한 글도 함께 읽기를 권고한다.

Servlet 과 JSP

동적 HTML을 구성하는 방법은 여러가지가 있다

Perl , 
PHP ,
JSP나 Servlet을 사용하기도 한다


자바가 가진 네트워크 프로그램에서 장점이나, 프로그램의 깔끔함은 저주받은 I/O 성능에 비해 아주 대단하다 할 수 있으므로 JSP나 Servlet을 이용하지 않을 이유가 없다


JSP를 이해하기 위해서는 Servlet을 먼저 이해해야 한다

Servlet은 동적으로 HTML을 생성하는 자바 프로그램이라고 볼 수 있다.


서블릿은 동작 원리가 정해져 있다

메모리에 최초 로딩 될 때 수행 되어져야 하는 내용의 것들이 init()에 작성되고,

실제 Client에 제공하는 서비스 내용이 Service()에 작성되며, 메모리에서 해제 될 때 수행 되어지는 것들이 destroy()에 작성 된다


서블릿의 init()과 destroy()에서 하는 일은 고정적인 일이다

모든 서블릿에 대해서 공통적으로 수행하는 일들이기 때문에 기본 Servlet class에서 위 메소드는 정의 되어 있다

Client의 요청에 따라 실제 서비스를 해야 하는 것은 요구에 따라 다 다르기 때문에 service() 메소드는 따로 프로그래머가 정의를 해야 한다

사용자 2명이 동시에 서버에 요청을 보내면, service를 수행하는 쓰레드가 2개 만들어져 동작한다


그런데, 자바코드로 HTML Page를 만들어 내면 코드 내부의 HTML이 직관적이지 못하다는 문제가 생긴다

테이블을 만들기 위해 for문과 print문이 반복되는 것은 그래도 이해 할 만 하지만,

조금 더 복잡한 테이블의 경우 코드 사이즈가 길어지더라도 HTML 코드로 만들었을 때가 오히려 더 직관적으로 이해하기 쉽다


JSP는 이런 문제점을 해결하기 위한 대안이라고 할 수 있다

그러므로 짐작하는 바와 같이 JSP는 자바 코드와 HTML 코드를 함께 쓸 수 있게 되어 있다

JSP는 기본적으로 HTML 코드에 바탕을 두고 있고, 자바 코드를 삽입할 수 있는 영역을 할당 해준다고 보는 편이 쉽다


디자이너나 퍼블리셔가 표현하고자 하는 페이지 형태는 HTML 코드를 이용해 만든다

그리고 동적으로 바뀌는 부분들만 개발자가 자바 코드를 이용해 페이지에 작업한다

이것이 JSP를 사용하는 목적이다


JSP Container (웹 컨테이너의 한 부류==웹로직, 톰캣)는 JSP 페이지를 바로 이해하지는 못한다

JSP Container는 Servlet만 이해 할 수 있으며, JSP 파일에 대해서는 사전에 Servlet Class로 변환하는 과정을 거친다

위에서 설명한 Servlet 동작 원리와 함께 정리하면 JSP Container는 JSP 파일이 변경이 되었거나 새로 만들어져서 Servlet Class로 변환해야 하는지를 확인하고, 그런 경우 Servlet Class로 변환한 뒤 메모리에 적재한다

메모리에 적재될 때 최초 init() 메소드를 수행하고 요청에 따라서 servlet() 메소드가 쓰레드로 요청을 수행한다. 메모리에 해제되면서 destroy() 메소드를 수행한다


하나의 JSP 페이지가 하나의 Servlet Class로 변환된다는 점에 주목할 필요가 있다.
JSP에서 자바 코드를 삽입하는 부분은 3가지이다.
선언문, 스크립트릿, 표현식이 그 3가지 이다. 
선언문과 스크립트릿의 차이는 JSP가 표현하는 Servlet Class의 멤버변수나 멤버 함수, 로컬변수를 다루는 차이라고 생각하면 된다.

1) 선언문
선언문은 Servlet Class의 멤버 변수나 멤버 함수를 선언한다.
선언문의 형식은 다음과 같다.
<%!
선언문 내용
%>

2) 스크립트릿
스크립트릿은 Servlet Class의 Service()에서 사용되는 지역 변수나 루틴을 표현한다.
스크립트릿의 형식은 다음과 같다.
<%
스크립트릿 내용
%>

3) 표현식
표현식은 Servlet Class의 변수나 메서드 결과 값을 화면에 출력하는 역할을 한다.
표현식의 형식은 다음과 같다.
<%= 변수 혹은 메서드 %>

위 요소를 사용한 다음 예제를 보고 정리한다.
<html>
<body>
<%!
String str = "No";
%>

<%
int i = 0;
if(str == "NO")
i = 1;
else
i = 2;
%>

<%= (i == 1) ? "Good Job" : "No Way"%>
</body>
</html>


http://www.thinkonweb.com/jspbook/lecture/Chapter03.pdf - 참조

EJB (Enterprise JavaBean) ?

Enterprise JavaBean (EJB)은 재활용 가능한 포터블 J2EE 컴포넌트이다. EJB는 비즈니스 로직을 인캡슐레이트 하는 메소드들로 구성되어 있다. 한 예로, EJB가 데이터베이스의 고객 데이터 업데이트를 위한 메소드를 포함하는 비즈니스 로직을 구현하고 있을 수 있다. 다양한 원격/로컬 클라이언트에서 이 메소드를 호출하는 것이 가능하다. 또 EJB는 컨테이너 내부에서 실행되므로, 개발자들이 트랜잭션 지원, 보안, 원격 오브젝트 접근과 같은 복잡하고 까다로운 문제를 신경 쓰지 않고도 빈 내부에 포함된 비즈니스 로직에만 집중 할 수 있게 한다.

EJB는 POJO(Plain Old Java Object)의 형태로 개발되며, 개발자들은 메타데이터 주석(Metadata Annotation)을 이용하여 이 빈들이 어떻게 관리되는지 정의 할 수 있다.


EJB는 윈도우의 COM/DCOM과 대비되는 기술로 대량 처리환경에서의 분산컴퓨팅을 원활하게 하기 위한 기술이다. 일반적으로 프리젠테이션 계층(웹 서버)을 담당하는 머신 A와 비즈니스로직을 처리하는 머신 B 그리고 퍼시스턴스 계층(DB)인 C머신으로 구성된다. A머신은 복수개가 될 수 있으며, 유저입장에서 볼 때에 웹 서버이지만, EJB 기술적 관점으로 볼 때에는 EJB 클라이언트라고 할 수 있다. 당연히 B는 EJB 서버가 된다.


Web Browser(user) - EJB Client(A) - EJB Server(B) - DB Server(C)


A는 EJB클라이언트이기 때문에 Remote Home Interface 및 Remote Interface를 작성한다.

B는 EJB 서버이기 때문에 Session Bean을 작성한다.


세션 빈은 구축 대상 업무를 처리하는 비즈니스 로직이라 생각하면 된다.

리모트 인터페이스는 세션 빈을 원격에서 호출할 수 있도록 해주는 stub와 같은 역할을 해주는 인터페이스이다. 이름이 원격 인터페이스임을 상기하라.


리모트 홈 인터페이스는 리모트 인터페이스의 실체를 생성하여 리턴해 준다. 리모트인터페이스를 만들어 준다고 이해하면 된다.

B의 서버에는 세션빈 이외에도 엔티티 빈이 존재한다.

엔티티 빈은 세션빈과 다르게 로컬환경에서 사용된다. 즉 B서버에만 있으며 A에서의 직접 호출이 불가능하다는 말이다. 따라서 세션빈에 의해 간접적으로 호출되게 된다. 엔티티빈은 일반적으로 DB상의 하나의 테이블과 일치되며, 이 테이블의 선택/갱신/입력/삭제에 관련한 작업을 수행하게 된다. 엔테티 빈은 세션빈의 리모트 인터페이스/리모트홈 인터페이스와 대배되는 로컬 인터페이스/로컬 홈 인터페이스를 보유하고 있다.


J2EE

자바(Java)는 Sun Microsystems 에서 개발된 언어 플랫폼이고, 현재 Ver. 2 이다.

(흔히 java2 라고 부른다.

정확히 Java 2 Platform, Enterprise Edition 이다.


배경을 보자면, 썬(Sun)은 Java 2가 나오면서 플랫폼별로 3개의 Java Version 을 따로 만들었다. 가장 작은 버전인 J2ME는 Micro Edtion이라고 해서 핸드폰이나 PDA등 휴대용 단말기를 위한 자바 플랫폼이고, 요즘 핸드폰에서 게임하고 그런 것들이 해당 된다.


표준인 J2SE는 Standard Edtion 이다. 보통 PC에서 쓰는 일반적인 에디션이다.

J2EE는 Enterprise Edition 이다.

대형 서버에서 돌아가도록 여러가지 부가 기능들이 많이 들어가 있는 에디션이다.

+ Recent posts