Download presentation
Presentation is loading. Please wait.
1
8 데이터베이스 사용하기
2
학습 목표 데이터베이스를 이용하면 파일보다 훨씬 더 체계적이고 구조적인 방법으 로 데이터를 저장하고 관리할 수 있다. 그래서 웹 프로그래밍에서도 데이 터베이스를 사용해야 할 경우가 많이 있는데 이번 장에서는 그 방법을 배 워보자. 내 용 데이터베이스 개론 MySQL 설치하기 Connector/J 설치하기 웹 컴포넌트에서 데이터베이스를 사용하는 방법 데이터베이스 커넥션 풀의 설치와 사용
3
1. 데이터베이스 사용 데이터베이스(database) 자바 프로그램에서 MySQL을 사용하려면 JDBC 드라이버가 필요하다.
파일과 마찬가지로 보조기억장치에 데이터를 저장하는 수단 크게 계층형 데이터베이스, 관계형 데이터베이스, 객체지향 데이터베이스로 구분 그 중 관계형 테이터베이스인 MySQL을 사용 자바 프로그램에서 MySQL을 사용하려면 JDBC 드라이버가 필요하다. [그림 12-1] JDBC 드라이버의 역할
4
2. MySQL 설치하기 MySQL 다운로드 받기
웹 브라우저를 열고 URL을 입력하면 다 음과 같은 웹 페이지가 나타난다.
5
2. MySQL 설치하기 MySQL 다운로드 받기 가장 최신 버전인 MySQL 5.1을 선택하면 화면이 다음과 같이 바뀐다.
6
2. MySQL 설치하기 MySQL 다운로드 받기 앞 화면에서 Download 버튼을 누른다.
7
2. MySQL 설치하기 MySQL 다운로드 받기
앞 화면에서 Windows 플랫폼을 선택하면 Windows 플랫폼에 맞는 MySQL의 여러 에디션이 표시된 화면이 나타난다.
8
2. MySQL 설치하기 MySQL 다운로드 받기
앞 화면에서 Pick a mirror 링크를 클릭하면 개인 정보를 입력하도록 권장하 는 화면이 나타난다.
9
2. MySQL 설치하기 MySQL 다운로드 받기
앞 화면 아래쪽의 ‘No Thanks’로 시작하는 링크를 클릭하면 MySQL을 다운로 드 받을 수 있는 다음과 같은 웹 페이지가 나타난다.
10
2. MySQL 설치하기 MySQL 다운로드 받기
앞 화면에서 HTTP나 FTP 링크 중 하나를 선택하면 다음과 같은 창이 나타나는 데, 여기에서 저장 버튼을 누르면 다운로드가 시작된다.
11
2. MySQL 설치하기 MySQL 설치하기 다운로드 받은 파일을 더블 클릭하면 왼쪽 창이 나타나며, ‘Next’ 버튼을 누르 면 화면이 오른쪽 그림처럼 바뀐다.
12
2. MySQL 설치하기 MySQL 설치하기 앞 화면에서 ‘Typical’ 옵션을 선택하고 ‘Next’ 버튼을 누르면 화면이 왼쪽 그림 처럼 바뀌고, ‘Install’ 버튼을 누르면 화면이 오른쪽 그림처럼 바뀌면서 설치가 진행된다.
13
2. MySQL 설치하기 MySQL 설치하기 설치가 끝나면 왼쪽 화면이 나타나고, ‘Next’ 버튼을 누르면 화면이 오른쪽 그 림처럼 바뀐다. 여기에서 ‘Finish’ 버튼을 누르면 MySQL의 구성 프로그램이 시작된다.
14
2. MySQL 설치하기 MySQL의 구성 정보 입력하기
MySQL 구성 프로그램이 시작되면 왼쪽 창이 나타나고, ‘Next’ 버튼을 누르면 화면이 오른쪽 그림처럼 바뀐다.
15
2. MySQL 설치하기 MySQL의 구성 정보 입력하기
앞 화면에서 ‘Next’ 버튼을 누르면 창이 왼쪽 그림처럼 바뀌는데, MySQL가 윈 도우 서비스로서 실행되도록 만들기 위해 아래쪽 체크박스를 선택해서 오른쪽 그림처럼 만든다.
16
2. MySQL 설치하기 MySQL의 구성 정보 입력하기
앞 화면에서 ‘Next’ 버튼을 누르면 창이 왼쪽 그림처럼 바뀌는데, 여기에서 새 로운 root 사용자 암호를 두 번 입력하고 ‘Next’ 버튼을 누르면 화면이 오른쪽 그림처럼 바뀐다. [주의] 암호는 나중에 필요하므로 잘 기억해둔다.
17
2. MySQL 설치하기 MySQL의 구성 정보 입력하기
앞 화면에서 ‘Execute’ 버튼을 누르면 앞에서 구성 정보의 설정이 시작되고, 설 정이 끝나면 화면이 오른쪽 그림처럼 바뀐다. 오른쪽 화면에서 ‘Finish’ 버튼을 누르면 MySQL 구성 프로그램이 끝난다.
18
2. MySQL 설치하기 MySQL 시작하기 시작 메뉴에서 제어판 → 관리 도구 → 서비스를 선택한다.
상태가 시작됨으로 표시되어 있지 않으면 MySQL이 작동되지 않고 있는 것이 다. 그럴 때는 MySQL 항목을 더블 클릭해서 MySQL 속성 창을 연다. [그림 12-9] 윈도우즈 운영체제의 서비스로 등록된 MySQL
19
2. MySQL 설치하기 MySQL 시작하기 MySQL 속성 창의 중간쯤 보면 시작, 중지, 일시 중지, 계속이라는 4개의 버튼 이 있는데 이 중 시작 버튼을 누르면 MySQL이 시작된다. [그림 12-10] MySQL 서비스를 선택했을 때 나타나는 윈도우
20
2. MySQL 설치하기 MySQL 설치 및 환경 설정 참고 사이트 Ubuntu 환경에서 MySQL 서버 설치
Windows 환경에서 MySQL 서버 설치 Ubuntu 환경에서 MySQL 환경 설정
21
mysqladmin -u root -p create webdb
3. MySQL DB 관리 데이터베이스 만들기 MySQL 클라이언트 프로그램 mysqladmin.exe을 이용 명령 프롬프트 창에서 실행 create SQL 명령을 이용하여 데이터베이스 생성 참고 사이트: linux-via-command-line/ mysqladmin -u root -p create webdb 사용자의 ID가 root라는 뜻 webdb라는 이름의 데이터베이스를 만들라는 뜻 패스워드를 입력받겠다는 뜻 ①데이터베이스를 생성하라는 명령을 입력합니다 ②패스워드를 입력합니다 [그림 12-11] 데이터베이스를 만드는 방법
22
3. MySQL DB 관리 데이터베이스에 데이터 저장하기
데이터베이스는 정형화된 구조의 데이터를 저장하기에 적합한 저장 수단이다. 관계형 데이터베이스를 테이블(Table) 형태로 데이터 저장 같은 구조를 갖는 데이터(레코드)들끼리 모아 저장 [그림 12-12] 관계형 데이터베이스에 저장하기에 적합한 데이터
23
3. MySQL DB 관리 데이터베이스에 데이터 저장하기
테이블을 생성하기 위해서는 먼저 테이블의 구조를 만들어야 하는데, 이 구조 는 데이터 항목의 이름, 타입, 최대 크기에 의해 정해진다. 테이블을 설계한 다음에 해야 할 일은 데이터베이스 안으로 들어가서 실제로 테이블을 생성하는 것
24
3. MySQL DB 관리 데이터베이스에 데이터 저장하기
데이터베이스에 로그인하기 위해서는 명령 프롬프트 창에서 다음과 같은 명령 을 입력해야 한다. 위 명령을 입력하면 root 사용자의 암호를 묻는 프롬프트가 나타나고, 암호를 입력하 면 mysql> 프롬프트가 나타난다. mysql> 프롬프트 다음에 use라는 명령을 다음과 같은 형식으로 입력하면 데이 터베이스에 들어갈 수 있다. 데이터베이스를 빠져나오려면 mysql> 프롬프트 다음에 quit라고 입력하면 된다. mysql -u root -p 패스워드를 입력받겠다는 뜻 사용자의 ID가 root라는 뜻 use webdb 데이터베이스의 이름
25
3. MySQL DB 관리 데이터베이스에 데이터 저장하기 1) mysql.exe 프로그램을 실행합니다.
2) 패스워드를 입력합니다. 3) use 명령을 이용해서 특정 데이터베이스로 들어갑니다. 4) quit 명령을 실행하면 mysql.exe 프로그램이 끝납니다. [그림 12-12] 데이터베이스에 들어가고 나오는 방법
26
3. MySQL DB 관리 데이터베이스에 데이터 저장하기
테이블을 만들기 위해서는 데이터베이스 안으로 들어가서 다음과 같은 형식의 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이라고 쓰세요.
27
3. MySQL DB 관리 데이터베이스에 데이터 저장하기
키로 사용할 데이터 항목을 지정하려면 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 항목을 키로 지정하는 부분입니다
28
3. MySQL DB 관리 데이터베이스에 데이터 저장하기
다음 그림은 create 문을 이용해서 실제로 테이블을 만드는 예이다. [그림 12-13]을 참조해서 webdb 데이터베이스로 들어가세요 테이블을 생성하는 create 문을 입력하세요. 정상적으로 테이블이 만들어지면 이런 메시지가 나옵니다. [그림 12-14] 테이블을 만드는 방법
29
3. MySQL DB 관리 데이터베이스에 데이터 저장하기 테이블이 올바르게 만들어졌는지 확인하기 위해서는 desc 명령을 사용
테이블의 구조 [그림 12-15] 테이블의 구조를 확인하는 방법
30
3. MySQL DB 관리 데이터베이스에 데이터 저장하기
테이블에 데이터를 입력하려면 다음과 같은 형식의 insert 문을 쓰면 된다. 문자 데이터는 반드시 작은따옴표로 묶어서 써야 한다. insert into goodsinfo (code, title, writer, price) values ( ‘10001 ’, ‘뇌를 자극하는 Java 프로그래밍 ’, ‘김윤명 ’, 27000); 테이블 이름 항목 이름 키워드 insert 문을 시작하는 키워드 데이터 [그림 12-16] 테이블에 데이터를 입력하는 방법
31
3. MySQL DB 관리 데이터베이스에 데이터 저장하기 테이블에 저장한 데이터를 읽어오려면 select문을 이용
와일드카드 문자(*)를 쓰면 테이블의 모든 항목을 읽어올 수 있다. 특정 데이터만 읽어오려면 테이블 이름 뒤에 where 절을 사용 select name, price from goodsinfo; 항목 이름 키워드 테이블 이름 select 문을 시작하는 키워드 select * from goodsinfo; 모든 데이터 항목을 뜻하는 와일드카드 문자 select * from goodsinfo where price > 20000; 키워드 검색 조건
32
3. MySQL DB 관리 데이터베이스에 데이터 저장하기 [그림 12-17] 테이블의 데이터를 조회하는 방법
33
3. MySQL DB 관리 데이터베이스에 데이터 저장하기 테이블에 있는 기존의 데이터를 수정하려면 update 문을 사용
update goodsinfo set writer:= ‘토마스 코멘 외 3명 ’, price:= where code = ‘10005’; 테이블 이름 키워드 update 문을 시작하는 키워드 항목 이름:=새로운 값 포맷으로 값을 지정 where 조건절 [그림 12-18] 테이블의 데이터를 수정하는 방법
34
delete from goodsinfo where code = ‘10005 ’;
3. MySQL DB 관리 데이터베이스에 데이터 저장하기 테이블에 있는 데이터를 삭제하기 위해서는 delete 문을 사용 delete from goodsinfo where code = ‘10005 ’; delete 문을 시작하는 키워드 테이블 이름 where 조건절 [그림 12-19] 테이블의 데이터를 삭제하는 방법
35
4. Connector/J 설치하기 JDBC 드라이버 다운로드 받기
웹 사이트 :
36
4. Connector/J 설치하기 JDBC 드라이버 다운로드 받기
37
4. Connector/J 설치하기 JDBC 드라이버 다운로드 받기
38
4. Connector/J 설치하기 JDBC 드라이버 설치하기
39
5. 웹 환경에서의 JDBC 프로그래밍 JDBC 개념과 역할
JDBC(Java Database Connectivity) - 자바에서 데이터베이스를 표준화 된 방법으로 접속할 수 있도록 만든 API 규격 데이터베이스 벤더와 상관없이 동일한 개발이 가능하게 함 애 플 리 케 이 션 오라클 DBMS MySql DBMS 인포믹스 DBMS JDBC 드라이버 관리자 구현 사용 오라클 JDBC 드라이버 MySql JDBC 드라이버 인포믹스 JDBC 드라이버
40
5. 웹 환경에서의 JDBC 프로그래밍 JDBC 드라이버 유형 자바 애플리케이션 JDBC 드라이버 관리자 DBMS
Native-Protocol 드라이버 ODBC 드라이버 JDBC 미들웨어 JDBC-ODBC JDBC API JDBC 드라이버 API Net-Protocol Native-API
41
WebContent\WEB-INF\lib 폴더에 설치
5. 웹 환경에서의 JDBC 프로그래밍 JDBC 드라이버 설치 – 오라클 JDBC 드라이버 JDBC 드라이버 선택 JDBC 드라이버는 사용하고자 하는 데이터베이스 벤더 별로 제공 됨 오라클 JDBC드라이버 c:\dev\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib\ojdbc1 4.jar 설치 디렉터리(다음 중 한 가지를 이용함) JDK설치디렉터리\jre\lib\ext\ 에 복사하는 방법. 톰캣설치디렉터리\common\lib 폴더에 복사하는 방법 이클립스 프로젝트의 WebContent\WEB-INF\lib 폴더에 복사하는 방법 WebContent\WEB-INF\lib 폴더에 설치
42
5. 웹 환경에서의 JDBC 프로그래밍 JDBC 프로그래밍 단계 (1)
43
5. 웹 환경에서의 JDBC 프로그래밍 JDBC 프로그래밍 단계 (2)
44
5. 웹 환경에서의 JDBC 프로그래밍 JDBC 드라이버 로드& 데이터베이스 연결
45
5. 웹 환경에서의 JDBC 프로그래밍 JDBC 드라이버 로드& 데이터베이스 연결
데이터베이스로 연결을 하기 위해서는 먼저 프로토콜, 서브프로토콜, 서브네 임으로 이루어진 데이터베이스 URL을 알아두어야 한다. 서브네임의 작성 방법은 DBMS의 종류마다 다르므로 MySQL이 아닌 다른 DBMS를 사용할 때는 관련 매뉴얼을 찾아보아야 한다. Class.forName(“com.mysql.jdbc.Driver”); JDBC 드라이버의 클래스 이름 jdbc:mysql:// :3306/webdb 프로토콜 (protocol) 서브프로토콜 (subprotocol) 서브네임(subname) IP주소:포트번호/DB이름
46
5. 웹 환경에서의 JDBC 프로그래밍 JDBC 드라이버 로드& 데이터베이스 연결
데이터베이스로 연결을 맺기 위해서는 java.sql.DriverManager 클래스의 getConnection 메서드를 호출해야 한다. 이 메서드는 데이터베이스로의 연결에 성공하면 java.sql.Connection 인터페이스 타입 의 객체를 만들어서 리턴한다. 데이터베이스로의 연결을 끊기 위해서는 Connection 객체에 대해 close 메서드 를 호출하면 된다. Connection conn = DriverManager.getConnection(“jdbc:mysql:// :3306/webdb ”, “root ”, “1234 ”); 데이터베이스 URL 사용자 ID 패스워드 conn.close() 데이터베이스로의 연결을 끊는 메서드
47
5. 웹 환경에서의 JDBC 프로그래밍 JDBC 드라이버 로드& 데이터베이스 연결
contentType= “text/html; charset=euc-kr ”%> 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의 실행 결과
48
Statement stmt = conn.createStatement();
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 읽어오는 방법 데이터베이스에 있는 데이터를 읽어오려면 우선 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 문을 실행하는 메서드
49
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 읽어오는 방법
executeQuery 메서드가 리턴한 ResultSet 객체에 대해 next 메서드를 호출하면 데이터베이스로부터 읽은 데이터를 순서대로 가져올 수 있다. 다음 위치에 데이터가 있을 때는 true, 없을 때는 false를 리턴한다. next 메서드를 호출한 다음에 ResultSet 객체에 대해 getInt, getString, getFloat 등의 메서드를 호출하면 특정 데이터 항목 값을 가져올 수 있다. boolean exists = rs.next(); 데이터베이스로부터 읽은 데이터의 첫 번째/다음 행 위치로 이동하는 메서드 String code = rs.getString( “code ”); int price = rs.getInt( “price ”); 문자 데이터를 가져오는 메서드 정수 데이터를 가져오는 메서드
50
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 읽어오는 방법
필요한 데이터를 모두 가져온 다음에는 ResultSet 객체가 더 이상 필요치 않기 때문에 close 메서드를 호출해야 한다. Statement 객체도 모두 사용하고 난 다음에는 close 메서드를 호출해서 닫아야 한다. rs.close(); ResultSet을 닫는 메서드 stmt.close(); Statement를 닫는 메서드
51
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 읽어오는 방법
[예제 12-2] 상품 정보 테이블을 읽는 JSP 페이지 contentType= “text/html; charset=euc-kr ” errorPage= “DBError.jsp ” %> 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 문자열을 Unicode 문자열로 바꾸는 메서드 private String toUnicode(String str) { try { byte[] b = str.getBytes( “ISO ”); return new String(b); } catch (java.io.UnsupportedEncodingException uee) { System.out.println(uee.getMessage()); return null; %>
52
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 읽어오는 방법
[예제 12-3] 상품 정보를 보여주는 JSP 페이지 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 페이지 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의 실행 결과
53
Statement stmt = conn.createStatement();
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스에 데이터를 입력하는 방법 데이터베이스에 데이터를 입력하려면 데이터를 읽어올 때와 마찬가지로 우선 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);”);
54
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스에 데이터를 입력하는 방법 [그림 12-13]을 참조해서 webdb
데이터베이스로 들어가세요 테이블을 생성하는 create 문을 입력하세요 정상적으로 테이블이 만들어지면 이런 메시지가 나옵니다 mysql.exe를 끝내세요 [그림 12-28] 회원 정보 테이블을 만드는 방법
55
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스에 데이터를 입력하는 방법
다음과 같이 작동하는 회원 가입 애플리케이션을 만들어보자. ① 회원 정보를 입력하고 ‘확인’ 버튼을 누르면 ② 해당 정보가 DB에 입력된 후 결과 화면이 나타납니다. [그림 12-29] 회원 가입 애플리케이션의 화면 설계
56
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스에 데이터를 입력하는 방법
이 애플리케이션은 다음과 같은 세 개의 모듈로 구현한다. HTML 문서와 JSP 페이지의 URL은 다음과 같이 정하기로 한다. 회원 정보 입력 화면 HTML 문서의 URL 회원 정보 DB 입력 JSP 페이지의 URL 회원 가입 결과 출력 JSP 페이지의 URL
57
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스에 데이터를 입력하는 방법
[예제 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>
58
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스에 데이터를 입력하는 방법
[예제 12-6] 회원 정보를 데이터베이스에 입력하는 JSP 페이지 contentType= “text/html; charset=euc-kr” errorPage= “DBError.jsp” %> 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 ”); %>
59
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스에 데이터를 입력하는 방법
[예제 12-7] 회원 가입 결과를 출력하는 JSP 페이지 contentType= “text/html; charset=euc-kr ”%> <HTML> <HEAD><TITLE>회원 가입 결과</TITLE></HEAD> <BODY> <H3>회원 가입 결과</H3> 가입되었습니다. </BODY> </HTML> [그림 12-31] 예제 12-5 ~ 예제 12-7의 실행 결과
60
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스에 데이터를 입력하는 방법 1) webdb 데이터베이스로 들어가십시오.
2) 회원 정보 테이블을 조회하는 select 문을 입력하십시오. 3) 입력된 데이터를 확인할 수 있습니다. [그림 12-32] 예제 12-5 ~ 예제 12-7의 결과를 확인하는 방법
61
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 수정하고 삭제하는 방법
데이터베이스에 있는 데이터를 수정할 때는 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 문을 실행할 수도 있습니다.
62
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 수정하고 삭제하는 방법
데이터베이스에 저장되어 있는 상품 정보를 수정하는 애플리케이션을 작성 초기 화면 상품 정보 편집 화면 상품 정보 수정 결과 화면 [그림 12-33] 상품 정보 수정 애플리케이션의 화면 설계
63
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 수정하고 삭제하는 방법
앞 애플리케이션을 다음과 같은 5개의 모듈로 구성하기로 하자. 상품코드 입력 화면 HTML 문서의 URL 상품 정보 DB 읽기 JSP 페이지의 URL 상품 정보 편집 화면 JSP 페이지의 URL 상품 정보 DB 수정 JSP 페이지의 URL 상품 정보 수정 결과 JSP 페이지의 URL
64
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 수정하고 삭제하는 방법
[예제 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>
65
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 수정하고 삭제하는 방법
[예제 12-9] 상품 정보 테이블을 읽는 JSP 페이지 contentType= “text/html; charset=euc-kr ” errorPage= “../DBError.jsp ” %> 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 문자열을 Unicode 문자열로 바꾸는 메서드 private String toUnicode(String str) { try { byte[] b = str.getBytes( “ISO ”); return new String(b); } catch (java.io.UnsupportedEncodingException uee) { System.out.println(uee.getMessage()); return null; %>
66
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 수정하고 삭제하는 방법
[예제 12-10] 상품 정보 관리 화면을 제공하는 JSP 페이지 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>
67
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 수정하고 삭제하는 방법
[예제 12-11] 상품 정보를 수정하는 JSP 페이지 contentType= “text/html; charset=euc-kr ” errorPage= “../DBError.jsp ” %> 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); %>
68
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 수정하고 삭제하는 방법
[예제 12-12] 상품 정보의 수정 결과를 보여주는 JSP 페이지 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>
69
5. 웹 환경에서의 JDBC 프로그래밍 데이터베이스의 데이터를 수정하고 삭제하는 방법
70
6. 데이터베이스 커넥션 풀(DBCP) 사용 데이터베이스에 동시에 접속할 수 있는 사용자 수는 한정되어 있는데, 웹 서버 에는 동시에 수백, 수천의 사용자들이 접속할 수 있다. 웹 애플리케이션이 실행될 때마다 데이터베이스로 새로운 접속을 맺는 것은 부하가 큰 작업 데이터베이스 몇 개의 접속을 맺어서 데이터베이스 커넥션 풀(Database Connection Pool)에 저장해놓고, 필요한 웹 애플리케이션이 빌려 쓰고 반환하는 방식을 사용.
71
6. 데이터베이스 커넥션 풀(DBCP) 사용 관련 사이트
%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0- JSPMySqlTomcat90
72
6. 데이터베이스 커넥션 풀(DBCP) 사용 DBCP, Pool, Collections 모듈 다운로드 받기
웹 사이트 :
73
6. 데이터베이스 커넥션 풀(DBCP) 사용 DBCP, Pool, Collections 모듈 다운로드 받기
앞 화면에서 Commons 프로젝트를 선택한다..
74
6. 데이터베이스 커넥션 풀(DBCP) 사용 DBCP, Pool, Collections 모듈 다운로드 받기
75
6. 데이터베이스 커넥션 풀(DBCP) 사용 DBCP, Pool, Collections 모듈 다운로드 받기
76
6. 데이터베이스 커넥션 풀(DBCP) 사용 DBCP, Pool, Collections 모듈 다운로드 받기
77
6. 데이터베이스 커넥션 풀(DBCP) 사용 DBCP, Pool, Collections 모듈 설치하기.
78
[그림 12-44] 데이터베이스 커넥션 풀을 통해 데이터베이스를 사용하는 방법
6. 데이터베이스 커넥션 풀(DBCP) 사용 데이터베이스 커넥션 풀을 사용하는 방법 데이터베이스 커넥션 풀을 이용한 데이터베이스 사용법은 데이터베이스 커넥 션 풀을 사용하지 않을 때와 비슷하다. 차이점이라면 Class.forName과 DriverManager, getConnection 메서드에 넘겨주는 파 라미터 값이 다르다는 정도이다. [그림 12-44] 데이터베이스 커넥션 풀을 통해 데이터베이스를 사용하는 방법
79
GenericObjectPool objectPool = new GenericObjectPool();
6. 데이터베이스 커넥션 풀(DBCP) 사용 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법 데이터베이스 커넥션 풀 생성은 우선 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 아이디 패스워드
80
6. 데이터베이스 커넥션 풀(DBCP) 사용 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법
앞에서 만든 두 객체가 함께 작동시키려면 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 객체
81
6. 데이터베이스 커넥션 풀(DBCP) 사용 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법
[예제 12-13] 데이터베이스 커넥션 풀을 생성하고 등록하는 JSP 페이지 contentType= “text/html; charset=euc-kr ”%> import= “org.apache.commons.dbcp.* ”%> 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의 실행 결과
82
6. 데이터베이스 커넥션 풀(DBCP) 사용 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법
[예제 12-14] 데이터베이스 커넥션 풀 테스트하기 ( 1 ) contentType= “text/html; charset=euc-kr ” errorPage= “DBError.jsp ” %> 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의 실행 결과 - 에러가 발생했을 때
83
6. 데이터베이스 커넥션 풀(DBCP) 사용 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법
[예제 12-15] 상품 정보 테이블을 읽는 JSP 페이지 - 데이터베이스 커넥션 풀 사용 contentType= “text/html; charset=euc-kr ” errorPage= “DBError.jsp ” %> 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 문자열을 Unicode 문자열로 바꾸는 메서드 private String toUnicode(String str) { try { byte[] b = str.getBytes( “ISO ”); return new String(b); } catch (java.io.UnsupportedEncodingException uee) { System.out.println(uee.getMessage()); return null; %>
84
6. 데이터베이스 커넥션 풀(DBCP) 사용 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법
[그림 12-48] 예제 12-15의 실행 결과 - 올바른 결과 [그림 12-49] 예제 12-15의 실행 결과 - 에러가 발생했을 때
85
[그림 12-50] 웹 컨테이너가 시작될 때 JSP 페이지가 초기화되도록 만드는 방법
6. 데이터베이스 커넥션 풀(DBCP) 사용 데이터베이스 커넥션 풀을 생성하고 등록하는 프로그램의 작성 방법 [예제 12-16] jspInit 메서드 안에서 데이터베이스 커넥션 풀을 생성하고 등록하는 JSP 페이지 contentType= “text/html; charset=euc-kr ”%> import= “org.apache.commons.dbcp.* ”%> 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 페이지가 초기화되도록 만드는 방법
86
6. 데이터베이스 커넥션 풀(DBCP) 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법
JOCL 파일을 이용하면 프로그램을 작성하지 않고 DBCP 데이터베이스 커넥션 풀을 생성하고 등록할 수 있다. 위 코드를 자세히 살펴보면 DBCP 데이터베이스 커넥션 풀을 생성하고 등록하 는 프로그램과 동일한 부분이 많이 있음을 알 수 있다. JOCL 파일은 WEB-INF/classes 서브디렉터리 안에 저장해야 한다. [그림 12-51] JOCL 파일의 예
87
6. 데이터베이스 커넥션 풀(DBCP) 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법
88
6. 데이터베이스 커넥션 풀(DBCP) 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법
JOCL 파일을 사용할 때는 JDBC 드라이버, DBCP, Pool, Collections 모듈을 JOCL 파일이 속하는 웹 애플리케이션 디렉터리의 WEB-INF/lib 디렉터리로 옮겨와야 한다..
89
6. 데이터베이스 커넥션 풀(DBCP) 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법
[예제 12-17] 데이터베이스 커넥션 풀 테스트하기 (2) contentType= “text/html; charset=euc-kr ” errorPage= “DBError.jsp ” %> 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의 실행 결과
90
6. 데이터베이스 커넥션 풀(DBCP) 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법
[예제 12-18] 회원 정보를 입력하는 JSP 페이지 contentType= “text/html; charset=euc-kr ” errorPage= “DBError.jsp ” %> 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 ”); %>
91
6. 데이터베이스 커넥션 풀(DBCP) 사용 JOCL 파일을 이용한 데이터베이스 커넥션 풀 생성 방법
[그림 12-55] 예제 12-15, 예제 12-18, 예제 12-7의 실행 결과
Similar presentations