HTTP [hypertext transfer protocol] 인터넷에서 , 웹 서버와 사용자의 인터넷...

Post on 01-Jan-2016

92 views 0 download

description

용어. HTTP [hypertext transfer protocol] 인터넷에서 , 웹 서버와 사용자의 인터넷 브라우저 사이에 문서를 전송하기 위해 사용되는 통신 규약을 말한다 . 프로토콜 [protocol] 컴퓨터간에 정보를 주고받을 때의 통신방법에 대한 규칙과 약속 . 월드와이드웹 [world wide web] 인터넷망에서 정보를 쉽게 찾을 수 있도록 고안된 방법 또는 세계적인 인터넷망 . 인터넷 [internet] 아르파네트 (ARPANET) 에서 시작된 세계 최대 규모의 컴퓨터 통신망 . - PowerPoint PPT Presentation

Transcript of HTTP [hypertext transfer protocol] 인터넷에서 , 웹 서버와 사용자의 인터넷...

1

용어

HTTP [hypertext transfer protocol] 인터넷에서 , 웹 서버와 사용자의 인터넷 브라우저 사이에 문서를 전송하기 위해 사용되는 통신 규약을 말한다 .

프로토콜 [protocol] 컴퓨터간에 정보를 주고받을 때의 통신방법에 대한 규칙과 약속 .

월드와이드웹 [world wide web] 인터넷망에서 정보를 쉽게 찾을 수 있도록 고안된 방법 또는 세계적인 인터넷망 .

인터넷 [internet] 아르파네트 (ARPANET) 에서 시작된 세계 최대 규모의 컴퓨터 통신망 .

인트라넷 [intranet] 인터넷 기술과 통신규약을 이용하여 조직내부의 업무를 통합하는 정보시스템 .

URL [uniform resource locator] 웹 문서의 각종 서비스를 제공하는 서버들에 있는 파일의 위치를 표시하는 표준을 말한다 . URL 은 웹상에서 서비스를 제공하는 각 서버들에 있는 파일들의 위치를 명시하기 위한 것으로 접속해야 될 서비스의 종류 , 서버의 위치 ( 도메인 네임 ), 파일의 위치를 포함한다 . 일반적인 체계 (syntax) 는 프로토콜 :// 정보를 가진 컴퓨터 이름 /디렉터리 이름 / 파일 네임으로 구성된다 .

FTP [file transfer protocol] 인터넷을 통해 한 컴퓨터에서 다른 컴퓨터로 파일을 전송할 수 있도록 하는 방법과 , 그런 프로그램을 모두 일컫는 말이다 .

2

용어

텔넷 [telecommunication network] 인터넷을 통하여 원격지의 호스트 컴퓨터에 접속할 때 지원되는 인터넷 표준 프로토콜 .

URI (Uniform Resource Identifier)인터넷에 있는 자원을 나타내는 유일한 주소이다 . URI 의 존재는 인터넷에서 요구되는 기본조건으로서 인터넷 프로토콜에 항상 붙어다닌다 . URI 는 다음과 같은 요소로 구성된다 .프로토콜 (HTTP 혹은 FTP) + : + // + 호스트이름 + 주소예 : http://ko.wikipedia.orgURI 의 하위개념으로 URL, URN 이 있다 .

HTML [ Hyper Text Markup Language ]하이퍼텍스트의 구조를 서술하는 일종의 컴퓨터 언어 . 직접 프로그램을 제작하는 데 사용되는 C 나 PASCAL 과 달리 웹에서 사용되는 각각의 하이퍼텍스트문서로 사용되는 각각의 하이퍼텍스트 문서를 작성하는 데 사용된다 . 넷스케이프 등과 같은 웹 브라우저는 이 HTML 파일을 받아다 하이퍼텍스트 파일을 구성해 놓은 것으로 우리가 인터넷에서 볼 수 있는 수많은 홈페이지들은 기본적으로 HTML 이라는 언어를 사용하여 구현된 것이다 . HTTPS [ hypertext transfer protocol over Secure Sockets Layer, HTTP over SSL ]월드 와이드 웹 통신 프로토콜인 HTTP 의 보안이 강화된 버전이다 . HTTPS 는 통신의 인증과 암호화를 위해 넷스케이프 커뮤니케이션즈 코퍼레이션이 개발했으며 , 전자 상거래에서 널리 쓰인다 .HTTPS 는 소켓 통신에서 일반 텍스트를 이용하는 대신에 , SSL 이나 TLS 프로토콜을 통해 세션 데이터를 암호화한다 . 따라서 데이터의 적절한 보호를 보장한다 . HTTPS 의 기본 TCP/IP 포트는 443 이다 .보호의 수준은 웹 브라우저에서의 구현 정확도와 서버 소프트웨어 , 지원하는 암호화 알고리즘에 달려있다 .HTTPS 를 사용하는 웹페이지의 URL 은 'http://' 대신 'https://' 로 시작한다 .

3

용어

SSL [secure sockets layer] 인터넷 상거래시 필요한 개인 정보를 보호하기 위한 , 개인 정보 유지 프로토콜이다 .인터넷 프로토콜 (Internet protocol) 이 보안면에서 기밀성을 유지하지 못한다는 문제를 극복하기 위해 개발되었다 . 현재 전세계에서 사용되는 인터넷 상거래시 요구되는 개인 정보와 크레디트카드 정보의 보안 유지에 가장 많이 사용되고 있는 프로토콜이다 . 최종 사용자와 가맹점간의 지불 정보 보안에 관한 프로토콜이라고 할 수 있다 .

XML [extensible markup language] 인터넷 웹페이지를 만드는 HTML 을 획기적으로 개선하여 만든 언어이다 . 홈페이지 구축기능 , 검색기능 등이 향상되었고 , 웹 페이지의 추가와 작성이 편리해졌다 .확장성 생성 언어 (擴張性生成言語 ) 로 번역되며 , 1996 년 W3C(World Wide Web Consortium) 에서 제안하였다 . HTML 보다 홈페이지 구축 기능 , 검색 기능 등이 향상되었고 클라이언트 시스템의 복잡한 데이터 처리를 쉽게 한다 . 또한 인터넷 사용자가 웹에 추가할 내용을 작성 , 관리하기에 쉽게 되어 있다 . 이밖에 HTML 은 웹 페이지에서 데이터베이스처럼 구조화된 데이터를 지원할 수 없지만 XML 은 사용자가 구조화된 데이터베이스를 뜻대로 조작할 수 있다 . 구조적으로 XML 문서들은 SGML(standard generalized markup language) 문서 형식을 따르고 있다 . XML 은 SGML 의 부분집합이라고도 할 수 있기 때문에 응용판 또는 축약된 형식의 SGML 이라고 볼 수 있다 . 1997년부터 마이크로소프트사 (社 ) 와 넷스케이프 커뮤니케이션스사 (社 ) 가 XML 을 지원하는 브라우저 개발을 하고 있다 .

SGML [Standard Generalized Markup Language] 전자문서가 어떠한 시스템 환경에서도 정보의 손실 없이 전송 , 저장 , 자동처리가 가능하도록 국제표준화기구 (ISO) 에서 정한 문서처리 표준이다 .웹문서를 만드는 언어로 가장 보편적인 HTML 과 차세대 인터넷표준언어로 채택된 XML 은 모두 SGML 에 근거하여 만들어진 것이다 .

4

용어

애플릿 [applet] Java 언어로 구성된 간단한 기능의 소규모 프로그램을 의미하거나 웹 페이지에 포함되어 작은 기능을 수행하는 프로그램을 말한다 . 용량과 속도에 구애 받지 않고 서버에 대한 별도의 요청 없이 단순한 작업을 수행한다 .애플릿은 Java 언어로 구성된 작은 응용 프로그램을 의미한다 . Java 언어는 인터넷 기반의 언어이므로 용량과 속도의 한계로 프로그램을 크게 만들 필요가 없으므로 소규모 애니메이션 , 그림 그리기 , 날씨 변화 표시하기 , 주가정보 표시 등의 간단한 기능을 처리하는 작은 프로그램을 만들어 사용하는 데 이를 의미한다 .월드 와이드 웹이 나오기 이전에도 윈도와 함께 기본으로 제공되던 작은 프로그램들 , 예를 들어 메모장이나 그림 그리기 등을 '애플릿 ' 이라고 부른 적이 있었다 .

디버그 [debug] 프로그램의 개발 마지막 단계에서 , 프로그램의 오류를 발견하고 그 원인을 밝히는 작업 또는 그 프로그램을 말한다 . 오류 수정 작업은 디버깅 (debugging), 오류 수정 소프트웨어는 디버거 (debugger) 라고 한다 .

객체지향프로그래밍 [object-oriented programming] 모든 데이터를 오브젝트 (object; 물체 ) 로 취급하여 프로그래밍 하는 방법으로 , 처리 요구를 받은 객체가 자기 자신의 안에 있는 내용을 가지고 처리하는 방식이다 .

XSL 변환 [ XSLT, XSL Transformation, - 變換 ]확장성 생성 언어 (XML) 문서 형식을 다른 형식의 문서로 변환하는 방법을 기술한 표준 방법 . 확장 스타일시트 언어 (XSL) 의 확장으로서 XML 문서가 다른 데이터 형식으로 재구성되는 방법을 보여준다 . XSLT 부호화를 스타일시트라 부르기도 하고 , XSL 스타일시트와 같이 사용하거나 독립적으로 사용된다 . →확장성 스타일시트 언어 . ;

CSS [cascading style sheets] 웹 문서의 전반적인 스타일을 미리 저장해 둔 스타일시트이다 . 문서 전체의 일관성을 유지할 수 있고 , 세세한 스타일 지정의 필요를 줄어들게 하였다 .

5

FORM

<form name="" action="" method="post" target="_self"><input name="" type="text" tabindex="1" align="left" disabled maxlength="10" size="10"><br/><input name="" type="text" readonly tabindex="2" onKeyUp="" onFocus=""><br/><input name="" type="password" onFocus="" onKeyDown=""><br/><input name="" type="radio" value="A" checked>A <input name="" type="radio" value="B">B <input name="" type="radio" value="C">C<br/><select name="select" onChange=""> <option value="O">O</option> <option value="X" selected>X</option></select><select name="" size="5" multiple onChange=""> <option value="O">O</option> <option value="X">X</option> <option value="" selected></option></select><br/><input name="" type="image" usemap="" border="" align="middle" onBlur="" onClick=""><br/><input name="" type="hidden" value=""><br/><input name="" type="file" onChange=""><br/><input name="" id="" type="checkbox" value="A" onClick="" checked>A <input name="" id="" type="checkbox" value="B" onCli

ck="">B <input name="" id="" type="checkbox" value="C" onClick="">C<br/><input name="" type="button" onClick=""><br/><input name="" type="submit"><br/><input name="" type="reset"><br/><textarea name="" cols="" rows="" onFocus=""></textarea></form>

6

과제 - 회원가입

* 필수입력체크1.입력에 포커스에 있을 때 바탕 색을 노랑색으로 변경 .포커스 떠나면 횐색2. 이름 입력 시 한글모드 , 공백제거3. 아이디 영문 +숫자 (한글입력 안됨 ) 8자리 이상 ~10자리4. 주민번호 6자리 입력하면 포커스 옆으로 이동5. 주민번호 7 번째 입력 시 남 / 여 자동 체크6. 저장 버튼 클릭시 이메일 @ 존재 확인하고 없으면 경고창 띄우고 포커스 줌7. 전화번호 서비스번호 변경되면 포커스 옆으로 이동 , 국번 4 자리 입력하면 포커스이동8. 저장 버튼 클릭 시 필수입력 체크9. 비밀번호 8자리 ~10자리

* 이름

주민번호

이메일

전화 - -

-

* 아이디

* 비밀번호

성별 여남

저장 초기화

7

용어

CVS (Concurrent Versions System, 동시 버전 시스템 )동시 버전 관리 시스템 (Concurrent Versioning System) 으로도 알려져 있으며 , 버전 관리 시스템을 구현한다 . 보통 소프트웨어 프로젝트를 진행할 때 , 파일로 이뤄진 모든 작업과 모든 변화를 추적하고 , 여러 개발자 ( 지역적으로 떨어진 ) 가 협력하여 작업할 수 있게 한다 . CVS 는 GNU 일반 공중 사용 허가서 하에서 배포된다 . CVS 는 오픈 소스 프로젝트에서 널리 사용되었다 . 현재는 CVS 가 한계를 맞아 , CVS 를 대체하는 서브버전이 개발되었다 .CVS 로 관리되는 하나의 프로젝트 (관련된 파일의 집합 ) 를 모듈이라 부른다 . CVS 서버는 보관소에 모듈을 저장한다 . 모듈의 복사본을 얻는 것은 체크 아웃 (checking-out) 이라 한다 . 체크 아웃된 파일은 작업 중인 복사본으로 관리된다 . 이 복사본을 바꾸려면 커밋 (commit) 하여 보관소에 넣어야 한다 . 업데이트 (update) 는 작업 중인 복사본이 있는 보관소에서 최근에 변경된 사항을 얻는다 .

SVN서브버전 (Subversion) 은 자유 소프트웨어 버전 관리 시스템이다 . 명령행 인터페이스에서 사용하는 명령어를 따서 “ SVN”이라고 줄여서 부르기도 한다 . 제한이 있던 CVS 를 대체하기 위해 2000 년부터 콜랩넷에서 개발되었다 .

CVS 와 비교했을 때 , 서브 버전은 다음과 같은 장점을 가진다 .원자적으로 쓰기를 지원하므로 , 다른 사용자의 쓰기와 엉키지 않는다 .이름을 바꾸거나 , 복사하거나 , 파일을 지워도 리비전 기록을 유지한다 .이진 파일의 경우 한번 저장한 후 변경될 경우 차이점만 저장하기 때문에 저장소를 효율적으로 사용할 수 있다 .디렉터리도 버전 관리를 할 수 있다 . 디렉터리 전체를 빠르게 옮기거나 복사할 수 있으며 , 리비전 기록도 그대로 유지한다 .소스 저장고의 크기에 상관 없이 일정한 시간 안에 가지 치기 (branching) 나 테그 넣기 (tagging) 를 할 수 있다 .소스 저장고로의 접근이 최적화되어 있으므로 , 소스 저장고에서 필요 없는 네트워크 트래픽을 줄일 수 있다 .

8

용어

웹서버 [ Web Server ]웹 페이지 (HTML 파일 ) 를 제공해 주는 서버를 말하는 것으로 HTTP 를 사용하여 웹 페이지를 제공할 수 있는 웹 서버 프로그램이 설치되어 있고 하나의 도메인 이름을 갖고 있다 . 예를 들어 , 사용자가 웹 브라우저에서 URL 로 'http://epic.kdi.re.kr' 를 입력하면 , 도메인 이름이 'epic.kdi.re.kr' 인 서버에게 웹 페이지를 요청하고 서버는 'index.html' 파일을 찾아서 브라우저에게 보낸다 . 따라서 , 가장 일반적인 웹 서버로는 UNIX기반의 아파치 , WINDOW NT 의 IIS, 넷스케이프의 엔터프라이즈 서버가 있다 .

웹 애플리케이션 서버웹 애플리케이션 서버 (Web Application Server, 약자 WAS) 는 인터넷 상에서 HTTP 를 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해 주는 미들웨어 ( 소프트웨어 엔진 ) 이다 .웹 애플리케이션 서버는 동적 서버 콘텐츠를 수행하는 것으로 일반적인 웹 서버와 구별이 되며 , 주로 데이터베이스 서버와 같이 수행이 된다 . 한국에서는 일반적으로 "WAS" 또는 "WAS S/W"로 통칭하고 있으며 공공기관에서는 "웹 응용서버 "로 사용되고 , 영어권에서는 "Application Server"로 불린다 .웹 애플리케이션 서버는 대부분이 자바 기반으로 주로 Java EE 표준을 수용하고 있으나 , 자바 기반이지만 Java EE 표준을 따르지 않는 제품과 .NET 이나 Citrix 기반인 비 Java 계열도 존재한다 .

웹 애플리케이션 서버의 기본 기능은 3 가지이다 .프로그램 실행 환경과 데이터베이스 접속 기능을 제공한다 .여러 개의 트랜잭션을 관리한다 .업무를 처리하는 비즈니스 로직을 수행한다 .

Java EE 표준준수 웹 애플리케이션 서버제우스 ( 한국 , 티맥스소프트 , 상용 ) 웹로직 (미국 , 오라클 , 상용 ) 웹스피어 (미국 , IBM, 상용 ) 레진 (미국 , Caucho, 상용 )글래스피시 (미국 , 오라클 , 오픈소스 ) 제이보스 (미국 , 레드햇 , 오픈소스 ) 인터스테이지 ( 일본 , 후지쯔 , 상용 )

Java 기반이나 Java EE 비준수 웹 애플리케이션 서버아파치 톰캣 (Apache Tomcat) : 오픈소스재단 아파치 소프트웨어 재단의 오픈소스 소프트웨어레진 (Resin) : Caucho 사의 제품 , 제이런 (JRun) : macromedia 사의 제품

9

개발환경

1. JDK 6 설치2. Tomcat 6 설치3. 환경변수 추가4. eclipse 설치5. c:/workspace 생성6. eclipse

help>Install New Software...Subversive SVN Connectorshttp://community.polarion.com/projects/subversive/download/eclipse/2.0/galileo-site/

7. tomcat plugin 설치 (eclipse>plugin>tomcatPluginV321.zip)8. 톰캣 lib 복사9. 네이버 SVN checkout 다이나믹 프로젝트로 생성 한후에

Window>profer...>team>cvs>ingno...> .class, .project, .classpath, .settings, classes10. 수정

tomcat 6.0/conf/ Catalina/ localhost/ROOT.xml

CATALINA_HOME : C:\Tomcat 6.0classpath : .;C:\Tomcat 6.0\lib\servlet-api.jarPath : %CATALINA_HOME%\bin; 추가

<?xml version="1.0" encoding="UTF-8"?><Context path="/" docBase="c:\workspace2\education\WebContent\" debug="0" privileged="true" reloadable="true"></Context>

10

자바스크립트

윈도우 오픈 (팝업 )window.open("파일명 ","target","width=크기 ,height=크기 ,left=위치 ,top=위치 , directories=yn,copyHistory=yn,location=yn,resizable=yn,scrollbars=yn,status=yn,toolbar=yn"); width=크기 -> 새윈도우의 폭 , height=크기 -> 새윈도우의 높이left=위치 -> 윈도우의 위치를 왼쪽 끝을 기준 , top=위치 -> 윈도우의 위치를 위쪽 끝을 기준directories=yn -> 디렉토리 버튼을 보여준다 . (연결 )익스플로러 연결도구모음 , 익스플로러 전용 yew||nocopyHistory=yn -> 윈도우의 히스토리를 복사location=yn -> 주소 입력창 , resizable=yn -> 사용자가 윈도우의 크기를 조정 유무 , scrollbars=yn -> 스크롤바 사용 유무status=yn -> 상태 표시줄 , toolbar=yn -> 툴바window.close; -> 창닫기

이벤트 핸들러 (Event Handlers) HTML 코드에 내장되는 자바스크립트 명령어다 . 사용자와 웹 페이지 사이의 상호 작용을 위해 HTML 코드와 함께 사용된다 .onBlur : 사용자가 select, text, textarea 폼 요소에 있다가 그 요소에서 벗어나게 될 때 발생하는 이벤트 핸들러이다 . 즉 , 사용자가 그 아이템에 대한 포커스를 잃을 때 발생한다 .onChange : 사용자가 select, text, textarea 폼 요소에 있는 텍스트를 변경한 후 그 요소를 떠날 때 발생하게 된다 .onClick : 사용자가 링크와 같은 오브젝트를 클릭할 때 발생한다 .onFocus : 사용자가 select, text, textarea 폼 요소를 선택할 때 발생한다 . 즉 사용자가 그 폼 요소에 포커스를 맞출 때 발생한다 .onLoad : 웹 페이지가 열릴 때 발생하는 이벤트로 HTML 의 BODY 태그 안에서 사용된다 .onMouseOver : 사용자가 링크 위에 마우스를 올려 놓았을 때 발생하는 이벤트 핸들러이다 .onSelect : 사용자가 text, textarea 폼 요소에 있는 텍스트의 일부 또는 전체를 선택할 때 발생한다 .onSubmit : submit 버튼 폼 요소를 사용자가 틀릭할 때 발생한다 .onUnLoad : 사용자가 웹 페이지를 떠날 때 발생하는 이벤트로 HTML 의 BODY 태그 안에서 사용된다 .

11

자바스크립트

제어 문if( 비교값 1){ 처리내용 1}elseif( 비교값 2){ 처리내용 2}else{비교값 3};논리연산자 && (AND), || (OR), ! (NOT)연산기호 ==,<,>,<=,>=,!=

반복 문for(i=0;i<5;i++){ 처리내용 }while(i<5){ 처리내용 };

날짜관련var myDate = new Date();var myDate = new Date(949278000000);var myDate = new Date("1 jan 2003");var myDate = new Date(2000,0,31,15,35,20,20); 2000 년 1월 31일 35 분 20 초 20밀리getDate() -> myDate.getDate(); 날짜를 반환getDay() -> myDate.getDay(); 요일을 정수로 반환getMonth() -> myDate.getMonth(); 월을 정수로 반환getFullYear() -> myDate.getFullYear; 년을 네 자리 수로 반환setDate() -> myDate.setDate(27); 날짜를 설정setMonth() -> myDate.Month(1); 월을 설정setFullYear() -> myDate.setFullYear(2003); 년을 설정myDate.getHours(); 시간myDate.getMinutes(); 분myDate.getSeconds(); 초myDate.getMilliseconds; 밀리

12

자바스크립트

문자관련isNaN(변수 ); -> 숫자 false 문자 truelength -> 문자열의 길이myArray.length; -> 변수길이myArray.sort();var myString = new String("나는 String 개체입니다 ");var lengthOfString = myString.length;charAt( 위치값 ) -> 문자열에서 한문자 선택charCodeAt( 위치값 ) -> 문자열에 한문자 코드값myString = String.fromCharCode(65,66,67); -> 문자 코드를 문자열로 변환 (ABC)indexOf('앞부분 부터 찾을문자 ');lastIndexOf('뒷부분 부터 찾을 문자 ') -> 문자열의 위치를 반환 , 없을 경우 -1반환substr( 시작위치 , 복사할문자수 ); -> 문자열의 일부분 복사하기substring( 시작위치 ,끝위치 );myDate.toString(); -> 숫자를 문자열로 반환myString.toLowerCase(); -> 문자열의 소문자 변환myString.toUpperCase(); -> 문자열의 대문자 변환

알림 창window.alert(' 내용 '); //경고창prompt(' 내용 ',초기값 ); //입력값 받기confirm(' 내용 '); // 확인 ,취소print(); // 현 윈도우를 인쇄하고자 할 때

13

자바스크립트 예제

<script type="text/javascript">function setVisible(divname){document.getElementById(divname).style.display = "";}function setHide(divname){document.getElementById(divname).style.display = "none";}</script>

<input type="button" name="btn_div" value=" 보이기 " onClick="javascript:setVisible('test_div')"/><input type="button" name="btn_div" value=" 감추기 " onClick="javascript:setHide('test_div')"/>

<div id="test_div" style="display:none">여기는 KGIT 8 층입니다 .</div>

14

자바스크립트 예제

<script type="text/javascript">var idx = 1;function setAdd(divname){idx ++;document.getElementById(divname).outerHTML = "<div id='div"+idx+"'>"+ "<input type='text' name=\"person_name\"/>"+ " <input type='button' name='minus' value='-' onClick=\"javascript:setDel('div"+idx+"')\"/></div>"+"<div id=\"test_div\"></div>";}

function setDel(tname){document.getElementById(tname).outerHTML = "";}</script>

<input type="button" name="btn_div" value=" 추가 " onClick="javascript:setAdd('test_div')"/>

<div id="div1"><input type="text" name="person_name"/><input type="button" name="minus" value="-" onClick="javascript:setDel('div1')"/></div><div id="test_div"></div>

15

자바스크립트 예제

<script type="text/javascript">function checkAll(bool) {var chks = document.getElementsByName("chk");for(var i=0;i<chks.length;i++) {if(chks[i].type == "checkbox") chks[i].checked = bool;}}</script>

<input type="checkbox" name="chkAll" onclick="javascript:checkAll(this.checked);">전체 <br/><br/><input type="checkbox" name="chk" value="A">A&nbsp;&nbsp;<input type="checkbox" name="chk" value="B">B&nbsp;&nbsp;<input type="checkbox" name="chk" value="C">C&nbsp;&nbsp;

16

용어

AJAXWEB2.0 의 기반 기술 중 하나이다 . AJAX 는 자체가 하나의 특정한 기술을 말하는 것이 아니며 , 함께 사용하는 기술의 묶음을 지칭하는 용어로 대화식 웹 애플리케이션의 제작을 위해 사용된다 . AJAX 애플리케이션은 실행을 위한 플랫폼으로 사용되는 기술들을 지원하는 웹 브라우저를 이용하는데 , 이를 지원하는 브라우저로는 모질라 파이어폭스 , 인터넷 익스플로러 , 오페라 , 사파리 등이 있다 .현재 대화형 웹 페이지를 위한 도구로서 Ajax 를 이용하는 애플리케이션들이 급격히 늘어나고 있으며 , 이는 부분적으로 이용할 수 있는 애플리케이션 툴 킷 ( 예 : Ruby on Rails, DWR) 이 늘어나 프로그래머들이 구현하기가 쉬워진 때문이다 .

장점페이지 이동 없이 고속으로 화면을 전환할 수 있다 .서버 처리를 기다리지 않고 , 비 동기 요청이 가능하다 .수신하는 데이터 량을 줄일 수 있고 , 클라이언트에게 처리를 위임할 수도 있다 .

단점Ajax 를 쓸 수 없는 브라우저에 대한 문제가 있다 .Http 클라이언트의 기능이 한정되어 있다 .페이지 이동 없는 통신으로 인한 보안상의 문제지원하는 Charset 한정되어 있다 .스크립트로 작성되므로 Debugging 이 용이하지 않다 .요청을 남발하면 역으로 서버 부하가 늘 수 있음 .

17

XML/XSL/DTD

200234-250537.xml<?xml version="1.0" encoding="utf-8"?><!DOCTYPE press SYSTEM "200234-250537.dtd"><!-- XSL 문서 적용 <?xml-stylesheet type="text/xsl" href="200234-250537.xsl"?>--><press> <category id="정치면 "> <news> <headline>기사제목 </headline> <subject>' 예산 삭감 논란 ' 에 종지부 </subject> <date>2008 년 10월 24 일 (금 )</date> <content>기사내용 .....</content> <picture> <img src="banq.jpg"/> </picture> <write> <position>서울 =연합뉴스 </position> <name>이승관 </name> <email>humane@yna.co.kr</email> </write> </news> </category> // category 반복</press>

200234-250537.dtd <?xml version="1.0" encoding="utf-8"?><!ELEMENT press (category*)><!ELEMENT category (news*)><!ELEMENT news (headline,subject,date,content,picture,write)><!ELEMENT write (position,name,email)><!ELEMENT headline (#PCDATA)><!ELEMENT subject (#PCDATA)><!ELEMENT date (#PCDATA)><!ELEMENT content (#PCDATA)><!ELEMENT picture (img)><!ELEMENT position (#PCDATA)><!ELEMENT name (#PCDATA)><!ELEMENT email (#PCDATA)><!ELEMENT img (#PCDATA)><!ATTLIST category id CDATA #REQUIRED><!ATTLIST img src CDATA #REQUIRED>

18

XML/XSL/DTD

<?xml version="1.0" encoding="utf-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><!-- start template rule --><xsl:output method="html" encoding="euc-kr"/>

<xsl:template match="/"> <html> <head> <title>200234-250537</title> <link href="200234-250537.css" rel="stylesheet" type="text/css"/> </head> <body> <table width="600" border="0" cellspacing="0" cellpadding="0"> <xsl:apply-templates select="/press/category"/> </table> </body> </html></xsl:template>

<xsl:template match="category"> <tr> <td class="category_text"><xsl:value-of select="@id"/></td> </tr> <xsl:apply-templates select="news"/></xsl:template>

19

XML/XSL/DTD

<xsl:template match="news"> <tr> <td> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="200" valign="middle"> <xsl:variable name="vImg"><xsl:value-of select="picture/img/@src"/></xsl:variable> <img src="{$vImg}" width="200"/> </td> <td width="5"></td> <td valign="top"> <span class="headline_text"><xsl:value-of select="headline"/></span><br/> <span class="subject_text"><xsl:value-of select="subject"/></span><br/> <span class="content_text"><xsl:value-of select="content"/></span><br/> <span class="write_text"><xsl:value-of select="date"/></span><br/> <span class="write_text"> <xsl:value-of select="write/position"/> / <xsl:value-of select="write/name"/> (<xsl:value-of select="write/

email"/>)</span> </td> </tr> </table> </td> </tr> <tr><td height="5"></td></tr></xsl:template></xsl:stylesheet>

20

TEST

하이퍼텍스트의 구조를 서술하는 일종의 컴퓨터 언어 ?

SGML 에 근거하여 정의 , 구조화된 데이터베이스를 뜻대로 조작할 수 있는 차세대 인터넷표준언어 ?

전자문서가 어떠한 시스템 환경에서도 정보의 손실 없이 전송 , 저장 , 자동처리가 가능하도록 국제표준화기구 (ISO) 에서 정한 문서처리 표준언어 ?

확장성 생성 언어 (XML) 문서 형식을 다른 형식의 문서로 변환하는 방법을 기술한 표준 방법 ?

웹 애플리케이션 서버 (Web Application Server, 약자 WAS) 종류 아는 대로 쓰시오 .

월드 와이드 웹 통신 프로토콜인 HTTP 의 보안이 강화된 버전 ?

현재 전세계에서 사용되는 인터넷 상거래시 요구되는 개인 정보와 크레디트카드 정보의 보안 유지에 가장 많이 사용되고 있는 프로토콜 ?

HTTP 를 사용하여 웹 페이지를 제공할 수 있는 웹서버 종류 아는 대로 쓰시오 .

폼 요소에 있는 텍스트를 변경한 후 그 요소를 떠날 때 발생하는 이벤트 명 ?

자바스크립트 내장함수 중 isNaN(변수 ) 의 리턴값으로 변수가 숫자일때 리턴값은 ?

자바스크립트 내장함수 중 alert() 과는 다르게 사용자에게 질문하는데 사용되며 사용자는 true 또는 false 를 리턴한다 . 해당 함수는 ?

21

TEST

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE press SYSTEM "200234-250537.dtd"><presses> <category name="정치면 "> <news> <headline>기사제목 </headline> <subject>' 예산 삭감 논란 ' 에 종지부 <subject> <date>2008 년 10월 24 일 (금 )</date> <content>기사내용 .....</content> <picture src="banq.jpg"> <write> <position>서울 =연합뉴스 </position> <name>이승관 </name> <email>humane@yna.co.kr</email> </write> </news> </Category></presses>

<?xml version="1.0" encoding="utf-8"?><!ELEMENT press (category*)><!ELEMENT category (news*)><!ELEMENT news (headline,subject,date,content,picture,write)><!ELEMENT write (position,name,email)><!ELEMENT headline (#PCDATA)><!ELEMENT subject (#PCDATA)><!ELEMENT date (#PCDATA)><!ELEMENT content (#PCDATA)><!ELEMENT picture (#PCDATA)><!ELEMENT position (#PCDATA)><!ELEMENT name (#PCDATA)><!ELEMENT email (#PCDATA)><!ATTLIST category id CDATA #REQUIRED><!ATTLIST picture src CDATA #REQUIRED>

왼쪽의 dtd 를 기준으로 xml 의 잘못된 부분 5개를 고쳐주세요

22

JAVASE 1.6

한글 API 1.6 SE - http://pllab.kw.ac.kr/javaSE6APIs/api/index.html

http://download.oracle.com/javase/6/docs/

23

자바란 ?

자바는 특별히 인터넷의 분산환경에서 사용되도록 설계된 프로그래밍 언어이다 . 자바는 C++ 언어처럼 보이지만 , C++ 보다는 사용하기에 간단하고 프로그래밍의 완전한 객체지향성을 강화하였다 . 자바는 한 대의 컴퓨터나 , 네트웍 상의 분산 클라이언트 /서버 환경에서도 실행되는 응용프로그램을 만드는데 모두 사용될 수 있다 . 이것은 또한 웹페이지의 일부로서 쓰이는 작은 응용프로그램 모듈이나 애플릿 등을 만드는 데에도 사용될 수 있다 . 애플릿들은 사용자들이 웹페이지를 통해 상호작용을 할 수 있도록 해준다 . 자바의 주요 특성들을 요약하면 다음과 같다 .

▶사용자가 만드는 프로그램들은 네트웍 상에서 쉽게 이식이 가능하다 . 사용자가 개발한 프로그램은 자바 가상머신이 설치된 서버나 클라이언트 등 네트웍의 어디에서든지 실행될 수 있도록 , 자바 바이트코드로 컴파일된다 . 자바 가상머신은 바이트코드를 실제 컴퓨터 하드웨어에서 실행될 수 있는 코드로 해석한다 . 이것은 명령어의 길이 등 , 개별 컴퓨터 플랫폼간의 차이가 인식되고 , 프로그램이 실행되어지고 있는 바로 그 위치에서 국부적으로 조정될 수 있다는 것을 의미한다 . 특정한 플랫폼에 맞는 프로그램 버전은 더 이상 필요하지 않다 . ▶ 자바코드는 " 튼튼하다 ". 즉 , 이것은 C++ 나 기타 다른 언어로 작성된 프로그램들과는 달리 , 자바 객체들은 외부 데이터로부터 내부 또는 알려진 다른 객체들로 향하는 참조를 포함하지 않을 수 있다는 것을 의미한다 . 이것은 명령어가 다른 응용프로그램이나 운영체계 그 자체 내에 있는 데이터 저장소의 주소를 포함하지 않음을 보장함으로써 , 그 프로그램이나 운영체계의 실행이 중단되거나 고장을 일으키지 않게 한다 . 자바 가상머신은 각 객체에 대해 무결성을 보장하기 위해 여러 번의 검사를 실시한다 . ▶자바는 객체지향적이다 . 이는 다른 특성들 가운데 , 비슷한 객체들은 같은 클래스의 일부가 되고 공통 코드를 상속하는 등의 장점을 취할 수 있다는 것을 의미한다 . 객체들은 전통적이고 절차적인 " 동사 "와 관계 있기보다 , 사용자에게 "명사 "와 관계 있는 것으로 생각하게 한다 . 메쏘드는 객체의 능력이나 행동 중의 하나로 생각할 수 있다 . ▶ 서버가 아닌 클라이언트에서 실행되는 것 외에도 , 자바 애플릿은 빠르게 실행되기 위해 설계된 다른 특성들을 가진다 . ▶ C++ 에 비해 자바는 배우기 쉽다 ( 그러나 , 물론 하룻밤새 배울 수 있는 것은 아니다 ).

자바는 1995 년에 썬마이크로시스템즈에 의해 소개되었으며 , 그 즉시 웹의 대화형 가능성에 대해 새로운 의미를 창출하였다 . 주요 웹브라우저들은 모두 자바 가상머신을 포함한다 . IBM, 마이크로소프트 등 거의 모든 주요 운영체계 개발자들이 자신들의 제품에 자바 컴파일러를 추가하였다 . 자바 가상머신은 한번에 하나의 바이트코드 명령어를 해석하는 대신 , 바이트코드를 동적으로 컴파일하여 실행코드로 만드는 JIT 컴파일러를 선택적으로 포함할 수 있다 . 많은 경우에서 , 동적 JIT 컴파일이 가상머신 해석보다 더 빠르다 .

24

자바의 특징

플랫폼 독립성자바의 가장 큰 특징은 플랫폼 독립성을 갖고 있다는 점이다 .자바로 프로그램을 작성하면 한번 만들어진 자바 프로그램은 운영체제나 CPU 타입에 상관없이 프로그램이 동작될 수 있다 .(Write Once, Run Anywhere.)이것은 자바가상머신 (JVM: Java Virtual Machine) 이 자바로 작성된 프로그램에게 동일한 실행환경을 제공하기 때문이다 . 객체지향 언어객체지향 프로그래밍 기법은 기존의 구조적 프로그래밍 방식을 획기적으로 개선한 뛰어난 프로그래밍 기법이다 .이 기법은 재사용성이나 프로그램의 생산성 측면에서 놀라운 기능을 제공한다 . 멀티 쓰레드 지원쓰레드란 프로그램 안에서 독립적으로 실행되는 작은 실행단위라고 할 수 있다 .이 쓰레드는 하나의 프로그램 안에서 같이 실행되기 때문에 메모리 공유가 가능하면서 프로그램이 효율적으로 실행될 수 있도록 해준다 . 자동 메모리 관리자바가상머신이 자동적으로 사용되지 않는 메모리 영역을 찾아서 해제해준다 .

25

자바 Edition

자바 플랫폼 스탠더드 에디션 (Java Platform, Standard Edition, 약자 Java SE)자바 플랫폼에서 가장 널리 쓰이는 자바 API 의 집합체이다 . 예전에는 J2SE 로 불리었으나 버전 6.0이후에 Java SE 로 변경되었다 . 이전에는 썬 마이크로시스템즈에서 관리하였으나 , J2SE 1.4 이후는 JCP 주도하에 개발되고 있다 . 따라서 , JSR 59에는 J2SE 1.4 를 , JSR 176에는 J2SE 5.0( 프로젝트명 타이거 ) 를 , Java SE 6 ( 프로젝트명 무스탕 ) 은 JSR 170 하에 개발되었다 .

자바 플랫폼 , 마이크로 에디션 (Java Platform, Micro Edition) Java 2 Platform, Micro Edition 라고도 불리며 , Java ME 혹은 J2ME 등으로도 널리 알려져 있다 . 제한된 자원을 가진 휴대 전화 , PDA, 세트톱박스 등에서 Java 프로그래밍 언어를 지원하기 위해 만들어진 플랫폼 중 하나를 가리킨다 .Java ME 는 썬 마이크로시스템즈에서 고안하였다 . 초기에는 Java Community Process 에서 JSR 68로 개발되었으나 , 각각 다른 특성을 가진 Java ME 플랫폼들이 별도의 JSR 로 개발되었다 . 썬 마이크로시스템즈에서 이 규격에 대한 참조 구현을 제공하고 있다 . 하지만 이는 Java ME 플랫폼을 무료로 제공하기 위한 목적이 아니라 , 다른 개발사에서 개발하는 데 도움을 주기 위함이다 .

J2EE [ Java 2 Enterprise Edition ]분산 객체 , 효율적 자원 관리 , 컴포넌트 기반 개발 등을 자바 환경에서 할 수 있도록 하는 표준 규약 . 은행 전산망처럼 큰 규모의 전산 환경을 엔터프라이즈급 환경이라고 하는데 , 이러한 환경은 수많은 고객 정보를 공유해야 하고 어느 곳에서나 동일한 서비스를 차질 없이 제공해야 한다 . 이러한 개방적인 웹 환경을 지원하는 J2EE 의 구성 요소는 분산 객체와 컴포넌트 기반 개발을 지원하는 기업 자바빈 (EJB), EJB 컨테이너 또는 웹 애플리케이션 서버가 효율적 자원 관리를 위해 사용하는 JTA(Java Transaction API) 와 JDBC, 웹 환경을 담당하는 서브릿과 JSP(Java ServerPages), 기타 자바 네이밍 디렉터리 인터페이스 (JNDI), 자바메일 , 자바 메시지 서비스 (JMS) 등의 기능이 있다 .

자바 FX 모바일 [ JavaFX Mobile ]선 마이크로시스템스사가 개발한 모바일 기기용 소프트웨어 표준 . 운영 시스템 (OS) 으로 리눅스 , 미들웨어는 자바를 사용한다 . 리눅스와 자바 모두 공개 소프트웨어이기 때문에 휴대폰 업체 입장에서는 비용을 줄이고 , 자사 제품에 안정적으로 사용할 수 있다 . 모바일용 자바 ME 가 단순한 소프트웨어 동작 플랫폼이었다면 , 자바 FX 모바일은 각종 애플리케이션 프레임워크 , 다양한 휴대폰 소프트웨어 , 리눅스 기반 운영 체계 커널까지 전체를 제공하는 모바일 운용 기반이다 .

26

용어

엔터프라이즈 자바빈즈 (Enterprise JavaBeans; EJB) 기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델이다 . 즉 , EJB는 애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션이다 . EJB 사양은 Java EE 의 자바 API 중 하나로 , 주로 웹 시스템에서 JSP 는 화면 로직을 처리하고 , EJB는 업무 로직을 처리하는 역할을 한다 .

Java 다운로드 사용자 컴퓨터용 Java 소프트웨어 또는 Java Runtime Environment, Java Runtime, Runtime Environment, Runtime, JRE, Java Virtual Machine, Virtual Machine, Java VM, JVM, VM 또는 Java 다운로드라고도 합니다 .

자바 서블릿 (Java Servlet) 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며 , 흔히 "서블릿 "이라 불린다 .자바 서블릿은 Java EE 사양의 일부분으로 , 주로 이 기능을 이용하여 쇼핑몰이나 온라인 뱅킹 등의 다양한 웹 시스템이 구현되고 있다 .비슷한 기술로는 펄 등을 이용한 CGI, PHP 를 아파치 웹 서버 프로세스에서 동작하게 하는 mod_php, 마이크로소프트사의 IIS에서 동작하는 ASP 등이 있다 . CGI 는 요청이 있을 때마다 새로운 프로세스가 생성되어 응답하는 데 비해 , 자바 서블릿은 외부 요청마다 프로세스보다 가벼운 쓰레드로써 응답하므로 보다 가볍다 . 또한 , 자바 서블릿은 자바로 구현되므로 다양한 플랫폼에서 동작한다 .

자바 서버 페이지 (JavaServer Pages, JSP)HTML 내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려주는 언어이다 . Java EE 스펙 중 일부로 웹 애플리케이션 서버에서 동작한다 .자바 서버 페이지는 실행시에는 자바 서블릿으로 변환된 후 실행되므로 서블릿과 거의 유사하다고 볼 수 있다 . 하지만 , 서블릿과는 HTML 표준에 따라 작성되므로 웹 디자인하기에 편리하다 . 이와 비슷한 구조인 것인 PHP, ASP, ASP.NET 등도 있다 .아파치 스트럿츠나 자카르타 프로젝트의 JSTL 등의 JSP 태그 라이브러리를 사용하는 경우에는 자바 코딩없이 태그만으로 간략히 기술이 가능하므로 생산성을 높일 수 있다 .클라이언트에서 서비스가 요청되면 , JSP 의 실행을 요구하고 , JSP 는 웹 애플리케이션 서버의 서블릿 컨테이너에서 서블릿 원시코드로 변환된다 . 그 후에 서블릿 원시코드는 바로 컴파일된 후 실행되어 결과를 HTML 형태로 클라이언트에 돌려준다 .

27

자바 문법

1.변수 1) 변수란 리터럴을 담는 그릇으로 리터럴 값에 따라 변수의 값이 변한다 . ex) int i = 0; // 선언 타입 (int) 변수명 (i) 대입연산자 (=) 리터럴 (0) 2) 변수의 선언과 초기화 ex) int i = 0; // 변수 타입 선언과 동시에 초기화 int i; // 변수 타입 선언 i = 0; // 초기화 int i,j,k = 0; // 여러개의 변수를 같은 리터럴 값으로 동시에 초기화 int i = 0, j = 1, k = 2; // 여러개의 변수 각각에 다른 리터럴 값을 동시에 초기화2. 리터럴이란 변수에 대입되는 상수 값3. 기본 Data Type 1) 논리형 : booolean(true, false) 2) 문자형 : char(16bit 유니코드 ) 3) 숫자형 : byte(8bit), short(16bit), int(32bit), long(64bit), float(32bit), double(64bit) ※ 참조형 (reference type) String : 문자열 4. 연산자 1) 대입연산자 : = 2) 산술연산자 : *, /, +, -, % - "+" 연산자 숫자와 문자열의 연산이 가능하다 . ex) 10 + 10 = 20, 10 + "10" = 1010 3) 산술대입연산자 : *=, /=, %=, +=, -= 4) 단항연산자 : ++, --, +( 부호 ), +( 부호 ) ※ 전위식 (++i) 은 모든 연산자중 가장 우선순위가 높다 . 후위식 (i++) 은 모든 연산자중 가장 우선순위가 낮다 .

5) 조건연산자 (삼항연산자 ) : ( 조건식 ) ? true 일때 값 : false 일때 값 6) 비교연산자 : >, >=, <, <=, == ,!= 7) 논리연산자 : !(not), &&(and), ||(or) *short circuit(단축평가 ) 8) 비트연산자 : ^, &, |, ~ 9) 쉬프트연산자 : <<, >>, >>>

ex) int a = 4; // a값은 4int b = a++ + 3; // b = 7, a = 5int c = a + b; // a = 5, b = 7, c = 12int d = ++a - b--; //a = 6, d = -1, b = 6int sum = ++a + b++; // a = 7, sum = 13, b = 7

28

자바 문법

5. 제어 문 1) if 문 ( 조건 문 ) - if 문 - if...else 문 - if...else if...else 문 2) switch 문 (선택 문 ) ex) switch( 수식 ) { // 기본 데이터 타입으로 결과 값이 나와야 한다 . case 0: // case 문에 올 수 있는 값은 정수나 상수뿐이다 . 실행 문 1; break; case 1: 실행 문 2; break; default: 실행 문 3; break; }

3) for 문 ( 반복 문 ) ex) for(int i=0(초기값 ); i<10( 조건 식 ); i++( 증감 값 )) { 실행 문 ; } 4) while 문 ( 반복 문 ) ex) while( 조건 식 ) { // true값일 동안에는 계속 실행 false값 일때 중지 .. 실행 문 ; } 5) do...while 문 ( 반복 문 ) ex) do { 실행 문 ; } while( 조건 식 ) // true값일 동안에는 계속 실행 false값 일때 중지 ..

29

자바 문법

6. 클래스 (Class) 1) 정의 - 객체 (Object) 의 속성 ( 상태 ) 과 동작 ( 기능 ) 을 캡슐화해 놓은 것이다 . 2) 구조 - 클래스명 , 맴버변수 (객체의 상태저장 ), 메서드 (객체의 동작정의 ), 생성자 (맴버변수를 특정값으로 초기화 ) ex) class 클래스명 { 맴버변수 선언문 ; ... 생성자 () { // 생성자의 이름은 클래스명과 동일하며 리턴타입이 없다 . 맴버변수를 특정값으로 초기화 ; } 리턴타입 메서드 (int i, int j....(매개변수 , 매개변수 ....)) { // 리턴값이 없을 경우 리턴타입은 void 로 한다 . // 매개변수가 있을 경우에만 사용한다 . 실행문 ; ... return i; ( 리턴문 ) // 리턴타입이 void 일 경우 리턴문을 사용하지 않는다 . } }

30

자바 문법

7. 접근자 1) public - 어디서든 접근해서 사용할 수 잇는 접근자 ex) public String msg = "public"; 2) private - 같은 클래스 내에서만 사용할 수 있는 접근자 ex) private String msg = "private"; 3) default - 같은 패키지 내의 클래스 접근가능 - 같은 패키지 안에 있는 그 클래스를 상속받은 클래스 접근가능 ex) String msg = "default"; // 타입앞의 접근자가 생략되어 있으면 그건 default 이다 . 4) protected - 자기 자신의 클래스 접근가능 - 같은 패키지 내의 클래스 접근가능 - 다른 패키지이더라도 그 클래스를 상속받은 클래스 접근가능 8. package - 여러 개의 클래스를 묶어놓은 것 ...패키지 명은 고유해야 한다 . ex) package 패키지 명 ; // 소스코드의 맨 처음에 존재해야 한다 .

31

자바 문법

9. import - 다른 패키지의 클래스를 사용할 수 있게 한다 . ex) import 패키지 명 .클래스 ; import 패키지 명 .*; // 패키지 명에 있는 모든 클래스를 사용할 수 있으나 // 패키지 안의 패키지까지 사용할 수는 없다 . - import 하지 않고 사용하는 방법 ex) class PackTest { public static void main(String[] args) { new pdw213.Base().printBase(); // pdw213 패키지의 Base클래스를 new연산자를 사용하여 객체를 만들어 // printlnBase() 메소드를 실행하라는 의미다 . } }

32

Collection

java.util. 컬렉션 프레임 워크프로그램을 작성한다는 것은 무엇일까 ?프로그램은 데이터를 일정한 규칙에 맞춰 가공하는 일련의 과정으로 볼 수 있다 . 물론 어떻게 가공하는 지도 중요하겠지만 데이터를 관리하기 위한 방법 역시 프로그램에서 중요한 요소이다 . 자바에서는 이런 데이터를 개발자가 쉽게 이용할 수 있도록 다양한 클래스 형태로 제공하는데 이들을 컬렉션 클래스 혹은 just 컬렉션이라 라고 부른다 . 프레임 워크란 ? -> 만들고자 하는 구조물의 기본골격 쓰이는 상황에 따라 다양한 의미를 가지는 용어로 어플리케이션 ( 자바 ) 프레임워크에서는 물리적인 실체이면서 반제품 성격의 구체적이고 체계화된 API 를 제공하는 개념 . 즉 , 자바 프레임 워크 = 라이브러리 (클래스 ) + 디자인 패턴 ( 가이드라인 )

자바 (Collection) framework컬렉션 프레임워크는 컬렉션 클래스을 쉽게 이해하고 사용하도록 다형성을 이용해서 컬렉션 객체의 메소드를 형태적으로 동일하게 유지함으로써 사용법을 일관되게 만든 디자인 패턴 ( 가이드라인 ) 이다 . ※ Map 인터페이스는 Collection 인터페이스를 직접 확장한 것은 아니지만 Map 도 컬렉션 프레임워크에 포함되는 것으로 간주한다 . 따라서 Map 도 그냥 컬렉션이라고 부른다 .1. 컬렉션 클래스 Data 의 관리를 위해서 예전에는 배열 혹은 구조체 (C 언어 ) 을 사용하였지만 자바에서는 발전된 형태인 배열을 사용하는데 이것이 바로 컬렉션 클래스 (Interface Collection 와 Map 으로 구현된 클래스를 가리킨다 .) 이다 .컬렉션은 배열의 크기를 동적으로 늘릴 수 없다는 단점을 보완해서 , 동적으로 필요할 때 메모리를 확장할 수 있게 만들었다 . 이러한 저장공간에 여러가지 자료구조적인 기능이 가미된 저장공간으로서 객체의 삽입 , 삭제 , 수정 , 검색의 기능을 가지고 있다 .

33

Interface Collection

Collection 인터페이스로부터 구현된 클래스들은 다음 그림과 같다 . 이 인터페이스의 기본적인 기능을 바탕으로 조금씩 확장되어 다양한 기능이 첨가된 클래스들을 제공된다 . 보통은 집합적인 데이터를 관리하기 위해서 사용된다 .Set , List , Map , SortedSet , SortedMap , HashSet , TreeSet , ArrayList , LinkedList , Vector , Collections , Arrays , AbstractCollection Collection 인터페이스를 구현한 클래스에서는 각각의 기능의 기능에 맞게 오버라이딩되어 있기 때문에 이들 메소들의 사용법을 잘 익혀두면 컬렉션 클래스를 보다 쉽게 사용할 수 있다 .Collection 인터페이스의 주요 메서드boolean add(E e) 요소를 추가void clear() 컬렉션의 모든 요소를 제거boolean isEmpty () 컬렉션에 요소가 없는 경우에 true 를 돌려줍니다 . boolean remove(Object o) 삭제int size() 이 컬렉션중의 요소의 수를 돌려줍니다 .

34

Interface Map

Map 인터페이스로 구현된 클래스는 다음 그림과 같다 . Collection 과 달리 Map 은 검색적인 개념을 담고 있는 인터페이스이다 . 검색을 위해서 각각의 데이터에 키를 함께 보유하게 된다 . Map 인터페이스는 검색적인 저장공간을 지원하기 위해서 사용하는 경우가 많다 .Collection 이나 Map 은 객체의 저장공간을 위한 기능적인 측면을 담당한다는 것은 동일하다 . 하지만 Collection 은 단순히 집합적인 개념의 저장소의 기능을 가지고 있으며 , Map 은 키를 이용한 검색적인 저장소의 기능을 가지고 있다는 것이 다르다 . 특별한 기능은 없다 . 데이터를 삽입하고 필요할 때 끄집어 낼 수 있으며 그것으로 끝이다 . 키 없이 단순히 데이터만을 넣어 두고자 할 때는 Collection 계열을 사용하면 된다 . 키를 사용해서 데이터를 빠르게 검색하기 위해서는 Map 계열을 사용하면 된다 .HashMap , TreeMap , Hashtable , SortedMap , Collection , Set Map 인터페이스의 메서드void clear()V get(Object key)V put(K key, V value)void putAll(Map<? extends K,? extends V> m)V remove(Object key)int size()

35

Java Collection 객체 비교표

인터페이스 클래스 동기화 성능속성

Set HashSet No 가장빠른 Set 이다 Hashmap 보다는 느리지만 Set 인터페이스를 구현하고 있다는 특징이 있다 (HashMap) 은 set 인터페이스를 구현하지 않는다 .

Set LinkedHashSet No 1.4 버전부터 제공 , LinkedHashMap 에 근간해서 작성되었으므로 삽입순서에 따라 배열요소에 접근한다 . TreeSet 보다 빠르다 .

Set TreeSet No HashSet 보다 느리다 . 키 순서에 따른 접근이 가능하다 .

Map IdentityHashMap No 1.4 버전부터 제공한다 . 동일성 (identity) 에 근간한 특별한 목적의 HashMap(==) 동등 (.equals 메소드 ) 대신의 개념이다 . 동일성개념을 사용할수 있는 경우 HashMap 보다 더 빠른 고성능 대응을 제공한다 .

Map HashTable Yes HashMap 보다는 느리다 하지만 동기화된 HashMap 보다는 빠르다 .

Map LinkedHashMap No 1.4 버전부터 제공한다 . 엔트리 순서에 있는 링크된 리스트를 유지하는 해시맵을 구현한다 . 엔트리 순서에 따른 키 접근이 가능하다 . TreeMap 보다는 빠르지만 다른 종류의 Map클래스보다는 느리다 .

Map TreeMap No HashTable 과 HashMap 보다 느리다 . 키를 순서대로 접근할 수 있다 .

List ArrayList No 가장 빠른 리스트이다 . 그러나 배열보다 느리다 .

List Vector Yes ArrayList 보다 느리지만 동기화된 ArrayList 보다는 빠르다 .

List Stack Yes Vector 와 동일한 속도를 제공하나 LIFO 큐 기능을 제공한다 .

List LinkedList No 다른 List 클래스들보다 느리다 . 그러나 몇 가지 형태의 큐에 있어서는 다른 클래스보다 더 빠르다 .

36

Exception

컴퓨터 시스템의 동작 도중 예기치 않았던 이상 상태가 발생하여 수행 중인 프로그램이 영향을 받는 것 . 예를 들면 , 연산 도중 넘침에 의해 발생한 끼어들기 등이 이에 해당한다 .ArithmeticExceptionArrayIndexOutOfBoundsException NullPointerExceptionRuntimeExceptionIllegalArgumentExceptionNumberFormatException ClassNotFoundExceptionIOExceptionSQLExceptionDOMException

37

Exception 예제

String[] str = {"서울 "," 경기도 "," 경상도 ","전라도 ","강원도 ","충청도 ","제주도 "};try{

out.write(str[10]);}catch(Exception e){ }

int k = 100, i = 0;int j;try{

j = k / i;}catch(Exception e){ }

String str = null;try{

if(str.equals("")) out.write("str 은 값이 없습니다 .");}catch(Exception e){ }

String str = "sdf";int k;try{

k = Integer.parseInt(str);}catch(Exception e){ }

38

용어

JNDI(Java Naming and Directory Interface)디렉터리 서비스에서 제공하는 데이터 및 객체를 발견 (discover) 하고 참고 (lookup) 하기 위한 자바 API 다 .

connection pool 데이터베이스 메모리 내에 있는 데이터베이스 연결들로 된 하나의 캐시 . 데이터베이스 연결들은 데이터에 대한 요청이 발생하면 재사용되는 것으로 , 데이터베이스의 수행 능력을 향상시키기 위해 사용된다 . 연결 풀에서 하나의 연결이 생성되어 풀에 배치되면 새로운 연결이 만들어지지 않도록 재사용하지만 만약에 모든 연결이 사용 중에 있으면 새로운 연결이 만들어져 풀에 추가된다 . 연결 풀은 사용자가 데이터베이스 연결을 위해 기다리는 시간을 축소시키기도 한다 .

JDBC자바 프로그램 안에서 SQL 을 실행하기 위해 데이터베이스를 연결해주는 응용프로그램 인터페이스를 말한다 .C:\Tomcat 6.0\lib\ojdbc14.jar* mysql-connector-java-5.1.13-bin.jar

DBCPC:\Tomcat 6.0\libcommons-pool-1.5.4.jarcommons-dbcp-1.4.jarcommons-collections-3.2.1.jar

[source]Context init = new InitialContext();DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/xe");Connection conn = ds.getConnection();

39

Tomcat 6 설정

C:\Tomcat 6.0\conf\context.xml<Context>

<WatchedResource>WEB-INF/web.xml</WatchedResource><!-- 추가 --><ResourceLink name="jdbc/xe" global="jdbc/xe" type="javax.sql.DataSource"/>

</Context>

C:\Tomcat 6.0\conf\serverxml<GlobalNamingResources>

<!-- 추가 --><Resource name="jdbc/xe" auth="Container" type="javax.sql.DataSource" maxActive="10" maxIdle="5" maxWait="10000" username="scott" password="tiger" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:XE"/>

</GlobalNamingResources>

WEB-INF/web.xml<!-- Datasource --> <resource-ref><description>DB Connection</description><res-ref-name>jdbc/xe</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>

40

TIP

#PCDATA 와 CDATA 의 차이점PCDATA 는 Parsed Character DATA 의 약자로서 XML 파서 ( 해석기 ) 가 해석하는 문자 데이터를 말합니다 . 해석을 한다라는 말은 문자 데이터 안에 XML 권고안에 규정되어 있는 문자로 쓰여 졌는지 조사하고 , 또한 엔티티 참조가 있다면 엔티티 참조에 해당하는 값으로 치환하는 작업을 의미합니다 .

이와 같이 PCDATA 는 XML 파서가 해석하는데 반해 CDATA 섹션내의 문자 데이터는 XML 파서가 해석하지 않고 바로 응용프로그램으로 전달됩니다 .그래서 문자 데이터로 사용할 수 없는 < 문자나 & 문자도 CDATA 섹션 내에서는 마음대로 사용할 수 있으며 공백문자의 길이도 보존 됩니다 .

41

JSP / JNDI / JDBC / List / Map source sample - 1

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%><%@page import="java.sql.*"%><%@page import="javax.naming.*"%><%@page import="javax.sql.*"%><%@page import="java.util.List,java.util.ArrayList,java.util.Map,java.util.HashMap"%><%!

public Connection getConnection() throws Exception{Connection conn = null;String curr_dt = "";try{

Context init = new InitialContext();Context envCtx = (Context)init.lookup("java:comp/env");DataSource ds = (DataSource)envCtx.lookup("jdbc/xe");//DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/xe");conn = ds.getConnection();

}catch(Exception e){throw e;

}return conn;

}%>

* 대신 클래스 명을 다 쓰는 습관을 들인다

JNDI한 줄로 소스를 줄이는 것과 동일하다 .

42

JSP / JNDI / JDBC / List / Map source sample - 2

<%Statement stmt = null;ResultSet rs = null;Connection conn = null;StringBuffer sb = new StringBuffer();List<Map<String,String>> dataList = null;Map<String,String> data = null;try{

conn = getConnection();

if(conn != null){stmt = conn.createStatement();sb.append("select a.empno,");sb.append("a.ename,");sb.append("a.job,");sb.append("a.mgr,");sb.append("to_char(a.hiredate,'yyyy-mm-dd') hiredate,");sb.append("a.sal,");sb.append("a.comm,");sb.append("a.deptno ");sb.append("from emp a");rs = stmt.executeQuery(sb.toString());

String 대신 StringBuffer 사용

43

JSP / JNDI / JDBC / List / Map source sample - 3

if(rs.next()){dataList = new ArrayList<Map<String,String>>();do{

data = new HashMap<String,String>();data.put("empno",rs.getString("empno"));data.put("ename",rs.getString("ename"));data.put("job",rs.getString("job"));data.put("mgr",rs.getString("mgr"));data.put("hiredate",rs.getString("hiredate"));data.put("sal",rs.getString("sal"));data.put("comm",rs.getString("comm"));data.put("deptno",rs.getString("deptno"));dataList.add(data);

}while(rs.next());}

}}catch(Exception e){

out.write(e.toString());}finally{

if(stmt != null) stmt.close();if(conn != null) conn.close();

}

%>

Statement, Connection 반드시 닫는다 .

44

JSP / JNDI / JDBC / List / Map source sample - 4

<html><head><meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"><title>Collection Sample</title><style>td {font-family: "돋움 ", "맑은 고딕 ","Malgun Ghothic","Verdana", 돋움체 ;font-size: 12px; margin:0px 0 0 0px ;line-height: 18px;}</style></head><body>

<table width="700" border="0" cellspacing="1" cellpadding="2" bgcolor="#bebebe"><tr bgcolor="#ebebeb" align="center">

<td>empno</td><td>ename</td><td>job</td><td>mgr</td><td>hiredate</td><td>sal</td><td>comm</td><td>deptno</td>

</tr><%if(dataList != null && dataList.size() > 0){

int l = dataList.size();for(int k=0;k<l;k++){

data = dataList.get(k);%>

45

JSP / JNDI / JDBC / List / Map source sample – 5 end

<tr bgcolor="#FFFFFF"><td><%=data.get("empno") %></td><td><%=data.get("ename") %></td><td><%=data.get("job") %></td><td><%=data.get("mgr") %></td><td><%=data.get("hiredate") %></td><td><%=data.get("sal") %></td><td><%=data.get("comm") %></td><td><%=data.get("deptno") %></td>

</tr><%

}}

%></table>

</body></html>

46

배열

선언String[] str = new String[2]; str[0] = “a”; str[1] = “b”;String[] str = {“a”,”b”};

int[] k = new int[2]; k[0] = 10; k[1] = 20;int[] k = {1,2};

String str = "월 , 화 , 수 ,목 ,금 , 토 , 일 ";String[] arr = str.split(",");arr[0] 월 ... arr[6] 일

2 차 배열int[][] k = int[2][3];

for(int h=0;h<2;h++){for(int j=0;j<3;j++){

out.write(k[h][j]);}

}

k[0][0] k[0][1] k[0][2]

k[1][0] k[1][1] k[1][2]

47

과제

1. day8 폴더에 jsp 를 exam2-개발자이니셜 .jsp 생성하시고 작성하십시오 .화면에 보기와 같이 출력하세요 .2* 1 = 22 * 2 = 4..9 * 9 = 81

2. day8 폴더에 jsp 를 exam3-개발자이니셜 .jsp 생성하시고 작성하십시오 .보기 문자열을 수정하시고 출력하세요 .( 공백제거 , 쉼표 (,) 를 dot(.)변경 , 소문자로 변경 , $를 @ 로변경 , co.kr 를 com 으로 변경 )[ 보기 ]fish_73@naver .comlemon294@naver,comIGHTSHIFT@NAVER.COMhana307$naver.comelsiud@naver.co.kr

3. day8 폴더에 jsp 를 exam4-개발자이니셜 .jsp 생성하시고 작성하십시오 .( 주의사항 핸드폰 길이 , 2차배열 사용 , 빈값제거String[] split(String regex) String toLowerCase() String trim()

[ 보기 ]홍길동 ,0101239898|심청 ,01887682343|장동건 ,01123218879|이명박 ,0176549821|,|조영주 ,01091670928[결과 ]홍길동 (010-123-9898)..

48

과제 - 회원가입처리

회원가입테이블 정보 NAME VARCHAR2(10) NOT NULL, ID VARCHAR2(10) NOT NULL, PWD VARCHAR2(10) NOT NULL, REGNO VARCHAR2(13) NULL, SEX CHAR(1) DEFAULT 'M' NULL, EMAIL VARCHAR2(50) NULL, PHONE VARCHAR2(14) NULL, INPUT_ID VARCHAR2(10) NULL, INPUT_DT DATE DEFAULT sysdate NULL

등록 쿼리 문insert into skb_user ( name,id,pwd,regno,sex,email,phone,input_id,input_dt) values (?,?,?,?,?,?,?,?,sysdate)

sex : 남자는 M 여자는 W 입력phone : 010-123-3456 하이픈 (-) 구분하여 등록input_id : 본인 이니셜 입력ID PRIMARY KEY

조회 쿼리 문select name,id,pwd,regno, decode(sex,'M','남자 ','W',' 여자 ','') sex, email,phone,input_id, to_char(input_dt,'yyyy-mm-dd') input_dt from skb_user

49

Oracle Query - Data Type(1)

오라클 데이터 타입- 관계형 데이터베이스에서 제공하는 데이터 타입은 대개 CHAR, VARCAHR2, NUMBER, DATE, LONG, RAW, LONG RAW, ROWID 타입으로 분류한다 .- 원하는 정보를 가장 효율적으로 처리하기 위해서 적절한 데이터 타입의 선정이 필요 하다 .- 적절하지 못한 데이터 타입은의 선정은 수행속도를 나쁘게 하고 불필요한 자원을 낭비를 가져온다 .

VARCHAR2 타입- 가변길이 문자형 데이터 타입 - 최대 길이 : 2000 바이트 ( 반드시 길이 지정 ) - 다른 타입에 비해 제한이 적다 - 일부만 입력시 뒷부분은 NULL - 입력한 값의 뒷부분에 있는 BLANK도 같이 입력 - 전혀 값을 주지 않으면 NULL 상태 입력 - 지정된 길이보다 길면 입력시 에러 발생 - 컬럼 길이의 편차가 심한 경우 , NULL 로 입력되는 경우가 많은 경우 VARCHAR2 사용

NUMBER 타입- 숫자형 데이타 타입 , 음수 , ZERO, 양수 저장 - 전체 자리수는 38자리를 넘을 수 없다 - 소수점이 지정되지 않았을 때 소수점이 입력되거나 , 지정된 소수점자리 이상 입력되면 반올림되어 저장 - 지정한 정수 자리수 이상 입력시 에러 발생 - 연산이 필요한 컬럼은 NUMBER 타입으로 지정한다 . - NUMBER(p,s) 로 지정시 p 는 s 의 자리수를 포함한 길이므로 감안하여 P 의 자리수를 결정 - NUMBER 타입은 항상 가변길이므로 충분하게 지정할 것

50

Oracle Query - Data Type(2)

DATE 타입- 일자와 시간을 저장하는 날짜형 타입 - 일자나 시간의 연산이 빈번한 경우 사용 - 포함정보 : 세기 , 년도 , 월 , 일 , 시간 , 분 , 초 - NLS_DATE_FORMAT 을 이용하여 국가별 특수성을 해결 - 특별히 시간을 지정하지 않으면 00:00:00로 입력 됨 . 특별히 일자를 지정하지 않았다면 현재월의 1일로 지정 됨 - SYSDATE 는 현재일과 시간을 제공 LONG 타입- 2기가 바이트의 가변길이 문자 저장 - VARCHAR2와 유사한 특징을 가지나 아래와 같은 제한사항이 있다 . * 하나의 테이블에 하나의 LONG 타입만 사용 가능 * (NOT) NULL 을 제외한 다른 제약 조건은 지정할 수 없다 * 인덱스를 만들 수 없다 * PROCEDURE 나 Stored FUNCTION 에서 LONG 타입의 변수를 받을 수 없다 * Stored FUNCTION 은 LONG 타입 출력불가 * SELECT 문 내에서 WHERE, GROUP BY, ORDER BY, CONNECT BY, DISTINCT불가 * SQL Function(SUBSTR,REPLACE,..) 사용 불가 * CREATE TABLE .. AS SELECT.. 사용불가 RAW, LONG RAW, ROWID 타입- 그래픽 IMAGE 나 디지탈 SOUND를 저장 - HEXA-DECIMAL 형태로 RETURN - RAW는 VARCHAR2와 유사 - LONG RAW는 LONG과 유사하나 아래와 같은 제한사항이 있다 . * 저장과 추출만 가능하고 , DATA 를 가공할 수 없다 . * LONG RAW는 LONG과 같은 제한 사항을 같는다 .

51

Oracle Query - Data Type(3)

LOB, LONG, LONG RAW 데이터 타입의 비교- 테이블의 한 ROW에 여러 LOB 컬럼이 있을 수 있는 반면 , LONG 또는 LONG RAW 컬럼은 한 ROW에 하나 밖에 사용될 수 없다 .- LOB는 사용자 정의 데이터 타입 (user-defined datatype) 의 속성 (attribute) 으로 사용 될 수 있는 반면 , LONG이나 LONG RAW

는 속성으로 사용될 수 없다 .- LONG 또는 LONG RAW는 값 전체가 테이블 내에 저장이 되는 반면 , LOB는 테이블 컬럼내에 LOB locator만 저장이된다 . BLOB과 CLOB ( 내부 LOB) 데이터는 별도의 테이블스페이스에 저장시킬 수 있으며 , BFILE (외부 LOB) 데이터는 데이터베이스 외부의 별도 파일로 존재한다 . 따라서 LOB 컬럼을 액세스할 경우에는 , locator 값만 return 되는 반면 , LONG이나 LONG RAW 컬럼을 액세스할 경우에는 , 전체 값이 return 된다 .- LOB 데이터는 4GB까지 저장이 가능하며 , BFILE 컬럼이 가리키는 파일 크기는 4GB 이내에서 OS 에서 지원하는 최대

크기까지 가능하다 . 한편 LONG이나 LONG RAW 데이터 타입에서는 2GB 까지만 지원이 가능하다 .- 데이터에 대한 랜덤 액세스 기능 또는 데이터 조작을 할 경우 LOB를 사용하는 것이 LONG 또는 LONG RAW를 사용하는 것에

비해 훨씬 많은 기능을 사용할 수 있다 .- LOB는 랜덤 액세스가 가능한 반면 , LONG 타입에 저장된 데이터는 처음부터 원하는지점까지 순차적으로 읽어 처리하여야 한다 .- LOB 데이터에 대한 replication 을 local 또는 remote 에서 수행할 수 있는 반면 , LONG / LONG RAW 컬럼 데이터는 replication

이 되지 않는다 .LONG 컬럼의 데이터는 TO_LOB() 라는 함수를 사용하여 LOB으로 변환 가능하지만 , LOB을 LONG / LONG RAW로 변환 하는

기능은 제공되지 않는다 .

LOB 데이터 타입의 제약 사항- LOB는 클러스터 테이블에서는 사용할 수 없으며 , 따라서 클러스터 키로도 사용할 수 없다 .- LOB 컬럼은 GROUP BY, ORDER BY, SELECT DISTINCT 등에 사용할 수 없으며 JOIN 에도 사용할 수 없다 .- LOB 컬럼은 ANALYZE ... COMPUTE/ESTIMATE STATISTICS 명령 사용 시에도 Analyze 되지 않는다 .- LOB는 파티션된 IOT (Index Organized Table) 에는 사용할 수 없다 . 그러나 파티션 되어 있지 않은 IOT 에는 사용할 수 있다 .- LOB는 VARRAY에는 사용할 수 없다 .NCLOB은 OBJECT TYPE 의 속성 (attribute) 으로 사용될 수 없으나 , 메소드 정의를 하는 데는 NCLOB 파라미터를 사용할 수 있다 .

52

Oracle Query – 제약조건 (1)

제약조건 (Constraint) 이란 ?제약조건이란 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해서 여러 가지 규칙을 적용해 놓는거라 생각하면 된다 . 간단하게 테이블안에서 테이터의 성격을 정의하는 것이 바로 제약조건 이다 .- 제약조건은 데이터의 무결성 유지를 위하여 사용자가 지정할 수 있는 성질 이다 . - 모든 제약조건은 데이터 사전 (DICTIONARY) 에 저장 된다 . - 의미있는 이름을 부여했다면 CONSTRAINT 를 쉽게 참조할 수 있다 . - 표준 객체 명명법을 따르는 것이 좋다 . - 제약조건은 테이블을 생성할 당시에 지정할 수도 있고 , 테이블 생성 후 구조변경 (ALTER) 명령어를 통해서도 추가가 가능하다 . NOT NULL 제약조건은 반드시 컬럼 레벨에서만 정의가 가능하다 .

NOT NULL 조건컬럼을 필수 필드화 시킬 때 사용 한다 .-- NOT NULL 제약조건을 설정하면 ename 컬럼에는 꼭 데이터를 입력해야 한다 .-- emp_nn_ename 을 제약조건 명으로 설정 하였다 .SQL> CREATE TABLE emp( ename VARCHAR2(20) CONSTRAINT emp_nn_ename NOT NULL ); -- 제약조건은 USER_CONSTRAINTS 뷰를 통해서 확인 할 수 있다 .SQL> SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME ='EMP' ;-----------------------emp_nn_ename

53

Oracle Query – 제약조건 (2)

UNIQUE 조건데이터의 유일성을 보장 (중복되는 데이터가 존재할수 없다 ) 되고 , 자동으로 인덱스가 생성 된다 .-- deptno 컬럼에 UNIQUE 제약조건 생성SQL> ALTER TABLE emp ADD CONSTRAINT emp_uk_deptno UNIQUE (deptno);-- 제약 조건의 삭제SQL> ALTER TABLE emp DROP CONSTRAINT emp_uk_deptno;

CHECK 조건컬럼의 값을 어떤 특정 범위로 제한할 수 있다 .-- comm 컬럼에 1에서 100까지의 값만을 가질수 있는 체크조건 생성SQL> ALTER TABLE emp ADD CONSTRAINT emp_ck_comm CHECK (comm >= 1 AND comm <= 100);

-- 제약 조건의 삭제SQL> ALTER TABLE emp DROP CONSTRAINT emp_ck_comm;

-- 10000,20000,30000,40000,50000의 값만을 가질수 있는 체크조건 생성SQL> ALTER TABLE emp ADD CONSTRAINT emp_ck_comm CHECK comm IN (10000,20000,30000,40000,50000);

54

Oracle Query – 제약조건 (3)

DEFAULT(컬럼 기본값 ) 지정데이터를 입력 하지 않아도 지정된 값이 기본으로 입력 된다 .-- hiredate 컬럼에 값을 입력하지 않아도 오늘 날짜가 입력된다 .SQL> CREATE TABLE emp( ... (컬럼생략 ) ..., hiredate DATE DEFAULT SYSDATE );

PRIMARY KEY 지정- 기본키는 UNIQUE 와 NOT NULL 의 결합과 같다 . - 기본키는 그 데이터 행을 대표하는 컬럼으로서의 역할을 수행하여 다른 테이블에서 외래키들이 참조할 수 있는 키로서의 자격을

가지고 있다 . 이를 참조 무결성이라 한다 . - UNIQUE 조건과 마찬가지로 기본키를 정의하면 자동으로 인덱스를 생성하며 , 그 이름은 기본 키 제약 조건의 이름과 같다 . - INDEX: 검색 키로서 검색 속도를 향상 시킨다 .(UNIQUE,PRIMARY KEY 생성시 자동적으로 생긴다 .) -- PRIMARY KEY 생성 예제SQL> CREATE TABLE emp( empno NUMBER CONSTRAINT emp_pk_empno PRIMARY KEY );

FOREIGN KEY(외래 키 ) 지정- 기본키를 참조하는 컬럼 또는 컬럼들의 집합이다 . - 외래키를 가지는 컬럼의 데이터 형은 외래키가 참조하는 기본키의 컬럼과 데이터형과 일치해야 한다 . 이를 어기면 참조무결성

제약에의해 테이블을 생성할수 없다 . - 외래키에 의해 참조되고 있는 기본 키는 삭제 할 수 없다 . - ON DELETE CASCADE 연산자와 함께 정의된 외래키의 데이터는 그 기본키가 삭제 될 때 같이 삭제 된다 . -- emp 테이블의 deptno 컬럼이 dept 테이블에 deptno 컬럼을 참조하는 외래키 생성SQL> ALTER TABLE emp ADD CONSTRAINT emp_fk_deptno FOREIGN KEY (deptno) REFERENCES dept(deptno);

55

Oracle Query – select(1)

SELECT 문 및 연산자

SELECT [distinct] { *, column [alias], . . .}FROM table_name[WHERE condition][ORDER BY {column, expression} [ASC | DESC] ];

- DISTINCT : 중복되는 행을 제거하는 옵션 . - * : 테이블의 모든 column 을 출력 . - alias : 해당 column 에 대해서 다른 이름을 부여할 때 사용 . - table_name : 질의 대상 테이블 명 - WHERE : 조건을 만족하는 행들 만 검색 - condition : column, 표현식 , 상수 및 비교 연산자 - ORDER BY : 질의 결과 정렬을 위한 옵션 (ASC:오름차순 (Default), DESC 내림차순 )

SQL 문의 작성 방법- SQL 문장은 대소문자를 구별하지 않는다 . - SQL 문장은 한 줄 또는 여러 줄에 입력될 수 있다 . - 일반적으로 키워드는 대문자로 입력한다 . 다른 모든 단어 , 즉 테이블 이름 , 열 이름은 소문자로 입력한다 .( 권장 ) - 가장 최근의 명령어 한 개가 SQL buffer 에 저장 된다 . - SQL 문 마지막 절의 끝에 ";" 를 기술하여 명령의 끝을 표시 한다 .

-- empno 와 ename 은 각각 사번과 성명이라는 컬럼 별칭 (alias) 으로 만들어 출력-- alias 를 사용할 때 as 라는 키워드를 사용해도 되고 , 생략 할 수도 있다 .SQL> SELECT empno 사번 , ename 성명 FROM emp WHERE deptno = 10

사번 성명---------- --------------- 7782 CLARK 7839 KING 7934 MILLER

56

Oracle Query – select(2)

WHERE 절에 사용될 수 있는 SELECT 연산자

연산자 설 명 BETWEEN a AND b a 와 b 사이의 데이터를 출력 .(a, b 값 포함 )

IN (list) list 의 값 중 어느 하나와 일치하는 데이터를 출력

LIKE 문자 형태로 일치하는 데이터를 출력 (%, _ 사용 )

IS NULL NULL 값을 가진 데이터를 출력 합니다 .

NOT BETWEEN a AND b a 와 b 사이에 있지않은 데이터를 출력 (a, b값 포함하지 않음 )

NOT IN (list) list 의 값과 일치하지 않는 데이터를 출력

NOT LIKE 문자 형태와 일치하지 않는 데이터를 출력

IS NOT NULL NULL 값을 갖지 않는 데이터를 출력

구 분 설 명

LIKE 'A%' 'A' 로 시작하는 데이터만 검색

LIKE '%A' 'A' 로 끝나는 테이터들만 검색

LIKE '%KIM%' 'KIM' 문자가 있는 데이터 들만 검색

LIKE '%K%I%' 'K' 문자와 'I' 문자가 있는 데이터 들만 검색

LIKE '_A%' 'A' 문자가 두 번째 위치한 데이터 들만 검색

LIKE 연산자

57

Oracle Query – Alias

테이블 예명 (Alias)- 테이블 Alias 로 column 을 단순 , 명확히 할 수 있다 . - 현재의 SELECT 문장에 대해서만 유효하다 . - 테이블 Alias 는 길이가 30자 까지 가능하나 짧을수록 더욱 좋다 . - 테이블 Alias 는 의미가 있어야 한다 . - FROM 절에 테이블 Alias 설정시 해당 테이블 Alias 는 SELECT 문장에서 테이블 이름 대신에 사용 한다 . -- 사원수가 3 명이 넘는 부서의 부서명과 사원수 조회SQL> SELECT a.dname, b.cnt FROM dept a, (SELECT deptno, COUNT(empno) cnt FROM emp GROUP BY deptno) b WHERE a.deptno = b.deptno AND b.cnt > 3

위 쿼리에선 총 3 개의 Alias 가 사용되었다 . 첫 번째로 dept테이블을 a 라는 예명으로 두 번째로 부서의 사원수인 COUNT(empno) 를 cnt 라는 예명으로 세 번째로 부서별 사원수를 가져오는 쿼리를 b 라는 예명을 사용했다

위 예제와 같이 예명은 컬럼에만 주는 것이 아니라 . 쿼리 문 및 테이블에도 사용할 수 있다 .

DNAME CNT----------------- ----------RESEARCH 5SALES 6

58

Oracle Query – insert

INSERTINSERT 명령어는 테이블 안에 데이터를 삽입하는 역할을 한다 .

- 실제 데이터는 VALUES 괄호 () 안에 입력하고 문자열은 단일 따옴표 (' ') 로 둘러싼다 . - 각각의 테이터 구분은 ","로 한다 . - 테이블 이름 옆에 ()생략시에는 자동으로 모든 컬럼을 VALUES() 안에 입력 시킨다 .

-- 모든 데이터를 입력할 경우SQL> INSERT INTO emp VALUES(7369, 'SMITH', 'CLERK', 7902, TO_DATE('80/12/17'), 800, NULL, 20);

-- 원하는 데이터만 입력할 경우SQL> INSERT INTO dept (deptno, dname) VALUES(10, 'ACCOUNTING' );

-- SELECT 문장을 이용한 INSERTSQL> INSERT INTO dept2 SELECT * FROM dept;

INSERT INTO table_name(column1,column2, ...)VALUE ( 데이터 ,' 데이터 ', ... );

INSERT INTO table_name(column1,column2, ...)SELECT column1,column2, ...FROM table_nameWHERE 조건 ;

59

Oracle Query –update

UPDATE테이블 안의 데이터를 수정 한다 .

-- 사원번호가 7902 번인 사원의 부서 번호를 30으로 수정SQL> UPDATE emp SET deptno = 30 WHERE empno = 7902;

-- 부서번호 20의 사원들 급여가 10% 인상됨SQL> UPDATE emp SET sal = sal * 1.1 WHERE deptno = 20;

-- 모든 사원의 입사일을 오늘로 수정SQL> UPDATE emp SET hiredate = SYSDATE

UPDATE table_nameSET column1= 값 ( 고칠내용 ), column2=값 , ...where 조건

60

Oracle Query – delete

DELETE사용하지 않는 데이터를 삭제 한다 .

-- 사원번호가 7902 번인 사원의 데이터를 삭제 . SQL> DELETE FROM emp WHERE empno = 7902 ;

-- 평균급여보다 적게 받는 사원 삭제SQL> DELETE FROM emp WHERE sal < (SELECT AVG(sal) FROM emp); -- 모든 행이 삭제SQL> DELETE FROM emp;

DELETE FROM table_name WHERE 조건 ;

61

Oracle Query – Join

조인 (Join) 이란 ?- 둘 이상의 테이블을 연결하여 데이터를 검색하는 방법 이다 . - 보통 둘 이상의 행들의 공통된 값 Primary Key 및 Foreign Key 값을 사용하여 조인 한다 . - 그러므로 두 개의 테이블을 SELECT 문장 안에서 조인 하려면 적어도 하나의 컬럼이 그 두 테이블 사이에서 공유 되어야 한다 .

조인 방법- Equi Join(동등 조인 , 내부조인 ) - Non-equi Join - Outer Join - Self Join

Cartesian Product( 카티션 곱 ) - 검색하고자 했던 데이터뿐 아니라 조인에 사용된 테이블들의 모든 데이터가 반환 되는 현상 - Cartesian Product 는 다음과 같은 경우에 발생 한다 . * 조인 조건을 정의하지 않았을 경우 * 조인 조건이 잘못된 경우 * 첫 번째 테이블의 모든 행들이 두 번째 테이블의 모든 행과 조인이 되는 경우 * 테이블의 개수가 N 이라면 Cartesian Product 를 피하기 위해서는 적어도 N-1개의 등가 조건을 SELECT 문안에 포함시켜서

다른 테이블 안에 있는 각 테이블의 컬럼이 적어도 한번은 참조되도록 해야 한다 .

62

Oracle Query – Join(1)

Equi Join - 조건절 Equality Condition(=) 에 의하여 조인이 이루 진다 . - Equi join 의 성능을 높이기 위해서는 Index 기능을 사용하는 것이 좋다 .

Non-Equi Join - Non-equi Join 은 테이블의 어떤 column 도 Join 할 테이블의 column 에 일치하지 않을 때 사용하고 , 조인조건은 동등 ( = )

이외의 연산자를 갖는다 . - BETWEEN AND, IS NULL, IS NOT NULL, IN, NOT IN

Self Join - Equi Join 과 같으나 하나의 테이블에서 조인이 일어나는 것이 다르다 . - 같은 테이블에 대해 두 개의 alias 를 사용하여 FROM 절에 두 개의 테이블을 사용하는 것 처럼 조인한다 .

-- Non-Equi Join 예제 SQL> SELECT e.ename,e.sal,s.grade FROM emp e, salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;

-- 사원의 매니저명을 조회하는 Self Join 예제SQL> SELECT e.ename, a.ename "Manager" FROM emp e, emp a WHERE e.empno = a.mgr;

-- WHERE 절에 조인 조건을 작성한다 .SQL> SELECT e.ename, d.dname FROM emp e , dept d WHERE e.deptno = d.deptno;

63

Oracle Query – Join(2)

Outer(외부 ) Join- Equi Join 문장들의 한 가지 제약점은 그것들이 조인을 생성하려 하는 두 개의 테이블의 두 개 컬럼에서 공통된 값이 없다면

테이블로부터 테이터를 반환하지 못하는 것이다 . - 정상적으로 조인 조건을 만족하지 못하는 행들을 보기위해 Outer Join 을 사용 한다 . Outer Join 연산자는 "(+)" 이다 . - 조인시킬 값이 없는 조인측에 "(+)"를 위치 시킨다 . - Outer Join 연산자는 표현식의 한 편에만 올 수 있다 .

Outer Join 예제-- 예제 1) 일반 조인의 경우SQL> SELECT DISTINCT(a.deptno), b.deptno FROM emp a, dept b WHERE a.deptno = b.deptno

-- 예제 2) Outer Join 을 했을 경우SQL> SELECT DISTINCT(a.deptno), b.deptno FROM emp a, dept b WHERE a.deptno(+) = b.deptno

DEPTNO DEPTNO------ ---------- 10 10 20 20 30 30

DEPTNO DEPTNO ------- -------- 10 10 20 20 30 30 40

64

Oracle Query – Join(3)

-- 다음의 쿼리를 한번 잘 살펴보기 바란다 .SQL> SELECT DISTINCT(a.deptno), b.deptno FROM emp a, dept b WHERE a.deptno(+) = b.deptno AND a.ename LIKE '%';

-- 쿼리 결과를 잘 보면 Outer Join 이 되지 않은 것을 알 수 있다 .-- 위 쿼리를 Outer Join 시키기 위해서는 아래와 같이 고쳐야 한다 .SQL> SELECT DISTINCT(a.deptno), b.deptno FROM emp a, dept b WHERE a.deptno(+) = b.deptno AND a.ename(+) LIKE '%'

-- Outer Join 조건이 걸려있는 테이블에는 다른 조건절이 들어와도-- 똑같이 Outer Join 연산자인 (+) 를 해주어야 한다 .

DEPTNO DEPTNO---------- ---------- 10 10 20 20 30 30 40

DEPTNO DEPTNO---------- ---------- 10 10 20 20 30 30

65

Oracle Query – Join(4)

표준 Outer Join Oracle9i 부터는 ANSI/ISO SQL 표준인 LEFT OUTER JOIN , RIGHT OUTER JOIN, FULL OUTER JOIN 를 지원 한다 .LEFT OUTER JOIN 과 RIGHT OUTER JOIN 의 테이블 순서를 바꾸어 가면서 테스트를 하시면 쉽게 이해를 할 수 있다 .

LEFT OUTER JOIN오른쪽 테이블 ( 아래 예제에서 emp 테이블 ) 에 조인시킬 컬럽의 값이 없는 경우 사용한다 .SQL> SELECT DISTINCT(e.deptno), d.deptno FROM dept d LEFT OUTER JOIN emp e ON d.deptno = e.deptno; RIGHT OUTER JOIN 왼쪽 테이블 ( 아래 예제에서 emp 테이블 ) 에 조인시킬 컬럽의 값이 없는 경우 사용한다 .SQL> SELECT DISTINCT(e.deptno), d.deptno FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno; FULL OUTER JOIN 양쪽 테이블에 다 Outer Join 을 거는것을 TWO-WAY OUTER JOIN 또는 FULL OUTER JOIN 이라 한다 . SQL>SELECT DISTINCT(a.deptno), b.deptno FROM emp a FULL OUTER JOIN dept b ON a.deptno = b.deptno;

66

Oracle Query – Join(5)

CROSS JOINCartesian Product 값을 얻을때 사용 한다 . -- 아래 SQL 문장을 실행해 보자 SQL> SELECT ename FROM emp CROSS JOIN dept

INNER JOIN- 일반 조인시 ,(콤마 ) 를 생략하고 INNER JOIN 을 추가하고 , WHERE 절 대신 ON 절을 사용하면 된다 . - INNER 는 생략 가능 하다 . - 아래 두 조인의 결과 값은 같다 . -- INNER JOIN 을 사용한 문장SQL> SELECT e.empno, e.ename FROM dept d INNER JOIN emp e ON d.deptno=e.deptno; -- 일반적인 SQL 문장SQL> SELECT e.empno, e.ename FROM dept d , emp e WHERE d.deptno=e.deptno;

67

Oracle Query – Join(6)

NATURAL JOIN - Equi Join 과 동일 하다고 보면 된다 . - 두 테이블의 동일한 이름을 가지는 칼럼은 모두 조인이 된다 . - 동일한 컬럼을 내부적으로 찾게 되므로 테이블 Alias 를 주면 오류가 발생 한다 . - 동일한 컬럼이 두개 이상일 경우 JOIN~USING 문장으로 조인되는 컬럼을 제어 할 수 있다 . - 아래 두 조인의 결과 값은 같다 . -- NATURAL JOIN 을 사용한 SQL 문장 .SQL> SELECT empno, ename, deptno FROM emp NATURAL JOIN dept

-- 일반적인 SQL 문장SQL> SELECT e.empno, e.ename, d.deptno FROM emp e, dept d WHERE e.deptno=d.deptno

JOIN ~ USING - NATURAL JOIN 의 단점은 동일한 이름을 가지는 칼럼은 모두 조인이 되는데 , USING 문을 사용하면 컬럼을 선택해서 조인을 할

수가 있다 . - USING절 안에 포함되는 컬럼에 Alias 를 지정하면 오류가 발생 한다 . -- 일반적인 사용 방법SQL> SELECT e.empno, e.ename, deptno FROM emp e JOIN dept d USING(deptno)

68

Oracle Query – Join(6)

ON 구문- 조인 조건을 지정 할 수 있다 . - 모든 논리 연산 및 서브쿼리를 지정할 수 있다 . -- 테스트를 위해 scott 유저에서 아래 insert 문장을 실행시킨다 .SQL> INSERT INTO bonus(ename, job, sal) VALUES('SMITH','CLERK',500); -- ON 절 사용 예제 (multi-table joins)SQL> SELECT e.empno, e.ename, e.sal FROM emp e JOIN dept d ON (e.deptno=d.deptno) JOIN bonus b ON (b.ename = e.ename) WHERE e.sal IS NOT NULL

69

Oracle Query – 트랜잭션 (1)

트랜잭션 (TRANSACTION)- 트랜잭션은 데이터 처리의 한 단위 이다 .- 오라클 서버에서 발생하는 SQL 문들이 하나의 논리적인 작업 단위로써 성공하거나 실패하는 일련의 SQL 문을 트랙잭션이라

보면 된다 .- 오라클 서버는 트랜잭션을 근거로 데이터의 일관성을 보증 한다 .- 트랜잭션은 데이터를 일관되게 변경하는 DML 문장으로 구성된다 (COMMIT, ROLLBACK, SAVEPOINT)

TRANSACTION 의 시작- 실행 가능한 SQL 문장이 제일 처음 실행될 때

TRANSACTION 의 종료- COMMIT 이나 ROLLBACK - DDL 이나 DCL 문장의 실행 ( 자동 COMMIT) - 기계 장애 또는 시스템 충돌 (crash) - deadlock 발생 - 사용자가 정상 종료

자동 COMMIT 은 다음의 경우 발생 한다 .- DDL,DCL 문장이 완료 될 때 - 명시적인 COMMIT 이나 ROLLBACK없이 SQL*Plus 를 정상 종료 했을 경우

자동 ROLLBACK은 다음의 경우 발생 한다 .- SQL*Plus 를 비정상 종료 했을 경우 - 비정상적인 종료 , system failure

70

Oracle Query – 트랜잭션 (2)

COMMIT 과 ROLLBACK - COMMIT : 변경사항 저장 - ROLLBACK : 변경사항 취소

COMMIT 과 ROLLBACK 의 장점- 데이터의 일관성을 제공 한다 . - 데이터를 영구적으로 변경하기 전에 데이터 변경을 확인하게 한다 . - 관련된 작업을 논리적으로 그룹화 할 수 있다 . - COMMIT, SAVEPOINT, ROLLBACK 문장으로 TRANSACTION 의 논리를 제어할 수 있다 .

COMMIT 이나 ROLLBACK 이전의 데이터 상태- 데이터 이전의 상태로 북구가 가능 하다 . - 현재 사용자는 SELECT 문장으로 DML 작업의 결과를 확인할 수 있다 . - 다른 사용자는 SELECT 문장으로 현재 사용자 사용한 DML 문장의 결과를 확인할 수 없다 . - 변경된 행은 LOCK 이 설정 되어서 다른 사용자가 변경 할 수 없다 .

COMMIT 이후의 데이터 상태- 데이터베이스에 데이터를 영구적으로 변경 - 데이터의 이전 상태는 완전히 상실 - 모든 사용자가 결과를 볼 수 있다 . - 변경된 행의 LOCK 이 해제되고 다른 사용자가 변경할 수 있다 . - 모든 SAVEPOINT 는 제거 된다 .

71

Oracle Query – 숫자함수 (Number Functions)(1)

ABS(n) 절대값을 계산하는 함수이다 .SQL> SELECT ABS(-10) Absolute FROM DUAL;

--------10

CEIL(n) 주어진 값보다는 크지만 가장 근접하는 최소값을 구하는 함수이다 . SQL> SELECT CEIL(10.1) test FROM DUAL; SQL> SELECT CEIL(-10.1) test FROM DUAL ;

------- -------11 -10

FLOOR(n) 주어진 값보다 작거나 같은 최대 정수 값을 구하는 함수이다 . CEIL 함수와 비교해 보자 . SQL> SELECT FLOOR(10.1) test FROM DUAL ; SQL> SELECT FLOOR(-10.1) test FROM DUAL ;

------- -------10 -11

MOD(m, n) m 을 n 으로 나눈 나머지를 반환 한다 . n 이 0일 경우 m 을 반환 한다 . SQL> SELECT MOD(9, 4) test FROM DUAL ;

-------1

POWER(m, n) m 의 n승 값을 계산 한다 . SQL> SELECT POWER(4, 2) test FROM DUAL ;

-------16

72

Oracle Query – 숫자함수 (Number Functions)(2)

ROUND(n, [m]) n값의 반올림을 하는 함수로 m 은 소숫점 아래 자릿 수를 나타 낸다 . SQL> SELECT ROUND(192.123, 1) test FROM DUAL ; SQL> SELECT ROUND(192.123, -1) test FROM DUAL ;

------- -------192.1 190

TRUNC(n, m) n값을 m 소숫점 자리로 반내림한 값을 반환 한다 . ROUND 함수와 비교해 보자 SQL> SELECT TRUNC(7.5597, 2) test FROM DUAL ; SQL> SELECT TRUNC(5254.26, -2) test FROM DUAL ;

------- -------7.55 5200

73

Oracle Query – 문자열 처리 함수 (Character Functions)(1)

CONCAT(char1, char2) Concatenation 의 약자로 두 문자를 결합하는 역할을 한며 , "||" 연산자와 같은 역할을 한다 . SQL> SELECT CONCAT('Oracle', 'Club') FROM DUAL; ---------- OracleClub INITCAP(char) 주어진 문자열의 첫 번째 문자를 대문자로 변환시켜 준다 . SQL> SELECT INITCAP('kim jung sick') FROM DUAL; ------------- Kim jung sick LOWER(char), UPPER(char) LOWER 함수는문자열을 소문자로 , UPPER 함수는 문자열을 대문자로 변환 시켜 준다 . SQL> SELECT LOWER('KIM JUNG SICK') FROM DUAL; SQL> SELECT UPPER('kim jung sick') FROM DUAL; ------------- ------------- kim jung sick KIM JUNG SICK

LPAD(char1, n [,char2]) 왼쪽에 문자열을 끼어 놓는 역할을 한다 . n 은 반환되는 문자열의 전체 길이를 나타내며 , char1의 문자열이 n 보다 클 경우 char1을 n 개 문자열 만큼 반환 한다 .

SQL> SELECT LPAD('JUNG-SICK', 10, '*') FROM DUAL; ------------ *JUNG-SICK

RPAD(char1, n [,char2]) LPAD와 반대로 오른쪽에 문자열을 끼어 놓는 역할을 한다 .SQL> SELECT RPAD('JUNG-SICK', 10, '*') FROM DUAL; ------------ JUNG-SICK*

74

Oracle Query – 문자열 처리 함수 (Character Functions)(2)

SUBSTR(char, m ,[n]) m 번째 자리부터 길이가 n 개인 문자열을 반환한 한다 . m 이 음수일 경우에는 뒤에서 M번째 문자부터 반대 방향으로 n 개의 문자를 반환한다 .

SQL> SELECT SUBSTR('JUNG-SICK', 3, 3) FROM DUAL; SQL> SELECT SUBSTR('JUNG-SICK', -3, 3) FROM DUAL; ----------- ----------- NG- ICK

LENGTH(char1) 문자열의 길이를 반환 한다 .SQL> SELECT LENGTH('JUNG-SICK') TEST FROM DUAL; ---------- 9

REPLACE(char1, str1, str2) 문자열의 특정 문자를 다른 문자로 변환 한다 . -- 대소문자를 구분한다SQL> SELECT REPLACE('JACK and JUE','J','BL') "Changes" FROM DUAL;--------------BLACK and BLUE

INSTR 문자열이 포함되어 있는지를 조사하여 문자열의 위치를 반환 한다 . 지정한 문자열이 발견되지 않으면 0이 반환 된다 . -- 지정한 문자 OK가 발견되지 않아서 0이 반환 .SQL> SELECT INSTR('CORPORATE FLOOR','OK') "Instring" FROM DUAL; ---------- 0

-- OR 이 있는 위치 2를 반환 . 왼쪽부터 비교를 한다는 것을 알 수 있다 .SQL> SELECT INSTR('CORPORATE FLOOR','OR') "Instring" FROM DUAL; ---------- 2

75

Oracle Query – 문자열 처리 함수 (Character Functions)(3)

-- 왼쪽에서 3번째부터 시작을 해서 비교를 한다 . -- 2번째 OR 의 위치가 반환 됩니다 .SQL> SELECT INSTR('CORPORATE FLOOR','OR', 3) "Instring" FROM DUAL; ---------- 5TRIM 특정한 문자를 제거 한다 . 제거할 문자를 입력하지 않으면 기본적으로 공백이 제거 된다 .-- 0을 제거 한다 .SQL> SELECT TRIM(0 FROM 0009872348900) "TRIM Example" FROM DUAL;------------98723489 -- 어떤 문자도 입력하지 않으면 기본적으로 공백이 제거 된다 . SQL> SELECT NVL(TRIM (' '),' 공백 ') "TRIM Example" FROM DUAL;------------공백

-- LTRIMSQL> SELECT LTRIM('xyxXxyLAST WORD','xy') "LTRIM example" FROM DUAL;------------XxyLAST WORD -- RTRIMSQL> SELECT RTRIM('BROWNINGyxXxy','xy') "RTRIM example" FROM DUAL;-----------BROWNINGyxX

76

Oracle Query – 날짜 처리 함수 (Date Functions)

LAST_DAY(d) 달의 마지막 날의 날짜를 반환 한다-- 오늘이 6월 5일 이니깐 , 6월달의 마지막 날 30일을 반환 한다 . SQL> SELECT SYSDATE today, LAST_DAY(SYSDATE) lastday FROM DUAL; TODAY LASTDAY------------ ---------------05-JUN-2000 30-JUN-2000 ADD_MONTHS(a, b) 함수는 a 의 날짜에 b 의 달을 더한 값을 반환 한다 .-- 오늘이 6월 5일 이니깐 , 3 개월이 더해진 9월 5일이 반환 된다 . SQL> SELECT TO_CAHR(ADD_MONTHS(SYSDATE,3),'RRRR/MM/DD' LASTDAY) "date“ FROM DUAL;------------ 2000/09/05 MONTH_BETWEEN(a1, a2) a1과 a2 사이의 달의 수를 NUMBER형 타입으로 반환 한다 .-- 달사이의 간격을 숫자형으로 반환 한다 . SQL> SELECT MONTHS_BETWEEN(TO_DATE('2000/06/05'), TO_DATE('2000/09/23')) "Date“ FROM DUAL;------------- -3.880635

ROUND(d[,F]) F 에 지정된 단위로 반올림 한다 . F 가 연도라면 연도 단위로 반올림 한다 .SQL> SELECT ROUND(TO_DATE('1998/09/11'), 'YEAR') FROM DUAL; ------------- 99-01-01

77

Oracle Query – 변환 함수 (Conversion Functions)

TO_CHAR 함수는 DATE형 , NUMBER형을 VARCHAR2 형으로 변환 한다 . -- 오늘이 6월 10일 이니깐 , 6월이 출력된다 .SQL> SELECT TO_CHAR(SYSDATE) CHARTEST FROM DUAL; -------------- JUNE

-- 오늘 날짜가 문자형으로 출력된다 .SQL> SELECT TO_CHAR(SYSDATE, 'MONTH') CHARTEST FROM DUAL; -------------- 00/06/10 TO_DATE 함수는 CHAR, VARCHAR2형을 DATE 타입으로 변환한다 .-- '2000/06/16' 문자열이 날짜형으로 변환 된다 SQL> SELECT TO_DATE('2000/06/16','RRRR/MM/DD') FROM DUAL; ------------ 2000/06/16 TO_NUMBER 함수는 CHAR, VARCHAR2의 데이터 타입을 숫자형식으로 변환 한다 .-- '1210616' 문자열이 숫자형으로 변환 된다SQL> SELECT TO_NUMBER('1210616') FROM DUAL;------------ 1210616

78

Oracle Query – General Functions

NVL NULL 값을 다른 값으로 바꿀 때 사용하며 , 모든 데이터 타입에 적용이 가능하다 .-- Commsion 이 없는 사원에 대해 0으로 바꾸어서 출력하는 예제 . SQL> SELECT empno, NVL(comm, 0) FROM emp WHERE deptno = 30;

...

DECODE 데이터 들을 다른 값으로 바꾸어 주며 , DECODE(VALUE, IF1, THEN1, IF2, THEN2...) 형태로 사용 할 수 있다 .VALUE 값이 IF1일 경우에 THEN1 값 으로 바꾸어 주고 VALUE 값이 IF2일 경우에는 THEN2 값 으로 바꾸어 준다 .-- 부서가 10 번이면 'ACCOUNTING' 를 20 번이면 'RESEARCH' 를 30 번이면 'SALES' 를 40 번이면 'OPERATIONS' 를 출력하는 예제이다 . SQL> SELECT deptno, DECODE(deptno, 10 , 'ACCOUNTING' , 20 , 'RESEARCH' , 30 , 'SALES' , 40 , 'OPERATIONS') FROM emp;

DEPTNO DECODE(DEP ---------- ---------- 20 RESEARCH 30 SALES 30 SALES 10 ACCOUNTING 20 RESEARCH

EMPNO NVL(COMM,0)---------- ----------- 7499 300 7521 500 7698 0 7844 0

79

Oracle Query – General Functions

MERGE한 번에 조건에 따라 INSERT, UPDATE 가 가능 하다 . 해당 ROW가 있으면 UPDATE, 없으면 INSERT 문장이 실행 된다 .MERGE INTO target_table_name USING (table|view|subquery) ON (join condition)WHEN MATCHED THEN UPDATE SET col1 = val1[, col2 = val2…]WHEN NOT MATCHED THEN INSERT(...) VALUES(...) - INTO : DATA 가 UPDATE 되거나 INSERT 될 TABLE 이름을 지정 . - USING : 대상 TABLE 의 DATA 와 비교한 후 UPDATE 또는 INSERT 할 대상이 되는 DATA 의 SOURCE 테이블 또는 뷰를 지정 - ON : UPDATE 나 INSERT 를 하게 될 조건으로 , 해당 조건을 만족하는 DATA 가 있으면 WHEN MATCHED 절을 실행하게 되고 , 없으면 WHEN NOT MATCHED 이하를 실행하게 된다 . - WHEN MATCHED : ON 조건절이 TRUE 인 ROW에 수행 할 내용 - WHEN NOT MATCHED : ON 조건절에 맞는 ROW가 없을 때 수행할 내용

NULLIF- NULLIF(exp1, exp2) - exp1값과 exp2값이 동일하면 NULL 을 그렇지 않으면 exp1을 반환 - CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

COALESCE- COALESCE(expr1,expr2,expr3,…) - expr1이 NULL 이 아니면 expr1값을 그렇지 않으면 COALESCE(expr2,expr3,…)값을 반환 . - NVL 함수와 비슷하다 . -- 아래 문장을 실행해 보자 .SQL> SELECT COALESCE(comm,1) FROM emp;

80

Oracle Query – General Functions

CASE 문장Simple CASE expression, DECODE 함수와 비슷하다SQL> SELECT deptno, CASE deptno WHEN 10 THEN 'ACCOUNTING' WHEN 20 THEN 'RESEARCH' WHEN 30 THEN 'SALES' ELSE 'OPERATIONS' END as "Dept Name" FROM emp;

Searched CASE expressionIF.. THEN .. ELSE 구문과 비슷 하다 . WHEN 절 다음에 여러 조건이 올 수 있다 .

SQL> INSERT INTO raise SELECT last_name , CASE WHEN job_id LIKE 'AD%' THEN '10%' WHEN job_id LIKE 'IT%' THEN '15%' WHEN job_id LIKE 'PU%' THEN '18%' ELSE '20%' END FROM employees;

81

Oracle Query – 그룹함수 (1)

그룹 함수란 ?- 여러 행 또는 테이블 전체의 행에 대해 함수가 적용되어 하나의 결과값을 가져오는 함수를 말한다 .- GROUP BY절을 이용하여 그룹 당 하나의 결과가 주어지도록 그룹화 할 수 있다 .- HAVING절을 사용하여 그룹 함수를 가지고 조건비교를 할 수 있다 .- COUNT(*) 를 제외한 모든 그룹함수는 NULL값을 고려하지 않는다 .- MIN, MAX 그룹함수는 모든 자료형에 대해서 사용 할 수 있다 .

COUNT 함수는 검색된 행의 수를 반환 한다 .-- 검색된 행의 총 수 4 개를 반환 . 즉 4 개의 부서가 존재한다 .SQL> SELECT COUNT(deptno) FROM dept; ------------- 4

MAX 함수는 컬럼값 중에서 최대값을 반환 한다 .-- sal 컬럼값 중에서 제일 큰값을 반환 . 즉 가장 큰 급여를 반환 .SQL> SELECT MAX(sal) salary FROM emp; ------- 5000

MIN 함수는 컬럼값 중에서 최소값을 반환 한다 .-- sal 컬럼값 중에서 가장 작은 값 반환 . 즉 가장 적은 급여를 반환SQL> SELECT MIN(sal) salary FROM emp; -------- 800

82

Oracle Query – 그룹함수 (2)

AVG 함수는 평균 값을 반환 한다 .-- 부서번호 30의 사원 평균 급여를 소수점 1자리 이하에서 반올림SQL> SELECT ROUND(AVG(sal),1) salary FROM emp WHERE deptno = 30;---------- 1566.7 SUM 함수는 검색된 컬럼의 합을 반환 한다 .-- 부서번호 30의 사원 급여 합계를 조회 .SQL> SELECT SUM(sal) salary FROM emp WHERE deptno = 30; --------- 9400 STDDEV 함수는 표준편차를 반환 한다 .-- 부서번호 30의 사원 급여 표준편차를 반환 . SQL> SELECT ROUND(STDDEV(sal),3) salary FROM emp WHERE deptno = 30; ---------- 668.331

83

Oracle Query – GROUP BY와 HAVING(1)

GROUP BY- 특정한 컬럼의 테이터 들을 다른 데이터들과 비교해 유일한 값에 따라 무리를 짓는다 .- GROUP BY절을 사용하여 한 테이블의 행들을 원하는 그룹으로 나눈다 .- 컬럼명을 GROUP 함수와 SELECT 절에 사용하고자 하는 경우 GROUP BY뒤에 컬럼명을 추가 하면 된다 .-- 부서별로 그룹한 결과 값이며 , 부서별로 사원수를 조회한다 .SQL> SELECT b.deptno, COUNT(a.empno) FROM emp a, dept b WHERE a.deptno = b.deptno GROUP BY b.deptno;

-- 부서별로 그룹하여 부서번호 , 인원수 , 급여의 평균 , -- 급여의 합을 조회하는 예제 SQL> SELECT deptno, COUNT(*), ROUND(AVG(sal)) " 급여평균 ", ROUND(SUM(sal)) " 급여합계 " FROM emp GROUP BY deptno;

-- 업무별로 그룹하여 업무 , 인원수 , 평균 급여액 , -- 최고 급여액 , 최저 급여액 및 합계를 조회하는 예제SQL> SELECT job, COUNT(empno) "인원수 ",

AVG(sal) "평균급여액 ", MAX(sal) "최고급여액 ", MIN(sal) "최저급여액 ", SUM(sal) " 급여합계 " FROM emp GROUP BY job

DEPTNO COUNT(*)----- ---------- 10 3 20 5 30 6

DEPTNO COUNT(*) 급여평균 급여합계--------- ---------- ---------- ---------- 10 3 2998 8995 20 5 2175 10875 30 6 1567 9400

JOB 인원수 평균급여액 최고급여액 최저급여액 급여합계--------- ------- ---------- ---------- --------- --------ANALYST 2 3000 3000 3000 6000CLERK 4 1037.5 1300 800 4150MANAGER 3 2840 2975 2695 8520PRESIDENT 1 5000 5000 5000 5000SALESMAN 4 1400 1600 1250 5600

84

Oracle Query – GROUP BY와 HAVING(2)

HAVING 절 WHERE 절에 GROUP 함수를 사용할 수 없다 .HAVING절은 GROUP 함수를 가지고 조건비교를 할 때 사용 한다 .WHERE → GROUP BY → HAVING → ORDER BY순으로 쿼리문이 와야 한다 .

-- 사원수가 5명이 넘는 부서의 부서명과 사원수 조회SQL> SELECT b.dname, COUNT(a.empno) FROM emp a, dept b WHERE a.deptno = b.deptno GROUP BY dname HAVING COUNT(a.empno) > 5

-- 전체 월급이 5000을 초과하는 각 업무에 대해서 업무와 월급여 합계를 조회-- 단 판매원은 제외하고 월 급여 합계로 내림차순 정렬 . SQL> SELECT job, SUM(sal) " 급여합계 " FROM emp WHERE job != 'SALES' -- 판매원은 제외 GROUP BY job -- 업무별로 Group By HAVING SUM(sal) > 5000 -- 전체 월급이 5000을 초과하는 ORDER BY SUM(sal) DESC; -- 월급여 합계로 내림차순 정렬

DNAME COUNT(A.EMPNO)-------------- --------------RESEARCH 6SALES 6

JOB 급여합계--------- ----------MANAGER 8520ANALYST 6000SALESMAN 5600

85

Oracle Query – Subquery(1)

서브쿼리란 ?- 서브쿼리는 다른 하나의 SQL 문장의 절에 NESTEDED된 SELECT 문장 이다 .- SELECT, UPDATE, DELETE, INSERT 와 같은 DML 문과 CREATE TABLE 또는 VIEW에서 이용 될 수 있다 .- 알려지지 않은 조건에 근거한 값 들을 검색하는 SELECT 문장을 작성하는데 유용 하다 .

가이드라인- 서브쿼리는 괄호로 묶어야 한다 .- 단일 행 연산자 (=, >, >=, <, <=, <>, !=) 와 복수 행 연산자 (IN, NOT IN, ANY, ALL, EXISTS) 들이 서브쿼리에 사용 된다 .- 서브쿼리는 연산자의 오른쪽에 위치해야 한다 .

서브쿼리의 유형- 단일 행 (Sing-Row) 서브쿼리 : SELECT 문장으로 부터 오직 하나의 행 만을 검색하는 질의이다 .- 다중 행 (Multiple-Row) 서브쿼리 : SELECT 문장으로부터 하나 이상의 행을 검색하는 질의이다 .- 다중 열 (Multiple-Column) 서브쿼리 : SELECT 문장으로부터 하나 이상의 컬럼을 검색하는 질의이다 .- FROM 절상의 서브쿼리 (INLINE VIEW) : FROM 절상에 오는 서브쿼리로 VIEW처럼 작용 한다 .- 상관관계 서브 쿼리 : 바깥쪽 쿼리의 컬럼 중의 하나가 안쪽 서브쿼리의 조건에 이용되는 처리 방식 이다 .

86

Oracle Query – Subquery(2)

다중 행 (Multiple-Row) 서브쿼리- 하나 이상의 행을 반환하는 서브쿼리를 다중 행 서브쿼리라고 한다 .복수 행 연산자 (IN, NOT IN, ANY, ALL, EXISTS) 를 사용 할 수 있다 .

IN 연산자의 사용 예제-- 부서별로 가장 급여를 많이 받는 사원의 정보를 출력하는 예제SQL> SELECT empno,ename,sal,deptno FROM emp WHERE sal IN (SELECT MAX(sal) FROM emp GROUP BY deptno);

ANY 연산자의 사용 예제ANY 연산자는 서브쿼리의 결과값중 어느 하나의 값이라도 만족이 되면 결과값을 반환 한다 .SQL> SELECT ename, sal FROM emp WHERE deptno != 20 AND sal > ANY (SELECT sal FROM emp WHERE job='SALESMAN');

EMPNO ENAME SAL DEPTNO---------- -------- --------- --------- 7698 BLAKE 2850 30 7788 SCOTT 3000 20 7902 FORD 3000 20 7839 KING 5000 10

ENAME SAL---------- ----------ALLEN 1600BLAKE 2850CLARK 2450...

87

Oracle Query – Subquery(3)

ALL 연산자의 사용 예제ALL 연산자는 서브쿼리의 결과값 중 모든 결과 값이 만족 되야만 결과값을 반환 한다 .SQL> SELECT ename, sal FROM emp WHERE deptno != 20 AND sal > ALL (SELECT sal FROM emp WHERE job='SALESMAN'); EXISTS 연산자의 사용 예제EXISTS 연산자를 사용하면 서브쿼리의 데이터가 존재하는가의 여부를 먼저 따져 존재하는 값 들만을 결과로 반환해 준다 .서브쿼리에서 적어도 한 개의 행을 반환하면 논리식은 참이고 그렇지 않으면 거짓 이다 . -- 사원을 관리할 수 있는 사원의 정보 조회 예제 SQL> SELECT empno, ename, sal FROM emp e WHERE EXISTS (SELECT empno FROM emp WHERE e.empno = mgr)

ENAME SAL---------- ----------BLAKE 2850CLARK 2450KING 5000

EMPNO ENAME SAL---------- -------- -------- 7566 JONES 2975 7698 BLAKE 2850 7782 CLARK 2450…..

88

Oracle Query – Subquery(4)

다중 열 (Multiple-Column) 서브쿼리다중 열 서브쿼리란 서브쿼리의 결과 값이 두 개 이상의 컬럼을 반환하는 서브쿼리 이다 .

Pairwise(쌍비교 ) Subquery서브쿼리가 한 번 실행되면서 모든 조건을 검색해서 주 쿼리로 넘겨 준다 .SQL> SELECT empno, sal, deptno FROM emp WHERE (sal, deptno) IN ( SELECT sal, deptno FROM emp WHERE deptno = 30 AND comm is NOT NULL ); EMPNO SAL DEPTNO---------- ---------- ---------- 7521 1250 30 7654 1250 30 7844 1500 30 7499 1600 30

89

Oracle Query – Subquery(5)

FROM 절상의 서브쿼리 (INLINE VIEW)INLINE VIEW란 FROM 절 상에 오는 서브쿼리로 VIEW처럼 작용 한다 . -- 급여가 부서번호 20의 평균 급여보다 크고 , 사원을 관리하는 사원으로서 -- 부서번호 20에 속하지 않은 사원의 정보를 조회하는 SQL 문장이다 .SQL> SELECT b.empno,b.ename,b.job,b.sal, b.deptno FROM (SELECT empno FROM emp WHERE sal >(SELECT AVG(sal) FROM emp WHERE deptno = 20)) a, emp b WHERE a.empno = b.empno AND b.mgr is NOT NULL AND b.deptno != 20 EMPNO ENAME JOB SAL DEPTNO---------- ---------- --------- ---------- ---------- 7698 BLAKE MANAGER 2850 30 7782 CLARK MANAGER 2450 10