2013년 8월 29일 목요일

JAVA&WEB프레임워크실무과정(주말주간(토/일))

구로디지털단지역 오엔제이프로그래밍 실무학원


(Java , Oracle, SQL, Oracle Tuning, BackUP& Recovery, ASP.NET, C#, C#Network ,채용확정 무상교육) www.onjprogramming.co.kr  오라클자바커뮤니티  http://www.oraclejavanew.kr

JAVA&WEB프레임워크실무과정

강좌명 JAVA&WEB프레임워크실무과정(주말주간(토/일))
교재 자체교재 무료제공
강좌 일정 08월31일(토) ~ 10월20일(일)((주말주간(토/일)) 10:00~18:00, 14일) 총 98시간
강의 장소 [B강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
[약도보기]
수강절차 - 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료 - 1,200,000원
[고용주환급]대기업:40만원 전후,중소기업:48만원 전후 환급
[개인수강지원(개인환급)]정규직960,000원 ,비정규직:전액환급

대기업(상시근로자 300인 이상 대기업)은 개인환급 불가합니다.

재직자 내일배움카드 : 정부지원금 80% 자기부담금 20%
(구 능력개발카드 명칭이 내일배움카드로 변경 / 연간 총한도 200만원



* 휴강 :법정공휴일 / 추석 연휴 9월17일 휴강
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 본과정은 프로그래밍 언어의 경험이 있는 분이지만 자바를 처음하시는 분들을 위해
현장에서 필요로 하는 기술들을 최적화된 커리큘럼 및 강사를 통해 배울 수 있도록 하는 과정 입니다.

자바의 기본적인 사항부터 JDBC 프로그래밍, 모든 개발의 근간이 되는 자바네트워크 프로그래밍(이거 안하시면 2~3년지나서 UI개발자의 틀을 벗어 날 수 없습니다), 자바웹의 기본이되는 JSP, 그리고 최근 가장널리 사용되는 Ajax, jQuery를 통해 화면 깜박임없이 웹페이지를 역동적으로 구성할 수 있도록 배우고 최근 가장 많이 사용되는 JAVA기반의 프레임워크인 Spring Framework, SQL Data Mapper인 MyBatis까지 배울 수 있는 과정으로 자바 웹 개발자로 가시고자 하는 분들을 위한 최적의 과정 입니다.

본과정을 통해 기초부터 하나씩 배우신다면 내공 있는 자바 개발자가 되실것을 확신합니다!
교육목표 - 자바 기본문법의 이해
- 자바 네트워크 프로그래밍에 대한 이해
- JDBC 개발에 대한 이해
- 자바 웹개발에 대한 이해
- JSP의 작동원리 및 기본문법의 이해
- Ajax 및 jQuery에 대한 이해
- WAS(Web Application Server) 및 Web Server에 대한 이해
- 자바기반 프레임워크에 대한 이해(Spring3.X)
- SQL Mapper(MyBatis)에 대한 이해
- 실무 자바기술의 전반적인 이해 및 활용
교육대상 - 자바 초보 개발자
- 신입개발자
- 다른 언어를 사용하다가 자바쪽으로 전향을 원하는 개발자
- 자바를 배우고자 하는 학생
선수학습 - 프로그래밍에 대한 이해
 

Java Fundamental 자바 언어 소개,기본 문법
Virtual Machine 소개/메모리 영역
클래스 패스(Class Path) 개요
Array 이론/실습
클래스와 객체(Class & Object)
Abstarct Data Type, 상속(Inheritance)과 다형성
추상클래스(Abstract Class)와 다형성
인터페이스(Interface)와 다형성
연관(Aggregation & Composition)
오버로딩(OverLoading)과 오버라이딩(Overriding)
this/super/constructor
Package 만들기 이론/실습
Java에서 예외 처리 요령
사용자 예외 처리 방법
스트림(Stream) 입출력 관련 클래스, InputStream/OutputStream,
FileInputStream/FileOutputStream
Reader/Writer등 입출력 관련 클래스
표준 입출력/FILE 처리, 객체 직렬화 이론/실습
Thread 개요
Java에서의 Process
Thread Joining/Interrupt
Java Network URL/HTTP URL, URLConnection, HttpURLConnection, URLEncoding, URLDecoding 클래스 개요
URL을 다루는 예제 실습(Get/Post)

Client Socket과 Server Socket의 개요
MultiThread EchoServer
Socket을 이용한 예제 구현

UDP Programming(Multicasting programming)
UDP/Datagram 개요
DatagramSocket, DatagramPacket 소개
UDP를 이용한 예제 구현
Multicast 소개
Multicast Client/Server 구현
Distributed Computing(java RMI)
Distributed Computing, Object 소개
Java RMI를 이용한 “Hello World” 제작
RMI 응용예제 실습
JDBC Programming JDBC Driver 소개
JDBC 연결방법
Connection, Statement, ResultSet, PreparedStatement
Oracle의 function, procedure 다루기
DBCP, DataSource, Connection Pool
JSP(Java Server Page) JSP 기본문법, 작동원리
JSP 내장 객체,Java Beans
JSP에서의 Session, Cookie 다루기
Custom Tag
MVC Model(Model2)의 이해 및 활용
Ajax/jQuery Ajax 개발환경 구축
왜 Ajax 인가?
Ajax의 기본 구성
XMLHttpRequest 객체
innerHTML의 사용
DOM(Document Object Model) 다루기
Ajax MVC
jQuery 소개, 개요
jQuery 응용 예제
Spring Framework3.2 J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.2, Tomcat7, Spring3.2 다운로드 및 설치)
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
DL. DI 예제를 통한 이해
Spring 설정 상세
Spring AOP 란 ?Code, Advice, JoinPoint, PointCut, Aspect, WeavingProxyFactoryBean
Annotation기반 AOP(AspectJ)
Spring JDBC
Spring Web MVC
Sprint Web Flow
Spring Controller
Spring MVC TEST Framework
Spring3.2 New Feature
MyBatis/Hibernate [MyBatis]
개요 및 소개
개발환경 설정 및 설치
Data Mapper란
sqlMapConfig 이해 및 환경설정
Spring, MyBatis 연동
SQL Map XML File 이해
SqlMapClient 이해
SQL의 실행(Insert/update/delete) 이해와 실습
고급 쿼리 사용방법의 이해와 실습
Spring MyBatis 응용예제 작성

[Hibernate]
Hibernate 소개
SessionFactory 설정
1:1, 1:다 매핑
Session Interface
Hibernate DML
Spring, Hibernate 예제 프로그램 작성
Mini Project Spring 게시판 작성 실습
-- 게시판 구현에 대해 철저하게 이해한다면 실무에서의 개발도 충분히 가능 합니다.
 

2013년 8월 27일 화요일

JAVA 인스턴스변수, 클래스변수 [오라클교육오라클자바교육강의강좌,자바교육,ORACLEJAVA교육강의강좌]

자바에서의 변수에 대해 알아 보도록 하죠...


오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr


자바에서의 변수는 지역변수(local variables), 매개변수(parameters),클래스 범위에서 선언 한 인스턴스 변수(instance fields), 클래스 변수(class fields) 등으로 구분 할 수 있습니다. 물론 인스턴스 변수나 클래스변수나 전부 어떤 메소드(함수)안에서 선언되는 것이 아니라 메소드 밖에 선언되는 변수 입니다. 말이 틀리지만 그 쓰임새 또한 대단히 다르니 잘 아래의 내용을 발 봐두어야 합니다.
전 가끔 붕어빵 찍는 틀클래스로 비유하고 그 틀에 의해 찍혀 나오는 각각의 붕어(인스턴스)객체라고 비유 합니다. 붕어빵 찍는 클이 클래스라고 했으니 클래스 변수 붕어빵 찍는 틀과 관련이 있는 거죠... 즉 찍혀 나온 모든 붕어빵들이 공유하는 전역 변수로서 역할을 하며 또한 붕어를 만들어 내지 않아도 붕어빵 찍는 틀애 있는 것이니까 New 하지 않아도(붕어를 찍어 내지 않아도) 접근이 가능하죠... 즉 클래스 변수는 클래스이름.클래스변수명 으로 접근이 가능 한겁니다. 각각의 붕어를 찍어 낼때 팥의 양을 조절이 가능하다고 가정 할때 클래스변수가 아닌 인스턴스 변수팥의양을 둘 수가 있겠죠... 이건 붕어빵 찍는 틀(클래스)과 관련이 있는 변수가 아니라 찍혀 나온 붕어(인스턴스)들에 관련이 있는 변수 이므로 인스턴스 변수라고 하고 반드시 붕어를 찍어 낸 후(New 한 후) 접근이 가능한 변수가 되는 겁니다. 이해가 되시나요? 아래를 보시면서 다시 한번 정리하시기 바랍니다. 그래서 static이라는 키워드를 보는 순간 전역변수, 초기화가 한번만(붕어빵 찍는 틀과 관련이 있으므로), New 하지 안아도(붕어를 찍어 내지 않아도) 접근이 가능하며 즉 클래스이름.변수명... 잘 기억하시기 바랍니다.
클래스 변수
클래스의 인스턴스(객체)가 아니라 그것이 정의된 클래스와 연관된다.
static 한정자는 이 변수(필드)가 클래스필드 임을 의미
상수를 정의하는것이 클래스필드의 일반적인 사용이다.public static final double PI=3.14159;
정적필드의 복사본은 오직 한 개 존재하며 전역변수로 사용 된다.
같은 클래스 내부에서는 PI로 지칭되며 클래스 외부에서 해당 변수(필드)를 유일하게 지칭하기 위해서는 클래스명.PI로 인스턴스를 생성하지 않고도 직접 참조가 가능(물론 인스턴스를 만든 후 객체참조변수.PI형태의 참조도 가능하다.)

인스턴스 변수
static으로 선언되지 않은 모든 변수(필드)는 인스턴스 변수 입니다. public double r;
클래스의 인스턴스와 연관, 생성된 모든 객체는 자신만의
복사본을 가진다.
클래스 내부에서 이름 하나만으로 지칭된다
public double r;
public double area() {
return PI * r * r;
}
클래스 외부에서는 클래스를 인스턴스화한 객체.변수명 형
태로 사용한다. 인스턴스 필드(변수)의 값은 한객체를 다른
객체와 구분한다.
Circle c = new Circle(); c.r=2.0;
Circle c1 = new Circle(); c1.r=5.0;



JAVA JVM의 메모리 영역 [오라클교육오라클자바교육강의강좌,자바교육,ORACLEJAVA교육강의강좌]

JVM의 실행 메모리 영역에 대해 알아보자구요... JVN의 메모리 구조에 대해 본다는 이야기 입니다.

오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr



JVM 실행 메모리 영역
메쏘드(method) 영역 : 클래스의 메소드에 대한 바이트코드, 전역변수(클래스 변수)
힙(heap) 영역 : 객체를 저장할때 사용하는 메모리
스택(stack) 영역 : 지역변수,함수의 인자,함수의 리턴값,리턴 번지
레지스터(registers) : 가상 머신의 현재 상태를 보여줌, 현재 실행되고 있는 메소드의 실행 포인터를 저장
실행 풀(Runtime Constant Pool) : 숫자 리터럴과 상수 필드 포함, 메소드 영역으로 부터 할당 받는다.


[ JVM 실행 메모리 영역 ]

메소드 내에서 객체 참조형으로 선언된 변수인 경우(String s = new String("abc") 일때의 s) 지역변수로서 스택에 위치하며 힙에 저장되어 있는 객체에 대한 참조값을 가지게 됩니다.
객체 참조형 변수의 값이 null 이라는 의미는 아무것도 참조하고 있지 않다는 의미 입니다.
New 연산자는 힙(heap) 메모리에 객체를 만들고 그 객체의 참조값을 반환 합니다.(Hello h = new Hello()) ---> Memory Heap에 Hello 클래스의 인스턴스(객체)를 만들고 그것을 스택에 있는 h라는 변수가 참조하도록 합니다. C에서의 포인터 변수와 유사 합니다.)
객체 참조 변수의 경우 대입, 메소드 호출시의 인자, 반환형 등으로 사용 될 때 참조 값만 전달 될 뿐, 객체 자체가 복제되어 전달되는 것은 아닙니다.
아래의 예제를 참고하세요

class C
{
public static void
main(String[] args)
{
int i = 3;
f(i);
}
static void f(int arg)
{
int i = 10;
double f = 3.14
}
}
메모리 구조는 아래와 같습니다.

이상 JVN의 메모리 영역에 대해 살펴 보았습니다. 다음 강좌에서는 자바에서의 변수의 종류와 그 쓰임새에 대해 보도록 하겠습니다.

자바의 자료형 소개 [오라클교육오라클자바교육강의강좌,자바교육,ORACLEJAVA교육강의강좌]

자료형에 대해 계속 보도록 하겠습니다.


오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr



1. 정수 자료형 (byte,short,int,long)

자바에서 제공하는 정수 자료형은 byte, short, int, long 4가지가 있습니다.(1,2,4,8 바이트 순)

C언어의 unsigned는 지원하지 않습니다.

short, byte에 연산을 하면 무조건 int형이 됩니다. 아래의 예를 보죠...

short a=0, b=0;

short c = a + b;

만약 위의 코드 부분이 컴파일 되다면 다음과 같은 오류가 날것 입니다.

---------- javac ----------
test.java:10: possible loss of precision
found : int
required: short
short c = a + b;
^
1 error


int형이 아닌 long형으로 데이터를 다루기 위해선 숫자 끝에 소문자 l이나 대문자 L을 표시한다.

Int : 12 (10진수), 012 (8진수), 0x12 (16진수)

Long : 12L, 12l



2. 부동소수 자료형 (float ,double)

자바에서 제공하는 부동소수 자료형은 float와 double이 있습니다.
부동소수 자료형 뒤에 아무것도 붙이지 않거나 ‘d’ 또는 ‘D’ 가 붙으면 기본적으로 double 형이 되며 ‘f’, ‘F’를 붙이면 float 자료형이 됩니다.

유효 10진 자리수
float : 6자리, double : 15자리

2진수로 표현하므로 표현 오차 발생하며 보다 정확한 표현을 하려면 BigDecimal 이용하세요~

리터럴

float --> 1e1f, 2.F, .3f, 6.02E+23f, 1.4039846e-45f ~ 3.40282347e+38f
double --> 1e1, 2.D, .3, 6.02E+23d, 4.94065645841246544e-324 ~ 1.79769313486231570e+308



[예제]

// FloatPointTest.java

class FloatingPointTest
{
public static void main( String[] args )
{
System.out.println( 1.2345678901234567890123456789 ); // 1.2345678901234567
System.out.println( 2e3 ); // 2000.0
System.out.println( 0.1 + 1.6 ); // 1.7000000000000002
System.out.println( 3.0 / 0.0 ); // Infinity
System.out.println( 0.0 / 0.0 ); // NaN
}
}



3. 진리 자료형 (boolean)

boolean Literal : true, false

boolean 형은 다른 데이터형과 연산이 불가하며 boolean형은 boolean 형과 연산이 가능 합니다.

[예제]

public class BooleanTest {
public static void main(String[] args) {
boolean b1 = true; boolean b2 = !b1;
System.out.println("b1 : " + b1);
System.out.println("!b1 : " + b2);
System.out.println(b1 & b2);
System.out.println(b1 | b2);
System.out.println(b1 == b2);
System.out.println(" 6 < 7 : " + (6 < 7));
}
}

[결과]

b1 : true
!b1 : false
false
true
false
6 < 7 : true

4. 문자 자료형 (char)

자바는 유니코드를 지원하는데 JDK1.4부터는 Unicode 2.0까지 지원합니다.

한 문자를 표현할 때는 '와 ' 사이에 단 한 글자만이 올 수 있습니다.

자바에서 문자를 표현하는 방법은 두가지가 있는데 첫번째 방법은 있는 그대로 쓰는 것이며 두번째 방법은 유니코드로 표현하는 방법이다. 예)char c = ‘A’, char c = ‘\u0041’

[예]

class CharTest {
public static void main(String[] args) {
char c1 = 'A'; char c2 = '\u0041';
char c3 = '가'; char c4 = '\uac00';
System.out.println("c1:"+c1+",c2:"+c2);
System.out.println(c1 == c2);
System.out.println("c3:"+c3+",c4:"+c4);
System.out.println(c3 == c4);
}
}

[결과]

c1:A,c2:A
true
c3:가,c4:가
true

2013년 8월 26일 월요일

오라클 테이블 생성 예제

테이블 생성 하기


오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr 


 
à 오라클을 설치하게 되면 SCOTT계정은 자동으로 생성되어 있을 것이다. 그리고 default tablespace SYSTEM 테이블스페이스로 설정 되어 있다. 원래 SYSTEM 테이블스페이스에 사용자의 테이블을 만드는 것은 좋은 방법이 아니다. 왜냐면 이 부분은 오라클 시스템에서 사용되는 객체들이 저장되는 곳이기 때문이다(딕셔너리 정보 등이 저장된다) . 그러므로 우선 SYS 계정으로 접속하여 SCOTT 사용자의 default tablespace USERS 라는 테이블스페이스로 변경하자. 그리고 실습을 위해 USER_DATA 라는 테이블스페이스를 만들자. 데이터파일의 경로는 PC환경에 맞게 수정하길 바란다.
 
SQL> connect / as sysdba
연결되었습니다.
 
SQL> alter user scott default tablespace users;
 
사용자가 변경되었습니다.
 
SQL> create tablespace user_data
  2  datafile 'C:\oracle\oradata\wink\test01.dbf'
  3  size 10m
  4  autoextend on
  5  next 1m
  6  maxsize 1000m;
 
테이블 영역이 생성되었습니다.
 
SQL> connect scott/tiger
연결되었습니다.
 
à 아래 예문에서 주의 깊게 볼 부분은 tablespace 구이다. 이것은 employee 테이블을 어느 테이블스페이스에 만들것인지에 대해 설정이며 생략되면 scott 사용자의 defaut tablespace에 만들어 지게 된다. 또한 테이블스페이스에서 지정한 매개변수들을 그대로 employee 테이블은 상속 받게 된다. 물론 그 다음 예문처럼 명시적으로 지정을 하는 것도 가능하다.
 
SQL> create table employee (
  2  empno number(4) primary key,
  3  ename varchar2(15) not null,
  4  addr varchar2(50) ,
  5  sal number(8,2)
  6  ) tablespace user_data;
 
테이블이 생성되었습니다.
 
SQL> create table employee2 (
  2  empno number(4) primary key,
  3  ename varchar2(15) not null,
  4  addr varchar2(50) ,
  5  sal number(8,2)
  6  )
  7  pctfree 10
  8  pctused 40
  9  tablespace user_data
 10  storage (
 11     initial 10k
 12     next 10k
 13     maxextents 20
 14     pctincrease 0
 15  );
 
테이블이 생성되었습니다.

[오라클자바커뮤니티강좌,oraclejava,javaoracle교육강좌강의,오라클자바실무개발잘하는학원,오라클강좌자바강좌강의]Flashback Feature – Transaction Query


FlashBack Transaction Query라고 하는 것은 이전 강좌에서 설명 드렸던 Flashback Version Query의 결과로 나타난 해당 Transaction에 대해 특별한 정보를 얻을 수 있는 것 정도로 보시면 됩니다.


오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr 


VERSIONS_XID 값이 트랜잭션의 아이디라고 했는데 이 값을 FLASHBACK_TRANSACTION_QUERY의 인자 값으로 줘서 쿼리를 실행 하면 해당 트랜잭션에 대한 정보를 볼 수 있습니다.

예를 들면 어떤 DML을 이용했으며 어떠한 SQL 구문이 실행 되었다든지 하는 것이 확인 가능 합니다.

아래의 예를 통해 이해 하도록 하겠습니다.

아래에서 “0600030021000000”  값이 VERSIONS_XID 값 입니다. 이 값은 Flashback Version Query의 결과로서 얻어 낼 수 있습니다. 이전 강좌의 내용을 참고 하세요~

SELECT xid, operation, start_scn,commit_scn, logon_user, undo_sql
FROM  flashback_transaction_query
WHERE  xid = HEXTORAW('0600030021000000');


XID              OPERATION                        START_SCN COMMIT_SCN
---------------- -------------------------------- ---------- ----------
LOGON_USER
------------------------------
UNDO_SQL
----------------------------------------------------------------------------------------------------
0600030021000000 UPDATE                              725208    725209
SCOTT
update "SCOTT"."FLASHBACK_VERSION_QUERY_TEST" set "DESCRIPTION" = 'ONE' where ROWID = 'AAAMP9AAEAAAA
AYAAA';

0600030021000000 BEGIN                                725208    725209
SCOTT

XID              OPERATION                        START_SCN COMMIT_SCN
---------------- -------------------------------- ---------- ----------
LOGON_USER
------------------------------
UNDO_SQL
----------------------------------------------------------------------------------------------------



2 rows selected.
 

2013년 8월 23일 금요일

오라클자바 Community에서 설립한 실무개발교육6년차 오엔제이 프로그래밍 실무교육센터 소개

1998년부터 운영된 오라클자바커뮤니티(www.oraclejavanew.kr)에서 설립 운영되고 있는 오엔제이 프로그래밍실무학원(www.onjprogramming.co.kr )은 개발자를 위한 SKILL UP, 실무개발교육 6년차 교육센터 입니다.

(2008년5월부터 오엔제이시스템즈에서 운영하던 "오라클자바교육센터"는 2013년5월 양도 하였으며 새로운 오엔제이 프로그래밍 실무교육센터에서 개발자 실무 교육을 이어갈 수 있도록 더욱 더 노력 하겠습니다.)

자바, 오라클의 기초부터 자바프레임워크(Struts, Spring), 오라클 튜닝, 모델링, 고급SQL, Xinternet(GAUCE, Miplatform, XPlatform), 닷넷(C#, ASP.Net), 스마트폰앱개발교육(안드로이드, 아이폰)까지 실무전문 교육을 진행하고 있습니다.
(본원은 TOBESOFT에서 공인 교육기관 입니다.)

자바, 스프링, 오라클 교육 받으셨는데 이론으로 교육을 받으셨다고요? IT프로그래밍 교육은 실전예제, 실습을 통해 이론을 습득을 해야 합니다. 본원은 모든 강좌가 실습을 통해 이론을 취득하는 실무중심 교육 입니다.

한번 방문 하시어 실무전문 교육의 진수를 느껴 보시기 바랍니다.

감사합니다.

2013년 8월 22일 목요일

with를 사용하자구요...

union을 이용하여 데이터를 가지고 오는 경우 Query가 조건절등에서
반복되는 경우가 있습니다. 아래의 경우에 MYBUYER라는 것은 반복되어
나타나는 inline view인데...
이를 with로 빼냈을때와 안빼냈을때는 속도의 많은 차이가 있습니다.

아래의 쿼리는 백화점별 고객수와 매출수를 시간대별로 출력하는 쿼리인데
두라인에 출력하기 위해 union을 사용하였으며 데이터 역시 서로 다른 테이블에
있는 경우의 예입니다. 그리고 로그인한 사원의 권한이 허용되는 백화점의 매출만
보기위해 인라인뷰로 구성했는데 이부분이 반복된것 입니다.

더 좋은 방법이 있으시면 좀 가르쳐 주시면 좋구요...^^

with를 사용했을때 저의 경우는 3배이상 속도의 차이가 있었습니다.^^

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

----------------------------------------------------------------
SELECT *
FROM (
SELECT
MYBUYER.BUYER_CODE CODE,
MYBUYER.EMP_NAME||'('||MYBUYER.BUYER_CODE||')',
'고객수' "GUBN",
SUM(DECODE(TIME_CODE, '0930', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '1000', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '1030', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '1100', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '1130', MD_CNT,0)) "A1130",
SUM(DECODE(TIME_CODE, '1200', MD_CNT,0)) "A1200" ,
SUM(DECODE(TIME_CODE, '1230', MD_CNT,0)) "A1230" ,
SUM(DECODE(TIME_CODE, '1300', MD_CNT,0)) "A1300" ,
SUM(DECODE(TIME_CODE, '1330', MD_CNT,0)) "A1330" ,
SUM(DECODE(TIME_CODE, '1400', MD_CNT,0)) "A1400" ,
SUM(DECODE(TIME_CODE, '1430', MD_CNT,0)) "A1430" ,
SUM(DECODE(TIME_CODE, '1500', MD_CNT,0)) "A1500" ,
SUM(DECODE(TIME_CODE, '1530', MD_CNT,0)) "A1530" ,
SUM(DECODE(TIME_CODE, '1600', MD_CNT,0)) "A1600" ,
SUM(DECODE(TIME_CODE, '1630', MD_CNT,0)) "A1630" ,
SUM(DECODE(TIME_CODE, '1700', MD_CNT,0)) "A1700" ,
SUM(DECODE(TIME_CODE, '1730', MD_CNT,0)) "A1730" ,
SUM(DECODE(TIME_CODE, '1800', MD_CNT,0)) "A1800" ,
SUM(DECODE(TIME_CODE, '1830', MD_CNT,0)) "A1830" ,
SUM(DECODE(TIME_CODE, '1900', MD_CNT,0)) "A1900" ,
SUM(DECODE(TIME_CODE, '1930', MD_CNT,0)) "A1930" ,
SUM(DECODE(TIME_CODE, '2000', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2030', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2100', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2130', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2200', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2230', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2300', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2330', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2400', MD_CNT,0)) "FINAL",
SUM(MD_CNT) "SUM"

FROM TANTSO T,
(

SELECT BUYERPC.BUYER_CODE,
BUYERPC.EMP_NAME,
MYPC.STORE_CODE,
MYPC.TEAM_CODE,
MYPC.PC_CODE
FROM
-- 해당 사원이 볼수 있는 모든 pc레벨 까지의 코드
(
SELECT DISTINCT
A.STORE_CODE,
A.TEAM_CODE,
A.FLOOR_CODE,
A.PC_CODE
FROM TCOORG A,
(
SELECT STORE_CODE,
DEPT_CODE,
TEAM_CODE,
FLOOR_CODE,
PC_CODE
FROM TCOORG,
(SELECT JOJIK_LEVEL,
ORG_LEVEL_VALUE
FROM TCOPAU
WHERE EMPNO = ?) PAU
WHERE TCOORG.JOJIK_LEVEL LIKE DECODE(PAU.JOJIK_LEVEL,'9','%',PAU.JOJIK_LEVEL) || '%'
AND TCOORG.ORG_LEVEL_VALUE LIKE DECODE(PAU.ORG_LEVEL_VALUE,'99','%',PAU.ORG_LEVEL_VALUE) || '%'
AND STORE_CODE = '07'

) B
WHERE A.STORE_CODE = B.STORE_CODE
AND A.DEPT_CODE = B.DEPT_CODE
AND A.TEAM_CODE LIKE DECODE(B.TEAM_CODE ,'00','%',B.TEAM_CODE)
AND A.FLOOR_CODE LIKE DECODE(B.FLOOR_CODE ,'00','%',B.FLOOR_CODE)
AND A.PC_CODE LIKE DECODE(B.PC_CODE ,'00','%',B.PC_CODE)
) MYPC,


-- 해당 사원이 검색 가능한 모든 바이어들이 가지는 pc레벨 까지의 코드
(
SELECT R.BUYER_CODE BUYER_CODE,
U.EMP_NAME EMP_NAME,
R.STORE_CODE STORE_CODE,
R.TEAM_CODE TEAM_CODE,
R.PC_CODE PC_CODE
FROM TCOBYR R, TCOBYP P, TCOUSR U
WHERE (R.STORE_CODE, R.TEAM_CODE, R.PC_CODE)
IN
(
SELECT DISTINCT
STORE_CODE,
TEAM_CODE,
PC_CODE
FROM TCOORG,
(SELECT JOJIK_LEVEL,
ORG_LEVEL_VALUE
FROM TCOPAU
WHERE EMPNO = ?) PAU
WHERE TCOORG.JOJIK_LEVEL LIKE DECODE(PAU.JOJIK_LEVEL,'9','%',PAU.JOJIK_LEVEL) || '%'
AND TCOORG.ORG_LEVEL_VALUE LIKE DECODE(PAU.ORG_LEVEL_VALUE,'99','%',PAU.ORG_LEVEL_VALUE) || '%'
AND STORE_CODE = '07'
)
AND P.BUYER_CODE = R.BUYER_CODE
AND P.START_DATE <= TO_CHAR(SYSDATE, 'YYYYMMDD') >
AND P.END_DATE >= TO_CHAR(SYSDATE, 'YYYYMMDD')
AND P.EMPNO = U.EMPNO
) BUYERPC

WHERE MYPC.STORE_CODE = BUYERPC.STORE_CODE
AND MYPC.TEAM_CODE = BUYERPC.TEAM_CODE
AND MYPC.PC_CODE = BUYERPC.PC_CODE

) MYBUYER
WHERE SALE_DATE BETWEEN ? AND ?
AND T.STORE_CODE = DECODE(MYBUYER.STORE_CODE,'07','00',MYBUYER.STORE_CODE)
AND T.TEAM_CODE = MYBUYER.TEAM_CODE
AND T.PC_CODE = MYBUYER.PC_CODE

GROUP BY MYBUYER.BUYER_CODE, MYBUYER.EMP_NAME

UNION ALL

SELECT
MYBUYER.BUYER_CODE CODE,
MYBUYER.EMP_NAME||'('||MYBUYER.BUYER_CODE||')',
'매출액' "GUBN",
(SUM(DECODE(TIME_CODE, '0930', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '1000', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '1030', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '1100', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '1130', SALE_AMT,0)))/1000 "A1130",
SUM(DECODE(TIME_CODE, '1200', SALE_AMT,0))/1000 "A1200" ,
SUM(DECODE(TIME_CODE, '1230', SALE_AMT,0))/1000 "A1230" ,
SUM(DECODE(TIME_CODE, '1300', SALE_AMT,0))/1000 "A1300" ,
SUM(DECODE(TIME_CODE, '1330', SALE_AMT,0))/1000 "A1330" ,
SUM(DECODE(TIME_CODE, '1400', SALE_AMT,0))/1000 "A1400" ,
SUM(DECODE(TIME_CODE, '1430', SALE_AMT,0))/1000 "A1430" ,
SUM(DECODE(TIME_CODE, '1500', SALE_AMT,0))/1000 "A1500" ,
SUM(DECODE(TIME_CODE, '1530', SALE_AMT,0))/1000 "A1530" ,
SUM(DECODE(TIME_CODE, '1600', SALE_AMT,0))/1000 "A1600" ,
SUM(DECODE(TIME_CODE, '1630', SALE_AMT,0))/1000 "A1630" ,
SUM(DECODE(TIME_CODE, '1700', SALE_AMT,0))/1000 "A1700" ,
SUM(DECODE(TIME_CODE, '1730', SALE_AMT,0))/1000 "A1730" ,
SUM(DECODE(TIME_CODE, '1800', SALE_AMT,0))/1000 "A1800" ,
SUM(DECODE(TIME_CODE, '1830', SALE_AMT,0))/1000 "A1830" ,
SUM(DECODE(TIME_CODE, '1900', SALE_AMT,0))/1000 "A1900" ,
SUM(DECODE(TIME_CODE, '1930', SALE_AMT,0))/1000 "A1930" ,
(SUM(DECODE(TIME_CODE, '2000', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2030', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2100', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2130', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2200', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2230', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2300', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2330', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2400', SALE_AMT,0)))/1000 "FINAL",
SUM(SALE_AMT)/1000 "SUM"

FROM TANTSO T,
(
SELECT BUYERPC.BUYER_CODE,
BUYERPC.EMP_NAME,
MYPC.STORE_CODE,
MYPC.TEAM_CODE,
MYPC.FLOOR_CODE,
MYPC.PC_CODE
FROM
-- 해당 사원이 볼수 있는 모든 pc레벨 까지의 코드
(
SELECT DISTINCT
A.STORE_CODE,
A.TEAM_CODE,
A.FLOOR_CODE,
A.PC_CODE
FROM TCOORG A,
(
SELECT STORE_CODE,
DEPT_CODE,
TEAM_CODE,
FLOOR_CODE,
PC_CODE
FROM TCOORG,
(SELECT JOJIK_LEVEL,
ORG_LEVEL_VALUE
FROM TCOPAU
WHERE EMPNO = ?) PAU
WHERE TCOORG.JOJIK_LEVEL LIKE DECODE(PAU.JOJIK_LEVEL,'9','%',PAU.JOJIK_LEVEL) || '%'
AND TCOORG.ORG_LEVEL_VALUE LIKE DECODE(PAU.ORG_LEVEL_VALUE,'99','%',PAU.ORG_LEVEL_VALUE) || '%'
AND STORE_CODE = '07'

) B
WHERE A.STORE_CODE = B.STORE_CODE
AND A.DEPT_CODE = B.DEPT_CODE
AND A.TEAM_CODE LIKE DECODE(B.TEAM_CODE ,'00','%',B.TEAM_CODE)
AND A.FLOOR_CODE LIKE DECODE(B.FLOOR_CODE ,'00','%',B.FLOOR_CODE)
AND A.PC_CODE LIKE DECODE(B.PC_CODE ,'00','%',B.PC_CODE)
) MYPC,


-- 해당 사원이 검색 가능한 모든 바이어들이 가지는 pc레벨 까지의 코드
(
SELECT R.BUYER_CODE BUYER_CODE,
U.EMP_NAME EMP_NAME,
R.STORE_CODE STORE_CODE,
R.TEAM_CODE TEAM_CODE,
R.PC_CODE PC_CODE
FROM TCOBYR R, TCOBYP P, TCOUSR U
WHERE (R.STORE_CODE, R.TEAM_CODE, R.PC_CODE)
IN
(
SELECT DISTINCT
STORE_CODE,
TEAM_CODE,
PC_CODE
FROM TCOORG,
(SELECT JOJIK_LEVEL,
ORG_LEVEL_VALUE
FROM TCOPAU
WHERE EMPNO = ?) PAU
WHERE TCOORG.JOJIK_LEVEL LIKE DECODE(PAU.JOJIK_LEVEL,'9','%',PAU.JOJIK_LEVEL) || '%'
AND TCOORG.ORG_LEVEL_VALUE LIKE DECODE(PAU.ORG_LEVEL_VALUE,'99','%',PAU.ORG_LEVEL_VALUE) || '%'
AND STORE_CODE = '07'
)
AND P.BUYER_CODE = R.BUYER_CODE
AND P.START_DATE <= TO_CHAR(SYSDATE, 'YYYYMMDD') >
AND P.END_DATE >= TO_CHAR(SYSDATE, 'YYYYMMDD')
AND P.EMPNO = U.EMPNO
) BUYERPC

WHERE MYPC.STORE_CODE = BUYERPC.STORE_CODE
AND MYPC.TEAM_CODE = BUYERPC.TEAM_CODE
AND MYPC.PC_CODE = BUYERPC.PC_CODE

) MYBUYER

WHERE SALE_DATE BETWEEN ? AND ?
AND T.STORE_CODE = DECODE(MYBUYER.STORE_CODE,'07','00',MYBUYER.STORE_CODE)
AND T.TEAM_CODE = MYBUYER.TEAM_CODE
AND T.PC_CODE = MYBUYER.PC_CODE

GROUP BY MYBUYER.BUYER_CODE, MYBUYER.EMP_NAME
)
ORDER BY 1, 2



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

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

WITH MYBUYER AS (
..... (위에서 빨간색으로 되어 있는 부분)
)

SELECT *
FROM (
SELECT
MYBUYER.BUYER_CODE CODE,
MYBUYER.EMP_NAME||'('||MYBUYER.BUYER_CODE||')',
'???' "GUBN",
SUM(DECODE(TIME_CODE, '0930', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '1000', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '1030', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '1100', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '1130', MD_CNT,0)) "A1130",
SUM(DECODE(TIME_CODE, '1200', MD_CNT,0)) "A1200" ,
SUM(DECODE(TIME_CODE, '1230', MD_CNT,0)) "A1230" ,
SUM(DECODE(TIME_CODE, '1300', MD_CNT,0)) "A1300" ,
SUM(DECODE(TIME_CODE, '1330', MD_CNT,0)) "A1330" ,
SUM(DECODE(TIME_CODE, '1400', MD_CNT,0)) "A1400" ,
SUM(DECODE(TIME_CODE, '1430', MD_CNT,0)) "A1430" ,
SUM(DECODE(TIME_CODE, '1500', MD_CNT,0)) "A1500" ,
SUM(DECODE(TIME_CODE, '1530', MD_CNT,0)) "A1530" ,
SUM(DECODE(TIME_CODE, '1600', MD_CNT,0)) "A1600" ,
SUM(DECODE(TIME_CODE, '1630', MD_CNT,0)) "A1630" ,
SUM(DECODE(TIME_CODE, '1700', MD_CNT,0)) "A1700" ,
SUM(DECODE(TIME_CODE, '1730', MD_CNT,0)) "A1730" ,
SUM(DECODE(TIME_CODE, '1800', MD_CNT,0)) "A1800" ,
SUM(DECODE(TIME_CODE, '1830', MD_CNT,0)) "A1830" ,
SUM(DECODE(TIME_CODE, '1900', MD_CNT,0)) "A1900" ,
SUM(DECODE(TIME_CODE, '1930', MD_CNT,0)) "A1930" ,
SUM(DECODE(TIME_CODE, '2000', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2030', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2100', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2130', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2200', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2230', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2300', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2330', MD_CNT,0))+
SUM(DECODE(TIME_CODE, '2400', MD_CNT,0)) "FINAL",
SUM(MD_CNT) "SUM"

FROM TANTSO T,
(
SELECT * FROM MYBUYER
) MYBUYER
WHERE SALE_DATE BETWEEN ? AND ?
AND T.STORE_CODE = DECODE(MYBUYER.STORE_CODE,'07','00',MYBUYER.STORE_CODE)
AND T.TEAM_CODE = MYBUYER.TEAM_CODE
AND T.PC_CODE = MYBUYER.PC_CODE

GROUP BY MYBUYER.BUYER_CODE, MYBUYER.EMP_NAME

UNION ALL

SELECT
MYBUYER.BUYER_CODE CODE,
MYBUYER.EMP_NAME||'('||MYBUYER.BUYER_CODE||')',
'???' "GUBN",
(SUM(DECODE(TIME_CODE, '0930', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '1000', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '1030', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '1100', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '1130', SALE_AMT,0)))/1000 "A1130",
SUM(DECODE(TIME_CODE, '1200', SALE_AMT,0))/1000 "A1200" ,
SUM(DECODE(TIME_CODE, '1230', SALE_AMT,0))/1000 "A1230" ,
SUM(DECODE(TIME_CODE, '1300', SALE_AMT,0))/1000 "A1300" ,
SUM(DECODE(TIME_CODE, '1330', SALE_AMT,0))/1000 "A1330" ,
SUM(DECODE(TIME_CODE, '1400', SALE_AMT,0))/1000 "A1400" ,
SUM(DECODE(TIME_CODE, '1430', SALE_AMT,0))/1000 "A1430" ,
SUM(DECODE(TIME_CODE, '1500', SALE_AMT,0))/1000 "A1500" ,
SUM(DECODE(TIME_CODE, '1530', SALE_AMT,0))/1000 "A1530" ,
SUM(DECODE(TIME_CODE, '1600', SALE_AMT,0))/1000 "A1600" ,
SUM(DECODE(TIME_CODE, '1630', SALE_AMT,0))/1000 "A1630" ,
SUM(DECODE(TIME_CODE, '1700', SALE_AMT,0))/1000 "A1700" ,
SUM(DECODE(TIME_CODE, '1730', SALE_AMT,0))/1000 "A1730" ,
SUM(DECODE(TIME_CODE, '1800', SALE_AMT,0))/1000 "A1800" ,
SUM(DECODE(TIME_CODE, '1830', SALE_AMT,0))/1000 "A1830" ,
SUM(DECODE(TIME_CODE, '1900', SALE_AMT,0))/1000 "A1900" ,
SUM(DECODE(TIME_CODE, '1930', SALE_AMT,0))/1000 "A1930" ,
(SUM(DECODE(TIME_CODE, '2000', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2030', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2100', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2130', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2200', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2230', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2300', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2330', SALE_AMT,0))+
SUM(DECODE(TIME_CODE, '2400', SALE_AMT,0)))/1000 "FINAL",
SUM(SALE_AMT)/1000 "SUM"

FROM TANTSO T,
(
SELECT * FROM MYBUYER
) MYBUYER

WHERE SALE_DATE BETWEEN ? AND ?
AND T.STORE_CODE = DECODE(MYBUYER.STORE_CODE,'07','00',MYBUYER.STORE_CODE)
AND T.TEAM_CODE = MYBUYER.TEAM_CODE
AND T.PC_CODE = MYBUYER.PC_CODE

GROUP BY MYBUYER.BUYER_CODE, MYBUYER.EMP_NAME
)
ORDER BY 1, 2

NID를 이용하여 DB NAME 변경하기

Oracle9i Database Release 2 이상에서 NID 라는 유틸리티를 이용하면 DB이름을 바꿀수가 있습니다.

Oracle9i Database Release 2  이전 버전에서는 database를 rename하기 위해서는 control file을 수정해 줘야 했지만 "nid" 라는 츄틸리티를 이용하면 이러한 부분을 자동으로 해줍니다.

아래 예는 DB이름을 WINK로 바꾸는 예입니다.

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

1. Shutdown database

2. Startup mount

3. $ nid target=/ dbname=WINK

4. Shutdown database

5. Change init.ora/spfile name, i.e.: initWINK.ora

6. Change db_name parameter in init.ora/spfile, i.e.: db_name='WINK'

7. Change ORACLE_SID to point to new database name

8. Startup mount

9. Alter database open resetlogs

10. Take a backup


File header와 control file의 동기화 정보가 맞지 않을 때

File  header와 control file의 동기화 정보가 맞지 않을 때

시스테 오류가 있어 DB를 강제 종료하는 경우 File Header와 Control File의 Header 정보가 맞지 않을 수 있습니다. 이 경우 ORA-01207 에러 즉 “file is more recent than control file – old control file”를 만날 수 있는데…

처리 방법은 다음과 같습니다.


우선 DB를 마운트 단계까지 시작하여 다음 명령을 실행 하여 trace file을 생성 후 정보를 확인 합니다.

alter session set events 'immediate trace name controlf level 10';

alter session set events 'immediate trace name file_hdrs level 10';

alter session set events 'immediate trace name redohdr level 10';

이 명령은 매개변수 파일에서 설정된 user_dump_dest 디렉토리에 하나의 trace file을 생성 하는데 이 파일에는 control file과 datafile, redo log file의 정보를 포함하고 있으니 동기화 정보를 확인 해 보시면 됩니다.

만약 DB가 아카이브 로그 모드로 운영 중이면 recover 명령들을 통해 복구가 가능하리라 생각되구요, recover 명령은 Oracle 강좌의 [백업/복구]부분을 참고하시기 바랍니다.

현재 세션의 Lock Tree [오라클자바교육,오라클교육,오라클강의,ORACLEAJVA강좌,ORACLE12C]

오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr



-- -----------------------------------------------------------------------------------
-- File Name    : http://www.oracle-base.com/dba/10g/lock_tree.sql
-- Author      : DR Timothy S Hall
-- Description  : Displays information on all database sessions with the username
--                column displayed as a heirarchy if locks are present.
-- Requirements : Access to the V$ views.
-- Call Syntax  : @lock_tree
-- Last Modified: 18-MAY-2005
-- -----------------------------------------------------------------------------------
SET LINESIZE 500
SET PAGESIZE 1000

COLUMN username FORMAT A15
COLUMN machine FORMAT A25
COLUMN logon_time FORMAT A20

SELECT LPAD(' ', (level-1)*2, ' ') || NVL(s.username, '(oracle)') AS username,
      s.osuser,
      s.sid,
      s.serial#,
      s.lockwait,
      s.status,
      s.module,
      s.machine,
      s.program,
      TO_CHAR(s.logon_Time,'DD-MON-YYYY HH24:MI:SS') AS logon_time
FROM  v$session s
CONNECT BY PRIOR s.sid = s.blocking_session
START WITH s.blocking_session IS NULL;

SET PAGESIZE 14

2013년 8월 21일 수요일

오라클 Table에 인위적으로 extent 할당

Table에 인위적으로 extent 할당하는 예제

오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr


extent는 pctincrease, maxextents가 허용하는 범위에서 자동으로 증가하는데 많은 데이터를 한꺼번에 insert하는 경우 maxextents를 넘을 수 있으므로 데이터를 저장할 extent를 인위적으로 지정해 주는 것이 좋을 수도 있습니다.

특히 새로운 extents를 다른 디스크에 분산 시킴으로서 하나의 데이터파일이 여러 디스크에 나뉘어지는 striping 역할을 해줄 수 있어 디스크 IO를 분산 시킬 수 있습니다.

SQL>alter table emp allocate extent (size 512K datafile ‘/usr/data/WINK/data01.dbf’);

2013년 8월 19일 월요일

ORACLE Distinct

ORACLE Distinct

오라클자바커뮤니티에서 설립한  개발자실무교육 6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   


Distinct

Select 문은 기본적으로 중복된 행을 모두 표시하므로 Distinct 키워드를 사용하여 중복행의 출력을 방지 한다. Select 키워드 바로 다음에 Distinct를 기술 한다.
Distinct 뒤에 나타나는 컬럼이 여러 개인 경우엔 컬럼의 조합이 중복이 없게 출력 한다.

SQL> select job from emp;
JOB
---------
CLERK
SALESMAN
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
….
SQL> select distinct job from emp;
JOB
---------
ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
SQL> select deptno, job from emp;
    DEPTNO JOB
---------- ---------
        20 CLERK
        30 SALESMAN
        30 SALESMAN
        20 CLERK
        ……
SQL> select distinct deptno, job from emp;
    DEPTNO JOB
---------- ---------
20 ANALYST
        20 CLERK
        20 MANAGER

2013년 8월 18일 일요일

자바 AWT:JAVA GUI Programming을 위한 AWT 프로그래밍-Toolkit

자바 AWT:JAVA GUI Programming을 위한 AWT 프로그래밍-Toolkit
예제 입니다. 지금은 자주 사용되지 않지만 재미있는 부분이죠

참고하세요~

오라클자바커뮤니티에서 설립한  개발자실무교육 6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr

 
이번 강좌에서는 Java.awt.Toolkit 에 대해 알아 보겠습니다.

-------------------
Java.awt.Toolkit
-------------------

그래픽 자원관련 시스템 정보 제공 합니다.
new 명령으로 만들수 없으며 Component의 Method인 getToolkit()이나 Toolkit.getDefaultToolkit을 사용해야 합니다.( Toolkit 객체가 하나만 존재해야 하므로…)

beep() : beep 음 출력

createimage(), getImage() : 이미지를 만들거나 Network 경로를 통해얻을 사용 합니다.

getPrintJob() : 프린터와 연결된 객체인 java.awt.PrintJob을 얻게 해 줍니다.

getScreenSoze() : 실제 화면의 크기를 구해주며 스플레쉬(Splash) 윈도우를 만들때 유용 합니다.

getScreenResolution() : 현재 화면이 인치당 몇 개의 점이 들어가는 해상도인지 알려줌.

getSystemClipboard() : 클립보드 객체를 리턴해준다. 이 객체에 내용을 넣어 다른 프로그램등에 전달 해줄때 사용 합니다.



[예제]


import java.awt.*;

public class ToolkitExam extends Frame {
public ToolkitExam(String title) {
super(title);
}
public static void main(String[] args) {
ToolkitExam halfWindow = new ToolkitExam("Toolkit Sample");
Toolkit toolkit = halfWindow.getToolkit();
Dimension size = toolkit.getScreenSize();

halfWindow.setBounds(size.width/4, size.height/4,
size.width/2, size.height/2);
halfWindow.setVisible(true);
}

SQL 49 문제(SQL간단실습)

간단한 오라클 SQL 실습입니다. 한번 풀어 보세요


오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터

(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr



1. A로 시작하는 사원이름과 급여 출력하시오.

답) select ename, sal
    from emp
    where ename like 'A%';

2. 95년 01월 01일부터 오늘까지 몇달 차이가 나는지 출력하시오.
  (소수 첫 째자리에서 반올림)
답) select round(months_between(sysdate, '95/01/01'), 0) from dual;


3. 급여(sal)가 사원 전체의 평균보다 높은 사원의 이름, sal, 부서명을 출력하시오.

답) select ename, sal, dname
    from  emp e, dept d
    where  e.deptno = d.deptno
    and    sal > (select avg(sal) from emp);

4. emp table에서 급여가 가장 높은 사람의 사번, 성명 부서명, 급여를 출력하시오.

답) select empno, ename, dname, sal
    from emp e, dept d
    where e.deptno = d.deptno
    and sal = (select max(sal) from emp);

5. emp table에서 column명 addr을 address 로 바꾸시오.

답) alter table emp
    rename column addr to address;

6. 최진실과 부서과 같고 직책이 같은 사원의 sal는?
sql> select sal from emp
    where deptno=(select deptno from sawon
                  where ename='최진실')
    and  job=(select job from sawon
                where ename='최진실');

7. 각 부서별로 급여 서열 2위 까지 부서코드, 이름을 출력?
sql> select deptno, ename from emp a
    where 2 > (select count(*) from emp
              where sal > a.sal
              and deptno=a.deptno)
    order by deptno,sal desc

8. 아이디가 test 비빌번호가 security인 사용자를 등록하시오.
  (사용자의 default tablespace는 users이며 temporary tablespace는 temp임)

9. test사용자에세 기본적으로 DataBase에서 작업(테이블 생성등,,,) 을 할수 있는
  role을 부여하시오.(grant 이용)

10. test 사용자의 비밀번호를 tatata로 변경 하시오.

11. 다음의 SQL을 실행하고 오류가 발생하면 조치하시오.
  CREATE  TABLE  사원
          (  사원번호번호    NUMBER(6)  PRIMARY KEY,
            사원명          VARCHAR2(10)  NOT NULL,
            전화번호        VARCHAR2(15)  DEFAULT  "Un-known",
            부서코드        NUMBER(5)  REFERENCE dept(deptno) )

12. emp 테이블에 이름이 같은 홍길동이라는 사람을 2명 삽입 하고 이름 출력시 한명만 나오게 하시오
SQL>insert into emp(empno, ename) values ('1111','홍길동);
SQL>insert into emp(empno, ename) values ('1112','홍길동);
SQL>select distinct ename from emp;

13.사원번호와 이름, 주소를 갖고있는 sawon 테이블에 부서테이블의 부서번호를
참조하게(외래키)하서 만드는 코드를 작성하라.
SQL> create table sawon(
  2  id varchar2(4) not null primary key,
  3  name varchar2(10) not null,
  4  deptno varchar2(2) null,
  5  constraint fk_buseo_deptno foreign key (deptno) references buseo(deptno)
  6  );

14. 부서별로 그룹하여  부서번호, 인원수, 급여의 평균, 급여의 합을 구하여 출력 하여라.
  (평균은 소수 둘때 다리에서 반올림 하시오.)
 
SQL>SELECT deptno,COUNT(ename) "인원수" ,
          ROUND(AVG(sal),1) "급여평균",
          SUM(sal) "급여합계"
    FROM emp
    GROUP BY deptno

15. SMITH와 CLARK의 부서와 같은 부서에서 일하는 사람들 중 급여가 가장 많은 사람의 부서명과 이름, sal을 출력하시오..
답) select ename, sal, dname
    from emp e, dept d
    where e.deptno=d.deptno
    and sal=(select max(sal)
      from emp
      where deptno in( select deptno
      from emp
      where ename in('CLARK', 'SMITH')));

16. 'SMITH'와 같은 부서에서 일하는 사원의 이름과 부서명 출력하시오
 select e.ename, d.dname
    from emp e, dept d
    where e.deptno=d.deptno
    and e.deptno=(select deptno from emp where ename='SMITH');

17. 부서별 급여 평균을 출력하시오
 select dname, sum(sal)
    from emp, dept
    where emp.deptno=dept.deptno
    group by dname;

18. 오늘은 몇요일인가?
 select decode(to_char(sysdate,'d'),
    '1', '일요일',
    '2', '월요일',
    '3', '화요일',
    '4', '수요일',
    '5', '목요일',
    '6', '금요일',
    '7', '토요일') "요일" from dual;
19. emp 테이블에서 급여에 1200을 곱하여 만원단위로 사원이름과 급여를 출력하시오
  select ename "성명",
    sal*1200/10000 "만원"
    from emp;

20. sal가 사원전체의 평균보다 큰사람의 이름과 sal출력
select ename,sal,dname
from emp e,dept d
where e.deptno = d.deptno
and sal > (select avg(sal)
from emp)

21. 부서별로 급여의 총합을 나타내고자 한다. 10번 부서보다 급여의 평균이 많은 부서만 출력하시오.
 select dname,sum(sal)
 from emp e,dept d                        //from 뒤에 테이블이 2개 이상나오면 조인꼭 해줘야한다.
 where e.deptno = d.deptno                //테이블이 두개면 조인1개 세개면 조인 2개  조인을 안하면                                //emp*dept의 컬럼수가 나온다.
 group by dname                        //부서별로 라고 했기때문에 dname명으로 그룹지었다.
 having avg(sal) > (select avg(sal)       
 from emp
 where deptno = 10);

22. emp테이블에서 job별로 급여의 평균을 출력하고자 한다. 'SALESMAN '이라는 job보다 급여의 평균이
큰 job만 출력하시오
select job,avg(sal) from emp
group by job
having avg(sal) > (select avg(sal) from emp
where job = 'SALESMAN');

23. 부서중에 sal합계가 가장큰 부서의 부서명과 sal합계를 구하시오.
select dname,sum(sal)
from emp e,dept d
where e.deptno = d.deptno
group by dname
having sum(sal) = (select max(sum(sal)) from emp
group by deptno)

24. emp테이블에서 부서코드가 10또는 20또는 30또는 40인 데이터의 급여의 grade를 출력하시오(사원ID,사원명,sal,grade)
 select empno,ename,sal,grade
 from emp,salgrade
 where deptno in (10,20,30,40)
 and sal between losal and hisal

25. 오늘 날짜 출력하기(2003.07.09 20:10:10 오후 형식으로 출력하시오)
select to_char(sysdate,'yyyy.mm.dd hh:mi:ss PM') from dual;

26. 현재 접속되어 있는 사용자의 계정을 확인할려면?
SQL> show user

27. c:\oracle\oradata\wink에 test01.dbf라는 데이터 파일을 test라는 테이블스페이스를
    만들때 작성하고자 한다. TableSapce를 creation하는 Oracle Script를 기술하시오.
    (TableSpace의 사이즈는 10m)
SQL> create tablespace test datafile 'd:\oracle\oradata\wink\test01.dbf' size 10m;

28. 현재 Oracle 시스템의 role을 확인하기 위해 Oracle에서 제공되는 View는?
    user_roles

29. emp table의 idx_emp_ename 이라는 인덱스를 삭제후 다시 만드시오.
    (ename, sal로 index를 사용하며INDX라는 테이블스페이스에 index를 만들려고 한다.)

30. 현재 사용자 계정에 만들어진 테이블들과 이들 테이블이 어느 테이블스페이스에 작성되었는지를
    확인하시오.
SQL>select TABLE_NAME,  TABLESPACE_NAME from user_tables;

31. 사원(EMP) 테이블에 sex(성별) 컬럼을 추가하시오. 길이는 varchar2(1) 이고 null을 허용하며
    값이 안들어 올때는 'M'을 넣으시오.

32. check 제약조건을 이용하여 성별(sex)컬럼에 'M',또는 'F'만 입력이가능하도록 하시오.

33. Oracle의 sequence만드는 스크립트를 작성하시오.

34. sequence를 이용하여 data를 insert하는 SQL을 작성하시오.

35. 다음 SQL의 오류를 수정하시오.
  create table sawon(
          id varchar2(4),
          name varchar2(10) not null,
          deptno varchar2(2) null,
          constraints pk_sawon_id primary key(id),
          constraints fk_sawon_deptno foreign key (deptno) reference dept(deptno)
)
36. emp table의 현재 제약조건을 확인 하는 SQL을 작성하시오.
    select constraint_name, column_name
    from user_cons_columns
    where table_name = 'EMP';

37. EMP Table에서 이름이 SMITH인 데이터와 같은 부서에 이쓴 사람들을 삭제하시오.
    9삭제후 rollback하시오.)

38.seq_emp_id라는 sequence를 삭제하시어.

39. 현재 사용자의 계정에서 작성된 sequence를 확인하시오.
    select sequence_name,
          min_value,
          max_value,
          increment_by,
          last_number
    from user_sequences;

40. emp Table에서 empno, ename만 볼수 있는 View를 만드시오.
    (뷰의 이름은 v_emp_empno_ename 이다.)

41. v_emp_empno_ename 뷰를 삭제 하시오.

42. EMP Table에서 이미 생성된 인덱스, 관련 컬럼명, Unique여부등을 출력 하시오.
    select ic.index_name, ic.column_name, ic.column_position, ix.uniqueness
    from user_indexes ix, user_ind_columns ic
    where ic.index_name = ix.index_name
    and  ix.table_name = 'EMP'

43. sys계정으로 접속후 scott계정의 select any table 권한을 뺐으시오.
    revoke scott from select any table

44. emp table에서 급여가 SMITH보다 큰 사람들의 급여에 10을 곱하시오.

45.emp 테이블에서 사원번호,사원명,봉급을 출력하시오 (단, 중복된 값들은 제외)

        select distinct ename , sal
        from emp;

46. 36.321을 소숫점 2째자리에서 반올림하세요

        select round(36.321,1)
        from dual;
47. 현시점에서 6개월후의 마지막날을 출력하세요

        select last_day(add_months(sysdate,6))
        from dual;


48. emp 테이블에 같은 이름이 있는 사원의 사원번호와 이름을 출력하세요

        select distint e1.empno , e1.ename
        from emp e1, emp e2
        where e1.ename = e1.ename
        and e1.rowid<>e2.rowid;

49. emp table의 primary key는 empno 이다. 키가 중복되는 레코드를 삭제하시오.

    DELETE FROM EMP A
    WHERE  ROWID  >  ( SELECT  MIN(ROWID)  FROM EMP B
                    WHERE  A.EMPNO = B.EMPNO ); 

2013년 8월 17일 토요일

오라클자바 Community 강좌, 자바에서 JCF 객체 출력하기 entrySet

오라클자바 Community 강좌, 자바에서 JCF 객체 출력하기


오라클자바커뮤니티에서 설립한  개발자중심! 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr 



private Map<String, Object> map ;
 private Properties props;
 private Set<Object> set;
        ......
 
 for(Map.Entry<String, Object> entry:map.entrySet()) {
   System.out.println("Key: " + entry.getKey() + "-" + entry.getValue());
 }
 for(Map.Entry<Object, Object> entry : props.entrySet()) {
   System.out.println("key : " + entry.getKey() + "-" + entry.getValue() );
 }

 for(Object obj : set) {
    System.out.println("value : " + obj);
 }

스프링 디스패처 서블릿

Spring Framework 스프링 디스패처 서블릿에 관한 내용 입니다.

오라클자바커뮤니티에서 설립한  개발자중심! 오엔제이프로그래밍 실무교육센터

(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr


DispatcherServlet은 Front Controller로서 서블릿 컨테이너에서 HTTP 프로토콜을 통해 들어오는 모든 요청을 프리젠테이션 계층의 제일 앞에 둬서 처리할 수 있는 컨트롤러이다.
 DispatcherServlet은 서블릿 컨테이너가 생성하고 관리하는 오브젝트로서 스프링이 관여하는 오브젝트가 아니므로 직접 DI를 해줄 방법이 없고 대신 web.xml에서 설정한 웹어플리케이션컨텍스를 참고하여 필요한 전략을 DI하여 사용할 수 있다. 

2013년 8월 16일 금요일

오라클 Optimizer Mode Setting 방법

오라클 Optimizer Mode Setting 방법

대한민국오라클학원/오라클학원/오라클교육/오라클강의/구로 오라클/가산오라클/오라클강


--------------------------
1.        Instance 수준의 셋팅 방법
--------------------------


오라클자바커뮤니티에서 설립한  개발자중심! 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr 


-        DB의 설정 파일(initSID.ora or spfileSID.ora)에 전체적으로 적용이 되도록 정의하는 방법이며 다음과 같이 기술하며 OPTIMIZER MODE는 REUL, CHOOSE, ALL_ROOWS, FIRST_ROWS와 같은 종류가 있습니다. CHOOSE인 경우 한테이블이라도 Analyzed되어 있는 경우엔 비용기반 접근 방식을 이용하는 것이며 RULE인 경우 규칙기반 접근 방식을 사용, ALL_ROWS인 경우 비용기반 옵티마이저의 한 방법이며 모든 ROW들을 처리한다고 할 때 그 비용을 최소화 하는 방법으로 실행계획을 수립하며,  FIRST_ROWS인 경우엔 최초 ROW를 추출하는데 드는 비용을 최소화 하도록 실행 계획을 구성하는 것입니다.

-        예) OPTIMIZER_MODE=FIRST_ROWS

-        만약 initSID or spfileSID.ora에 아무 내용도 정의하지 않은 경우 기본적으로 CHOOSE 방식이 됩니다.

-------------------------
2.        Session 수준의 셋팅 방법
-------------------------

-        alter session이라는 명령을 이용하면 현재 접속된 세션 레벨에서 옵티마이저 모드를 정의할 수 있습니다.

-        예) alter session set optimizer_goal=rule 앞과 같이 정의하면 해당 세션이 끝나기 전까지는 규칙 기반(,RULE-BASED) 옵티마이저 모드를 이용하게 됩니다.

--------------------------
3.        Statement 수준의 셋팅 방법
--------------------------

-        힌트(Hint) 구문을 이용한다면 매 SQL 문장마다 서로 다른 옵티마이저 모드를 적용할 수 있습니다.

-        예) SELECT /*+ FIRST_ROWS */
                          ENAME,
                          SAL,
                          JOB
              FROM EMP
              WHERE SAL > (SELECT MAX(SAL)
                                    FROM  EMP
                                    WHERE DEPTNO = 10)

2013년 8월 15일 목요일

Hello Spring 확장하기

spring.jar 파일은 http://www.springframework.org/download.html 에서 최신 버전을 받으시면 됩니다.

오라클자바커뮤니티에서 설립한  개발자중심! 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr
 
다운 받으신 후 spring-framework-1.2.X/dist/spring.jar 파일을 WEB-INF/lib 폴더에 복사하세요~   복사 후 Eclipse에서 jar 파일을 lib에 추가해주세요~(프로젝트에 마우스 우측 버튼 누른 후 속성선택 후 Java Build Path LIBRARY에서 AddJAR에서 추가)
 
-------------------------------------------------------------------
1.     springapp아래 JSP 폴더를 만든 후 include.jsp 아래와 같이 작성 합니다. 모든 JSP파일에서 JSTL을 사용하기 위해 include되는 Header 파일 입니다.
이번엔 JSTL을 사용해 볼텐데 jstl을 사용하기 위해 http://www.apache.org/dist/jakarta/taglibs/standard/ 에서 jakarta-taglibs-standard-current.zip 파일을 다은 받은 후 jstl.jar, standard.jar 파일을 /WEB-INF/lib 폴더에 복사 합니다. 물론 Eclipse에서 Library 등록해야 겠죠
-------------------------------------------------------------------
 
[jsp/include.jsp]
<%@ page session="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
 
--------------------------------------------------------------------
2.     index.jsp를 다음과 같이 수정 합니다.
--------------------------------------------------------------------
 
[index.jsp]
<%@ include file="/WEB-INF/jsp/include.jsp" %>
<%--Redirected because we can't set the welcome page to a virtual URL.--%>
<c:redirect url="/hello.htm"/>
 
-------------------------------------------------------------
3.     View 역할을 하는 hello.jsp를 다음과 같이 개선 합니다.
-----------------------------------------------------------------
 
우선 hello.jsp jsp 폴더아래로 이동시켜 다음과 같이 작성 합니다.
 
[hello.jsp]
<%@ include file="/WEB-INF/jsp/include.jsp" %>
<html>
<head>
<title>Hello :: Spring Application</title>
</head>
<body>
<h1>Hello - Spring Application</h1>
<p>방가와요! 현재 시각 : <c:out value="${now}"/></p>
</body>
</html>
 
-------------------------------------------------------------------
4.     Controller 역할을 하는 SpringappController.java를 다음처럼 수정 합니다.
--------------------------------------------------------------------
 
[SpringappController.java]
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
public class SpringappController implements Controller {   
                 
             public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)           
                         throws ServletException, IOException {       
                         String now = (new java.util.Date()).toString();  
                         
        //now 라는 이름으로 현재시간을 담고 있는 객체를 메모리에 저장 합니다.
                 //이것을 View 역할을 하는 JSP(hello.jsp)에서 사용 합니다.
        return new ModelAndView("/jsp/hello.jsp", "now", now);
    }
}
 
-------------------------------------------------------------------
5.     참고로 WEB-INF아래의 web.xml은 다음과 같습니다.
-------------------------------------------------------------------
 
[web.xml]
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>  <servlet>
    <servlet-name>springapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>springapp</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>
 
  <welcome-file-list>
    <welcome-file>
      index.jsp
    </welcome-file>
  </welcome-file-list>
 
</web-app>