데이터베이스사용하기 JSP & Servlet
Contents 학습목표 데이터베이스를이용하면파일보다훨씬더체계적이고구조적인방법으로데이터를저장하고관리할수있다. 그래서웹프로그래밍에서도데이터베이스를사용해야할경우가많이있는데이번장에서는그방법을배워보자. 내용 데이터베이스개론 MySQL 설치하기 Connector/J 설치하기 웹컴포넌트에서데이터베이스를사용하는방법 데이터베이스커넥션풀의설치와사용 2/80
3/90 1. 데이터베이스사용 데이터베이스 (database) 파일과마찬가지로보조기억장치에데이터를저장하는수단 크게계층형데이터베이스, 관계형데이터베이스, 객체지향데이터베이스로구분 그중관계형테이터베이스인 MySQL을사용 자바프로그램에서 MySQL 을사용하려면 JDBC 드라이버가필요하다. [ 그림 12-1] JDBC 드라이버의역할
2. MySQL 설치하기 MySQL 다운로드받기 웹브라우저를열고 http://dev.mysql.com/downloads/mysql 라는 URL 을입력 하면다음과같은웹페이지가나타난다. 4/90
5/90 2. MySQL 설치하기 MySQL 다운로드받기 가장최신버전인 MySQL 5.1 을선택하면화면이다음과같이바뀐다.
6/90 2. MySQL 설치하기 MySQL 다운로드받기 앞화면에서 Download 버튼을누른다.
2. MySQL 설치하기 MySQL 다운로드받기 앞화면에서 Windows 플랫폼을선택하면 Windows 플랫폼에맞는 MySQL 의 여러에디션이표시된화면이나타난다. 7/90
2. MySQL 설치하기 MySQL 다운로드받기 앞화면에서 Pick a mirror 링크를클릭하면개인정보를입력하도록권장하 는화면이나타난다. 8/90
2. MySQL 설치하기 MySQL 다운로드받기 앞화면아래쪽의 No Thanks 로시작하는링크를클릭하면 MySQL 을다운로 드받을수있는다음과같은웹페이지가나타난다. 9/90
2. MySQL 설치하기 MySQL 다운로드받기 앞화면에서 HTTP 나 FTP 링크중하나를선택하면다음과같은창이나타나는 데, 여기에서저장버튼을누르면다운로드가시작된다. 10/90
2. MySQL 설치하기 MySQL 설치하기 다운로드받은파일을더블클릭하면왼쪽창이나타나며, Next 버튼을누르 면화면이오른쪽그림처럼바뀐다. 11/90
2. MySQL 설치하기 MySQL 설치하기 앞화면에서 Typical 옵션을선택하고 Next 버튼을누르면화면이왼쪽그림처럼바뀌고, Install 버튼을누르면화면이오른쪽그림처럼바뀌면서설치가진행된다. 12/90
2. MySQL 설치하기 MySQL 설치하기 설치가끝나면왼쪽화면이나타나고, Next 버튼을누르면화면이오른쪽그림처럼바뀐다. 여기에서 Finish 버튼을누르면 MySQL의구성프로그램이시작된다. 13/90
2. MySQL 설치하기 MySQL 의구성정보입력하기 MySQL 구성프로그램이시작되면왼쪽창이나타나고, Next 버튼을누르면 화면이오른쪽그림처럼바뀐다. 14/90
2. MySQL 설치하기 MySQL 의구성정보입력하기 앞화면에서 Next 버튼을누르면창이왼쪽그림처럼바뀌는데, MySQL가윈도우서비스로서실행되도록만들기위해아래쪽체크박스를선택해서오른쪽그림처럼만든다. 15/90
2. MySQL 설치하기 MySQL 의구성정보입력하기 앞화면에서 Next 버튼을누르면창이왼쪽그림처럼바뀌는데, 여기에서새로운 root 사용자암호를두번입력하고 Next 버튼을누르면화면이오른쪽그림처럼바뀐다. [ 주의 ] 암호는나중에필요하므로잘기억해둔다. 16/90
2. MySQL 설치하기 MySQL 의구성정보입력하기 앞화면에서 Execute 버튼을누르면앞에서구성정보의설정이시작되고, 설 정이끝나면화면이오른쪽그림처럼바뀐다. 오른쪽화면에서 Finish 버튼을누르면 MySQL 구성프로그램이끝난다. 17/90
2. MySQL 설치하기 MySQL 시작하기 시작메뉴에서제어판 관리도구 서비스를선택한다. [ 그림 12-9] 윈도우즈운영체제의서비스로등록된 MySQL 상태가시작됨으로표시되어있지않으면 MySQL 이작동되지않고있는것이 다. 그럴때는 MySQL 항목을더블클릭해서 MySQL 속성창을연다. 18/90
2. MySQL 설치하기 MySQL 시작하기 MySQL 속성창의중간쯤보면시작, 중지, 일시중지, 계속이라는 4 개의버 튼이있는데이중시작버튼을누르면 MySQL 이시작된다. [ 그림 12-10] MySQL 서비스를선택했을때나타나는윈도우 19/90
2. MySQL 설치하기 MySQL 설치및환경설정참고사이트 Ubuntu 환경에서 MySQL 서버설치 https://websetnet.com/install-mysql-ubuntu-16-04/ Ubuntu 환경에서 MySQL 환경설정 http://blog.naver.com/wizardkyn/220852348757 Windows 환경에서 MySQL 서버설치 http://moomini.tistory.com/64 http://oyeahhh.tistory.com/66 https://m.blog.naver.com/postview.nhn?blogid=dream_time92&logno =220786449944&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2 F http://promobile.tistory.com/368 20/90
21/90 2. MySQL 설치하기 MAC OS-X 환경에서의설치및환경설정 1. MySQL S/W 패키지다운로드 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 2. MySQL S/W 패키지설치 DMG 파일실행, 설치과정에서발급되는관리자암호를기록 http://palpit.tistory.com/871 3. MySQL 클라이언트실행환경설정 터미널환경에서 MySQL 클라이언트실행 홈폴더에.bash_profile 생성 & 편집 Export PATH=/usr/local/mysql/bin:$PATH 4. MySQL 관리자암호변경 https://gomdoreepooh.github.io/notes/mysql-reset-password 5. MySQL 서버실행및종료 https://gomdoreepooh.github.io/notes/mysql-reset-password 6. MySQL 한글 (UTF-8) 지원설정 http://igeniusdo.tistory.com/17, http://tbang.tistory.com/31
3. MySQL DB 관리 데이터베이스만들기 MySQL 클라이언트프로그램 mysqladmin.exe 을이용 명령프롬프트창에서실행 create SQL 명령을이용하여데이터베이스생성 mysqladmin -u root -p create webdb 사용자의 ID 가 root 라는뜻 webdb 라는이름의데이터베이스를만들라는뜻 패스워드를입력받겠다는뜻 1 데이터베이스를생성하라는명령을입력합니다 2 패스워드를입력합니다 [ 그림 12-11] 데이터베이스를만드는방법 참고사이트 : http://www.liquidweb.com/kb/change-a-password-formysql-on-linux-via-command-line/ 22/90
23/90 3. MySQL DB 관리 데이터베이스에데이터저장하기 데이터베이스는정형화된구조의데이터를저장하기에적합한저장수단이다. [ 그림 12-12] 관계형데이터베이스에저장하기에적합한데이터 관계형데이터베이스를테이블 (Table) 형태로데이터저장 같은구조를갖는데이터 ( 레코드 ) 들끼리모아저장
3. MySQL DB 관리 데이터베이스에데이터저장하기 테이블을생성하기위해서는먼저테이블의구조를만들어야하는데, 이구조 는데이터항목의이름, 타입, 최대크기에의해정해진다. 테이블을설계한다음에해야할일은데이터베이스안으로들어가서실제로 테이블을생성하는것 24/90
3. MySQL DB 관리 데이터베이스에데이터저장하기 데이터베이스에로그인하기위해서는명령프롬프트창에서다음과같은명령 을입력해야한다. mysql -u root -p 사용자의 ID 가 root 라는뜻 패스워드를입력받겠다는뜻 위명령을입력하면 root 사용자의암호를묻는프롬프트가나타나고, 암호를입력하면 mysql> 프롬프트가나타난다. mysql> 프롬프트다음에 use라는명령을다음과같은형식으로입력하면데이터베이스에들어갈수있다. use webdb 데이터베이스의이름 데이터베이스를빠져나오려면 mysql> 프롬프트다음에 quit 라고입력하면된다. 25/90
26/90 3. MySQL DB 관리 데이터베이스에데이터저장하기 1) mysql.exe 프로그램을실행합니다. 2) 패스워드를입력합니다. 3) use 명령을이용해서특정데이터베이스로들어갑니다. 4) quit 명령을실행하면 mysql.exe 프로그램이끝납니다. [ 그림 12-12] 데이터베이스에들어가고나오는방법
3. MySQL DB 관리 데이터베이스에데이터저장하기 테이블을만들기위해서는데이터베이스안으로들어가서다음과같은형식의 create 명령을실행하면된다. create table goodsinfo (code char(5), title varchar(50), writer varchar(20), price int(8)) ; create 문을시작하는키워드 테이블이름데이터항목의이름, 타입, 크기모든명령문의끝에반드시써야하는세미콜론 위명령문의경우, 필수입력데이터가누락될가능성이있다. 필수입력데이터지정을위해서는항목뒤에 not null 이라는키워드를사용 create table goodsinfo ( code char(5) not null, title varchar(50) not null, writer varchar(20), price int(8) not null ); 필수데이터항목뒤에는 not null 이라고쓰세요. 27/90
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/90
29/90 3. MySQL DB 관리 데이터베이스에데이터저장하기 다음그림은 create 문을이용해서실제로테이블을만드는예이다. [ 그림 12-13] 을참조해서 webdb 데이터베이스로들어가세요 테이블을생성하는 create 문을입력하세요. 정상적으로테이블이만들어지면이런메시지가나옵니다. [ 그림 12-14] 테이블을만드는방법
30/90 3. MySQL DB 관리 데이터베이스에데이터저장하기 테이블이올바르게만들어졌는지확인하기위해서는 desc 명령을사용 테이블의구조 [ 그림 12-15] 테이블의구조를확인하는방법
31/90 3. MySQL DB 관리 데이터베이스에데이터저장하기 테이블에데이터를입력하려면다음과같은형식의 insert 문을쓰면된다. insert into goodsinfo (code, title, writer, price) values ( 10001, 뇌를자극하는 Java 프로그래밍, 김윤명, 27000); insert 문을시작하는키워드 테이블이름항목이름키워드데이터 문자데이터는반드시작은따옴표로묶어서써야한다. [ 그림 12-16] 테이블에데이터를입력하는방법
32/90 3. MySQL DB 관리 데이터베이스에데이터저장하기 테이블에저장한데이터를읽어오려면 select 문을이용 select name, price from goodsinfo; select 문을시작하는키워드 항목이름 키워드 테이블이름 와일드카드문자 (*) 를쓰면테이블의모든항목을읽어올수있다. select * from goodsinfo; 모든데이터항목을뜻하는와일드카드문자 특정데이터만읽어오려면테이블이름뒤에 where 절을사용 select * from goodsinfo where price > 20000; 키워드 검색조건
33/90 3. MySQL DB 관리 데이터베이스에데이터저장하기 [ 그림 12-17] 테이블의데이터를조회하는방법
34/90 3. MySQL DB 관리 데이터베이스에데이터저장하기 테이블에있는기존의데이터를수정하려면 update 문을사용 update goodsinfo set writer:= 토마스코멘외 3 명, price:=33600 where code = 10005 ; update 문을시작하는키워드 테이블이름키워드항목이름 := 새로운값포맷으로값을지정 where 조건절 [ 그림 12-18] 테이블의데이터를수정하는방법
35/90 3. MySQL DB 관리 데이터베이스에데이터저장하기 테이블에있는데이터를삭제하기위해서는 delete 문을사용 delete from goodsinfo where code = 10005 ; delete 문을시작하는키워드 테이블이름 where 조건절 [ 그림 12-19] 테이블의데이터를삭제하는방법
36/90 4. Connector/J 설치하기 JDBC 드라이버다운로드받기 웹사이트 : https://dev.mysql.com/downloads/connector/j/
37/90 4. Connector/J 설치하기 JDBC 드라이버다운로드받기 스크롤바를내리면 Connector/J 를다운로드받을수있는링크들이나타난다.
38/90 4. Connector/J 설치하기 JDBC 드라이버다운로드받기 최신버전의 Connector/J 에대한링크를클릭해서다운로드받는다.
39/90 4. Connector/J 설치하기 JDBC 드라이버설치하기
40/90 5. 웹환경에서의 JDBC 프로그래밍 JDBC 개념과역할 JDBC(Java Database Connectivity) - 자바에서데이터베이스를표준화된방법으로접속할수있도록만든 API 규격 데이터베이스벤더와상관없이동일한개발이가능하게함 애플리케이션 사용 JDBC 드라이버관리자 구현 오라클 JDBC 드라이버 MySql JDBC 드라이버 오라클 DBMS MySql DBMS 인포믹스 JDBC 드라이버 인포믹스 DBMS
41/90 5. 웹환경에서의 JDBC 프로그래밍 JDBC 드라이버유형 자바애플리케이션 JDBC API JDBC 드라이버관리자 JDBC 드라이버 API JDBC-ODBC 드라이버 Native-API 드라이버 Net-Protocol 드라이버 Native-Protocol 드라이버 ODBC 드라이버 JDBC 미들웨어 DBMS DBMS DBMS DBMS DBMS
42/90 5. 웹환경에서의 JDBC 프로그래밍 JDBC 드라이버설치 ( 예 ) 오라클 JDBC 드라이버 JDBC 드라이버선택 JDBC 드라이버는사용하고자하는데이터베이스벤더별로제공됨 오라클 JDBC 드라이버 c:\dev\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib\ojdbc14.jar 설치디렉터리 ( 다음중한가지를이용함 ) 1 JDK설치디렉터리 \jre\lib\ext\ 에복사하는방법. 2 톰캣설치디렉터리 \common\lib 폴더에복사하는방법 3 이클립스프로젝트의 WebContent\WEB-INF\lib 폴더에복사하는방법 WebContent\WEB-INF\lib 폴더에설치
43/90 5. 웹환경에서의 JDBC 프로그래밍 JDBC 프로그래밍단계 (1)
44/90 5. 웹환경에서의 JDBC 프로그래밍 JDBC 프로그래밍단계 (2)
45/90 5. 웹환경에서의 JDBC 프로그래밍 JDBC 드라이버로드 & 데이터베이스연결
5. 웹환경에서의 JDBC 프로그래밍 JDBC 드라이버로드 & 데이터베이스연결 자바프로그램에서관계형데이터베이스로연결을하기위해서는먼저다음과 같은방법으로 JDBC 드라이버를로드해야한다. Class.forName( com.mysql.jdbc.driver ); JDBC 드라이버의클래스이름 데이터베이스로연결을하기위해서는먼저프로토콜, 서브프로토콜, 서브네 임으로이루어진데이터베이스 URL 을알아두어야한다. jdbc:mysql://219.153.12.14:3306/webdb 프로토콜 (protocol) 서브프로토콜 (subprotocol) 서브네임 (subname) IP 주소 : 포트번호 /DB 이름 서브네임의작성방법은 DBMS 의종류마다다르므로 MySQL 이아닌다른 DBMS 를 사용할때는관련매뉴얼을찾아보아야한다. 46/90
5. 웹환경에서의 JDBC 프로그래밍 JDBC 드라이버로드 & 데이터베이스연결 데이터베이스로연결을맺기위해서는 java.sql.drivermanager 클래스의 getconnection 메서드를호출해야한다. Connection conn = DriverManager.getConnection( jdbc:mysql://219.153.12.14:3306/webdb, root, 1234 ); 데이터베이스 URL 사용자 ID 패스워드 이메서드는데이터베이스로의연결에성공하면 java.sql.connection 인터페이스타입의객체를만들어서리턴한다. 데이터베이스로의연결을끊기위해서는 Connection 객체에대해 close 메서드를호출하면된다. conn.close() 데이터베이스로의연결을끊는메서드 47/90
48/90 5. 웹환경에서의 JDBC 프로그래밍 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 의실행결과
5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를읽어오는방법 데이터베이스에있는데이터를읽어오려면우선 Connection 객체에대해 createstatement 메서드를호출해서 java.sql.statement 타입객체를구한다. Statement stmt = conn.createstatement(); getconnection 메서드가리턴한 Connection 객체 Statement 객체를만들어서리턴하는메서드 Statement 객체에대해 executequery 메서드를호출하면데이터베이스에있는 데이터를읽어올수있다. ResultSet rs = stmt.executequery( select * from goodsinfo where code= 10002 ; ); select 문을실행하는메서드 49/90
5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를읽어오는방법 executequery 메서드가리턴한 ResultSet 객체에대해 next 메서드를호출하면 데이터베이스로부터읽은데이터를순서대로가져올수있다. boolean exists = rs.next(); 데이터베이스로부터읽은데이터의첫번째 / 다음행위치로이동하는메서드 다음위치에데이터가있을때는 true, 없을때는 false 를리턴한다. next 메서드를호출한다음에 ResultSet 객체에대해 getint, getstring, getfloat 등의메서드를호출하면특정데이터항목값을가져올수있다. String code = rs.getstring( code ); int price = rs.getint( price ); 문자데이터를가져오는메서드 정수데이터를가져오는메서드 50/90
5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를읽어오는방법 필요한데이터를모두가져온다음에는 ResultSet 객체가더이상필요치않기때문에 close 메서드를호출해야한다. rs.close(); ResultSet 을닫는메서드 Statement 객체도모두사용하고난다음에는 close 메서드를호출해서닫아야한다. stmt.close(); Statement 를닫는메서드 51/90
5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를읽어오는방법 [ 예제 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; %> 52/90
53/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를읽어오는방법 [ 예제 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 의실행결과
5. 웹환경에서의 JDBC 프로그래밍 데이터베이스에데이터를입력하는방법 데이터베이스에데이터를입력하려면데이터를읽어올때와마찬가지로우선 Statement 객체를구해야한다. Statement stmt = conn.createstatement(); Statement 객체를만드는메서드 Statement 객체에대해 executeupdate라는메서드를호출하면데이터베이스에새로운데이터를추가할수있다. insert 문을실행하는메서드 int rownum = stmt.executeupdate( insert goodsinfo (code, title, writer, price) values( 10001, 뇌를자극하는 Java 프로그래밍, 김윤명, 27000); ); executeupdate 메서드를이용해서데이터를입력한다음에는 Statement 객체 에대해 close 메서드를호출해야한다. 54/90
55/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스에데이터를입력하는방법 [ 그림 12-13] 을참조해서 webdb 데이터베이스로들어가세요 테이블을생성하는 create 문을입력하세요 정상적으로테이블이만들어지면이런메시지가나옵니다 mysql.exe 를끝내세요 [ 그림 12-28] 회원정보테이블을만드는방법
56/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스에데이터를입력하는방법 다음과같이작동하는회원가입애플리케이션을만들어보자. 1 회원정보를입력하고 확인 버튼을누르면 2 해당정보가 DB 에입력된후결과화면이나타납니다. [ 그림 12-29] 회원가입애플리케이션의화면설계
57/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스에데이터를입력하는방법 이애플리케이션은다음과같은세개의모듈로구현한다. 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
58/90 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>
59/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스에데이터를입력하는방법 [ 예제 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 ); %>
60/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스에데이터를입력하는방법 [ 예제 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 의실행결과
61/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스에데이터를입력하는방법 1) webdb 데이터베이스로들어가십시오. 2) 회원정보테이블을조회하는 select 문을입력하십시오. 3) 입력된데이터를확인할수있습니다. [ 그림 12-32] 예제 12-5 ~ 예제 12-7 의결과를확인하는방법
5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를수정하고삭제하는방법 데이터베이스에있는데이터를수정할때는 executeupdate 메서드에 update 문 을파라미터로넘겨줘야한다. int rownum = stmt.executeupdate( update userinfo set password := dalek where id = rose ; ); 이메서드를이용해서 update 문을실행할수있습니다 데이터베이스에있는데이터삭제할때는 executeupdate 메서드에 delete 문을 파라미터로넘겨줘야한다. int rownum = stmt.executeupdate( delete from userinfo where id = rose ; ); 이메서드를이용해서 delete 문을실행할수도있습니다. 62/90
5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를수정하고삭제하는방법 데이터베이스에저장되어있는상품정보를수정하는애플리케이션을작성 초기화면 상품정보편집화면 상품정보수정결과화면 [ 그림 12-33] 상품정보수정애플리케이션의화면설계 63/90
64/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를수정하고삭제하는방법 앞애플리케이션을다음과같은 5 개의모듈로구성하기로하자. http://localhost:8080/brain12/gim/initform.html http://localhost:8080/brain12/gim/reader.jsp http://localhost:8080/brain12/gim/editform.jsp http://localhost:8080/brain12/gim/updater.jsp http://localhost:8080/brain12/gim/updateresult.jsp 상품코드입력화면 HTML 문서의 URL 상품정보 DB 읽기 JSP 페이지의 URL 상품정보편집화면 JSP 페이지의 URL 상품정보 DB 수정 JSP 페이지의 URL 상품정보수정결과 JSP 페이지의 URL
65/90 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>
5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를수정하고삭제하는방법 [ 예제 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; 66/90
67/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를수정하고삭제하는방법 [ 예제 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>
5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를수정하고삭제하는방법 [ 예제 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); %> 68/90
69/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를수정하고삭제하는방법 [ 예제 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>
70/90 5. 웹환경에서의 JDBC 프로그래밍 데이터베이스의데이터를수정하고삭제하는방법
6. 데이터베이스커넥션풀 (DBCP) 사용 데이터베이스에동시에접속할수있는사용자수는한정되어있는데, 웹서버에는동시에수백, 수천의사용자들이접속할수있다. 웹애플리케이션이실행될때마다데이터베이스로새로운접속을맺는것은부하가큰작업 데이터베이스몇개의접속을맺어서데이터베이스커넥션풀 (Database Connection Pool) 에저장해놓고, 필요한웹애플리케이션이빌려쓰고반환하는방식을사용. 71/90
6. 데이터베이스커넥션풀 (DBCP) 사용 관련사이트 https://yckwon2nd.blogspot.kr/2016/05/tomcat-dbcpcommondbcp.html http://all-record.tistory.com/104 http://dreamzelkova.tistory.com/entry/dbcp- %EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0- JSPMySqlTomcat90 http://d2.naver.com/helloworld/5102792 72/90
73/90 6. 데이터베이스커넥션풀 (DBCP) 사용 DBCP, Pool, Collections 모듈다운로드받기 웹사이트 : http://www.apache.org/.
74/90 6. 데이터베이스커넥션풀 (DBCP) 사용 DBCP, Pool, Collections 모듈다운로드받기 앞화면에서 Commons 프로젝트를선택한다..
75/90 6. 데이터베이스커넥션풀 (DBCP) 사용 DBCP, Pool, Collections 모듈다운로드받기 DBCP 링크를클릭하여모듈을찾아서다운로드한다..
76/90 6. 데이터베이스커넥션풀 (DBCP) 사용 DBCP, Pool, Collections 모듈다운로드받기 Pool 링크를클릭하여모듈을찾아서다운로드한다..
77/90 6. 데이터베이스커넥션풀 (DBCP) 사용 DBCP, Pool, Collections 모듈다운로드받기 Collections 링크를클릭하여모듈을찾아서다운로드한다..
78/90 6. 데이터베이스커넥션풀 (DBCP) 사용 DBCP, Pool, Collections 모듈설치하기.
6. 데이터베이스커넥션풀 (DBCP) 사용 데이터베이스커넥션풀을사용하는방법 데이터베이스커넥션풀을이용한데이터베이스사용법은데이터베이스커넥션풀을사용하지않을때와비슷하다. 차이점이라면 Class.forName과 DriverManager, getconnection 메서드에넘겨주는파라미터값이다르다는정도이다. [ 그림 12-44] 데이터베이스커넥션풀을통해데이터베이스를사용하는방법 79/90
6. 데이터베이스커넥션풀 (DBCP) 사용 데이터베이스커넥션풀을생성하고등록하는프로그램의작성방법 데이터베이스커넥션풀생성은우선 org.apache.commons.pool.impl 패키지에 속하는 GenericObjectPool 클래스나 StackObjectPool 클래스의객체를생성 GenericObjectPool objectpool = new GenericObjectPool(); GenericObjectPool 객체를생성합니다. GenericObjectPool 클래스는데이터베이스커넥션풀을표현하는것이아니라일반자바객체를담는풀을표현한다. 데이터베이스커넥션을생성하는객체는 DBCP 모듈에속하는 org.apache.commons.dbcp 패키지의 DriverManagerConnectionFactory 클래스를이용해서만들수있다. DriverManagerConnectionFactory connectionfactory = new DriverManagerConnectionFactory( jdbc:mysql://localhost:3306/webdb, root, 1234 ); 데이터베이스 URL 아이디패스워드 80/90
6. 데이터베이스커넥션풀 (DBCP) 사용 데이터베이스커넥션풀을생성하고등록하는프로그램의작성방법 앞에서만든두객체가함께작동시키려면 org.apache.commons.dbcp 패키지에 속하는 PoolableConnectionFactory 클래스의객체를만들어야한다. new PoolableConnectionFactory(connectionFactory, objectpool, null, null, false, true); DriverManagerConnectionFactory 객체 GenericObjectPool 객체 다음은 PoolingDriver 객체를생성해서 GenericObjectPool 객체를웹컨테이너 에등록하는것이다. PoolingDriver driver = new PoolingDriver(); PoolingDriver 객체를생성한다 driver.registerpool( /webdb_pool, objectpool); 데이터베이스커넥션풀의이름 GenericObjectPool 객체 81/90
82/90 6. 데이터베이스커넥션풀 (DBCP) 사용 데이터베이스커넥션풀을생성하고등록하는프로그램의작성방법 [ 예제 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 의실행결과
6. 데이터베이스커넥션풀 (DBCP) 사용 데이터베이스커넥션풀을생성하고등록하는프로그램의작성방법 [ 예제 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 의실행결과 - 에러가발생했을때 83/90
6. 데이터베이스커넥션풀 (DBCP) 사용 데이터베이스커넥션풀을생성하고등록하는프로그램의작성방법 [ 예제 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; %> 84/90
85/90 6. 데이터베이스커넥션풀 (DBCP) 사용 데이터베이스커넥션풀을생성하고등록하는프로그램의작성방법 [ 그림 12-48] 예제 12-15 의실행결과 - 올바른결과 [ 그림 12-49] 예제 12-15 의실행결과 - 에러가발생했을때
86/90 6. 데이터베이스커넥션풀 (DBCP) 사용 데이터베이스커넥션풀을생성하고등록하는프로그램의작성방법 [ 예제 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 페이지가초기화되도록만드는방법
6. 데이터베이스커넥션풀 (DBCP) 사용 JOCL 파일을이용한데이터베이스커넥션풀생성방법 JOCL 파일을이용하면프로그램을작성하지않고 DBCP 데이터베이스커넥션 풀을생성하고등록할수있다. [ 그림 12-51] JOCL 파일의예 위코드를자세히살펴보면 DBCP 데이터베이스커넥션풀을생성하고등록하 는프로그램과동일한부분이많이있음을알수있다. JOCL 파일은 WEB-INF/classes 서브디렉터리안에저장해야한다. 87/90
88/90 6. 데이터베이스커넥션풀 (DBCP) 사용 JOCL 파일을이용한데이터베이스커넥션풀생성방법
6. 데이터베이스커넥션풀 (DBCP) 사용 JOCL 파일을이용한데이터베이스커넥션풀생성방법 JOCL 파일을사용할때는 JDBC 드라이버, DBCP, Pool, Collections 모듈을 JOCL 파일이속하는웹애플리케이션디렉터리의 WEB-INF/lib 디렉터리로옮겨와야한다.. 89/90
90/90 6. 데이터베이스커넥션풀 (DBCP) 사용 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 의실행결과
6. 데이터베이스커넥션풀 (DBCP) 사용 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 { try { stmt.close(); catch (Exception ignored) { try { conn.close(); catch (Exception ignored) { response.sendredirect( SubscriptionResult.jsp ); %> 91/90
92/90 6. 데이터베이스커넥션풀 (DBCP) 사용 JOCL 파일을이용한데이터베이스커넥션풀생성방법 [ 그림 12-55] 예제 12-15, 예제 12-18, 예제 12-7 의실행결과
JSP & Servlet