35
Java Web Programming 3 일일

Java Web Programming

  • Upload
    romeo

  • View
    73

  • Download
    0

Embed Size (px)

DESCRIPTION

Java Web Programming. 3 일차. 데이터베이스와 DBMS. ' 데이터베이스 (Database)' 주목적은 데이터를 저장했다가 필요할 때에 사용하는 것 DBMS(Database Management System)- 데이터베이스를 관리하는 시스템 데이터베이스는 데이터를 오류없이 안전하게 보호하는 것이 핵심 ! DBMS 는 트랜잭션과 같이 데이터를 안전하게 보관할 수 있는 다양한 기능을 제공. DBMS 의 주요 기능. 데이터의 추가 / 조회 / 변경 / 삭제 데이터의 무결성 유지 트랜잭션 관리 - PowerPoint PPT Presentation

Citation preview

Page 1: Java Web Programming

Java Web Programming

3 일차

Page 2: Java Web Programming

JSP 2.0 Programming 2

데이터베이스와 DBMS

• ' 데이터베이스 (Database)' 주목적은 데이터를 저장했다가 필요할 때에 사용하는 것

• DBMS(Database Management System)- 데이터베이스를 관리하는 시스템

• 데이터베이스는 데이터를 오류없이 안전하게 보호하는 것이 핵심 !

• DBMS 는 트랜잭션과 같이 데이터를 안전하게 보관할 수 있는 다양한 기능을 제공

Page 3: Java Web Programming

JSP 2.0 Programming 3

DBMS 의 주요 기능

• 데이터의 추가 /조회 /변경 /삭제• 데이터의 무결성 유지• 트랜잭션 관리• 데이터의 백업 및 복원• 데이터 보안

Page 4: Java Web Programming

JSP 2.0 Programming 4

테이블과 스키마

• 테이블 - 데이터가 저장되는 장소• 스키마 - 테이블의 구조에 대한 정보 저장

필드이름 필드타입 길이

MEMBERID VARCHAR 10

PASSWORD VARCHAR 10

NAME VARCHAR 20

EMAIL VARCHAR 80

[ 테이블 스키마 예 ]

Page 5: Java Web Programming

JSP 2.0 Programming 5

테이블과 레코드

• 레코드 - 스키마에 정의된 필드에 해당하는 값을 갖는 하나의 행

• 레코드가 모여서 테이블을 구성한다 .MEMBERID PASSWORD NAME EMAIL

javaman java 최범균 [email protected]

jspman jsp 최모모 [email protected]

레코드 (Record)

Page 6: Java Web Programming

JSP 2.0 Programming 6

주요키와 인덱스

• 주요키 (Primary Key) - 각각의 레코드를 구별하기 위해서 사용되는 필드 . 테이블이 주요키를 갖는 경우 모든 레코드의 고유키값은 서로 달라야 한다 .

• 인덱스 (Index) - 특정 필드를 사용하여 레코드를 순서대로 정렬한 정보를 저장

Page 7: Java Web Programming

JSP 2.0 Programming 7

데이터베이스 프로그래밍의 일반적인 순서

DBMS

데이터베이스

데이터베이스

DBMS클라이언트

1. 연결

2. 명령어 전송 (SQL 실행 )

3. 결과 전송

4. 연결종료

• DBMS 클라이언트 - 데이터베이스를 사용하는 어플리케이션• DBMS - 데이터베이스를 관리해주는 시스템 • 데이터베이스 - 데이터를 저장할 공간

* 이 세가지 요소는 DB 프로그래밍의 필수 요소

Page 8: Java Web Programming

JSP 2.0 Programming 8

SQL 이란 ?

SQL 은 'Strutured Query Language' 의 약자로서데이터베이스로부터 데이터를 조회하고 삭제하는 등의

데이터베이스 작업을 수행할 때 사용하는 질의 언어

* 거의 모든 데이터베이스 프로그래밍은 SQL 을 사용해서 데이터를 처리한다 .

Page 9: Java Web Programming

JSP 2.0 Programming 9

SQL 표준 타입SQL 타입 설명

CHAR 확정 길이의 문자열을 저장

VARCHAR 가변 길이의 문자열을 저장 (255 자까지 저장 )

LONG VARCHAR 긴 가변 길이의 문자열을 저장

NUMERIC 숫자를 저장

DECIMAL 십진수를 저장

INTEGER 정수를 저장

TIMESTAMP 날짜 및 시간을 저장

TIME 시간을 저장

DATE 날짜를 저장

[ 표준 SQL 의 주요 타입 ]

Page 10: Java Web Programming

JSP 2.0 Programming 10

테이블 생성 쿼리 : CREATE TABLE ...Syntax

create table TABLENAME ( FIELD_NAME1 FIELD_TYPE1(LEN1), FIELD_NAME2 FIELD_TYPE2(LEN2), ..., FIELD_NAMEn FIELD_TYPEn(LENn))

TABLENAME - 테이블을 식별할 때 사용할 이름 FIELD_NAME - 각 필드의 이름 FIELD_TYPE - 각 필드에 저장될 값의 타입 LEN - 저장될 값의 최대 길이

Example

create table MEMBER ( MEMBERID VARCHAR(10) NOT NULL PRIMARY KEY, PASSWORD VARCHAR(10) NOT NULL, NAME VARCHAR(20) NOT NULL, EMAIL VARCHAR(80))

Page 11: Java Web Programming

JSP 2.0 Programming 11

데이터 삽입 쿼리 : INSERT INTO ... VALUES ...Syntax

insert into TABLENAME (FIELD1, FIELD2, .., FIELDn)values (VALUE1, VALUE2, .., VALUEn)

TABLENAME - 테이블을 식별할 때 사용할 이름 FIELDx - 값을 지정할 필드의 이름 VALUEx - 같은 순서에 위치한 필드의 값 필드 목록을 생략하면 모든 필드에 대해서 값을 삽입한다 .

Example

필드 지정insert into MEMBER (MEMBERID, PASSWORD, NAME) values ('madvirus', '1234', '최범균 ')

필드 지정 안함insert into MEMBER values ('era13', '5678', '최범균 ', '[email protected]')

Page 12: Java Web Programming

JSP 2.0 Programming 12

데이터 조회 쿼리 : SELECT ... FROM ... WHERE ...Syntax

select FIELD1, FIELD2, ..., FIELDn from TABLENAME[where 검색조건 ] [order by 정렬순서 ]

TABLENAME - 테이블을 식별할 때 사용할 이름 FIELDx - 값을 읽어올 필드의 이름 where 절에 조건을 입력하면 조건에 해당하는 레코드의 값만 읽어온다 . order by 절에 정렬 순서를 입력하면 지정한 순서대로 레코드를 읽어온다 . select * from 과 같이 '*' 를 사용하면 레코드의 모든 필드를 읽어온다 .

Example

select * from MEMBERselect * from MEMBER where NAME = '최범균 ' and EMAIL='[email protected]'select * from MEMBER where EMAIL <> ''select * from MEMBER where EMAIL is NULLselect * from MEMBER where EMAIL is not NULLselect * from EMPLOY where where SALARY >= 1000 and SALARY <= 2000select * from MEMBER where NAME like '최 %'select * from MEMBER order by NAME asc, MEMBERID desc

Page 13: Java Web Programming

JSP 2.0 Programming 13

데이터 조회 쿼리 : 집합• sum() : 특정 필드의 합• max() : 특정 필드 중 최대 값• min() : 특정 필드 중 최소값• count() : 검색된 레코드의 개수

Example

select count(*) from MEMBER where NAME like '최 %'select max(SALARY), min(SALARY) from EMPLOY

Page 14: Java Web Programming

JSP 2.0 Programming 14

데이터 수정 쿼리 : UPDATE ... SET ...Syntax

update TABLENAME set FIELD1=VALUE1, FIELD2=VALUE2, ... [where 조건절 ]

TABLENAME - 테이블을 식별할 때 사용할 이름 FIELDx - 값을 읽어올 필드의 이름 VALUEx - 변경할 값 where 절이 존재하지 않으면 모든 레코드를 수정한다 . where 절이 있는 경우 , 조건에 해당하는 레코드만 수정한다 .

Example

update MEMBER set ADDRESS = '서울시 ' where MEMBERID = 'myid'

Page 15: Java Web Programming

JSP 2.0 Programming 15

데이터 삭제 쿼리 : DELETE FROM ...Syntax

delete from TABLENAME [where 조건절 ]

TABLENAME - 테이블을 식별할 때 사용할 이름 where 절이 존재하지 않으면 모든 레코드를 삭제한다 . where 절이 있는 경우 , 조건에 해당하는 레코드만 삭제한다 .

Example

delete from MEMBER where MEMBERID = 'myid'

Page 16: Java Web Programming

JSP 2.0 Programming 16

조인 (join) : 조회시 테이블의 연결두 개 이상의 테이블로부터 관련 있는 데이터를 읽어올 때 사용된다

Syntax

select A. 필드 1, A. 필드 2, B. 필드 3, B. 필드 4 from 테이블 1 as A, 테이블2 as Bwhere A. 필드 x = B. 필드 y테이블 1 의 필드 x 와 테이블 2 의 필드 y 의 값이 같은 레코드를 하나의 행 (row) 으로 읽어온다 .

Example

select * from MEMBER as A, MEMBER_ETC as Bwhere A.MEMBERID = B.MEMBERID;

Page 17: Java Web Programming

JSP 2.0 Programming 17

JDBC 란 ?

• Java DataBase Connectivity 의 약자로서 자바에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 API

• DBMS 의 종류에 상관없이 하나의 JDBC API 를 사용해서 데이터베이스 작업을 처리

• 일단 익혀두면 하나의 JDBC API 로 모든 DBMS 에 대해서 데이터베이스 작업을 처리할 수 있음 .

Page 18: Java Web Programming

JSP 2.0 Programming 18

JDBC 프로그래밍의 구조

데이터베이스

데이터베이스

데이터베이스

데이터베이스

자바 ( 웹 )어플리케이션

자바 ( 웹 )어플리케이션

JDBCAPI

JDBCAPI

JDBC드라이버

JDBC드라이버

JDBC드라이버

JDBC드라이버

오라클 , MS-SQL, DB2, MySQL 등 현재 사용되고 있는 거의 대부분의DBMS 가 자신에 알맞은 JDBC 드라어비를 제공하고 있기 때문에 JDBC

드라이버가 없어서 JSP 에서 데이터베이스 프로그래밍을 할 수 없는 상황은 발생하지 않는다 .

Page 19: Java Web Programming

JSP 2.0 Programming 19

JDBC 프로그래밍의 실행 순서1. JDBC 드라이버 로딩2. 데이터베이스 커넥션 구함3. 쿼리 실행을 위한 Statement 객체 생성4. 쿼리 실행5. 쿼리 실행 결과 사용6. Statement 종료7. 데이터베이스 커넥션 종료

Page 20: Java Web Programming

JSP 2.0 Programming 20

JDBC 드라이버 로딩

데이터베이스 처리에 필요한클래스 import

JDBC 프로그래밍의 실행 순서 : 예제 (1)Example

<%@ page contentType = "text/html; charset=euc-kr" %>

<%@ page import = "java.sql.DriverManager" %><%@ page import = "java.sql.Connection" %><%@ page import = "java.sql.Statement" %><%@ page import = "java.sql.ResultSet" %><%@ page import = "java.sql.SQLException" %>

<html><head><title>회원 목록 </title></head><body>

MEMBMER 테이블의 내용<table width="100%" border="1"><tr> <td>이름 </td><td>아이디 </td><td>이메일 </td></tr><% // 1. JDBC 드라이버 로딩 Class.forName("com.mysql.jdbc.Driver"); Connection conn = null; Statement stmt = null; ResultSet rs = null;

Page 21: Java Web Programming

JSP 2.0 Programming 21

ResultSet 으로부터쿼리 결과 읽어옴

쿼리를 실행해서 결과를 ResultSet 에 저장

쿼리 실행을 위한 Statement 생성

데이터베이스 커넥션 생성

JDBC 프로그래밍의 실행 순서 : 예제 (2)Example

try { String jdbcDriver = "jdbc:mysql://localhost:3306/chap11?" + "useUnicode=true&characterEncoding=euc-kr"; String dbUser = "jspexam"; String dbPass = "jspex"; String query = "select * from MEMBER order by MEMBERID"; // 2. 데이터베이스 커넥션 생성 conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass); // 3. Statement 생성 stmt = conn.createStatement(); // 4. 쿼리 실행 rs = stmt.executeQuery(query); // 5. 쿼리 실행 결과 출력 while(rs.next()) {%><tr> <td><%= rs.getString("NAME") %></td> <td><%= rs.getString("MEMBERID") %></td> <td><%= rs.getString("EMAIL") %></td></tr><% }

Page 22: Java Web Programming

JSP 2.0 Programming 22

DB 커넥션 닫음

Statement 와 ResultSet 닫음

JDBC 프로그래밍의 실행 순서 : 예제 (3)Example

} catch(SQLException ex) { // 에러 발생 } finally { // 6. 사용한 Statement 종료 if (rs != null) try { rs.close(); } catch(SQLException ex) {} if (stmt != null) try { stmt.close(); } catch(SQLException ex) {} // 7. 커넥션 종료 if (conn != null) try { conn.close(); } catch(SQLException ex) {} }

%></table>

</body></html>

Page 23: Java Web Programming

JSP 2.0 Programming 23

JDBC 드라이버 로딩Code

try { Class.forName("JDBC 드라이버 클래스의 완전한 이름 ");} catch(ClassNotFoundException ex) { // 지정한 클래스가 존재하지 않을 경우 에러가 발생한다 . // 에러 처리}

JDBC 드라이버 클래스 예

•MySQL - com.mysql.jdbc.Driver• 오라클 - oracle.jdbc.driver.OracleDriver

Page 24: Java Web Programming

JSP 2.0 Programming 24

JDBC URLSyntax

jdbc:[DBMS]:[ 데이터베이스식별자 ]

Example

MySQLjdbc:mysql://localhost:3306/chap11?useUnicode=true&characterEncoding=euc-kr

오라클jdbc:oracle:thin:@172.0.0.1:1521:ORCL

Page 25: Java Web Programming

JSP 2.0 Programming 25

데이터베이스 커넥션 얻기Code

DriverManager.getConnection(String jdbcURL)DriverManager.getConnection(String jdbcURL, String user, String password)

• jdbcURL - 데이터베이스를 나타내는 JDBC URL• user - 데이터베이스 계정• password - 데이터베이스 계정 암호

→ DB 와 연결된 Connection 객체를 리턴한다 .

Exception Code

Connection conn = null;try { conn = DriverManager.getConnection(...); ...} catch(SQLException ex) { ... // 예외 처리}

커넥션을 구하지 못하면SQLException 예외를 발생

Page 26: Java Web Programming

JSP 2.0 Programming 26

데이터베이스 커넥션 얻기 : 예제 코드Example

Connection conn = null;

try { String jdbcDriver = "jdbc:mysql://localhost:3306/chap11?" + "useUnicode=true&characterEncoding=euc-kr"; String dbUser = "jspexam"; String dbPass = "jspex"; conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass); ...} catch(SQLException ex) { // 에러 발생} finally { if (conn != null) try { conn.close(); } catch(SQLException ex) {}}

Page 27: Java Web Programming

JSP 2.0 Programming 27

Statement 를 사용한 쿼리 실행Code

Statement stmt = null;stmt = conn.createStatement();stmt.executeQuery("select 쿼리 ... ");stmt.executeUpdate("insert,update,delete 쿼리 ...");

• ResultSet executeQuery(String query) - SELECT 쿼리를 실행한다 . SELECT 쿼리를 실행한 결과는 ResultSet 에 저장된다 .

• int executeUpdate(String query) - INSERT, UPDATE, DELETE 쿼리를 실행한다 .

결과값은 삽입 /변경 / 삭제 된 레코드의 개수

Page 28: Java Web Programming

JSP 2.0 Programming 28

ResultSet.getXXXX() 메소드를 사용해서결과로부터 필요한 데이터를 읽어온다 .

ResultSet 으로부터 데이터 읽기

Code

rs = stmt.executeQuery("select * from member");if (rs.next()) { // 다음행 ( 첫번째 행 ) 이 존재하면 rs.next() 는 true 를 리턴 // rs.next() 에 의해 다음행 ( 첫번째 행 ) 으로 이동 String name = rs.getString("NAME"); ...} else { // 첫번째 행이 존재하지 않는다 . 즉 , 결과가 없다 . ...}

• ResultSet.next() 메소드는 다음 행이 존재하면 true 리턴• 따라서 , ResultSet.next() 메소드로 읽어올 행이 존재하는 지 확인한 뒤

데이터 읽음• ResultSet.getXXXX() 형태의 메소드를 사용하여 지정한 컬럼 데이터 읽어옴

Page 29: Java Web Programming

JSP 2.0 Programming 29

ResultSet.next() 메소드의 이해

rs.next() : true

1 행

2 행

3 행

1 행

2 행

3 행

1 행

2 행

3 행

1 행

2 행

3 행

1 행

2 행

3 행

rs.next() : true rs.next() : true rs.next() : false

►►

►►

ResultSet.next() 메소드와 커서의 이동

Page 30: Java Web Programming

JSP 2.0 Programming 30

PreparedStatement 를 사용한 쿼리 실행

1. Connection.prepareStatement() 메소 드를 사용하여 PreparedStatement 생

성2. PreparedStatement 의 set 메소드를

사용하여 필요한 값 지정3. PreparedStatement 의

executeQuery() 또는executeUpdate() 메소드를 사용하여 쿼

리를 실행 .4. finally 블럭에서 사용한

PreparedStatement 를 닫는다 . (close() 메소드 실행 )

Page 31: Java Web Programming

JSP 2.0 Programming 31

물음표 위치에 들어갈 값을 지정한다 .물음표의 인덱스 값은 1 부터 시작

PreparedStatement 를 사용한 쿼리 실행Code

PreparedStatement pstmt = null;pstmt = conn.prepareStatement( "insert into MEMBER (MEMBERID, NAME, EMAIL) values (?, ?, ?)");pstmt.setString(1, memID);pstmt.setString(2, name);pstmt.setString(3, "[email protected]");pstmt.executeUpdate();

• ResultSet executeQuery() - SELECT 쿼리를 실행한다 . SELECT 쿼리를 실행한 결과는 ResultSet 에 저장된다 .

• int executeUpdate() - INSERT, UPDATE, DELETE 쿼리를 실행한다 . 결과값은 삽입 /변경 / 삭제 된 레코드의 개수

물음표 (?) 를 사용해서지정할 값의 위치 명시

Page 32: Java Web Programming

JSP 2.0 Programming 32

매번쿼리분석

PreparedStatement 를 사용하는 이유1, 반복해서 실행되는 동일 쿼리의 속도를 증가시키기 위해

Code

String ids = {"abc", "def", "ghi", .... };stmt = conn.createStatement();stmt.executeQuery("select * form MEMBER where MEMBERID = '"+ids[0]+"'");stmt.executeQuery("select * form MEMBER where MEMBERID = '"+ids[1]+"'");stmt.executeQuery("select * form MEMBER where MEMBERID = '"+ids[2]+"'");‥‥‥

String ids = {"abc", "def", "ghi" };pstmt = conn.prepareStatement("select * from MEMBER where MEMBERID = ?");for (int i = 0 ; i < ids.length ; i++) { pstmt.setString(1, ids[i]); pstmt.executeQuery();}

한번만 쿼리 분석

쿼리분석 시간 단축

Page 33: Java Web Programming

JSP 2.0 Programming 33

PreparedStatement 를 사용하는 이유2, 쿼리에 들어갈 값을 자동으로 변환 .

3, 쿼리 코드의 복잡성 없앰 .

Code

String value = " 최범 \' 균 ";stmt.executeQuery("select * from member where "+ "name = '"+ value.replaceAll("'", "''") + "' ");

String value = " 최범 \' 균 ";pstmt = conn.prepareStatement("select * from member where name = ?");pstmt.setString(1, value);pstmt.executeQuery();

쿼리에 포함되는 값은 작은따옴표 (') 를포함해서 특수 문자의 처리가 필요 .이에 따라 쿼리 코드가 복잡해짐

값에 포함된 특수문자를 PreparedStatement 가 알아서 처리이에 따라 코드도 간결해짐

Page 34: Java Web Programming

JSP 2.0 Programming 34

커넥션 풀 (Connection Pool)이란 ?

커넥션커넥션1. 풀에서 커넥션을 가져온다 .

2. 커넥션을 사용한다 .

3. 커넥션을 풀에 반환한다 .

커넥션커넥션

커넥션커넥션

커넥션커넥션

커넥션커넥션커넥션커넥션

DB 커넥션을 미리 일정 개수만큼 풀 (pool) 에 생성해두었다가필요할 때 마다 풀에서 꺼내쓰는 방식

• 풀속에미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는 데 드는 연결 시간이 소비되지 않는다 .

• 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가많지 않다 .

Page 35: Java Web Programming

JSP 2.0 Programming 35

커넥션 풀의 특징• 풀속에미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는 데 드는 연결 시간이 소비되지 않는다 .

• 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가많지 않다 .

커넥션커넥션1. 풀에서 커넥션을 가져온다 .

2. 커넥션을 사용한다 .

3. 커넥션을 풀에 반환한다 .

커넥션커넥션

커넥션커넥션

커넥션커넥션

커넥션커넥션커넥션커넥션

커넥션을 생성하고 닫는 데 필요한 시간이 소모되지 않는다 . ▶ 그 만큼 어플리케이션의 실행 속도가 빨라지며

또한 한번에 생성될 수 있는 커넥션 수를 제어하기 때문에 ▶ 동시 접속자수가 몰려도 웹 어플리케이션이 쉽게 다운되지 않는다 .

∴ 커넥션 풀을 사용하면 전체적인 웹 어플리케이션의 성능 및 처리량이 높아지기 때문에 많은 웹 어플리케이션에서 커넥션 풀을 기본으로 사용하고 있다