90
뇌뇌 뇌뇌뇌뇌 JSP & Servlet 뇌뇌뇌뇌뇌뇌 뇌뇌뇌뇌

데이터베이스 사용하기

  • Upload
    lada

  • View
    53

  • Download
    11

Embed Size (px)

DESCRIPTION

10. 데이터베이스 사용하기. 학습 목표 데이터베이스를 이용하면 파일보다 훨씬 더 체계적이고 구조적인 방법으로 데이터를 저장하고 관리할 수 있다 . 그래서 웹 프로그래밍에서도 데이터베이스를 사용해야 할 경우가 많이 있는데 이번 장에서는 그 방법을 배워보자 . 내 용 데이터베이스에 대하여 MySQL 설치하기 Connector/J 설치하기 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스 커넥션 풀의 설치와 사용. 1. 데이터베이스 사용. 데이터베이스 ( database ) - PowerPoint PPT Presentation

Citation preview

Page 1: 데이터베이스 사용하기

뇌를 자극하는 JSP & Servlet

데이터베이스 사용하기

Page 2: 데이터베이스 사용하기

2/80

Contents

학습 목표 데이터베이스를 이용하면 파일보다 훨씬 더 체계적이고 구조적인 방법으로

데이터를 저장하고 관리할 수 있다 . 그래서 웹 프로그래밍에서도 데이터베이스를 사용해야 할 경우가 많이 있는데 이번 장에서는 그 방법을 배워보자 .

내 용 데이터베이스에 대하여 MySQL 설치하기 Connector/J 설치하기 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스 커넥션 풀의 설치와 사용

Page 3: 데이터베이스 사용하기

3/90

데이터베이스 (database)• 파일과 마찬가지로 보조기억장치에 데이터를 저장하는 수단

• 크게 계층형 데이터베이스 , 관계형 데이터베이스 , 객체지향 데이터베이스로 구분

• 그 중 관계형 테이터베이스인 MySQL 을 사용

자바 프로그램에서 MySQL 을 사용하려면 JDBC 드라이버가 필요하다 .

1. 데이터베이스 사용

[ 그림 12-1] JDBC 드라이버의 역할

Page 4: 데이터베이스 사용하기

4/90

MySQL 다운로드 받기 웹 브라우저를 열고 http://dev.mysql.com/downloads/라는 URL 을 입력하면

다음과 같은 웹 페이지가 나타난다 .

2. MySQL 설치하기

Page 5: 데이터베이스 사용하기

5/90

MySQL 다운로드 받기 가장 최신 버전인 MySQL 5.1 을 선택하면 화면이 다음과 같이 바뀐다 .

2. MySQL 설치하기

Page 6: 데이터베이스 사용하기

6/90

MySQL 다운로드 받기

앞 화면에서 Download 버튼을 누른다 .

2. MySQL 설치하기

Page 7: 데이터베이스 사용하기

7/90

MySQL 다운로드 받기 앞 화면에서 Windows 플랫폼을 선택하면 Windows 플랫폼에 맞는 MySQL

의 여러 에디션이 표시된 화면이 나타난다 .

2. MySQL 설치하기

Page 8: 데이터베이스 사용하기

8/90

MySQL 다운로드 받기 앞 화면에서 Pick a mirror 링크를 클릭하면 개인 정보를 입력하도록

권장하는 화면이 나타난다 .

2. MySQL 설치하기

Page 9: 데이터베이스 사용하기

9/90

MySQL 다운로드 받기 앞 화면 아래쪽의 ‘ No Thanks’ 로 시작하는 링크를 클릭하면 MySQL 을

다운로드 받을 수 있는 다음과 같은 웹 페이지가 나타난다 .

2. MySQL 설치하기

Page 10: 데이터베이스 사용하기

10/90

MySQL 다운로드 받기 앞 화면에서 HTTP 나 FTP 링크 중 하나를 선택하면 다음과 같은 창이

나타나는데 , 여기에서 저장 버튼을 누르면 다운로드가 시작된다 .

2. MySQL 설치하기

Page 11: 데이터베이스 사용하기

11/90

MySQL 설치하기 다운로드 받은 파일을 더블 클릭하면 왼쪽 창이 나타나며 , ‘Next’ 버튼을

누르면 화면이 오른쪽 그림처럼 바뀐다 .

2. MySQL 설치하기

Page 12: 데이터베이스 사용하기

12/90

MySQL 설치하기 앞 화면에서 ‘ Typical’ 옵션을 선택하고 ‘ Next’ 버튼을 누르면 화면이 왼쪽

그림처럼 바뀌고 , ‘Install’ 버튼을 누르면 화면이 오른쪽 그림처럼 바뀌면서 설치가 진행된다 .

2. MySQL 설치하기

Page 13: 데이터베이스 사용하기

13/90

MySQL 설치하기 설치가 끝나면 왼쪽 화면이 나타나고 , ‘Next’ 버튼을 누르면 화면이 오른쪽

그림처럼 바뀐다 . 여기에서 ‘ Finish’ 버튼을 누르면 MySQL 의 구성 프로그램이 시작된다 .

2. MySQL 설치하기

Page 14: 데이터베이스 사용하기

14/90

MySQL 의 구성 정보 입력하기 MySQL 구성 프로그램이 시작되면 왼쪽 창이 나타나고 , ‘Next’ 버튼을

누르면 화면이 오른쪽 그림처럼 바뀐다 .

2. MySQL 설치하기

Page 15: 데이터베이스 사용하기

15/90

MySQL 의 구성 정보 입력하기 앞 화면에서 ‘ Next’ 버튼을 누르면 창이 왼쪽 그림처럼 바뀌는데 , MySQL 가

윈도우 서비스로서 실행되도록 만들기 위해 아래쪽 체크박스를 선택해서 오른쪽 그림처럼 만든다 .

2. MySQL 설치하기

Page 16: 데이터베이스 사용하기

16/90

MySQL 의 구성 정보 입력하기 앞 화면에서 ‘ Next’ 버튼을 누르면 창이 왼쪽 그림처럼 바뀌는데 , 여기에서

새로운 root 사용자 암호를 두 번 입력하고 ‘ Next’ 버튼을 누르면 화면이 오른쪽 그림처럼 바뀐다 .

• [ 주의 ] 암호는 나중에 필요하므로 잘 기억해둔다 .

2. MySQL 설치하기

Page 17: 데이터베이스 사용하기

17/90

MySQL 의 구성 정보 입력하기 앞 화면에서 ‘ Execute’ 버튼을 누르면 앞에서 구성 정보의 설정이 시작되고 ,

설정이 끝나면 화면이 오른쪽 그림처럼 바뀐다 .

오른쪽 화면에서 ‘ Finish’ 버튼을 누르면 MySQL 구성 프로그램이 끝난다 .

2. MySQL 설치하기

Page 18: 데이터베이스 사용하기

18/90

MySQL 시작하기 시작 메뉴에서 제어판 → 관리 도구 → 서비스를 선택한다 .

상태가 시작됨으로 표시되어 있지 않으면 MySQL 이 작동되지 않고 있는 것이다 . 그럴 때는 MySQL 항목을 더블 클릭해서 MySQL 속성 창을 연다 .

2. MySQL 설치하기

[ 그림 12-9] 윈도우즈 운영체제의 서비스로 등록된 MySQL

Page 19: 데이터베이스 사용하기

19/90

MySQL 시작하기 MySQL 속성 창의 중간쯤 보면 시작 , 중지 , 일시 중지 , 계속이라는 4 개의

버튼이 있는데 이 중 시작 버튼을 누르면 MySQL 이 시작된다 .

2. MySQL 설치하기

[ 그림 12-10] MySQL 서비스를 선택했을 때 나타나는 윈도우

Page 20: 데이터베이스 사용하기

20/90

데이터베이스 만들기 MySQL 클라이언트 프로그램 mysqladmin.exe 을 이용

• 명령 프롬프트 창에서 실행

create SQL 명령을 이용하여 데이터베이스 생성

2. MySQL 설치하기

mysqladmin -u root -p create webdb

사용자의 ID가root 라는 뜻패스워드를 입력받겠다는 뜻

webdb 라는 이름의 데이터베이스를만들라는 뜻

① 데이터베이스를 생성하라는 명령을 입력합니다

② 패스워드를 입력합니다

[ 그림 12-11] 데이터베이스를 만드는 방법

Page 21: 데이터베이스 사용하기

21/90

데이터베이스에 데이터 저장하기 데이터베이스는 정형화된 구조의 데이터를 저장하기에 적합한 저장 수단이다 .

관계형 데이터베이스를 테이블 (Table) 형태로 데이터 저장• 같은 구조를 갖는 데이터 ( 레코드 ) 들끼리 모아 저장

2. MySQL 설치하기

[ 그림 12-12] 관계형 데이터베이스에 저장하기에 적합한 데이터

Page 22: 데이터베이스 사용하기

22/90

데이터베이스에 데이터 저장하기 테이블을 생성하기 위해서는 먼저 테이블의 구조를 만들어야 하는데 , 이

구조는 데이터 항목의 이름 , 타입 , 최대 크기에 의해 정해진다 .

테이블을 설계한 다음에 해야 할 일은 데이터베이스 안으로 들어가서 실제로 테이블을 생성하는 것

2. MySQL 설치하기

Page 23: 데이터베이스 사용하기

23/90

데이터베이스에 데이터 저장하기 데이터베이스에 로그인하기 위해서는 명령 프롬프트 창에서 다음과 같은

명령을 입력해야 한다 .

• 위 명령을 입력하면 root 사용자의 암호를 묻는 프롬프트가 나타나고 , 암호를 입력하면 mysql> 프롬프트가 나타난다 .

mysql> 프롬프트 다음에 use 라는 명령을 다음과 같은 형식으로 입력하면 데이터베이스에 들어갈 수 있다 .

• 데이터베이스를 빠져나오려면 mysql> 프롬프트 다음에 quit 라고 입력하면 된다 .

2. MySQL 설치하기

mysql -u root -p

사용자의 ID가root 라는 뜻

패스워드를 입력받겠다는 뜻

use webdb

데이터베이스의 이름

Page 24: 데이터베이스 사용하기

24/90

데이터베이스에 데이터 저장하기

2. MySQL 설치하기

[ 그림 12-12] 데이터베이스에 들어가고 나오는 방법

1) mysql.exe 프로그램을 실행합니다 .

2) 패스워드를 입력합니다 .

3) use 명령을 이용해서 특정 데이터베이스로 들어갑니다 .

4) quit 명령을 실행하면 mysql.exe 프로그램이 끝납니다 .

Page 25: 데이터베이스 사용하기

25/90

데이터베이스에 데이터 저장하기 테이블을 만들기 위해서는 데이터베이스 안으로 들어가서 다음과 같은 형식의

create 명령을 실행하면 된다 .

위 명령문의 경우 , 필수 입력 데이터가 누락될 가능성이 있다 .

필수 입력 데이터 지정을 위해서는 항목 뒤에 not null 이라는 키워드를 사용

2. MySQL 설치하기

create table goodsinfo (code char(5), title varchar(50), writer varchar(20), price int(8)) ;

create 문을 시작하는 키워드

테이블 이름

데이터 항목의 이름 , 타입 , 크기

모든 명령문의 끝에 반드시 써야 하는

세미콜론

create table goodsinfo ( code char(5) not null, title varchar(50) not null, writer varchar(20), price int(8) not null);

필수 데이터 항목 뒤에는not null 이라고 쓰세요 .

Page 26: 데이터베이스 사용하기

26/90

데이터베이스에 데이터 저장하기 키로 사용할 데이터 항목을 지정하려면 create 문의 마지막 데이터 항목 뒤에

콤마를 찍고 , primary key 라는 키워드와 함께 키 항목의 이름을 다음과 같이 쓰면 된다 .

특정 항목을 키를 지정할 때의 이점 : • 키로 지정된 항목에는 똑같은 데이터 값이 입력될 수 없기 때문에 그 항목을 식별자로

사용할 수 있다 .

• 키로 지정된 항목의 인덱스 정보는 데이터베이스 안에 자동으로 생성되기 때문에 키를 이용한 검색 속도가 빨라진다 .

2. MySQL 설치하기

create table goodsinfo ( code char(5) not null, title varchar(50) not null, writer varchar(20), price int(8) not null, primary key(code));

code 항목을 키로 지정하는 부분입니다

Page 27: 데이터베이스 사용하기

27/90

데이터베이스에 데이터 저장하기

다음 그림은 create 문을 이용해서 실제로 테이블을 만드는 예이다 .

2. MySQL 설치하기

[ 그림 12-13] 을 참조해서webdb 데이터베이스로 들어가세요

테이블을 생성하는 create 문을입력하세요 .

정상적으로 테이블이 만들어지면이런 메시지가 나옵니다 .

[ 그림 12-14] 테이블을 만드는 방법

Page 28: 데이터베이스 사용하기

28/90

데이터베이스에 데이터 저장하기

테이블이 올바르게 만들어졌는지 확인하기 위해서는 desc 명령을 사용

2. MySQL 설치하기

테이블의 구조

[ 그림 12-15] 테이블의 구조를 확인하는 방법

Page 29: 데이터베이스 사용하기

29/90

데이터베이스에 데이터 저장하기 테이블에 데이터를 입력하려면 다음과 같은 형식의 insert 문을 쓰면 된다 .

• 문자 데이터는 반드시 작은따옴표로 묶어서 써야 한다 .

2. MySQL 설치하기

insert into goodsinfo (code, title, writer, price) values ( ‘10001 ’, ‘ 뇌를 자극하는 Java 프로그래밍 ’ , ‘김윤명 ’ , 27000);

[ 그림 12-16] 테이블에 데이터를 입력하는 방법

insert 문을 시작하는 키워드

테이블 이름

항목 이름

데이터키워드

Page 30: 데이터베이스 사용하기

30/90

데이터베이스에 데이터 저장하기 테이블에 저장한 데이터를 읽어오려면 select 문을 이용

와일드카드 문자 (*) 를 쓰면 테이블의 모든 항목을 읽어올 수 있다 .

특정 데이터만 읽어오려면 테이블 이름 뒤에 where 절을 사용

2. MySQL 설치하기

select name, price from goodsinfo;

select 문을 시작하는 키워드

항목 이름 테이블 이름키워드

select * from goodsinfo;

모든 데이터 항목을 뜻하는와일드카드 문자

select * from goodsinfo where price > 20000;

키워드 검색 조건

Page 31: 데이터베이스 사용하기

31/90

데이터베이스에 데이터 저장하기

2. MySQL 설치하기

[ 그림 12-17] 테이블의 데이터를 조회하는 방법

Page 32: 데이터베이스 사용하기

32/90

데이터베이스에 데이터 저장하기 테이블에 있는 기존의 데이터를 수정하려면 update 문을 사용

2. MySQL 설치하기

update goodsinfo set writer:= ‘토마스 코멘 외 3 명 ’ , price:=33600 where code = ‘10005’;

update 문을 시작하는 키워드

테이블 이름

키워드

항목 이름 :=새로운 값

포맷으로 값을 지정

where 조건절

[ 그림 12-18] 테이블의 데이터를 수정하는 방법

Page 33: 데이터베이스 사용하기

33/90

데이터베이스에 데이터 저장하기 테이블에 있는 데이터를 삭제하기 위해서는 delete 문을 사용

2. MySQL 설치하기

delete from goodsinfo where code = ‘10005 ’;

delete 문을 시작하는 키워드

테이블 이름

where 조건절

[ 그림 12-19] 테이블의 데이터를 삭제하는 방법

Page 34: 데이터베이스 사용하기

34/90

JDBC 드라이버 다운로드 받기 웹 사이트 : http://dev.mysql.com/downloads/

3. Connector/J 설치하기

Page 35: 데이터베이스 사용하기

35/90

JDBC 드라이버 다운로드 받기

스크롤 바를 내리면 Connector/J 를 다운로드 받을 수 있는 링크들이 나타난

다 .

3. Connector/J 설치하기

Page 36: 데이터베이스 사용하기

36/90

JDBC 드라이버 다운로드 받기

최신 버전의 Connector/J 에 대한 링크를 클릭해서 다운로드 받는다 .

3. Connector/J 설치하기

Page 37: 데이터베이스 사용하기

37/90

JDBC 드라이버 설치하기

3. Connector/J 설치하기

Page 38: 데이터베이스 사용하기

38/90

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

JDBC 개념과 역할 JDBC(Java Database Connectivity) - 자바에서 데이터베이스를 표준화 된

방법으로 접속할 수 있도록 만든 API 규격

데이터베이스 벤더와 상관없이 동일한 개발이 가능하게 함

애플리케이션

애플리케이션

오라클 DBMS

MySql DBMS

인포믹스 DBMS

JDBC드라이버관리자

구현사용

오라클 JDBC 드라이버

MySql JDBC 드라이버

인포믹스 JDBC 드라이버

Page 39: 데이터베이스 사용하기

39/90

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

JDBC 드라이버 유형

자바 애플리케이션자바 애플리케이션

JDBC 드라이버 관리자

DBMS DBMS DBMSDBMS DBMS

Native-Protocol 드라이버

ODBC 드라이버 JDBC 미들웨어

JDBC-ODBC 드라이버

JDBC API

JDBC 드라이버 API

Net-Protocol 드라이버

Native-API 드라이버

Page 40: 데이터베이스 사용하기

40/90

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

JDBC 드라이버 설치 – 오라클 JDBC 드라이버 JDBC 드라이버 선택

• JDBC 드라이버는 사용하고자 하는 데이터베이스 벤더 별로 제공 됨

오라클 JDBC 드라이버• c:\dev\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib\ojdbc14.jar

설치 디렉터리 ( 다음 중 한 가지를 이용함 )•JDK 설치디렉터리 \jre\lib\ext\ 에 복사하는 방법 .

•톰캣설치디렉터리 \common\lib 폴더에 복사하는 방법

•이클립스 프로젝트의 WebContent\WEB-INF\lib 폴더에 복사하는 방법

WebContent\WEB-INF\lib 폴더에 설치

Page 41: 데이터베이스 사용하기

41/90

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

JDBC 프로그래밍 단계 (1)

Page 42: 데이터베이스 사용하기

42/90

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

JDBC 프로그래밍 단계 (2)

Page 43: 데이터베이스 사용하기

43/90

JDBC 드라이버 로드 & 데이터베이스 연결

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

Page 44: 데이터베이스 사용하기

44/90

JDBC 드라이버 로드 & 데이터베이스 연결 자바 프로그램에서 관계형 데이터베이스로 연결을 하기 위해서는 먼저 다음과

같은 방법으로 JDBC 드라이버를 로드해야 한다 .

데이터베이스로 연결을 하기 위해서는 먼저 프로토콜 , 서브프로토콜 , 서브네임으로 이루어진 데이터베이스 URL 을 알아두어야 한다 .

• 서브네임의 작성 방법은 DBMS 의 종류마다 다르므로 MySQL 이 아닌 다른 DBMS

를 사용할 때는 관련 매뉴얼을 찾아보아야 한다 .

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

jdbc:mysql://219.153.12.14:3306/webdb

프로토콜(protocol)

서브프로토콜(subprotocol)

서브네임 (subname)IP 주소 : 포트번호 /DB

이름

Class.forName(“com.mysql.jdbc.Driver”);

JDBC 드라이버의 클래스 이름

Page 45: 데이터베이스 사용하기

45/90

JDBC 드라이버 로드 & 데이터베이스 연결 데이터베이스로 연결을 맺기 위해서는 java.sql.DriverManager 클래스의 get-

Connection 메서드를 호출해야 한다 .

• 이 메서드는 데이터베이스로의 연결에 성공하면 java.sql.Connection 인터페이스 타입의 객체를 만들어서 리턴한다 .

데이터베이스로의 연결을 끊기 위해서는 Connection 객체에 대해 close 메서드를 호출하면 된다 .

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

Connection conn = DriverManager.getConnection(“jdbc:mysql://219.153.12.14:3306/webdb ”, “root ”, “1234 ”);

데이터베이스 URL

사용자 ID

패스워드

conn.close()

데이터베이스로의

연결을 끊는 메서드

Page 46: 데이터베이스 사용하기

46/90

JDBC 드라이버 로드 & 데이터베이스 연결

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-1] JDBC 드라이버의 로드 , 데이터베이스로 연결하고 연결 끊기

<%@page contentType= “text/html; charset=euc-kr ”%><%@page import= “java.sql.* ”%><HTML> <HEAD><TITLE> 데이터베이스로 연결하기 </TITLE></HEAD> <BODY> <H3> 데이터베이스 연결 테스트 </H3> <% Class.forName( “com.mysql.jdbc.Driver ”); Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/webdb ”, “root ”, “1234 ”); if (conn != null) { out.println( “webdb 데이터베이스로 연결했습니다 .<BR> ”); conn.close(); out.println( “webdb 데이터베이스로의 연결을 끊었습니다 .<BR> ”); } else { out.println( “webdb 데이터베이스로 연결할 수 없습니다 .<BR> ”); } %> </BODY></HTML>

[ 그림 12-26] 예제 12-1 의 실행 결과

Page 47: 데이터베이스 사용하기

47/90

데이터베이스의 데이터를 읽어오는 방법 데이터베이스에 있는 데이터를 읽어오려면 우선 Connection 객체에 대해

createStatement 메서드를 호출해서 java.sql.Statement 타입 객체를 구한다 .

Statement 객체에 대해 executeQuery 메서드를 호출하면 데이터베이스에 있는 데이터를 읽어올 수 있다 .

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

Statement stmt = conn.createStatement();

getConnection 메서드가

리턴한 Connection 객체

Statement 객체를 만들어서 리턴하는

메서드

ResultSet rs = stmt.executeQuery( “select * from goodsinfo where code=‘10002’; ”);

select 문을 실행하는 메서드

Page 48: 데이터베이스 사용하기

48/90

데이터베이스의 데이터를 읽어오는 방법 executeQuery 메서드가 리턴한 ResultSet 객체에 대해 next 메서드를

호출하면 데이터베이스로부터 읽은 데이터를 순서대로 가져올 수 있다 .

• 다음 위치에 데이터가 있을 때는 true, 없을 때는 false 를 리턴한다 .

next 메서드를 호출한 다음에 ResultSet 객체에 대해 getInt, getString, get-

Float 등의 메서드를 호출하면 특정 데이터 항목 값을 가져올 수 있다 .

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

boolean exists = rs.next();

데이터베이스로부터 읽은 데이터의첫 번째 / 다음 행 위치로 이동하는 메서드

String code = rs.getString( “code ”);

문자 데이터를 가져오는 메서드

int price = rs.getInt( “price ”);

정수 데이터를 가져오는 메서드

Page 49: 데이터베이스 사용하기

49/90

데이터베이스의 데이터를 읽어오는 방법 필요한 데이터를 모두 가져온 다음에는 ResultSet 객체가 더 이상 필요치 않기

때문에 close 메서드를 호출해야 한다 .

Statement 객체도 모두 사용하고 난 다음에는 close 메서드를 호출해서 닫아야 한다 .

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

rs.close();

ResultSet 을 닫는 메서드

stmt.close();

Statement 를 닫는 메서드

Page 50: 데이터베이스 사용하기

50/90

데이터베이스의 데이터를 읽어오는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-2] 상품 정보 테이블을 읽는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr ” errorPage= “DBError.jsp ” %><%@page import= “java.sql.* ”%><% String code = request.getParameter( “code ”); Connection conn = null; Statement stmt = null; try { Class.forName( “com.mysql.jdbc.Driver ”); conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/webdb”, “root ”, “1234”); if (conn == null) throw new Exception( “ 데이터베이스에 연결할 수 없습니다 .<BR> ”); stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( “select * from goodsinfo where code = ‘” + code + “’; ”); if (rs.next()) { String title = rs.getString( “title ”); String writer = rs.getString( “writer ”); int price = rs.getInt( “price ”); request.setAttribute( “CODE ”, code); request.setAttribute( “TITLE ”, toUnicode(title)); request.setAttribute( “WRITER ”, toUnicode(writer)); request.setAttribute( “PRICE ”, new Integer(price)); } } finally { try { stmt.close(); } catch (Exception ignored) { } try { conn.close(); } catch (Exception ignored) { } } RequestDispatcher dispatcher = request.getRequestDispatcher(“GoodsInfoViewer.jsp”); dispatcher.forward(request, response);%>

<%! // ISO-8859-1 문자열을 Unicode 문자열로 바꾸는 메서드 private String toUnicode(String str) { try { byte[] b = str.getBytes( “ISO-8859-1 ”); return new String(b); } catch (java.io.UnsupportedEncodingException uee) { System.out.println(uee.getMessage()); return null; } }%>

Page 51: 데이터베이스 사용하기

51/90

데이터베이스의 데이터를 읽어오는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-3] 상품 정보를 보여주는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr ”%><HTML> <HEAD><TITLE> 상품 정보 </TITLE></HEAD> <BODY> <H3> 상품 정보 </H3> 코드 : ${CODE} <BR> 제목 : ${TITLE} <BR> 저자 : ${WRITER} <BR> 가격 : ${PRICE}원 <BR> </BODY></HTML>

[예제 12-4] 데이터베이스 에러를 출력하는 JSP 페이지

<%@page contentType=“text/html; charset=euc-kr” isErrorPage=“true” %><% response.setStatus(200); %><HTML> <HEAD><TITLE> 데이터베이스 에러 </TITLE></HEAD> <BODY> <H3> 데이터베이스 에러 </H3> 에러 메시지 : <%= exception.getMessage() %> </BODY></HTML>

[ 그림 12-27] 예제 12-2 ~ 예제 12-4 의 실행 결과

Page 52: 데이터베이스 사용하기

52/90

데이터베이스에 데이터를 입력하는 방법 데이터베이스에 데이터를 입력하려면 데이터를 읽어올 때와 마찬가지로 우선

Statement 객체를 구해야 한다 .

Statement 객체에 대해 executeUpdate 라는 메서드를 호출하면 데이터베이스에 새로운 데이터를 추가할 수 있다 .

executeUpdate 메서드를 이용해서 데이터를 입력한 다음에는 Statement 객체에 대해 close 메서드를 호출해야 한다 .

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

Statement stmt = conn.createStatement();

Statement 객체를 만드는 메서드

int rowNum = stmt.executeUpdate(

“insert goodsinfo (code, title, writer, price) values(‘10001’, ‘ 뇌를 자극하는 Java 프로그래밍’ , ‘김윤명’ , 27000);”);

insert 문을 실행하는 메서드

Page 53: 데이터베이스 사용하기

53/90

데이터베이스에 데이터를 입력하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[ 그림 12-13] 을참조해서 webdb데이터베이스로들어가세요

테이블을 생성하는 create문을 입력하세요정상적으로 테이블이

만들어지면이런 메시지가 나옵니다

mysql.exe 를 끝내세요

[ 그림 12-28] 회원 정보 테이블을 만드는 방법

Page 54: 데이터베이스 사용하기

54/90

데이터베이스에 데이터를 입력하는 방법

다음과 같이 작동하는 회원 가입 애플리케이션을 만들어보자 .

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[ 그림 12-29] 회원 가입 애플리케이션의 화면 설계

② 해당 정보가 DB 에 입력된 후 결과 화면이 나타납니다 .

① 회원 정보를 입력하고

‘확인’ 버튼을 누르면

Page 55: 데이터베이스 사용하기

55/90

데이터베이스에 데이터를 입력하는 방법 이 애플리케이션은 다음과 같은 세 개의 모듈로 구현한다 .

HTML 문서와 JSP 페이지의 URL 은 다음과 같이 정하기로 한다 .

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

http://localhost:8080/brain12/SubscriptionForm.html

회원 정보 입력 화면HTML 문서의 URL

http://localhost:8080/brain12/Subscription.jsp

회원 정보 DB 입력JSP 페이지의 URL

http://localhost:8080/brain12/SubscriptionResult.jsp

회원 가입 결과 출력JSP 페이지의 URL

Page 56: 데이터베이스 사용하기

56/90

데이터베이스에 데이터를 입력하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-5] 회원 정보를 입력받는 HTML 문서

<HTML> <HEAD> <META http-equiv= “Content-Type ” content= “text/html;charset=euc-kr ”> <TITLE>회원 가입 </TITLE> </HEAD> <BODY> <H4>회원 정보를 입력하세요 .</H4> <FORM ACTION=Subscription.jsp METHOD=POST> 이름 : <INPUT TYPE=TEXT NAME=name SIZE=10> <BR> 아이디 : <INPUT TYPE=TEXT NAME=id SIZE=8> <BR> 패스워드 : <INPUT TYPE=PASSWORD NAME=password SIZE=8> <BR> <INPUT TYPE=SUBMIT VALUE= ‘확인 ’ > <INPUT TYPE=RESET VALUE= ‘취소 ’ > </FORM> </BODY></HTML>

Page 57: 데이터베이스 사용하기

57/90

데이터베이스에 데이터를 입력하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-6] 회원 정보를 데이터베이스에 입력하는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr” errorPage= “DBError.jsp” %><%@page import= “java.sql.* ”%><% String name = request.getParameter( “name” ); String id = request.getParameter( “id ”); String password = request.getParameter( “password ”); if (name == null || id == null || password == null) throw new Exception( “ 데이터를 입력하세요 . ”); Connection conn = null; Statement stmt = null; try { Class.forName( “com.mysql.jdbc.Driver ”); conn = DriverManager.getConnection( “jdbc:mysql://localhost:3306/webdb ”, “root ”, “1234 ”); if (conn == null) throw new Exception( “ 데이터베이스에 연결할 수 없습니다 . ”); stmt = conn.createStatement(); String command = String.format( “insert into userinfo (name, id, password) values ( ‘%s ’, ‘%s ’, ‘%s ’); ”, name, id, password); int rowNum = stmt.executeUpdate(command); if (rowNum < 1) throw new Exception( “ 데이터를 DB 에 입력할 수 없습니다 . ”); } finally { try { stmt.close(); } catch (Exception ignored) { } try { conn.close(); } catch (Exception ignored) { } } response.sendRedirect( “SubscriptionResult.jsp ”);%>

Page 58: 데이터베이스 사용하기

58/90

데이터베이스에 데이터를 입력하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-7] 회원 가입 결과를 출력하는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr ”%><HTML> <HEAD><TITLE>회원 가입 결과 </TITLE></HEAD> <BODY> <H3>회원 가입 결과 </H3> 가입되었습니다 . </BODY></HTML>

[ 그림 12-31] 예제 12-5 ~ 예제 12-7 의 실행 결과

Page 59: 데이터베이스 사용하기

59/90

데이터베이스에 데이터를 입력하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[ 그림 12-32] 예제 12-5 ~ 예제 12-7 의 결과를 확인하는 방법

3) 입력된 데이터를 확인할 수 있습니다 .

1) webdb 데이터베이스로 들어가십시오 .

2) 회원 정보 테이블을 조회하는 select 문을 입력하십시오 .

Page 60: 데이터베이스 사용하기

60/90

데이터베이스의 데이터를 수정하고 삭제하는 방법 데이터베이스에 있는 데이터를 수정할 때는 executeUpdate 메서드에 update

문을 파라미터로 넘겨줘야 한다 .

데이터베이스에 있는 데이터 삭제할 때는 executeUpdate 메서드에 delete

문을 파라미터로 넘겨줘야 한다 .

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

int rowNum = stmt.executeUpdate( “update userinfo set password :=‘dalek’ where id = ‘rose ’; ”);

이 메서드를 이용해서 update 문을 실행할 수 있습니다

int rowNum = stmt.executeUpdate( “delete from userinfo where id = ‘rose ’; ”);

이 메서드를 이용해서 delete 문을 실행할 수도 있습니다 .

Page 61: 데이터베이스 사용하기

61/90

데이터베이스의 데이터를 수정하고 삭제하는 방법 데이터베이스에 저장되어 있는 상품 정보를 수정하는 애플리케이션을 작성

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

초기 화면

상품 정보 편집 화면

상품 정보 수정 결과 화면

[ 그림 12-33] 상품 정보 수정 애플리케이션의 화면 설계

Page 62: 데이터베이스 사용하기

62/90

데이터베이스의 데이터를 수정하고 삭제하는 방법

앞 애플리케이션을 다음과 같은 5 개의 모듈로 구성하기로 하자 .

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

http://localhost:8080/brain12/GIM/InitForm.html

상품코드 입력 화면HTML 문서의 URL

http://localhost:8080/brain12/GIM/Reader.jsp

상품 정보 DB 읽기JSP 페이지의 URL

http://localhost:8080/brain12/GIM/EditForm.jsp

상품 정보 편집 화면JSP 페이지의 URL

http://localhost:8080/brain12/GIM/Updater.jsp

상품 정보 DB 수정JSP 페이지의 URL

http://localhost:8080/brain12/GIM/UpdateResult.jsp

상품 정보 수정 결과JSP 페이지의 URL

Page 63: 데이터베이스 사용하기

63/90

데이터베이스의 데이터를 수정하고 삭제하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-8] 상품코드를 입력받는 HTML 문서

<HTML> <HEAD> <META http-equiv= “Content-Type ” content= “text/html;charset=euc-kr ”> <TITLE> 상품 정보 관리 </TITLE> </HEAD> <BODY> <H4> 상품코드를 입력하세요 .</H4> <FORM ACTION=Reader.jsp METHOD=GET> 상품코드 : <INPUT TYPE=TEXT NAME=code SIZE=5> <INPUT TYPE=SUBMIT VALUE= ‘확인 ’ > </FORM> </BODY></HTML>

Page 64: 데이터베이스 사용하기

64/90

데이터베이스의 데이터를 수정하고 삭제하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-9] 상품 정보 테이블을 읽는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr ” errorPage= “../DBError.jsp ” %><%@page import= “java.sql.* ”%><% String code = request.getParameter( “code ”); if (code == null) throw new Exception( “ 상품코드를 입력하세요 . ”); Connection conn = null; Statement stmt = null; try { Class.forName( “com.mysql.jdbc.Driver ”); conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/webdb ”, “root ”, “1234 ”); if (conn == null) throw new Exception( “ 데이터베이스에 연결할 수 없습니다 . ”); stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( “select * from goodsinfo where code = ‘” + code + “’; ”); if (!rs.next()) throw new Exception(“ 상품코드 ( ” + code + “) 에 해당하는 데이터가 없습니다 . ”); String title = rs.getString( “title ”); String writer = rs.getString( “writer ”); int price = rs.getInt( “price ”); request.setAttribute( “CODE ”, code); request.setAttribute( “TITLE ”, toUnicode(title)); request.setAttribute( “WRITER ”, toUnicode(writer)); request.setAttribute( “PRICE ”, new Integer(price)); } finally { try { stmt.close(); } catch (Exception ignored) { } try { conn.close(); } catch (Exception ignored) { } } RequestDispatcher dispatcher = request.getRequestDispatcher( “EditForm.jsp ”); dispatcher.forward(request, response);%>

<%! // ISO-8859-1 문자열을 Unicode 문자열로 바꾸는 메서드 private String toUnicode(String str) { try { byte[] b = str.getBytes( “ISO-8859-1 ”); return new String(b); } catch (java.io.UnsupportedEncodingException uee) { System.out.println(uee.getMessage()); return null; } }%>

Page 65: 데이터베이스 사용하기

65/90

데이터베이스의 데이터를 수정하고 삭제하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-10] 상품 정보 관리 화면을 제공하는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr ” %><HTML> <HEAD> <TITLE> 상품 정보 관리 </TITLE> </HEAD> <BODY> <H4> 상품 정보를 수정한 후 수정 버튼을 누르세요 .</H4> <FORM ACTION=Updater.jsp METHOD=POST> 코드 : <INPUT TYPE=TEXT NAME=code SIZE=5 VALUE= ‘${CODE} ’ READONLY=TRUE> <BR> 제목 : <INPUT TYPE=TEXT NAME=title SIZE=50 VALUE= ‘${TITLE} ’> <BR> 저자 : <INPUT TYPE=TEXT NAME=writer SIZE=20 VALUE= ‘${WRITER} ’> <BR> 가격 : <INPUT TYPE=TEXT NAME=price SIZE=8 VALUE= ‘${PRICE} ’>원 <BR> <INPUT TYPE=SUBMIT VALUE= ‘ 수정 ’ > </FORM> </BODY></HTML>

Page 66: 데이터베이스 사용하기

66/90

데이터베이스의 데이터를 수정하고 삭제하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-11] 상품 정보를 수정하는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr ” errorPage= “../DBError.jsp ” %><%@page import= “java.sql.* ”%><% reqeuest.setCharacterEncoding(“euc-kr”); String code = request.getParameter( “code ”); String title = request.getParameter( “title ”); String writer = request.getParameter( “writer ”); String price = request.getParameter( “price ”); if (code == null || title == null || writer == null || price == null) throw new Exception( “ 누락된 데이터가 있습니다 . ”); Connection conn = null; Statement stmt = null; try { Class.forName( “com.mysql.jdbc.Driver ”); conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/webdb ”, “root ”, “1234 ”); if (conn == null) throw new Exception( “ 데이터베이스에 연결할 수 없습니다 . ”); stmt = conn.createStatement(); String command = String.format( “update goodsinfo set title := ‘%s ’, writer := ‘%s ’, price := %s where code = ‘%s ’; ”, title, writer, price, code); int rowNum = stmt.executeUpdate(command); if (rowNum < 1) throw new Exception( “ 데이터를 DB 에 입력할 수 없습니다 .” ); } finally { try { stmt.close(); } catch (Exception ignored) { } try { conn.close(); } catch (Exception ignored) { } } response.sendRedirect( “UpdateResult.jsp?code= ” + code);%>

Page 67: 데이터베이스 사용하기

67/90

데이터베이스의 데이터를 수정하고 삭제하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

[예제 12-12] 상품 정보의 수정 결과를 보여주는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr ”%><HTML> <HEAD><TITLE> 상품 정보 관리 </TITLE></HEAD> <BODY> <H4> 상품 정보가 수정되었습니다 .</H4> 수정된 정보를 조회하려면 아래의 링크를 클릭하세요 . <BR><BR> <A HREF=Reader.jsp?code=${param.code}> 상품 정보 조회 </A> </BODY></HTML>

Page 68: 데이터베이스 사용하기

68/90

데이터베이스의 데이터를 수정하고 삭제하는 방법

4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법

Page 69: 데이터베이스 사용하기

69/90

데이터베이스에 동시에 접속할 수 있는 사용자 수는 한정되어 있는데 , 웹 서버에는 동시에 수백 , 수천의 사용자들이 접속할 수 있다 .

웹 애플리케이션이 실행될 때마다 데이터베이스로 새로운 접속을 맺는 것은 부하가 큰 작업 데이터베이스 몇 개의 접속을 맺어서 데이터베이스 커넥션 풀(Database Connection Pool) 에 저장해놓고 , 필요한 웹 애플리케이션이 빌려 쓰고 반환하는 방식을 사용 .

5. 데이터베이스 커넥션 풀의 설치와 사용

Page 70: 데이터베이스 사용하기

70/90

DBCP, Pool, Collections 모듈 다운로드 받기 웹 사이트 : http://www.apache.org/.

5. 데이터베이스 커넥션 풀의 설치와 사용

Page 71: 데이터베이스 사용하기

71/90

DBCP, Pool, Collections 모듈 다운로드 받기 앞 화면에서 Commons 프로젝트를 선택한다 ..

5. 데이터베이스 커넥션 풀의 설치와 사용

Page 72: 데이터베이스 사용하기

72/90

DBCP, Pool, Collections 모듈 다운로드 받기 DBCP 링크를 클릭하여 모듈을 찾아서 다운로드 한다 ..

5. 데이터베이스 커넥션 풀의 설치와 사용

Page 73: 데이터베이스 사용하기

73/90

DBCP, Pool, Collections 모듈 다운로드 받기 Pool 링크를 클릭하여 모듈을 찾아서 다운로드 한다 ..

5. 데이터베이스 커넥션 풀의 설치와 사용

Page 74: 데이터베이스 사용하기

74/90

DBCP, Pool, Collections 모듈 다운로드 받기

Collections 링크를 클릭하여 모듈을 찾아서 다운로드 한다 ..

5. 데이터베이스 커넥션 풀의 설치와 사용

Page 75: 데이터베이스 사용하기

75/90

DBCP, Pool, Collections 모듈 설치하기 .

5. 데이터베이스 커넥션 풀의 설치와 사용

Page 76: 데이터베이스 사용하기

76/90

데이터베이스 커넥션 풀을 사용하는 방법 데이터베이스 커넥션 풀을 이용한 데이터베이스 사용법은 데이터베이스

커넥션 풀을 사용하지 않을 때와 비슷하다 .• 차이점이라면 Class.forName 과 DriverManager, getConnection 메서드에 넘겨주는

파라미터 값이 다르다는 정도이다 .

5. 데이터베이스 커넥션 풀의 설치와 사용

[ 그림 12-44] 데이터베이스 커넥션 풀을 통해 데이터베이스를 사용하는 방법

Page 77: 데이터베이스 사용하기

77/90

데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법 데이터베이스 커넥션 풀 생성은 우선 org.apache.commons.pool.impl 패키지에

속하는 GenericObjectPool 클래스나 StackObjectPool 클래스의 객체를 생성

• GenericObjectPool 클래스는 데이터베이스 커넥션 풀을 표현하는 것이 아니라 일반 자바 객체를 담는 풀을 표현한다 .

데이터베이스 커넥션을 생성하는 객체는 DBCP 모듈에 속하는 org.apache.-

commons.dbcp 패키지의 DriverManagerConnectionFactory 클래스를 이용해서 만들 수 있다 .

5. 데이터베이스 커넥션 풀의 설치와 사용

GenericObjectPool objectPool = new GenericObjectPool();

GenericObjectPool 객체를 생성합니다 .

DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory( “jdbc:mysql://localhost:3306/webdb ”, “root ”, “1234 ”);

데이터베이스 URL

아이디 패스워드

Page 78: 데이터베이스 사용하기

78/90

데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법 앞에서 만든 두 객체가 함께 작동시키려면 org.apache.commons.dbcp

패키지에 속하는 PoolableConnectionFactory 클래스의 객체를 만들어야 한다 .

다음은 PoolingDriver 객체를 생성해서 GenericObjectPool 객체를 웹 컨테이너에 등록하는 것이다 .

5. 데이터베이스 커넥션 풀의 설치와 사용

new PoolableConnectionFactory(connectionFactory, objectPool, null, null, false, true);

DriverManagerConnectionFactory 객체

GenericObjectPool 객체

PoolingDriver driver = new PoolingDriver();

PoolingDriver 객체를 생성한다

driver.registerPool( “/webdb_pool ”, objectPool);

데이터베이스 커넥션 풀의 이름

GenericObjectPool 객체

Page 79: 데이터베이스 사용하기

79/90

데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법

5. 데이터베이스 커넥션 풀의 설치와 사용

[예제 12-13] 데이터베이스 커넥션 풀을 생성하고 등록하는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr ”%><%@page import= “org.apache.commons.dbcp.* ”%><%@page import= “org.apache.commons.pool.impl.* ”%><% GenericObjectPool objectPool = new GenericObjectPool(); DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory( “jdbc:mysql://localhost:3306/webdb ”, “root ”, “1234 ”); new PoolableConnectionFactory(connectionFactory, objectPool, null, null, false, true); PoolingDriver driver = new PoolingDriver(); driver.registerPool( “/webdb_pool ”, objectPool);%><HTML> <HEAD><TITLE> 데이터베이스 커넥션 풀 생성하기 </TITLE></HEAD> <BODY> <H3> 데이터베이스 커넥션 풀 생성하기 </H3> 데이터베이스 커넥션 풀을 생성하고 등록했습니다 . <BR><BR> 풀 이름 : /webdb_pool </BODY></HTML>

[ 그림 12-45] 예제 12-13 의 실행 결과

Page 80: 데이터베이스 사용하기

80/90

데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법

5. 데이터베이스 커넥션 풀의 설치와 사용

[예제 12-14] 데이터베이스 커넥션 풀 테스트하기 ( 1 )

<%@page contentType= “text/html; charset=euc-kr ” errorPage= “DBError.jsp ” %><%@page import= “java.sql.* ”%><HTML> <HEAD><TITLE> 데이터베이스 커넥션 풀 테스트 </TITLE></HEAD> <BODY> <H3> 데이터베이스 커넥션 풀 테스트 </H3> <% Class.forName( “org.apache.commons.dbcp.PoolingDriver ”); Connection conn = DriverManager.getConnection( “jdbc:apache:commons:dbcp:/webdb_pool ”); if (conn != null) { out.println( “ 연결 취득 완료 <BR> ”); conn.close(); out.println( “ 연결 반환 완료 <BR> ”); } else { out.println( “ 연결 취득 실패 <BR> ”); } %> </BODY></HTML>

[ 그림 12-46] 예제 12-14 의 실행 결과 - 올바른 결과

[ 그림 12-47] 예제 12-14 의 실행 결과 - 에러가 발생했을 때

Page 81: 데이터베이스 사용하기

81/90

데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법

5. 데이터베이스 커넥션 풀의 설치와 사용

[예제 12-15] 상품 정보 테이블을 읽는 JSP 페이지 - 데이터베이스 커넥션 풀 사용

<%@page contentType= “text/html; charset=euc-kr ” errorPage= “DBError.jsp ” %><%@page import= “java.sql.* ”%><% String code = request.getParameter( “code ”); Connection conn = null; Statement stmt = null; try { Class.forName( “org.apache.commons.dbcp.PoolingDriver ”); conn = DriverManager.getConnection(“jdbc:apache:commons:dbcp:/webdb_pool ”); if (conn == null) throw new Exception( “ 데이터베이스에 연결할 수 없습니다 .<BR> ”); stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( “select * from goodsinfo where code = ‘” + code + “’; ”); if (rs.next()) { String title = rs.getString( “title ”); String writer = rs.getString( “writer ”); int price = rs.getInt( “price ”); request.setAttribute( “CODE ”, code); request.setAttribute( “TITLE ”, toUnicode(title)); request.setAttribute( “WRITER ”, toUnicode(writer)); request.setAttribute( “PRICE ”, new Integer(price)); } } finally { try { stmt.close(); } catch (Exception ignored) { } try { conn.close(); } catch (Exception ignored) { } } RequestDispatcher dispatcher = request.getRequestDispatcher( “GoodsInfoViewer.jsp ”); dispatcher.forward(request, response);%>

<%! // ISO-8859-1 문자열을 Unicode 문자열로 바꾸는 메서드 private String toUnicode(String str) { try { byte[] b = str.getBytes( “ISO-8859-1 ”); return new String(b); } catch (java.io.UnsupportedEncodingException uee) { System.out.println(uee.getMessage()); return null; } }%>

Page 82: 데이터베이스 사용하기

82/90

데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법

5. 데이터베이스 커넥션 풀의 설치와 사용

[ 그림 12-48] 예제 12-15 의 실행 결과 - 올바른 결과

[ 그림 12-49] 예제 12-15 의 실행 결과 - 에러가 발생했을 때

Page 83: 데이터베이스 사용하기

83/90

데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법

5. 데이터베이스 커넥션 풀의 설치와 사용

[예제 12-16] jspInit 메서드 안에서 데이터베이스 커넥션 풀을 생성하고 등록하는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr ”%><%@page import= “org.apache.commons.dbcp.* ”%><%@page import= “org.apache.commons.pool.impl.* ”%><%! public void jspInit() { GenericObjectPool objectPool = new GenericObjectPool(); DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory( “jdbc:mysql://localhost:3306/webdb ”, “root ”, “1234 ”); new PoolableConnectionFactory(connectionFactory, objectPool, null, null, false, true); PoolingDriver driver = new PoolingDriver(); driver.registerPool( “/webdb_pool ”, objectPool); }%>

[ 그림 12-50] 웹 컨테이너가 시작될 때 JSP 페이지가 초기화되도록 만드는 방법

웹 컨테이너가 시작될 때 서블릿이 초기화되도록

만드는 값

Page 84: 데이터베이스 사용하기

84/90

JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법 JOCL 파일을 이용하면 프로그램을 작성하지 않고 DBCP 데이터베이스

커넥션 풀을 생성하고 등록할 수 있다 .

위 코드를 자세히 살펴보면 DBCP 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램과 동일한 부분이 많이 있음을 알 수 있다 .

JOCL 파일은 WEB-INF/classes 서브디렉터리 안에 저장해야 한다 .

5. 데이터베이스 커넥션 풀의 설치와 사용

[ 그림 12-51] JOCL 파일의 예

Page 85: 데이터베이스 사용하기

85/90

JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법

5. 데이터베이스 커넥션 풀의 설치와 사용

Page 86: 데이터베이스 사용하기

86/90

JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법 JOCL 파일을 사용할 때는 JDBC 드라이버 , DBCP, Pool, Collections 모듈을

JOCL 파일이 속하는 웹 애플리케이션 디렉터리의 WEB-INF/lib 디렉터리로 옮겨와야 한다 ..

5. 데이터베이스 커넥션 풀의 설치와 사용

Page 87: 데이터베이스 사용하기

87/90

JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법

5. 데이터베이스 커넥션 풀의 설치와 사용

[예제 12-17] 데이터베이스 커넥션 풀 테스트하기 (2)

<%@page contentType= “text/html; charset=euc-kr ” errorPage= “DBError.jsp ” %><%@page import= “java.sql.* ”%><HTML> <HEAD><TITLE> 데이터베이스 커넥션 풀 테스트 </TITLE></HEAD> <BODY> <H3> 데이터베이스 커넥션 풀 테스트 </H3> <% Class.forName( “org.apache.commons.dbcp.PoolingDriver ”); Connection conn = DriverManager.getConnection(“jdbc:apache:commons:dbcp:/wdbpool ”); if (conn != null) { out.println( “ 연결 취득 완료 <BR> ”); conn.close(); out.println( “ 연결 반환 완료 <BR> ”); } else { out.println( “ 연결 취득 실패 <BR> ”); } %> </BODY></HTML>

[ 그림 12-54] 예제 12-17 의 실행 결과

Page 88: 데이터베이스 사용하기

88/90

JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법

5. 데이터베이스 커넥션 풀의 설치와 사용

[예제 12-18] 회원 정보를 입력하는 JSP 페이지

<%@page contentType= “text/html; charset=euc-kr ” errorPage= “DBError.jsp ” %><%@page import= “java.sql.* ”%><% String name = request.getParameter( “name ”); String id = request.getParameter( “id ”); String password = request.getParameter( “password ”); if (name == null || id == null || password == null) throw new Exception( “ 데이터를 입력하세요 . ”); Connection conn = null; Statement stmt = null; try { Class.forName( “org.apache.commons.dbcp.PoolingDriver ”); conn = DriverManager.getConnection(“jdbc:apache:commons:dbcp:/wdbpool ”); if (conn == null) throw new Exception( “ 데이터베이스에 연결할 수 없습니다 . ”); stmt = conn.createStatement(); String command = String.format( “insert into userinfo ” + “(name, id, password) values ( ‘%s ’, ‘%s ’, ‘%s ’); ”, name, id, password); int rowNum = stmt.executeUpdate(command); if (rowNum < 1) throw new Exception( “ 데이터를 DB 에 입력할 수 없습니다 . ”); } finally { try { stmt.close(); } catch (Exception ignored) { } try { conn.close(); } catch (Exception ignored) { } } response.sendRedirect( “SubscriptionResult.jsp ”);%>

Page 89: 데이터베이스 사용하기

89/90

5. 데이터베이스 커넥션 풀의 설치와 사용

JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법

[ 그림 12-55] 예제 12-15, 예제 12-18, 예제 12-7 의 실행 결과

Page 90: 데이터베이스 사용하기

뇌를 자극하는 JSP & Servlet