350 likes | 580 Views
Java Web Programming. 3 일차. 데이터베이스와 DBMS. ' 데이터베이스 (Database)' 주목적은 데이터를 저장했다가 필요할 때에 사용하는 것 DBMS(Database Management System)- 데이터베이스를 관리하는 시스템 데이터베이스는 데이터를 오류없이 안전하게 보호하는 것이 핵심 ! DBMS 는 트랜잭션과 같이 데이터를 안전하게 보관할 수 있는 다양한 기능을 제공. DBMS 의 주요 기능. 데이터의 추가 / 조회 / 변경 / 삭제 데이터의 무결성 유지 트랜잭션 관리
E N D
데이터베이스와 DBMS • '데이터베이스(Database)' 주목적은 데이터를 저장했다가 필요할 때에 사용하는 것 • DBMS(Database Management System)- 데이터베이스를 관리하는 시스템 • 데이터베이스는 데이터를 오류없이 안전하게 보호하는 것이 핵심! • DBMS는 트랜잭션과 같이 데이터를 안전하게 보관할 수 있는 다양한 기능을 제공 JSP 2.0 Programming
DBMS의 주요 기능 • 데이터의 추가/조회/변경/삭제 • 데이터의 무결성 유지 • 트랜잭션 관리 • 데이터의 백업 및 복원 • 데이터 보안 JSP 2.0 Programming
테이블과 스키마 • 테이블 - 데이터가 저장되는 장소 • 스키마 - 테이블의 구조에 대한 정보 저장 [테이블 스키마 예] JSP 2.0 Programming
테이블과 레코드 • 레코드 - 스키마에 정의된 필드에 해당하는 값을 갖는 하나의 행 • 레코드가 모여서 테이블을 구성한다. 레코드(Record) JSP 2.0 Programming
주요키와 인덱스 • 주요키(Primary Key) - 각각의 레코드를 구별하기 위해서 사용되는 필드. 테이블이 주요키를 갖는 경우 모든 레코드의 고유키값은 서로 달라야 한다. • 인덱스(Index) - 특정 필드를 사용하여 레코드를 순서대로 정렬한 정보를 저장 JSP 2.0 Programming
데이터베이스 프로그래밍의 일반적인 순서 DBMS DBMS 클라이언트 1. 연결 데이터 베이스 데이터 베이스 2. 명령어 전송(SQL 실행) 3. 결과 전송 4. 연결종료 • DBMS 클라이언트 - 데이터베이스를 사용하는 어플리케이션 • DBMS - 데이터베이스를 관리해주는 시스템 • 데이터베이스 - 데이터를 저장할 공간 * 이 세가지 요소는 DB 프로그래밍의 필수 요소 JSP 2.0 Programming
SQL이란? SQL은 'Strutured Query Language'의 약자로서 데이터베이스로부터 데이터를 조회하고 삭제하는 등의 데이터베이스 작업을 수행할 때 사용하는 질의 언어 * 거의 모든 데이터베이스 프로그래밍은 SQL을 사용해서 데이터를 처리한다. JSP 2.0 Programming
SQL 표준 타입 [표준 SQL의 주요 타입] JSP 2.0 Programming
테이블 생성 쿼리: 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) ) JSP 2.0 Programming
데이터 삽입 쿼리: 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', '최범균', 'madvirus@empal.com') JSP 2.0 Programming
데이터 조회 쿼리: SELECT ... FROM ... WHERE ... Syntax select FIELD1, FIELD2, ..., FIELDn from TABLENAME [where 검색조건] [order by 정렬순서] • TABLENAME - 테이블을 식별할 때 사용할 이름 • FIELDx- 값을 읽어올 필드의 이름 • where 절에 조건을 입력하면 조건에 해당하는 레코드의 값만 읽어온다. • order by 절에 정렬 순서를 입력하면 지정한 순서대로 레코드를 읽어온다. • select * from 과 같이 '*'를 사용하면 레코드의 모든 필드를 읽어온다. Example select * from MEMBER select * from MEMBER where NAME = '최범균' and EMAIL='madvirus@empal.com' select * from MEMBER where EMAIL <> '' select * from MEMBER where EMAIL is NULL select * from MEMBER where EMAIL is not NULL select * from EMPLOY where where SALARY >= 1000 and SALARY <= 2000 select * from MEMBER where NAME like '최%' select * from MEMBER order by NAME asc, MEMBERID desc JSP 2.0 Programming
데이터 조회 쿼리: 집합 • sum() : 특정 필드의 합 • max() : 특정 필드 중 최대 값 • min() : 특정 필드 중 최소값 • count() : 검색된 레코드의 개수 Example select count(*) from MEMBER where NAME like '최%' select max(SALARY), min(SALARY) from EMPLOY JSP 2.0 Programming
데이터 수정 쿼리: UPDATE ... SET ... Syntax update TABLENAME set FIELD1=VALUE1, FIELD2=VALUE2, ... [where 조건절] • TABLENAME - 테이블을 식별할 때 사용할 이름 • FIELDx- 값을 읽어올 필드의 이름 • VALUEx - 변경할 값 • where 절이 존재하지 않으면 모든 레코드를 수정한다. • where 절이 있는 경우, 조건에 해당하는 레코드만 수정한다. Example update MEMBER set ADDRESS = '서울시' where MEMBERID = 'myid' JSP 2.0 Programming
데이터 삭제 쿼리: DELETE FROM ... Syntax delete from TABLENAME [where 조건절] • TABLENAME - 테이블을 식별할 때 사용할 이름 • where 절이 존재하지 않으면 모든 레코드를 삭제한다. • where 절이 있는 경우, 조건에 해당하는 레코드만 삭제한다. Example delete from MEMBER where MEMBERID = 'myid' JSP 2.0 Programming
조인(join) : 조회시 테이블의 연결 두 개 이상의 테이블로부터 관련 있는 데이터를 읽어올 때 사용된다 Syntax select A.필드1, A.필드2, B.필드3, B.필드4 from 테이블1 as A, 테이블2 as B where A.필드x = B.필드y 테이블1의 필드x와 테이블2의 필드y의 값이 같은 레코드를 하나의 행(row)으로 읽어온다. Example select * from MEMBER as A, MEMBER_ETC as B where A.MEMBERID = B.MEMBERID; JSP 2.0 Programming
JDBC란? • Java DataBase Connectivity의 약자로서 자바에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 API • DBMS의 종류에 상관없이 하나의 JDBC API를 사용해서 데이터베이스 작업을 처리 • 일단 익혀두면 하나의 JDBC API로 모든 DBMS에 대해서 데이터베이스 작업을 처리할 수 있음. JSP 2.0 Programming
JDBC 프로그래밍의 구조 JDBC 드라이버 데이터 베이스 자바 (웹) 어플리케이션 JDBC API 데이터 베이스 JDBC 드라이버 오라클, MS-SQL, DB2, MySQL 등 현재 사용되고 있는 거의 대부분의 DBMS가 자신에 알맞은 JDBC 드라어비를 제공하고 있기 때문에 JDBC 드라이버가 없어서 JSP에서 데이터베이스 프로그래밍을 할 수 없는 상황은 발생하지 않는다. JSP 2.0 Programming
JDBC 프로그래밍의 실행 순서 • JDBC 드라이버 로딩 • 데이터베이스 커넥션 구함 • 쿼리 실행을 위한 Statement 객체 생성 • 쿼리 실행 • 쿼리 실행 결과 사용 • Statement 종료 • 데이터베이스 커넥션 종료 JSP 2.0 Programming
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; 데이터베이스 처리에 필요한 클래스 import JDBC 드라이버 로딩 JSP 2.0 Programming
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> <% } 데이터베이스 커넥션 생성 쿼리 실행을 위한 Statement 생성 쿼리를 실행해서 결과를 ResultSet에 저장 ResultSet으로부터 쿼리 결과 읽어옴 JSP 2.0 Programming
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> Statement와 ResultSet 닫음 DB 커넥션 닫음 JSP 2.0 Programming
JDBC 드라이버 로딩 Code try { Class.forName("JDBC드라이버 클래스의 완전한 이름"); } catch(ClassNotFoundException ex) { // 지정한 클래스가 존재하지 않을 경우 에러가 발생한다. // 에러 처리 } • JDBC 드라이버 클래스 예 • MySQL - com.mysql.jdbc.Driver • 오라클 - oracle.jdbc.driver.OracleDriver JSP 2.0 Programming
JDBC URL Syntax jdbc:[DBMS]:[데이터베이스식별자] Example MySQL jdbc:mysql://localhost:3306/chap11?useUnicode=true&characterEncoding=euc-kr 오라클 jdbc:oracle:thin:@172.0.0.1:1521:ORCL JSP 2.0 Programming
데이터베이스 커넥션 얻기 Code DriverManager.getConnection(String jdbcURL) DriverManager.getConnection(String jdbcURL, String user, String password) → DB와 연결된 Connection 객체를 리턴한다. • jdbcURL - 데이터베이스를 나타내는 JDBC URL • user - 데이터베이스 계정 • password - 데이터베이스 계정 암호 Exception Code Connection conn = null; try { conn = DriverManager.getConnection(...); ... } catch(SQLException ex) { ... // 예외 처리 } 커넥션을 구하지 못하면 SQLException 예외를 발생 JSP 2.0 Programming
데이터베이스 커넥션 얻기: 예제 코드 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) {} } JSP 2.0 Programming
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 쿼리를 실행한다.결과값은 삽입/변경/삭제 된 레코드의 개수 JSP 2.0 Programming
ResultSet으로부터 데이터 읽기 • ResultSet.next() 메소드는 다음 행이 존재하면 true 리턴 • 따라서, ResultSet.next() 메소드로 읽어올 행이 존재하는 지 확인한 뒤 데이터 읽음 • ResultSet.getXXXX() 형태의 메소드를 사용하여 지정한 컬럼 데이터 읽어옴 Code rs = stmt.executeQuery("select * from member"); if (rs.next()) { // 다음행(첫번째 행)이 존재하면 rs.next()는 true를 리턴 // rs.next()에 의해 다음행(첫번째 행)으로 이동 String name = rs.getString("NAME"); ... } else { // 첫번째 행이 존재하지 않는다. 즉, 결과가 없다. ... } ResultSet.getXXXX() 메소드를 사용해서 결과로부터 필요한 데이터를 읽어온다. JSP 2.0 Programming
ResultSet.next() 메소드의 이해 ResultSet.next() 메소드와 커서의 이동 rs.next() : true rs.next() : true rs.next() : false rs.next() : true ► ► 1행 1행 1행 1행 1행 ► 2행 2행 2행 2행 2행 ► 3행 3행 3행 3행 3행 ► JSP 2.0 Programming
PreparedStatement를 사용한 쿼리 실행 • Connection.prepareStatement() 메소드를 사용하여 PreparedStatement 생성 • PreparedStatement의 set 메소드를 사용하여 필요한 값 지정 • PreparedStatement의 executeQuery() 또는 executeUpdate() 메소드를 사용하여 쿼리를 실행. • finally 블럭에서 사용한 PreparedStatement를 닫는다. (close() 메소드 실행) JSP 2.0 Programming
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, "no-mail@madvirus.net"); pstmt.executeUpdate(); 물음표 위치에 들어갈 값을 지정한다. 물음표의 인덱스 값은 1부터 시작 • ResultSet executeQuery() - SELECT 쿼리를 실행한다. SELECT 쿼리를 실행한 결과는 ResultSet에 저장된다. • int executeUpdate() - INSERT, UPDATE, DELETE 쿼리를 실행한다.결과값은 삽입/변경/삭제 된 레코드의 개수 JSP 2.0 Programming
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(); } JSP 2.0 Programming
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가 알아서 처리 이에 따라 코드도 간결해짐 JSP 2.0 Programming
커넥션 풀(Connection Pool)이란? DB 커넥션을 미리 일정 개수만큼 풀(pool)에 생성해두었다가 필요할 때 마다 풀에서 꺼내쓰는 방식 풀 1. 풀에서 커넥션을 가져온다. 커넥션 커넥션 커넥션 2. 커넥션을 사용한다. 커넥션 3. 커넥션을 풀에 반환한다. 커넥션 커넥션 • 풀 속에 미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는 데 드는 연결 시간이 소비되지 않는다. • 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가 많지 않다. JSP 2.0 Programming
풀 1. 풀에서 커넥션을 가져온다. 커넥션 커넥션 커넥션 2. 커넥션을 사용한다. 커넥션 3. 커넥션을 풀에 반환한다. 커넥션 커넥션 커넥션 풀의 특징 • 풀 속에 미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는 데 드는 연결 시간이 소비되지 않는다. • 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가 많지 않다. • 커넥션을 생성하고 닫는 데 필요한 시간이 소모되지 않는다. • ▶ 그 만큼 어플리케이션의 실행 속도가 빨라지며 • 또한 한번에 생성될 수 있는 커넥션 수를 제어하기 때문에 • ▶ 동시 접속자수가 몰려도 웹 어플리케이션이 쉽게 다운되지 않는다. • ∴커넥션 풀을 사용하면 전체적인 웹 어플리케이션의 성능 및 처리량이 높아지기 때문에 많은 웹 어플리케이션에서 커넥션 풀을 기본으로 사용하고 있다 JSP 2.0 Programming