블로그 이미지
숏퐁숑

카테고리

분류 전체보기 (70)
게임기획자 준비 (18)
게임기획 참고자료 (7)
프로그램 (33)
숨쉬기 활동 (10)
Total
Today
Yesterday

달력

« » 2025.2
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

공지사항

태그목록

최근에 올라온 글

시퀀스의 정의와 사용 방법에 대해 정리해보려 한다.

개발을 할때 자동으로 키(KEY) 생성을 해야 할 경우 주로 사용한다.?

 

시퀀스(Sequence)란?

  • - 유일(UNIQUE)한 값을 생성해주는 오라클 객체이다.
  • - 시퀀스를 생성하면 기본키와 같이 순차적으로 증가하는 컬럼을 자동적으로 생성 할 수 있다.
  • - 보통 PRIMARY KEY 값을 생성하기 위해 사용 한다.
  • - 메모리에 Cache되었을 때 SEQUENCE 값의 액세스 효율이 증가 한다.
  • - SEQUENCE는 테이블과는 독립적으로 저장되고 생성됩니다. 따라서 하나의 SEQUENCE를 여러 테이블에서 쓸 수 있다.

 

시퀀스 문법

  • - START WITH : 시퀀스의 시작 값을 지정한다. n을 1로 지정하면 1부터 순차적으로 시퀀스번호가 증가 한다.
  • - INCREMENT BY : 시퀀스의 증가 값을. n을 2로 하면 2씩 증가한다. START WITH를 1로 하고 INCREMENT BY를 2으로 하면 1, 3, 5,7,.. 이렇게 시퀀스 번호가 증가한다.

 

시퀀스 예제



-- 시퀀스 생성

SQL> CREATE SEQUENCE emp_seq

START WITH 1

INCREMENT BY 1

MAXVALUE 100000 ;



--  NEXTVAL을 사용하여  시퀀스 값을 자동으로 입력할 수 있다.

SQL> INSERT INTO emp(empno, ename, hiredate )

VALUES(emp_seq.NEXTVAL, 'julia' , sysdate);

-- NEXTVAL은 현재 시퀀스 값의 다음 값을 반환 한다.

SQL> SELECT emp_seq.NEXTVAL FROM DUAL ;

-- CURRVAL은 현재 시퀀스 값을 반환 한다.

SQL> SELECT emp_seq.CURRVAL FROM DUAL ;

 

시퀀스의 수정 및 삭제

START WITH는 수정 할 수 없다. START WITH 절이 없다는 점을 빼고는 CREATE SEQUENCE 문장과 같다.

 

시퀀스의 수정 및 삭제 예제



-- 2씩 증가하고, 최대값을 넘으면 다시 처음부터 순환하도록 수정

SQL> ALTER SEQUENCE emp_seq

INCREMENT BY 2

CYCLE;

-- 시퀀스 삭제

 SQL>DROP SEQUENCE emp_seq;

'프로그램 > ORACLE' 카테고리의 다른 글

Linux 기반의 Oracle10g 설치  (0) 2016.11.30
Backup & Recovery  (0) 2016.11.30
with grant option & with admin option 차이  (0) 2016.11.30
view에 사용되는 with check option  (0) 2016.11.30
오라클 함수 정리  (0) 2016.11.30
Posted by 숏퐁숑
, |

데이터베이스에서 with check option이 무엇일까?

 

view를 통해 insert 가 되는데 with check option 을 사용 여부에 따라 뷰의 조건에 해당하는

데이터만 삽입,삭제,수정 할 수 있다.

 

--예제를 보시면 훨씬 쉽게 이해 하실 수 있습니다.

 

ex)

create table testtable
(empno number(10) ,
deptno number(10),
name varchar2(20))

tablespace users;

 

insert into testtable values(10,20,'abc');

insert into testtable values(20,30,'ccc');

이런식으로 대충 몇개 쭈-욱 데이터를 넣어요!

 

이제 view를 만들어봅시다.

 

1. with check option을 사용하지 않은 view

create view testview2
as
select * from testtable where empno in (10,20,30,40);

 

2. with check option을 사용한 view

create view testview
as
select * from testtable where empno in (10,20,30,40)

with check option;

※ with check option 이 어떤 기능을 하는지 여기서 알수 있다.

view를 통해서 insert가 가능 하다.

 

먼저 with check option 을 사용하지 않은 view 를 통해서 insert를 해보자.

 

insert into testview2 values(10,20,'view_com');

select 문을 실행시키면 데이터가 입력된 것을 확인 할 수 있습니다.

select * from testview2;

(이것은 view는 테이블이 아니기 때문에 testview에 입력된 것이 아니라 testtable에 입력된 것입니다.)

 

insert into testview2 values(80,90,'view_com2');

이것도 역시 테이블에서 확인해 보면 정상적으로 삽입 된 것을 볼 수 있다.

(view에 제약조건이 걸려 있기 때문에 view에는 나타나지 않고 testtable에는 나타난 것을 확인합니다.)

여기까지 정상적으로 모든것이 insert가 된 것을 확인 할수 있을 겁니다.

 

이제, with check option을 사용한 view 를 통해서 insert를 해봅시다.

위에서 insert한 값과 똑같이 넣어 보겠습니다.

insert into testview values(10,20,'view_com'); 아무 이상없이 실행 될것입니다.

 

하지만

insert into testview values(80,90,'view_com2');

ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다.

이런 오류가 나오시는 것을 볼 수 있을 것입니다.

 

결론을 내리자면 with check option은

view를 만들 때 해당 제약조건 안에서만 삽입,삭제,수정이 가능하다는 것입니다.

 

위 예제는 view를 만들 때 empno가 10,20,30,40인 것들만 가져오는 것이였습니다.

그런데 with check option을 쓴 view에

empno에 80인 데이터를 넣을려고 하니 오류메세지가 나오는 것입니다.

'프로그램 > ORACLE' 카테고리의 다른 글

Linux 기반의 Oracle10g 설치  (0) 2016.11.30
Backup & Recovery  (0) 2016.11.30
with grant option & with admin option 차이  (0) 2016.11.30
데이터베이스]SEQUENCE(시퀀스)란 무엇인가?  (0) 2016.11.30
오라클 함수 정리  (0) 2016.11.30
Posted by 숏퐁숑
, |
1. 숫자 처리 함수 :  수 값을 인수로 받아서 처리하기 위한 함수다.

ABS  : 인수의 절대값을 반환한다.
select abs(-10) from dual;
 abs(-10)
 10

ACOS : 인수에 대한 역코사인 값을 반환한다.
select acos(0.1) from dual;
 acos(0.1)
 1.47062890563333682288579851218705812354

ASIN : 인수에 대한 역사인 값을 반환한다.
select asin(0.1) from dual;
 asin(0.1)
 0.10016742116155979634552317945269331856

ATAN : 인수에 대한 역탄젠트 값을 반환한다.
select atan(0.1) from dual;
 atan(0.1)
 0.0996686524911620273784461198780206049018

ATAN2 : 인수 n1/n2에 대한 역탄젠트 값을 반환한다.
select atan2(2,5) from dual;
 atan2(2,5)
 0.3805063771123648863035879168104337074528

BITAND : 인수들의 이진비트를 and한 값을 10진수로 반환한다.
select bitand(7,5) from dual;
 bitand(6,5)
 4
6 = 110(2)
5 = 101(2)
and값 = 100(2) = 4

CEIL : 인수의 같거나 큰수중 가장 작은 정수를 반환한다.
select ceil(6.01) from dual;
 ceil(6.01)
 7

COS : 인수에 대한 코사인 값을 출력한다.
select cos(3) from dual;
cos(3)
 -0.98999249660044545727157279473126130238

COSH :인수에 대한 하이퍼 콜릭 코사인 값을 반환한다.
select cosh(3) from dual;
 cosh(3)
 10.06766199577776584195393603511588983682

EXP : 자연대수 e에 인수n제곱한 값을 반환한다.
select Exp(5) from dual;
 Exp(5)
 148.413159102576603421115580040552279624

FLOOR : 인수보다 작거나 같은 정수들 중 가장 큰 값을 반환한다.
select floor(6.5) from dual;
 floor(6.5)
 6

LN : 0보다 큰 인수의 자연로그 값을 반환한다.
LOG : 인수n1 를 밑으로 하는 인수n2 의 로그 값을 반환한다.
MOD : 인수n1을 인수n2로 나눈 나머지 값을 반환한다.
NANVL : 인수n1이 숫자가 아닐경우, 인수n2값을 반환한다. n1이 숫자일 경우 n1을 반환.
POWER : 인수n1에 인수n2 제곱한 값을 반환.
REMAINDER : 
인수n1을 인수n2로 나눈 나머지 값을 반환한다. mod와는 공식이 다르다.
ROUND (number) : 인수n1를 소수점 인수n2 자리까지 반올림한 값을 반환.
SIGN : 인수의 부호를 반환. 값이-1일경우 음수, 0일경우 인수의 값이 0, 1일경우 양수.
SIN :인수에 대한 사인값을 반환
SINH :인수에 대한 하이퍼 볼릭 사인값을 반환
SQRT : 인수의 제곱근을 반환
TAN :인수에 대한 탄젠트 값을 반환
TANH  : 인수에 대한 하이퍼 볼릭 탄젠트 값을 반환
TRUNC (number)  : 인수n1의 인수n2소수점 자리까지 버림을 한다.
WIDTH_BUCKET : 최소값 인수n2, 최대값 인수n3 사이의 숫자를 구간 인수n3을 나누고, 인수n1이 몇번째 구간에 있는지를 반환.
 

 
2.  문자 처리 함수 : 문자(열) 값을 인수로 받아서 처리하기 위한 함수다.
 
CHR : 바이너리값 인수n1에 해당하는 문자를 반환.
CONCAT : 문자열 인수 들을 연결한다.
INITCAP : 문자열의 첫문자를 대문자로 바꾼다
LOWER : 문자열 전부를 소문자로 바꾼다.
LPAD : 인수n1 문자열앞에 인수n3 문자열을 추가한다. 더한 전체 문자열은 인수n2의 숫자만큼이다. 

LTRIM : 문자열 인수n1의 왼쪽 인수n2를 없앤 문자열을 반환.
NLS_INITCAP :조건부 첫문자열을 대문자로 변환
NLS_LOWER : 조건부 대문자를 소문자로 변환
NLSSORT : 조건부 정렬
NLS_UPPER : 조건부 소문자를 대문자로 변환
REGEXP_REPLACE : 지정한 패턴을 가진 문자열을 찾음.
REGEXP_SUBSTR : 문자열을 포함한 
지정한 패턴을 가진 문자열을 찾음.
REPLACE : 문자의 일부를 다른 문자열로 변경
RPAD : 특정한 문자열을 추가(right)해서 문자열 길이를 늘림
RTRIM :
문자열 인수n1의 오른쪽 인수n2를 없앤 문자열을 반환.
SOUNDEX : 영문 발음이 비슷한 그룹의 번호를 반환.
B, F, P, V = 1 C, G, J, K, Q, S, X, Z = 2 D, T = 3 L = 4 M, N = 5 R = 6
이외의 것은 미리 제거.

SUBSTR : 특정위치(인수n1)에서 몇개(인수n2)의 문자를 잘라 반환한다.
TRANSLATE 인수n1 문자열에 포함된 일부의 문자열 n2를 다른 문자열n3으로 변환한다.
TREAT : 인수의 선언된 형을 바꾼다.
TRIM : 조건으로 지정된 문자를 제거한다.
UPPER : 소문자에서 대문자로 변환한다.
 

 
3. 날짜 연산 함수 : 날짜 데이터 타입에 사용하는 함수다.
 
- 오라클 날짜 함수
ADD_MONTHS : 달수를 증가시킨다.
CURRENT_DATE : 현재 날짜를 반환한다.
CURRENT_TIMESTAMP : 현재 날짜와 시간 정보를 반환한다.
DBTIMEZONE 
 : 데이터베이스 시간대의 값을 반환합니다
EXTRACT (datetime) : 인수의 지정한 시간대를 출력. year,month등등..
FROM_TZ  
TIMESTAMPDBTIMEZONE 의 데이텉 타입을 timestamp with tome zone 타입으로 변환.
LAST_DAY : 지정한 달의 마지막 날짜를 반환.
LOCALTIMESTAMP  
TIMESTAMP의 현재 날짜와 시간을 출력.
MONTHS_BETWEEN : 지정한 두 날짜의 달 차이를 출력.
NEW_TIME : 첫번째시간대에 해당하는 날짜를 두번때 시간대로 변환.
NEXT_DAY : 지정한 날짜로부터 다음오는 지정한 요일이 몇일인지 반환.
NUMTODSINTERVAL 시간을 지정된 숫자로 변환.
NUMTOYMINTERVAL 날짜를 지정된 숫자로 변환.
ROUND (date) 날짜를 지정한 시간대의 첫번째 날을 출력.
SESSIONTIMEZONE : 현재 세션의 시간대를 반환.

SYS_EXTRACT_UTC :
시 간대 오프셋 또는 시간대 지역 이름을 datetime 값에서 UTC를 추출
SYSDATE : 데이터베이스의 날짜를 반환.
SYSTIMESTAMP 데이터베이스의 시간대를 반환.
TO_CHAR (datetime) 현재 시간을 문자열 형태로 반환.
TO_TIMESTAMP 지정한 
TIMESTAMP형태로 날짜와 시간을 변환
TO_TIMESTAMP_TZ 
지정한 TIMESTAMP형태의 날짜와 시간을 timestamp with tome zone 타입으로 변환
TO_DSINTERVAL  시간을 문자열 형태의 지정한 숫자로 변환.
TO_YMINTERVAL  날짜를 
문자열 형태의 지정한 숫자로 변환.
TRUNC (date) : 날짜를 지정한 기준으로 특정시간을 버림.
TZ_OFFSET  : 
문이 실행될 날짜를 기준으로 인수에 해당하는 시간대 오프셋을 반환

4.  형변환 함수 : 각각의 숫자, 문자, 날짜의 데이터 형을 변환해야하는 경우 사용하는 함수다.
 
- 오라클 변환 함수
 
ASCIISTR : 문자열의 아스키코드를 반환.
BIN_TO_NUM : 숫자의 2진코드로 변환.
CAST : 다른 데이터 형식으로 변환.
CHARTOROWID : 16진수의 바이너리코드를 해당 문자로 변환.
COMPOSE : 유니코드 형식의 코드를 해당 문자로 변환.
CONVERT :
하나의 문자 세트에서 다른 문자열로 변환
DECOMPOSE : 입력된 형태의 문자열을 유니코드에 해당되는 문자로 변환.
HEXTORAW  입력된 16진수의 값을 raw형태로 변환.
NUMTODSINTERVAL 각각 입력된 시간에 지정된 숫자의 차를 반환.
NUMTOYMINTERVAL 
각각 입력된 날짜에 지정된 숫자의 차를 반환.
RAWTOHEX  처리과정을 거치지않은 입력된 데이터를 16진수로 변환.
RAWTONHEX 
처리과정을 거치지않은 입력된 데이터를 16진수에 해당하는 데이터로 변환.
ROWIDTOCHAR : 
ROWID값을 18자 크기의 varchar2형으로 변환.
ROWIDTONCHAR 
ROWID값을 18자 크기의 nvarchar2형으로 변환. 
SCN_TO_TIMESTAMP : scn을 timestamp로 변환.
TIMESTAMP_TO_SCN  : 
timestamp을 scn로 변환.
TO_BINARY_DOUBLE : 인수를 더블 형태의 부동소수점 데이터형으로 변환.
TO_BINARY_FLOAT : 
인수를 플롯 형태의 부동소수점 데이터형으로 변환.
TO_CHAR (character) : 문자열 형식(
NCHAR , NVARCHAR2 , CLOB ,NCLOB)을 항상 varchar2 형태의 데이터로 변환.
TO_CHAR (datetime) : 
TIMESTAMP , TIMESTAMP WITH TIME ZONE , TIMESTAMP WITH LOCAL TIME ZONE의 데이터 형식을 varchar2 형식으로 변환.
TO_CHAR (number) : number, float, double 형식의 데이터를 varchar2 형식으로 변환.
TO_CLOB : lob칼럼의 nclob 혹은 다른 문자 스트링을 clob으로 구하는 함수.
TO_DATE : char, varchar2, ncar, nvarchar2 데이터 형을 date데이터 형식으로 변환.
TO_DSINTERVAL : 
char, varchar2, ncar, nvarchar2 데이터 형을 interval day to second 데이터 형으로 변환.
TO_LOB : long, log raw 컬럼의 데이터를 lob형싱 데이터로 변환.
TO_MULTI_BYTE :single 바이트 문자를 포함한 모든 문자열을 다중바이트 문자열로 변환.
TO_NCHAR (character) : 문자 스트링, clob, nclob 형식 데이타를 nchar형태의 데이터로 변환.
TO_NCHAR (datetime) : 모든 시간 데이터를 nchar형태의 데이터로 변환.
TO_NCHAR (number) : 모든 숫자 형식 데이터를 nchar형태의 데이터로 변환.
TO_NCLOB : 
lob칼럼의 clob 혹은 다른 문자 스트링을 nclob으로 구하는 함수.
TO_NUMBER : 숫자를 포함하는 문자열 데이터를 숫자형식의 데이터로 변환.
TO_SINGLE_BYTE : 다중 바이트 문자열을 single 문자데이터로 변환.
TO_TIMESTAMP : 
 char, varchar2, ncar, nvarchar2 형식 데이터를 timestamp 형식 데이터로 변환.
TO_TIMESTAMP_TZ : 
char, varchar2, ncar, nvarchar2 형식 데이터를 timestamp time zone형식 데이터로 변환.
TO_YMINTERVAL 
char, varchar2, ncar, nvarchar2 형식 데이터를 interval year to month 형식 데이터로 변환.
TRANSLATE ... USING : 문자열을 지정한 문자형식 코드로 변환.
UNISTR : 문자열을 nchar 형식으로 변환.

 

Posted by 숏퐁숑
, |

프로젝트를 진행하다보니 솔루션으로 개발되어진 시스템 개발환경을 수정해야할 일이 생겼다.  JAVA PROJECT로 만들어진

어플리케이션을 Web Dynamic Project로 변경해서 이클립스 상에서 톰캣에 올려놓고 운영을 하고 싶은데... 변환하는 과정에서

여러 문제가 발생해서 해결한 부분들을 기록해 보았다.


우선 웹 다이나믹 프로젝트로 변환하기 위해 Project Facets 부분 설정을 아래와 같이 변경해 주었고,

변경되어진 프로젝트를 톰캣에 올리려고 하니

톰캣 7.0버전 이상부터 지원이 가능해서 Tomcat 6.0으로 되어있는 설정 부분을 다 변경하고 Tomcat 7.0을 설치하였다.

 

여기까지는 순조로웠다. 쉽게 Web Dynamic Module로 변경은 해서 이제 톰캣에 add는 되었는데....톰캣을 구동하니 아래와 같은 에러가 발생하였다. 톰캣을 구동하는데 다음 처럼 컴포넌트를 시작하는데 실패하였다는 메시지였다.

왜 발생을 했을까? 우선 톰캣을 구동하면 빌드해 놓은 클래스파일들을 올리고나서 jar파일들을 읽어 드린다. 여기서 애기하는 conponent라는 것은 이 class파일을 묶어놓은 jar파일을 애기하는 것 같다. 톰캣 6.0에서 7.0으로 변경하면서 commons.dbcp 파일을 못찾고 있어 에러가 떨어졌다.

 

javax.naming.NamingException: Could not load resource factory class [Root exception is java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSourceFactory]
 at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:82)
 at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:842)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:153)


처음에는 기존 6.0톰캣 lib폴더 안에 있는 jar파일을 넣었더니 클래스파일을 찾기는 하는데 또 이번에는 읽을수가 없다고 나와서...


아래 경로해서 해당하는 버전의 commons.dbcp를 다운받아서 톰캣 lib 폴더에 넣어주었다.

http://commons.apache.org/proper/commons-dbcp/
http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

 

그랬더니 아래와 같은 에러가 여전히 발생하고 있었다... 왜 이런 에러가 계속 발생하는 걸까? 결론부터 애기하면

아래와 같은 에러는 해당 라이브러리가 버전이 달라 톰캣에서 지원을 안한다는 메시지로 보면 된다. 예를 들어

예를 들어 commons-dbcp.jar 파일은 톰캣6에서 사용했던 라이브러리였지만 tomcat7에서는 tomcat-dbcp.jar파일로

바뀌어져 제공을 하는데 잘 몰라서 commons-dbcp.jar파일을 넣는다던지 기존 버전에 쓰던 라이브러리를 넣었을때

아래와 같은 에러문구를 만날 수 있게 된다. 해결방법은 간단하다. 그냥 옛 버전 라이브러리를 삭제해주면 된다.

그리고 servlet.jar파일을 jdk 폴더 아래 jre/lib 폴더에 넣어주면 아래 에러는 해결할수 있다.


org.apache.catalina.LifecycleException: Failed to start component [StandardServer[10005]]
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:693)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:428)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
 at org.apache.commons.dbcp.BasicDataSourceFactory.createDataSource(BasicDataSourceFactory.java:152)
 at org.apache.commons.dbcp.BasicDataSourceFactory.getObjectInstance(BasicDataSourceFactory.java:144)
 at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:141)
 at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:842)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
 at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1103)
 at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:682)
 at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:271)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
 at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
 at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:731)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
 ... 7 more


하지만 문제를 다 해결하진 못했다. 모든 개발의 시작은 개발 환경설정에서 시작을 하는데 개발 환경을 잡는 것은 산 넘어 산이다.구글링을 통해서 다양한 문서들을 정독하다보니 먼저 발견한 것은 Tomcat6버전에서 Tomcat7버전으로 넘어오면서

Commons-dbcp.jar에서 제공하던 class 오브젝트들을 Tomcat-dbcp.jar파일에서 통합적으로 제공한다고 한다.

많은 사람들이 저 위의 방식대로 Tomcat-dbcp.jar파일을 Tomcat 폴더의 lib폴더에 넣고 아래처럼 JNDI 설정을 하라고 한다.

(아래 설정하는 것은 http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html 참고 바람)

 

<Resource name="jdbc/voc"
     auth="Container"
     type="javax.sql.DataSource"
     driverClassName="oracle.jdbc.driver.OracleDriver"
     factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
     url="jdbc:oracle:thin:@1xx.xx.x.xxx:xxxx:SID name"
     username="tiger"
     password="tiger"
     maxActive="3"
     maxIdle="3"
     maxWait="-1" 
     removeAbandoned="true"
     removeAbandonedTimeout="60"
     logAbandoned="true"
     validationQuery="select 1 from dual"
     validationInterval="30000"
     testOnBorrow="true"
     tetWhileIdle="true"
     timeBetweenEvictionRunsMillis="600000"
     minEvictableIdleTimeMillis="3600000"
     />

 

  server.xml파일에 JNDI 설정해 주고, context.xml에

<ResourceLink global="jdbc/voc"  name="jdbc/voc"  type="javax.sql.DataSource"/> 
<ResourceLink global="jdbc/sms"  name="jdbc/sms"  type="javax.sql.DataSource"/> 

추가해주고 마지막으로 web.xml에

 <resource-ref>
  <description>
  </description>
  <res-ref-name>jdbc/sms</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
 </resource-ref>


추가해주면 끝난다. 사실 위의 방식은 좀 Old한 방식이다 JNDI로 안붙고 SPRING  설정 파일에 다 설정해서 간단히 사용하는 경우가 많다.  위에 처럼 열심히 설정하면 끝나는것 처럼 보이지만 tomcat-dbcp.jar에서 server.xml에 설정 되어진 팩토리의 클래스들을 읽어오지를 못한다. 결국 통합적으로 제공해준다는  jar파일에서 읽어오지 못해서 에러가 발생할 것이다.

(구글링하다 보면 7.0에서 tomcat-dbcp.jar파일만 넣으면 된다고 써있다;;; 하지만 안되는 분들도 있을 것이다) 


해결방법은 기존에 ojdbc14.jar파일을 comcat의 lib 폴더에 넣어줘야 해결된다. 위에 오라클 드라이브나 DB 컨넥션 하기위한 클래스파일들을 정상적으로 읽어드리기 시작한다.

이야기가 길어졌는데...개발하기 전에 환경을 잡는 과정에서도 많은 문제점들을 접하게 된다. 이런 문제를 해결하기 위해 가능한

비슷한 환경에서 개발중인 분들의 글들을 참고하면서 해결해 나가는데 정답은 없는것 같다.  원인을 잘 모르면 똑같이 해보아도 잘 해결이 안된다. 나중에 이런문제가 발생했을 때 기억을 더듬기 위해 두서없이 적어보았는데 혹시 같은 문제로 고생분이신 부들에게 도움이 되었으면 좋겠다. 그럼 오늘도 열심히 개발 삼매경으로 ㄱㄱㄱ 

Posted by 숏퐁숑
, |

Web Server와 WAS 같은게 아닐까? SM 업무를 한지 4년이 지났다.

주로 화면 개발이 많다보니 JAVA와 JSP,UI단 화면 수정, 쿼리 수정이 대부분이고 서버쪽은 인프라 팀에 요청을 하곤 한다. 근데 이제 개발을 하면 할 수록 서버쪽을 모르고는 '모래성 위에 성'을 쌓는 것밖에 되지 않는 다는 사실을 몸소 깨닫고 있다. 이제는 무작정 개발하는 것이 아니라 성능이 중요해졌고 속도가 중요해졌다. 에러가 나는 원인이 중요해졌고 어떻게 해결 해야하는지가 중요해졌다. 서버를 이해하려면 아파치와 WAS 차이를 먼저 정리할 필요가 있다. Web Server와 WAS가 다르다는 것은 알고 있었지 둘의 개념은 정확히 정리되어 있지 않았다.

 

그럼 정리 들어간다... ㅋ 

 

  - Web Server(아파치)

- 정적인 페이지들을 표현하기 위한 서버로 즉  HTML,JPG나 GIF같은

이미지를 HTTP 프로토콜을 통해 웹 브라우저로 제공하는 서버이다.


   1) Web Client(웹 브라우저)에게 제공하는 컨텐츠를 제공하는 서버이다.

   2) 정적인 HTML 혹은 jpeg나 gif같은 이미지를 HTTP프로토콜을 통해 웹 브라우저로 제공한다.

   

    * 정적인 데이터(image, CSS, javascript- 파일 등의 리소스)는 구조적으로 앞에 존재하는

      웹 서버에서 처리하고 WAS로 서비스 요청이 넘어가지 않게 한다.

      동적인 데이터는 WAS가 처리한다. WAS는 웹 어플리케이션의 수행에 집중할 수 있다.

 


  - WAS(Web Application Server)

 - 동적인 페이지들(jsp,php, asp)등을 표현하기 위한 서버

   1) Server단에서 어플리케이션을 동작할 수 있도록 지원한다.

   2) 일반적으로 컨테이너라는 용어로 사용된다.

   3) Servlet, JSP, ASP, PHP 등의 프로그램으로 사용된다.

   4) Servlet 페이지를 html 형태로 변환한다.

      예를 들어 jsp의 경우 jsp를 WAS에서 java class파일로 컴파일 후 

      html형태의 페이지를 사용자에게 전달한다.

 

 

WAS의 종류는 크게 담음과 같은 4가지가 있다.
 1. BEA의 Web Logic 

 2. IBM의 Web Sphere  

 3. TMax의 Jeus(제우스)

 4. 아파치 그룹으로 잘 알려진 Apache S/W Foundation의 자바카르타 프로젝트에서 발표한 TOMCAT

Posted by 숏퐁숑
, |

오늘은 톰캣의 설치 및 서블릿 구동에 대한 내용을 정리해 보고자 한다. 일반적으로 톰캣은 경량 컨테이너라고 부르는데 가장 쉽게 접할 수 있는 WAS의 한 종류라고 볼 수 있다. WAS에는 크게 4가지 종류가 있는데 Weblogic, Websphere, JEUS, TOMCAT 이다.  흔히 우리는 로컬PC에서는 TOMCAT을 설치하여 서버를 구동하는데 말 그대로 경량 컨테이너이기 때문에 부담 없이 개인 PC에선 개발용으로 충분히 사용할 수 있겠다.

 

1. 우선 JDK 설치를 설치한다.

 

2. 웹서버(WAS) 설치(tomcat.apache.org사이트에서 다운로드)

    => tomcat 7.0 다운로드 (인스톨버전, 무설치 압축버전 중 택)


   *설정하기

  1. jdk path 잡기 => C:\Program Files\Java\jdk1.6.0_21\bin

  2. JAVA_HOME  => C:\Program Files\Java\jdk1.6.0_21

  3. CATALINA_HOME  => C:\tomcat                           // TomCat을 설치한 경로 or 압축푼 경로.

 

3. 이클립스 설치

     =>다이나믹웹프로젝트 생성함.

       src/                 //java파일만들기

       webContent/     //jsp, script, html, css문서 만들기

 


4. 이클립스에 서버등록하기(server.xml문서에 가상폴더 생김)


 

 

실행방법 :

http://ip:port/

웹서버가 설치되어있는 IP

LocalHost (127.0.0.1) 기본 포트 : 8080

 

보통 http://localhost:8080  을 입력하면 확인 할 수 있다.

Posted by 숏퐁숑
, |

Coherence WebClustering 기능을 통한 Session Clustering 구성 환경에서 Failover 실패에 대한 원인을 정리하고자 한다.  2대의 서버를 올려놓고 한대의 서버가 죽더라도 다른 서버에서 요청처리가 되어지도록 설정이 되어있었다. 즉 Clustering 구성이 되어있다는 말이다.  Weblogic을 사용하는데 비용때문에 엔터프라이즈로 들여오지 못하고 스탠다드로 들여오다 보니 Coherence WebClustering 기능을 통하여 구성을 하게 되었다 Coherence WebClustering이란 간단히 세션 서버를 따로 띄워놓고, 하나의 서버가 죽더라도 다른 서버에서 아무 문제 없이 세션을 공유한체 서비스를 제공해주기 위한 방식을 말한다. UI 단 계발은 XPLATFORM으로 개발이 되어 있는 상태다. Weblogic에서 Coherence WebClustering 기능을 통한 session Clustering 구성 환경에서 왜 Failover 실패가 되었을까?

 

처음엔 Xplatform에서 문제가 되는 것이 아닌가? 라는 생각이 들었다. 하지만 원인 다른 곳에 있었다. 

?

가)    Session Cluster 기능 정의

     Session Cluster Session 객에의 Attribute set된 직렬화된 객체를 Replication 방식을 통해 Failover를 구현하는 기능이다.

     Session Failover 전제 조건

   -. Session attribute에 담긴 객체가 Serializable(직렬화)객체여야 한다.

  -. Session attribute에 담겨야 한다. (Session외의 객체는 clustering 대상이 아니다)

 

나)    Application에서의 Session Check 방식(소스 분석 결과)

     소스 분석결과 Application에서의 Session 체크 로직이 Session만 체크하는 일반적인 구현방식이 아닙니다.

     일반적인 Session 유지 로직은 Session객체의 Attribute에 특정 Value Object를 담아 놓고 사용한다. 구현된 로직 상에 보면 Session Object외에 ServletContext attribute Object를 담고, session 체크 로직에서 양쪽의 Value값을 함께 체크하고 있다. 이는 일반적인 Session 체크 방식이 아니다.

     Cluster의 대상은 Session Object입니다. SevletContext 객체는 Cluster 대상이 아니다.

 

다)    Session 유지 테스트

     기본적인 세션관련 테스트 페이지(FailoverTest.jsp) Session 객체만을 이용하여 하나의 인스턴스 다운 시 클러스터의 다른 인스턴스를 통해 세션이 유지됨을 테스트 하는 페이지로, 테스트 결과 정상적으로 세션이 유지 되고 있다.

     Failover 현상 시, Session객체에 담긴 값은 Secondary 서버에서 그 값을 유지하지만  ServletContext Object는 복제대상이 아님으로 체크 값이 없다.

     WebLogic ? Coherence 구조의 테스트 뿐만 아니라 WebLogic Cluster 상의 테스트도 동일 결과가 나왔다.

?

결론은 현재의 현상은 Session Failover 실패 현상이 아니였다. Cluster 대상이 아닌 ServletContext객체를 Session체크를 하는 프로그램상의 오류 였다. 일반적으로 Session에 관련된 로직은 ServletContext객체 대신 Session객체만을 사용하여 구현한다.

 

Posted by 숏퐁숑
, |

세선은 클라이언트와 서버 간의 연결 단위를 지칭하는 용어입니다. 하나의 세션이 형성 되었다는 말은 클라이언트와 서버간에 하나의 연결이 이루어졌다는 의미입니다.

대개 "세션이 있다, 없다"는 식으로 표현을 합니다. 이것은 "현재 연결이 되어 있다, 아니다"를 말하는 것입니다.
Session 객체


getAttribute() 현재의 세션에 포함되어 있으면서 특정 이름을 가진 object 형의 객체를 반환합니다. 만일 해당 이름을 가진 객체가 존재하지 않는다면 null 값을 반환합니다 .
getAttributeNames() 현재의 세션에 포함되어 있는 객체의 이름들을 Enumeration 객체 집합으로 반환합니다.
getCreationTime() 현재의 세션이 생성된 시간을 반환합니다. 이 값은 밀리세컨드 단위이며, 기준은 유닉스 시간, 즉 1970년 1월 1일 GMT를 기준으로 해서 계산된 값입니다.
getId() 현재 세션의 유일한 구분값을 반환합니다. 세션은 사용자 별로 식별 가능한 값들을 가지고 있는데, 이 값들을 얻기 위해서 이 메소드를 이용하게 됩니다. 이 값은 JSP 개발자가 직접 다룰 일은 거의 없으며, 대부분 웹 컨테이너에서 세션 객체를 구분할 경우에 사용합니다.
getLastAccessedTime() 사용자가 현재 세션과 관련된 요청을 전송한 최종 시간을 반환합니다. 이 값은 밀리세컨드 이며, getCreationTime과 마찬가지로 유닉스 시간을 사용합니다.
getMaxInactiveInterval() 하나의 요청과 그 뒤의 요청 사이의 시간 간격을 얼마 동안 유효하게 볼 것인지에 대한 값을 반환합니다. 이 시간을 넘겨 요청하게 되면 해당 세션은 무효화됩니다.
getServletContext() 현재 세션과 연관되어 있는 ServletContext 객체를 반환합니다.
invalidate() 현재 세션을 무효화시키고, 세션에 있는 모든 객체들을 제거합니다.
isNew() 클라이언트에서 전송한 요청이 세션과 연관되지 않은 최초의 요청일 경우는 true를, 이미 세션과 연관되어 있다면 false를 반환합니다.
removeAttribute() 현재 세션에 저장되어 있는 객체 중 특정 이름을 가지고 있는 객체를 제거합니다.
setAttribute() 현재의 세션 객체에 특정 이름의 객체를 추가합니다.
setMaxInactiveInterval() 요청과 요청 사이에 세션 정보를 유지시킬 수 있는 시간을 설정합니다. 만일 이 시간을 넘어선 상태에서 요청을 하게 되면 세션은 무효화됩니다.

Posted by 숏퐁숑
, |

 

1000원 더내서 수육국밥을 먹었으나 맛이 없다.

 

'숨쉬기 활동' 카테고리의 다른 글

머리가 아프다  (0) 2017.01.03
오늘도 소주  (0) 2016.12.31
크리스마스땐 공부를  (0) 2016.12.26
크리스마스와 함께하는 안드로이드 개발공부  (0) 2016.12.25
블로그 자료 이전  (0) 2016.11.30
Posted by 숏퐁숑
, |

목표

게임기획자 준비 / 2016. 11. 29. 12:32

취업하기

 

연봉 3000받고 시작하기

 

3000이상 줄 수 있는 곳을 찾기

 

3000이상 주는 기업 요구사항을 하나씩 달성하기

 

과정이 어떻든 목표일에 맞춰 결과물을 내놓기

 

 

Posted by 숏퐁숑
, |

최근에 달린 댓글

글 보관함