데이터베이스 사용하기
DESCRIPTION
12. 데이터베이스 사용하기 . 학습목표 데이터베이스를 이용하면 파일보다 훨씬 더 체계적이고 구조적인 방법으로 데이터를 저장하고 관리할 수 있다 . 그래서 웹 프로그래밍에서도 데이터베이스를 사용해야 할 경우가 많이 있는데 이번 장에서는 그 방법을 배워보자 . 내용 데이터베이스에 대하여 MySQL 설치하기 Connector/J 설치하기 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스 커넥션 풀의 설치와 사용. 1. 데이터베이스에 대하여. - PowerPoint PPT PresentationTRANSCRIPT
2/80
Contents
학습목표
데이터베이스를 이용하면 파일보다 훨씬 더 체계적이고 구조적인 방법으로
데이터를 저장하고 관리할 수 있다 . 그래서 웹 프로그래밍에서도
데이터베이스를 사용해야 할 경우가 많이 있는데 이번 장에서는 그 방법을
배워보자 .
내용 데이터베이스에 대하여 MySQL 설치하기 Connector/J 설치하기 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스 커넥션 풀의 설치와 사용
3/85
데이터베이스 (database) 는 파일과 마찬가지로 보조기억장치에 데이터를 저장하는
수단이다 . 데이터베이스는 크게 계층형 데이터베이스 , 관계형 데이터베이스 , 객체지향
데이터베이스로 구분되는데 , 이 책에서는 그 중 관계형 테이터베이스인 MySQL 을
사용할 것이다 . 자바 프로그램에서 MySQL 을 사용하려면 JDBC 드라이버가 필요하다 .
1. 데이터베이스에 대하여
[ 그림 12-1] JDBC 드라이버의 역할
4/85
MySQL 다운로드 받기 웹 브라우저를 열고 http://dev.mysql.com/downloads/라는 URL 을 입력하면 다음과 같은
웹 페이지가 나타난다 .
2. MySQL 설치하기
7/85
MySQL 다운로드 받기 앞 화면에서 Windows 플랫폼을 선택하면 Windows 플랫폼에 맞는 MySQL 의 여러
에디션이 표시된 화면이 나타난다 .
2. MySQL 설치하기
9/85
MySQL 다운로드 받기 앞 화면 아래쪽의 ‘ No Thanks’ 로 시작하는 링크를 클릭하면 MySQL 을 다운로드 받을
수 있는 다음과 같은 웹 페이지가 나타난다 .
2. MySQL 설치하기
10/85
MySQL 다운로드 받기 앞 화면에서 HTTP 나 FTP 링크 중 하나를 선택하면 다음과 같은 창이 나타나는데 ,
여기에서 저장 버튼을 누르면 다운로드가 시작된다 .
2. MySQL 설치하기
12/85
MySQL 설치하기 앞 화면에서 ‘ Typical’ 옵션을 선택하고 ‘ Next’ 버튼을 누르면 화면이 왼쪽 그림처럼
바뀌고 , ‘Install’ 버튼을 누르면 화면이 오른쪽 그림처럼 바뀌면서 설치가 진행된다 .
2. MySQL 설치하기
13/85
MySQL 설치하기 설치가 끝나면 왼쪽 화면이 나타나고 , ‘Next’ 버튼을 누르면 화면이 오른쪽 그림처럼
바뀐다 . 여기에서 ‘ Finish’ 버튼을 누르면 MySQL 의 구성 프로그램이 시작된다 .
2. MySQL 설치하기
14/85
MySQL 의 구성 정보 입력하기 MySQL 구성 프로그램이 시작되면 왼쪽 창이 나타나고 , ‘Next’ 버튼을 누르면 화면이
오른쪽 그림처럼 바뀐다 .
2. MySQL 설치하기
15/85
MySQL 의 구성 정보 입력하기 앞 화면에서 ‘ Next’ 버튼을 누르면 창이 왼쪽 그림처럼 바뀌는데 , MySQL 가 윈도우
서비스로서 실행되도록 만들기 위해 아래쪽 체크박스를 선택해서 오른쪽 그림처럼
만든다 .
2. MySQL 설치하기
16/85
MySQL 의 구성 정보 입력하기 앞 화면에서 ‘ Next’ 버튼을 누르면 창이 왼쪽 그림처럼 바뀌는데 , 여기에서 새로운 root
사용자 암호를 두 번 입력하고 ‘ Next’ 버튼을 누르면 화면이 오른쪽 그림처럼 바뀐다 .
• [ 주의 ] 암호는 나중에 필요하므로 잘 기억해둔다 .
2. MySQL 설치하기
17/85
MySQL 의 구성 정보 입력하기 앞 화면에서 ‘ Execute’ 버튼을 누르면 앞에서 구성 정보의 설정이 시작되고 , 설정이
끝나면 화면이 오른쪽 그림처럼 바뀐다 .
오른쪽 화면에서 ‘ Finish’ 버튼을 누르면 MySQL 구성 프로그램이 끝난다 .
2. MySQL 설치하기
18/85
MySQL 시작하기 윈도우즈 운영체제의 시작 메뉴에서 제어판 → 관리 도구 → 서비스를 선택한다 .
상태가 시작됨으로 표시되어 있지 않으면 MySQL 이 작동되지 않고 있는 것이다 . 그럴
때는 MySQL 항목을 더블 클릭해서 MySQL 속성 창을 연다 .
2. MySQL 설치하기
[ 그림 12-9] 윈도우즈 운영체제의 서비스로 등록된 MySQL
19/85
MySQL 시작하기 MySQL 속성 창의 중간쯤 보면 시작 , 중지 , 일시 중지 , 계속이라는 4 개의 버튼이
있는데 이 중 시작 버튼을 누르면 MySQL 이 시작된다 .
2. MySQL 설치하기
[ 그림 12-10] MySQL 서비스를 선택했을 때 나타나는 윈도우
20/85
데이터베이스 만들기 데이터베이스를 만들기 위해서는 MySQL 에 포함되어 있는 mysqladmin.exe 라는
프로그램을 이용해야 한다 . 이 프로그램은 명령 프롬프트 창에서 실행해야 하며 , 다음과 같은 형태의 명령을 입력해서 데이터베이스를 만들 수 있다 .
2. MySQL 설치하기
mysqladmin -u root -p create webdb
사용자의 ID가root 라는 뜻패스워드를 입력받겠다는 뜻
webdb 라는 이름의 데이터베이스를만들라는 뜻
① 데이터베이스를 생성하라는 명령을 입력합니다
② 패스워드를 입력합니다
[ 그림 12-11] 데이터베이스를 만드는 방법
21/85
데이터베이스에 데이터 저장하기 데이터베이스는 정형화된 구조의 데이터를 저장하기에 적합한 저장 수단이다 .
관계형 데이터베이스에 데이터를 저장할 때는 같은 구조를 갖는 데이터들끼리 모아
놓아야 하는데 , 이런 데이터의 모음을 테이블 (table) 이라고 한다 .
2. MySQL 설치하기
[ 그림 12-12] 관계형 데이터베이스에 저장하기에 적합한 데이터
22/85
데이터베이스에 데이터 저장하기 테이블을 생성하기 위해서는 먼저 테이블의 구조를 만들어야 하는데 , 이 구조는 데이터
항목의 이름 , 타입 , 최대 크기에 의해 정해진다 .
테이블을 설계한 다음에 해야 할 일은 데이터베이스 안으로 들어가서 실제로 테이블을
생성하는 것이다 . 그런 일은 mysql.exe 프로그램을 이용해서 할 수 있다 .
2. MySQL 설치하기
23/85
데이터베이스에 데이터 저장하기 데이터베이스에 들어가기 위해서는 명령 프롬프트 창에서 다음과 같은 명령을 입력해야
한다 .
• 위 명령을 입력하면 root 사용자의 암호를 묻는 프롬프트가 나타나고 , 암호를 입력하면 mysql> 프롬프트가 나타난다 .
mysql> 프롬프트 다음에 use 라는 명령을 다음과 같은 형식으로 입력하면
데이터베이스에 들어갈 수 있다 .
• 데이터베이스를 빠져나오려면 mysql> 프롬프트 다음에 quit 라고 입력하면 된다 .
2. MySQL 설치하기
mysql -u root -p
사용자의 ID가root 라는 뜻
패스워드를 입력받겠다는 뜻
use webdb
데이터베이스의 이름
24/85
데이터베이스에 데이터 저장하기
2. MySQL 설치하기
[ 그림 12-12] 데이터베이스에 들어가고 나오는 방법
1) mysql.exe 프로그램을 실행합니다 .
2) 패스워드를 입력합니다 .
3) use 명령을 이용해서 특정 데이터베이스로 들어갑니다 .4) quit 명령을 실행하면 mysql.exe 프로그램이 끝납니다 .
25/85
데이터베이스에 데이터 저장하기 테이블을 만들기 위해서는 데이터베이스 안으로 들어가서 다음과 같은 형식의 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 이라고 쓰세요 .
26/85
데이터베이스에 데이터 저장하기 키로 사용할 데이터 항목을 지정하려면 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 항목을 키로 지정하는 부분입니다
27/85
데이터베이스에 데이터 저장하기 다음 그림은 create 문을 이용해서 실제로 테이블을 만드는 예이다 .
2. MySQL 설치하기
[ 그림 12-13] 을 참조해서webdb 데이터베이스로 들어가세요
테이블을 생성하는 create 문을입력하세요 .
정상적으로 테이블이 만들어지면이런 메시지가 나옵니다 .
[ 그림 12-14] 테이블을 만드는 방법
28/85
데이터베이스에 데이터 저장하기 테이블이 올바르게 만들어졌는지 확인하기 위해서는 desc 명령을 사용하면 된다 .
2. MySQL 설치하기
테이블의 구조
[ 그림 12-15] 테이블의 구조를 확인하는 방법
29/85
데이터베이스에 데이터 저장하기 테이블에 데이터를 입력하려면 다음과 같은 형식의 insert 문을 쓰면 된다 .
• 문자 데이터는 반드시 작은따옴표로 묶어서 써야 한다 .
2. MySQL 설치하기
insert into goodsinfo (code, title, writer, price) values ( ‘10001 ’, ‘ 뇌를 자극하는 Java 프로그래밍 ’ , ‘김윤명 ’ , 27000);
[ 그림 12-16] 테이블에 데이터를 입력하는 방법
insert 문을 시작하는 키워드
테이블 이름
항목 이름
데이터키워드
30/85
데이터베이스에 데이터 저장하기 테이블에 저장한 데이터를 읽어오려면 다음과 같은 형식의 select 문을 이용하면 된다 .
다음과 같이 와일드카드 문자 (*) 를 쓰면 테이블의 모든 항목을 읽어올 수 있다 .
특정 데이터만 읽어오려면 테이블 이름 뒤에 다음과 같은 형식의 where 절을 쓰면 된다 .
2. MySQL 설치하기
select name, price from goodsinfo;
select 문을 시작하는 키워드
항목 이름 테이블 이름키워드
select * from goodsinfo;
모든 데이터 항목을 뜻하는와일드카드 문자
select * from goodsinfo where price > 20000;
키워드 검색 조건
32/85
데이터베이스에 데이터 저장하기 테이블에 있는 기존의 데이터를 수정하려면 다음과 같은 형식의 update 문을 쓰면 된다 .
2. MySQL 설치하기
update goodsinfo set writer:= ‘토마스 코멘 외 3 명 ’ , price:=33600 where code = ‘10005’;
update 문을 시작하는 키워드
테이블 이름
키워드
항목 이름 :=새로운 값
포맷으로 값을 지정
where 조건절
[ 그림 12-18] 테이블의 데이터를 수정하는 방법
33/85
데이터베이스에 데이터 저장하기 테이블에 있는 데이터를 삭제하기 위해서는 다음과 같은 형식의 delete 문을 사용하면
된다 .
2. MySQL 설치하기
delete from goodsinfo where code = ‘10005 ’;
delete 문을 시작하는 키워드
테이블 이름
where 조건절
[ 그림 12-19] 테이블의 데이터를 삭제하는 방법
34/85
JDBC 드라이버 다운로드 받기 웹 브라우저를 열고 http://dev.mysql.com/downloads/라는 URL 을 입력하면 다음과 같은
웹 페이지가 나타난다 .
3. Connector/J 설치하기
36/85
JDBC 드라이버 다운로드 받기 최신 버전의 Connector/J 에 대한 링크를 클릭해서 Connector/J 를 다운로드 받는다 .
3. Connector/J 설치하기
40/85
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 드라이버의 클래스 이름
41/85
JDBC 드라이버를 로드하고 , 데이터베이스로 연결하고 , 연결을 끊는 방법
데이터베이스로 연결을 맺기 위해서는 java.sql.DriverManager 클래스의 getConnection
메서드를 호출해야 한다 .
• 이 메서드는 데이터베이스로의 연결에 성공하면 java.sql.Connection 인터페이스 타입의 객체를
만들어서 리턴한다 .
데이터베이스로의 연결을 끊기 위해서는 Connection 객체에 대해 close 메서드를
호출하면 된다 .
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법
Connection conn = DriverManager.getConnection(“jdbc:mysql://219.153.12.14:3306/webdb ”, “root ”, “1234 ”);
데이터베이스 URL
사용자 ID 패스워드
conn.close()
데이터베이스로의
연결을 끊는 메서드
42/85
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 의 실행 결과
43/85
데이터베이스의 데이터를 읽어오는 방법 데이터베이스에 있는 데이터를 읽어오려면 우선 Connection 객체에 대해 createState-
ment 메서드를 호출해서 java.sql.Statement 타입 객체를 구해야 한다 .
Statement 객체에 대해 executeQuery 메서드를 호출하면 데이터베이스에 있는
데이터를 읽어올 수 있다 .
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법
Statement stmt = conn.createStatement();
getConnection 메서드가
리턴한 Connection 객체
Statement 객체를 만들어서 리턴하는
메서드
ResultSet rs = stmt.executeQuery( “select * from goodsinfo where code=‘10002’; ”);
select 문을 실행하는 메서드
44/85
데이터베이스의 데이터를 읽어오는 방법 executeQuery 메서드가 리턴한 ResultSet 객체에 대해 next 메서드를 호출하면
데이터베이스로부터 읽은 데이터를 순서대로 가져올 수 있다 .
• 이 메서드는 다음 위치에 데이터가 있을 때는 true, 없을 때는 false 를 리턴한다 .
next 메서드를 호출한 다음에 ResultSet 객체에 대해 getInt, getString, getFloat 등의
메서드를 호출하면 특정 데이터 항목 값을 가져올 수 있다 .
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법
boolean exists = rs.next();
데이터베이스로부터 읽은 데이터의첫 번째 / 다음 행 위치로 이동하는 메서드
String code = rs.getString( “code ”);
문자 데이터를 가져오는 메서드
int price = rs.getInt( “price ”);
정수 데이터를 가져오는 메서드
45/85
데이터베이스의 데이터를 읽어오는 방법 필요한 데이터를 모두 가져온 다음에는 ResultSet 객체가 더 이상 필요치 않기 때문에
close 메서드를 호출해야 한다 .
Statement 객체도 모두 사용하고 난 다음에는 close 메서드를 호출해서 닫아야 한다 .
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법
rs.close();
ResultSet 을 닫는 메서드
stmt.close();
Statement 를 닫는 메서드
46/85
데이터베이스의 데이터를 읽어오는 방법
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; } }%>
47/85
데이터베이스의 데이터를 읽어오는 방법
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 의 실행 결과
48/85
데이터베이스에 데이터를 입력하는 방법 데이터베이스에 데이터를 입력하려면 데이터를 읽어올 때와 마찬가지로 우선 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 문을 실행하는 메서드
49/85
데이터베이스에 데이터를 입력하는 방법
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법
[ 그림 12-13] 을참조해서 webdb데이터베이스로들어가세요
테이블을 생성하는 create문을 입력하세요정상적으로 테이블이
만들어지면이런 메시지가 나옵니다
mysql.exe 를 끝내세요
[ 그림 12-28] 회원 정보 테이블을 만드는 방법
50/85
데이터베이스에 데이터를 입력하는 방법 다음과 같이 작동하는 회원 가입 애플리케이션을 만들어보자 .
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법
[ 그림 12-29] 회원 가입 애플리케이션의 화면 설계
② 해당 정보가 DB 에 입력된 후 결과 화면이 나타납니다 .
① 회원 정보를 입력하고
‘확인’ 버튼을 누르면
51/85
데이터베이스에 데이터를 입력하는 방법 이 애플리케이션은 다음과 같은 세 개의 모듈로 구현한다 .
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
52/85
데이터베이스에 데이터를 입력하는 방법
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>
53/85
데이터베이스에 데이터를 입력하는 방법
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 ”);%>
54/85
데이터베이스에 데이터를 입력하는 방법
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 의 실행 결과
55/85
데이터베이스에 데이터를 입력하는 방법
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법
[ 그림 12-32] 예제 12-5 ~ 예제 12-7 의 결과를 확인하는 방법
3) 입력된 데이터를 확인할 수 있습니다 .
1) webdb 데이터베이스로 들어가십시오 .
2) 회원 정보 테이블을 조회하는 select 문을 입력하십시오 .
56/85
데이터베이스의 데이터를 수정하고 삭제하는 방법 데이터베이스에 있는 데이터를 수정할 때는 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 문을 실행할 수도 있습니다 .
57/85
데이터베이스의 데이터를 수정하고 삭제하는 방법 데이터베이스에 저장되어 있는 상품 정보를 수정하는 애플리케이션을 작성해보자 .
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법
초기 화면
상품 정보 편집 화면
상품 정보 수정 결과 화면
[ 그림 12-33] 상품 정보 수정 애플리케이션의 화면 설계
58/85
데이터베이스의 데이터를 수정하고 삭제하는 방법 앞 애플리케이션을 다음과 같은 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
59/85
데이터베이스의 데이터를 수정하고 삭제하는 방법
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>
60/85
데이터베이스의 데이터를 수정하고 삭제하는 방법
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; } }%>
61/85
데이터베이스의 데이터를 수정하고 삭제하는 방법
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>
62/85
데이터베이스의 데이터를 수정하고 삭제하는 방법
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);%>
63/85
데이터베이스의 데이터를 수정하고 삭제하는 방법
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>
65/85
데이터베이스에 동시에 접속할 수 있는 사용자 수는 한정되어 있는데 , 웹 서버에는
동시에 수백 , 수천의 사용자들이 접속할 수 있다 . 웹 애플리케이션이 실행될 때마다 데이터베이스로 새로운 접속을 맺는 것은 현실적으로
불가능하므로 , 데이터베이스 몇 개의 접속을 맺어서 데이터베이스 커넥션 풀 (Database
Connection Pool) 에 저장해놓고 , 필요한 웹 애플리케이션이 빌려 쓰고 반환하는 방식을
사용해야 한다 .
5. 데이터베이스 커넥션 풀의 설치와 사용
66/85
DBCP, Pool, Collections 모듈 다운로드 받기 웹 브라우저를 열고 아파치 사이트의 URL 인 http://www.apache.org/를 입력한다 .
5. 데이터베이스 커넥션 풀의 설치와 사용
70/85
DBCP, Pool, Collections 모듈 다운로드 받기 Collections 링크를 클릭하여 모듈을 찾아서 다운로드 한다 .
5. 데이터베이스 커넥션 풀의 설치와 사용
72/85
데이터베이스 커넥션 풀을 사용하는 방법 데이터베이스 커넥션 풀을 이용해서 데이터베이스에 데이터를 읽고 쓰는 방법은
데이터베이스 커넥션 풀을 사용하지 않을 때와 비슷하다 . 차이점이라면 Class.forName
과 DriverManager, getConnection 메서드에 넘겨주는 파라미터 값이 다르다는 정도이
다 .
5. 데이터베이스 커넥션 풀의 설치와 사용
[ 그림 12-44] 데이터베이스 커넥션 풀을 통해 데이터베이스를 사용하는 방법
73/85
데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법 데이터베이스 커넥션 풀을 만들기 위해서는 우선 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 아이디 패스워
드
74/85
데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법 앞에서 만든 두 객체가 함께 작동하도록 만들기 위해서는 다음과 같은 방법으로 org.a-
pache.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 객체
75/85
데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법
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 의 실행 결과
76/85
데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법
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 의 실행 결과 - 에러가 발생했을 때
77/85
데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법
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; } }%>
78/85
데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법
5. 데이터베이스 커넥션 풀의 설치와 사용
[ 그림 12-48] 예제 12-15 의 실행 결과 - 올바른 결과
[ 그림 12-49] 예제 12-15 의 실행 결과 - 에러가 발생했을 때
79/85
데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법
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 페이지가 초기화되도록 만드는 방법
웹 컨테이너가 시작될 때 서블릿이 초기화되도록
만드는 값
80/85
JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법 JOCL 파일을 이용하면 프로그램을 작성하지 않고 DBCP 데이터베이스 커넥션 풀을
생성하고 등록할 수 있다 .
위 코드를 자세히 살펴보면 DBCP 데이터베이스 커넥션 풀을 생성하고 등록하는
프로그램과 동일한 부분이 많이 있음을 알 수 있다 . JOCL 파일은 WEB-INF/classes 서브디렉터리 안에 저장해야 한다 .
5. 데이터베이스 커넥션 풀의 설치와 사용
[ 그림 12-51] JOCL 파일의 예
82/85
JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법 JOCL 파일을 사용할 때는 앞에서 설치했던 JDBC 드라이버 , DBCP, Pool, Collections
모듈을 JOCL 파일이 속하는 웹 애플리케이션 디렉터리의 WEB-INF/lib 디렉터리로
옮겨와야 한다 .
5. 데이터베이스 커넥션 풀의 설치와 사용
83/85
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 의 실행 결과
84/85
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 ”);%>
85/85
5. 데이터베이스 커넥션 풀의 설치와 사용
JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법
[ 그림 12-55] 예제 12-15, 예제 12-18, 예제 12-7 의 실행 결과