12 데이터베이스 사용하기
학습목표 데이터베이스를 이용하면 파일보다 훨씬 더 체계적이고 구조적인 방법으 로 데이터를 저장하고 관리할 수 있다. 그래서 웹 프로그래밍에서도 데이 터베이스를 사용해야 할 경우가 많이 있는데 이번 장에서는 그 방법을 배 워보자. 내용 데이터베이스에 대하여 MySQL 설치하기 Connector/J 설치하기 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스 커넥션 풀의 설치와 사용
1. 데이터베이스에 대하여 데이터베이스(database)는 파일과 마찬가지로 보조기억장치에 데이터를 저장하는 수단 이다. 데이터베이스는 크게 계층형 데이터베이스, 관계형 데이터베이스, 객체지향 데이터베이 스로 구분되는데, 이 책에서는 그 중 관계형 테이터베이스인 MySQL 을 사용할 것이다. 자바 프로그램에서 MySQL을 사용하려면 JDBC 드라이버가 필요하다. [그림 12-1] JDBC 드라이버의 역할
2. MySQL 설치하기 MySQL 다운로드 받기 웹 브라우저를 열고 http://dev.mysql.com/downloads/라는 URL을 입력하면 다음과 같은 웹 페이지가 나타난다.
2. MySQL 설치하기 MySQL 다운로드 받기
2. MySQL 설치하기 MySQL 다운로드 받기 앞 화면에서 Download 버튼을 누른다.
2. MySQL 설치하기 MySQL 다운로드 받기 앞 화면에서 Windows 플랫폼을 선택하면 Windows 플랫폼에 맞는 MySQL의 여러 에디 션이 표시된 화면이 나타난다.
2. MySQL 설치하기 MySQL 다운로드 받기 앞 화면에서 Pick a mirror 링크를 클릭하면 개인 정보를 입력하도록 권장하는 화면이 나 타난다.
2. MySQL 설치하기 MySQL 다운로드 받기 앞 화면 아래쪽의 ‘No Thanks’로 시작하는 링크를 클릭하면 MySQL을 다운로드 받을 수 있는 다음과 같은 웹 페이지가 나타난다.
2. MySQL 설치하기 MySQL 다운로드 받기 앞 화면에서 HTTP나 FTP 링크 중 하나를 선택하면 다음과 같은 창이 나타나는데, 여기에 서 저장 버튼을 누르면 다운로드가 시작된다.
2. MySQL 설치하기 MySQL 설치하기 다운로드 받은 파일을 더블 클릭하면 왼쪽 창이 나타나며, ‘Next’ 버튼을 누르면 화면이 오른쪽 그림처럼 바뀐다.
2. MySQL 설치하기 MySQL 설치하기 앞 화면에서 ‘Typical’ 옵션을 선택하고 ‘Next’ 버튼을 누르면 화면이 왼쪽 그림처럼 바 뀌고, ‘Install’ 버튼을 누르면 화면이 오른쪽 그림처럼 바뀌면서 설치가 진행된다.
2. MySQL 설치하기 MySQL 설치하기 설치가 끝나면 왼쪽 화면이 나타나고, ‘Next’ 버튼을 누르면 화면이 오른쪽 그림처럼 바 뀐다. 여기에서 ‘Finish’ 버튼을 누르면 MySQL의 구성 프로그램이 시작된다.
2. MySQL 설치하기 MySQL의 구성 정보 입력하기 MySQL 구성 프로그램이 시작되면 왼쪽 창이 나타나고, ‘Next’ 버튼을 누르면 화면이 오 른쪽 그림처럼 바뀐다.
2. MySQL 설치하기 MySQL의 구성 정보 입력하기 앞 화면에서 ‘Next’ 버튼을 누르면 창이 왼쪽 그림처럼 바뀌는데, MySQL가 윈도우 서비 스로서 실행되도록 만들기 위해 아래쪽 체크박스를 선택해서 오른쪽 그림처럼 만든다.
2. MySQL 설치하기 MySQL의 구성 정보 입력하기 앞 화면에서 ‘Next’ 버튼을 누르면 창이 왼쪽 그림처럼 바뀌는데, 여기에서 새로운 root 사용자 암호를 두 번 입력하고 ‘Next’ 버튼을 누르면 화면이 오른쪽 그림처럼 바뀐다. [주의] 암호는 나중에 필요하므로 잘 기억해둔다.
2. MySQL 설치하기 MySQL의 구성 정보 입력하기 앞 화면에서 ‘Execute’ 버튼을 누르면 앞에서 구성 정보의 설정이 시작되고, 설정이 끝나 면 화면이 오른쪽 그림처럼 바뀐다. 오른쪽 화면에서 ‘Finish’ 버튼을 누르면 MySQL 구성 프로그램이 끝난다.
2. MySQL 설치하기 MySQL 시작하기 윈도우즈 운영체제의 시작 메뉴에서 제어판 → 관리 도구 → 서비스를 선택한다. 상태가 시작됨으로 표시되어 있지 않으면 MySQL이 작동되지 않고 있는 것이다. 그럴 때는 MySQL 항목을 더블 클릭해서 MySQL 속성 창을 연다. [그림 12-9] 윈도우즈 운영체제의 서비스로 등록된 MySQL
2. MySQL 설치하기 MySQL 시작하기 MySQL 속성 창의 중간쯤 보면 시작, 중지, 일시 중지, 계속이라는 4개의 버튼이 있는데 이 중 시작 버튼을 누르면 MySQL이 시작된다. [그림 12-10] MySQL 서비스를 선택했을 때 나타나는 윈도우
mysqladmin -u root -p create webdb 데이터베이스 만들기 데이터베이스를 만들기 위해서는 MySQL에 포함되어 있는 mysqladmin.exe라는 프로그 램을 이용해야 한다. 이 프로그램은 명령 프롬프트 창에서 실행해야 하며, 다음과 같은 형태의 명령을 입력해서 데이터베이스를 만들 수 있다. mysqladmin -u root -p create webdb 사용자의 ID가 root라는 뜻 webdb라는 이름의 데이터베이스를 만들라는 뜻 패스워드를 입력받겠다는 뜻 ①데이터베이스를 생성하라는 명령을 입력합니다 ②패스워드를 입력합니다 [그림 12-11] 데이터베이스를 만드는 방법
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 데이터베이스는 정형화된 구조의 데이터를 저장하기에 적합한 저장 수단이다. 관계형 데이터베이스에 데이터를 저장할 때는 같은 구조를 갖는 데이터들끼리 모아 놓 아야 하는데, 이런 데이터의 모음을 테이블(table)이라고 한다. [그림 12-12] 관계형 데이터베이스에 저장하기에 적합한 데이터
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 테이블을 생성하기 위해서는 먼저 테이블의 구조를 만들어야 하는데, 이 구조는 데이터 항목의 이름, 타입, 최대 크기에 의해 정해진다. 테이블을 설계한 다음에 해야 할 일은 데이터베이스 안으로 들어가서 실제로 테이블을 생성하는 것이다. 그런 일은 mysql.exe 프로그램을 이용해서 할 수 있다.
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 데이터베이스에 들어가기 위해서는 명령 프롬프트 창에서 다음과 같은 명령을 입력해야 한다. 위 명령을 입력하면 root 사용자의 암호를 묻는 프롬프트가 나타나고, 암호를 입력하면 mysql> 프 롬프트가 나타난다. mysql> 프롬프트 다음에 use라는 명령을 다음과 같은 형식으로 입력하면 데이터베이스 에 들어갈 수 있다. 데이터베이스를 빠져나오려면 mysql> 프롬프트 다음에 quit라고 입력하면 된다. mysql -u root -p 패스워드를 입력받겠다는 뜻 사용자의 ID가 root라는 뜻 use webdb 데이터베이스의 이름
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 1) mysql.exe 프로그램을 실행합니다. 2) 패스워드를 입력합니다. 3) use 명령을 이용해서 특정 데이터베이스로 들어갑니다. 4) quit 명령을 실행하면 mysql.exe 프로그램이 끝납니다. [그림 12-12] 데이터베이스에 들어가고 나오는 방법
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 테이블을 만들기 위해서는 데이터베이스 안으로 들어가서 다음과 같은 형식의 create 명 령을 실행하면 된다. 위 명령문을 이용하여 만든 테이블에는 필수 입력 데이터가 누락될 가능성이 있다. 이런 문제를 방지하려면 필수 입력 데이터 항목 뒤에 not null이라는 키워드를 붙이면 된다. 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이라고 쓰세요.
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 키로 사용할 데이터 항목을 지정하려면 create 문의 마지막 데이터 항목 뒤에 콤마를 찍 고, primary key라는 키워드와 함께 키 항목의 이름을 다음과 같이 쓰면 된다. 특정 항목을 키를 지정할 때의 이점은 다음과 같다. 키로 지정된 항목에는 똑같은 데이터 값이 입력될 수 없기 때문에 그 항목을 식별자로 사용할 수 있다. 키로 지정된 항목의 인덱스 정보는 데이터베이스 안에 자동으로 생성되기 때문에 키를 이용한 검 색 속도가 빨라진다. 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 항목을 키로 지정하는 부분입니다
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 다음 그림은 create 문을 이용해서 실제로 테이블을 만드는 예이다. [그림 12-13]을 참조해서 webdb 데이터베이스로 들어가세요 테이블을 생성하는 create 문을 입력하세요. 정상적으로 테이블이 만들어지면 이런 메시지가 나옵니다. [그림 12-14] 테이블을 만드는 방법
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 테이블이 올바르게 만들어졌는지 확인하기 위해서는 desc 명령을 사용하면 된다. 테이블의 구조 [그림 12-15] 테이블의 구조를 확인하는 방법
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 테이블에 데이터를 입력하려면 다음과 같은 형식의 insert 문을 쓰면 된다. 문자 데이터는 반드시 작은따옴표로 묶어서 써야 한다. insert into goodsinfo (code, title, writer, price) values ( ‘10001 ’, ‘뇌를 자극하는 Java 프로그래밍 ’, ‘김윤명 ’, 27000); 테이블 이름 항목 이름 키워드 insert 문을 시작하는 키워드 데이터 [그림 12-16] 테이블에 데이터를 입력하는 방법
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 테이블에 저장한 데이터를 읽어오려면 다음과 같은 형식의 select문을 이용하면 된다. 다음과 같이 와일드카드 문자(*)를 쓰면 테이블의 모든 항목을 읽어올 수 있다. 특정 데이터만 읽어오려면 테이블 이름 뒤에 다음과 같은 형식의 where 절을 쓰면 된다. select name, price from goodsinfo; 항목 이름 키워드 테이블 이름 select 문을 시작하는 키워드 select * from goodsinfo; 모든 데이터 항목을 뜻하는 와일드카드 문자 select * from goodsinfo where price > 20000; 키워드 검색 조건
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 [그림 12-17] 테이블의 데이터를 조회하는 방법
2. MySQL 설치하기 데이터베이스에 데이터 저장하기 테이블에 있는 기존의 데이터를 수정하려면 다음과 같은 형식의 update 문을 쓰면 된다. update goodsinfo set writer:= ‘토마스 코멘 외 3명 ’, price:=33600 where code = ‘10005’; 테이블 이름 키워드 update 문을 시작하는 키워드 항목 이름:=새로운 값 포맷으로 값을 지정 where 조건절 [그림 12-18] 테이블의 데이터를 수정하는 방법
delete from goodsinfo where code = ‘10005 ’; 2. MySQL 설치하기 데이터베이스에 데이터 저장하기 테이블에 있는 데이터를 삭제하기 위해서는 다음과 같은 형식의 delete 문을 사용하면 된다. delete from goodsinfo where code = ‘10005 ’; delete 문을 시작하는 키워드 테이블 이름 where 조건절 [그림 12-19] 테이블의 데이터를 삭제하는 방법
3. Connector/J 설치하기 JDBC 드라이버 다운로드 받기 웹 브라우저를 열고 http://dev.mysql.com/downloads/라는 URL을 입력하면 다음과 같은 웹 페이지가 나타난다.
3. Connector/J 설치하기 JDBC 드라이버 다운로드 받기
3. Connector/J 설치하기 JDBC 드라이버 다운로드 받기 최신 버전의 Connector/J에 대한 링크를 클릭해서 Connector/J를 다운로드 받는다.
3. Connector/J 설치하기 JDBC 드라이버 설치하기
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 JDBC 드라이버를 로드하고, 데이터베이스로 연결하고, 연결을 끊는 방법
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 JDBC 드라이버를 로드하고, 데이터베이스로 연결하고, 연결을 끊는 방법 자바 프로그램에서 관계형 데이터베이스로 연결을 하기 위해서는 먼저 다음과 같은 방 법으로 JDBC 드라이버를 로드해야 한다. 데이터베이스로 연결을 하기 위해서는 먼저 프로토콜, 서브프로토콜, 서브네임으로 이 루어진 데이터베이스 URL을 알아두어야 한다. 서브네임의 작성 방법은 DBMS의 종류마다 다르므로 MySQL이 아닌 다른 DBMS를 사용할 때는 관련 매뉴얼을 찾아보아야 한다. Class.forName(“com.mysql.jdbc.Driver”); JDBC 드라이버의 클래스 이름 jdbc:mysql://219.153.12.14:3306/webdb 프로토콜 (protocol) 서브프로토콜 (subprotocol) 서브네임(subname) IP주소:포트번호/DB이름
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 JDBC 드라이버를 로드하고, 데이터베이스로 연결하고, 연결을 끊는 방법 데이터베이스로 연결을 맺기 위해서는 java.sql.DriverManager 클래스의 getConnection 메서드를 호출해야 한다. 이 메서드는 데이터베이스로의 연결에 성공하면 java.sql.Connection 인터페이스 타입의 객체를 만들어서 리턴한다. 데이터베이스로의 연결을 끊기 위해서는 Connection 객체에 대해 close 메서드를 호출하 면 된다. Connection conn = DriverManager.getConnection(“jdbc:mysql://219.153.12.14:3306/webdb ”, “root ”, “1234 ”); 데이터베이스 URL 사용자 ID 패스워드 conn.close() 데이터베이스로의 연결을 끊는 메서드
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 JDBC 드라이버를 로드하고, 데이터베이스로 연결하고, 연결을 끊는 방법 [예제 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의 실행 결과
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스의 데이터를 읽어오는 방법 데이터베이스에 있는 데이터를 읽어오려면 우선 Connection 객체에 대해 createStatement 메서드를 호출해서 java.sql.Statement 타입 객체를 구해야 한다. Statement 객체에 대해 executeQuery 메서드를 호출하면 데이터베이스에 있는 데이터를 읽어올 수 있다. Statement stmt = conn.createStatement(); getConnection 메서드가 리턴한 Connection 객체 Statement 객체를 만들어서 리턴하는 메서드 ResultSet rs = stmt.executeQuery( “select * from goodsinfo where code=‘10002’; ”); select 문을 실행하는 메서드
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스의 데이터를 읽어오는 방법 executeQuery 메서드가 리턴한 ResultSet 객체에 대해 next 메서드를 호출하면 데이터베 이스로부터 읽은 데이터를 순서대로 가져올 수 있다. 이 메서드는 다음 위치에 데이터가 있을 때는 true, 없을 때는 false를 리턴한다. next 메서드를 호출한 다음에 ResultSet 객체에 대해 getInt, getString, getFloat 등의 메서 드를 호출하면 특정 데이터 항목 값을 가져올 수 있다. boolean exists = rs.next(); 데이터베이스로부터 읽은 데이터의 첫 번째/다음 행 위치로 이동하는 메서드 String code = rs.getString( “code ”); int price = rs.getInt( “price ”); 문자 데이터를 가져오는 메서드 정수 데이터를 가져오는 메서드
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스의 데이터를 읽어오는 방법 필요한 데이터를 모두 가져온 다음에는 ResultSet 객체가 더 이상 필요치 않기 때문에 close 메서드를 호출해야 한다. Statement 객체도 모두 사용하고 난 다음에는 close 메서드를 호출해서 닫아야 한다. rs.close(); ResultSet을 닫는 메서드 stmt.close(); Statement를 닫는 메서드
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 { stmt.close(); catch (Exception ignored) { conn.close(); 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; %>
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의 실행 결과
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스에 데이터를 입력하는 방법 데이터베이스에 데이터를 입력하려면 데이터를 읽어올 때와 마찬가지로 우선 Statement 객체를 구해야 한다. Statement 객체에 대해 executeUpdate라는 메서드를 호출하면 데이터베이스에 새로운 데이터를 추가할 수 있다. executeUpdate 메서드를 이용해서 데이터를 입력한 다음에는 Statement 객체에 대해 close 메서드를 호출해야 한다. Statement stmt = conn.createStatement(); Statement 객체를 만드는 메서드 insert 문을 실행하는 메서드 int rowNum = stmt.executeUpdate( “insert goodsinfo (code, title, writer, price) values(‘10001’, ‘뇌를 자극하는 Java 프로그래밍’, ‘김윤명’, 27000);”);
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스에 데이터를 입력하는 방법 [그림 12-13]을 참조해서 webdb 데이터베이스로 들어가세요 테이블을 생성하는 create 문을 입력하세요 정상적으로 테이블이 만들어지면 이런 메시지가 나옵니다 mysql.exe를 끝내세요 [그림 12-28] 회원 정보 테이블을 만드는 방법
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스에 데이터를 입력하는 방법 다음과 같이 작동하는 회원 가입 애플리케이션을 만들어보자. ① 회원 정보를 입력하고 ‘확인’ 버튼을 누르면 ② 해당 정보가 DB에 입력된 후 결과 화면이 나타납니다. [그림 12-29] 회원 가입 애플리케이션의 화면 설계
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스에 데이터를 입력하는 방법 이 애플리케이션은 다음과 같은 세 개의 모듈로 구현한다. HTML 문서와 JSP 페이지의 URL은 다음과 같이 정하기로 한다. 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
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>
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 { stmt.close(); catch (Exception ignored) { conn.close(); response.sendRedirect( “SubscriptionResult.jsp ”); %>
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의 실행 결과
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스에 데이터를 입력하는 방법 1) webdb 데이터베이스로 들어가십시오. 2) 회원 정보 테이블을 조회하는 select 문을 입력하십시오. 3) 입력된 데이터를 확인할 수 있습니다. [그림 12-32] 예제 12-5 ~ 예제 12-7의 결과를 확인하는 방법
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스의 데이터를 수정하고 삭제하는 방법 데이터베이스에 있는 데이터를 수정할 때는 executeUpdate 메서드에 update 문을 파라미 터로 넘겨줘야 한다. 데이터베이스에 있는 데이터 삭제할 때는 executeUpdate 메서드에 delete 문을 파라미터 로 넘겨줘야 한다. int rowNum = stmt.executeUpdate( “update userinfo set password :=‘dalek’ where id = ‘rose ’; ”); 이 메서드를 이용해서 update 문을 실행할 수 있습니다 int rowNum = stmt.executeUpdate( “delete from userinfo where id = ‘rose ’; ”); 이 메서드를 이용해서 delete 문을 실행할 수도 있습니다.
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스의 데이터를 수정하고 삭제하는 방법 데이터베이스에 저장되어 있는 상품 정보를 수정하는 애플리케이션을 작성해보자. 초기 화면 상품 정보 편집 화면 상품 정보 수정 결과 화면 [그림 12-33] 상품 정보 수정 애플리케이션의 화면 설계
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스의 데이터를 수정하고 삭제하는 방법 앞 애플리케이션을 다음과 같은 5개의 모듈로 구성하기로 하자. 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
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>
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 { stmt.close(); catch (Exception ignored) { conn.close(); 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; %>
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>
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 { stmt.close(); catch (Exception ignored) { conn.close(); response.sendRedirect( “UpdateResult.jsp?code= ” + code); %>
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>
4. 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스의 데이터를 수정하고 삭제하는 방법
5. 데이터베이스 커넥션 풀의 설치와 사용 데이터베이스에 동시에 접속할 수 있는 사용자 수는 한정되어 있는데, 웹 서버에는 동시 에 수백, 수천의 사용자들이 접속할 수 있다. 웹 애플리케이션이 실행될 때마다 데이터베이스로 새로운 접속을 맺는 것은 현실적으로 불가능하므로, 데이터베이스 몇 개의 접속을 맺어서 데이터베이스 커넥션 풀(Database Connection Pool)에 저장해놓고, 필요한 웹 애플리케이션이 빌려 쓰고 반환하는 방식을 사용해야 한다.
5. 데이터베이스 커넥션 풀의 설치와 사용 DBCP, Pool, Collections 모듈 다운로드 받기 웹 브라우저를 열고 아파치 사이트의 URL인 http://www.apache.org/를 입력한다.
5. 데이터베이스 커넥션 풀의 설치와 사용 DBCP, Pool, Collections 모듈 다운로드 받기 앞 화면에서 Commons 프로젝트를 선택한다.
5. 데이터베이스 커넥션 풀의 설치와 사용 DBCP, Pool, Collections 모듈 다운로드 받기
5. 데이터베이스 커넥션 풀의 설치와 사용 DBCP, Pool, Collections 모듈 다운로드 받기
5. 데이터베이스 커넥션 풀의 설치와 사용 DBCP, Pool, Collections 모듈 다운로드 받기
5. 데이터베이스 커넥션 풀의 설치와 사용 DBCP, Pool, Collections 모듈 설치하기
[그림 12-44] 데이터베이스 커넥션 풀을 통해 데이터베이스를 사용하는 방법 5. 데이터베이스 커넥션 풀의 설치와 사용 데이터베이스 커넥션 풀을 사용하는 방법 데이터베이스 커넥션 풀을 이용해서 데이터베이스에 데이터를 읽고 쓰는 방법은 데이터 베이스 커넥션 풀을 사용하지 않을 때와 비슷하다. 차이점이라면 Class.forName과 DriverManager, getConnection 메서드에 넘겨주는 파라미터 값이 다르다는 정도이다. [그림 12-44] 데이터베이스 커넥션 풀을 통해 데이터베이스를 사용하는 방법
GenericObjectPool objectPool = new GenericObjectPool(); 5. 데이터베이스 커넥션 풀의 설치와 사용 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법 데이터베이스 커넥션 풀을 만들기 위해서는 우선 org.apache.commons.pool.impl 패키지 에 속하는 GenericObjectPool 클래스나 StackObjectPool 클래스의 객체를 만들어야 한다 GenericObjectPool 클래스는 데이터베이스 커넥션 풀을 표현하는 것이 아니라 일반 자바 객체를 담는 풀을 표현한다. 데이터베이스 커넥션을 생성하는 기능의 객체는 DBCP 모듈에 속하는 org.apache.commons.dbcp 패키지의 DriverManagerConnectionFactory 클래스를 이용해 서 만들 수 있다. GenericObjectPool objectPool = new GenericObjectPool(); GenericObjectPool 객체를 생성합니다. DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory( “jdbc:mysql://localhost:3306/webdb ”, “root ”, “1234 ”); 데이터베이스 URL 아이디 패스워드
5. 데이터베이스 커넥션 풀의 설치와 사용 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법 앞에서 만든 두 객체가 함께 작동하도록 만들기 위해서는 다음과 같은 방법으로 org.apache.commons.dbcp 패키지에 속하는 PoolableConnectionFactory 클래스의 객체를 만들어야 한다. 그 다음에 할 일은 PoolingDriver 객체를 생성해서 GenericObjectPool 객체를 웹 컨테이 너에 등록하는 것이다. new PoolableConnectionFactory(connectionFactory, objectPool, null, null, false, true); DriverManagerConnectionFactory 객체 GenericObjectPool 객체 PoolingDriver driver = new PoolingDriver(); PoolingDriver 객체를 생성한다 driver.registerPool( “/webdb_pool ”, objectPool); 데이터베이스 커넥션 풀의 이름 GenericObjectPool 객체
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의 실행 결과
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의 실행 결과 - 에러가 발생했을 때
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 { stmt.close(); catch (Exception ignored) { conn.close(); 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; %>
5. 데이터베이스 커넥션 풀의 설치와 사용 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법 [그림 12-48] 예제 12-15의 실행 결과 - 올바른 결과 [그림 12-49] 예제 12-15의 실행 결과 - 에러가 발생했을 때
[그림 12-50] 웹 컨테이너가 시작될 때 JSP 페이지가 초기화되도록 만드는 방법 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 페이지가 초기화되도록 만드는 방법
5. 데이터베이스 커넥션 풀의 설치와 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법 JOCL 파일을 이용하면 프로그램을 작성하지 않고 DBCP 데이터베이스 커넥션 풀을 생 성하고 등록할 수 있다. 위 코드를 자세히 살펴보면 DBCP 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그 램과 동일한 부분이 많이 있음을 알 수 있다. JOCL 파일은 WEB-INF/classes 서브디렉터리 안에 저장해야 한다. [그림 12-51] JOCL 파일의 예
5. 데이터베이스 커넥션 풀의 설치와 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법
5. 데이터베이스 커넥션 풀의 설치와 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법 JOCL 파일을 사용할 때는 앞에서 설치했던 JDBC 드라이버, DBCP, Pool, Collections 모 듈을 JOCL 파일이 속하는 웹 애플리케이션 디렉터리의 WEB-INF/lib 디렉터리로 옮겨 와야 한다.
5. 데이터베이스 커넥션 풀의 설치와 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법 [예제 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의 실행 결과
5. 데이터베이스 커넥션 풀의 설치와 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법 [예제 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 { stmt.close(); catch (Exception ignored) { conn.close(); response.sendRedirect( “SubscriptionResult.jsp ”); %>
5. 데이터베이스 커넥션 풀의 설치와 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법 [그림 12-55] 예제 12-15, 예제 12-18, 예제 12-7의 실행 결과