06 데이터베이스 프로그래밍

● 웹 애플리케이션과 데이터베이스(Database)

○ 프로그램이 DBMS를 통해 데이터베이스를 사용하기 위해서는 양측을 연결하는 매개체 역할을 해줄 프로그램인 JDBC(java Database Connectivity)가 필요

JDBC 프로그래밍

1)    JDBC 동작 구조

■ 사용하려는 DBMS에 알맞은 JDBC 드라이버만 있으면 어떤 종류의 DBMS를 사용하더라도 독립적인 데이터베이스 프로그래밍이 가smd

2)    JDBC 드라이버 다운로드 및 설치

■ 이클립스를 사용하지 않는 실제 서버와 같은 환경에서는 JDBC 드라이버를 해당 웹 애플리케이션 디렉터리 내 WEB-INF/lib 디렉터리에 복사하면 사용이 가능

oracle : 기본 오라클을 설치하면 JDBC 파일이 저장되어 있음

내 컴터에 저장된 오라클 폴더를 찾아서 JDBC 파일인 ojdbc.jar를 버전에 맞는 걸로 복사해 lib폴더에 붙여 넣고 프로젝트 참조(build path)에서 Add jar 하면 됨

MYSQL : http://dev.mysql.com/downloads/connector/j/에서 다운로드

mysql-connector-java-gpl-5.1.29.msi 파일을 다운로드 받은 후 설치

C\Program Files (x86)\MySQL\MySQL Connector J\ 디렉터리에 설치된 mysql-connector-java-5.1.29-bin.jar 파일을 이클립스 웹 프로젝트의 Web Content\WEB-INF\lib\ 디렉터리에 복사

 

3)    JDBC 프로그래밍의 작성 순서

 

JDBC 프로그래밍 코드

1)    SQL패키지 임포트

■ 자반/애플리케이션이 데이터베이스에 접근하기 위해서는 사용하는 DBMS에 적합한 JDBC 드라이버를 로딩

Class 클래스의 forName( )메서드 이용

MySQL JDBC 로딩 시 “com.mysql.cj.jdbc.Driver”

■ 오라클 JDBC 로딩 시 "oracle.jdbc.driver.OracleDriver"

JDBC URL 작성 : “protocol : subprotocol : subname”

(1)   “ : ”을 통해 3구간으로 분류

(2)   첫 번째 구간 : 프로토콜. DBMS 종류에 상관없이 jdbd로 입력

(3)   두 번째 구간 : subprotocol. DBMS 종류에 따라 달라짐 (MYSQL일 경우 mysql로 지정)

(4)   세 번째 구간 : subname. 데이터베이스를 지정, 사용할 데이터베이스의 주소와 port를 명시한 후 데이터베이스명을 함께 작성

 

2)    데이터베이스 세션을 얻기

Connection 인스턴스 생성

DriverManger 클래스의 getConnection( ) 메서드를 통해 생성

DriverManager 클래스 : JDBC 드라이버의 관리를 위해 사용하며 JDBC URL을 통해 Connection 인스턴스를 생성

getConnection 메서드

(1)   첫 번째 입력 파라미터 : JDBC URL 입력

(2)   두 번째 세 번째 입력 파라미터 : 데이터베이스 접속을 위한 계정정보

           계정 아이디, 비밀번호 지정

Connection conn = DriverManager.getConnection(“url”, “id”, “password”);

 

3)    SQL문 실행

java.sql 패키지의 Statement 인터페이스 사용

SQL문을 데이터베이스에 전달하고 그 실행 결과를 ResultSet 인터페이스로 전달하는 역할

앞서 생성한 Connection 인스턴스의 createStatement( )메서드를 사용하여 획득

Statement stmt = conn.createStatement()

Statement를 통해 SQL문을 데이터베이스에 전달하는 메서드의 입력 파라미터로 사용될 SQL문은 String 타입으로 입력

 

ResultSet : 실행된 SQL문의 질의 결과를 처리하기 위해 사용(select에서 사용)

ResultSet rs = stmt.executeQuery ("SELECT * FROM STUDENT")

□ 데이터베이스를 조회한 결과를 담은 ResultSet 인스턴스 rs에는 위 SQL문의 결과인 STUDENT 테이블의 데이터가 저장되어 있음

next() 메서드를 통해 하나의 로우 단위로 저장된 데이터 사용이 가능

결과 로우가 더 남아있을 경우 true, 더 이상 반환할 로우기 남아있지 않을 경우 false를 리턴

-> 여러 로우로 반환된 결과를 반복하여 사용하고 싶을 경우 반복문과 함께 사용

while ( rs.next( ) ) {

// ResultSet에 담긴 조회 결과 데이터를 로우 단위로 사용

)

ResultSetnext( )메서드를 통해 전달되는 로우의 데이터들은 자바에서 사용되는 데이터 타입으로 변환과정 필요

getString( ) 메서드 : 괄호 안 숫자를 인덱스로 하여 컬럼을 의미

그 컬럼의 데이터를 String타입으로 변환하여 리턴

 

4)    자원 반환

■ 데이터베이스 관련 작업 수행이 끝나면, 반드시 DriverManger를 통해 획득한 Connection 객체를 종료시켜 사용 중인 자원을 반환

■ 인스턴스를 획득한 순서와 반대로 ResultSet, Statement, Connection 순서로 종료

rs.close( )

stmt.close( )

conn.close( )

 

PreparedStatement 사용

SQL문을 미 리 컴파일하여 사용하므로 Statement 사용하는 거 보다 실행 속도가 빠름

Connection 객체의 prepareStatement( ) 메서드에 실행할 SQL문을 지정하는 방식으로 획득

PreparedStatement pstmt = conn.prepareStatement ( SQL )

SQL문 내에는 위치 표시자라 불리는 물음표 “ ? “ 사용 가능

PreparedStatement pstmt = conn.prepareStatement ( "SELECT * FROM STUDENT

WHERE DEPARTMENT_ID =? AND STUDENT_ID LIKE ?")

pstmt.setString (1, “M001")

pstmt.setstring (2, "2014%”')

setString( ) 메서드 : 문자열 타입의 데이터를 SQL문 물음표에 넣어줌

첫 번째 입력 파라미터 숫자는 SQL문의 순서대로의 물음표를 지칭

 

● 커넥션 풀

DB 연결 효율 높이는 방법

JDBC를 사용한 데이터베이스 연동 시 가장 많은 시간을 필요로 하는 Connection객체를 미리 여러 개 생성해두고, 데이터베이스 관련 작업 수행 시 생성해둔 Connection객체를 빌려준 후 사용이 끝나면 반환 받는 방식

■ 순서

① 웹 애플리케이션 내 데이터베이스 관련 작업이 수행되어야 할 경우 커넥션 풀에서 미리 생성되어 있는 커넥션을 빌려온다.

② 커넥션 풀로부터 받아온 커넥션을 통해 데이터베이스 관련 작업을 수행한다.

③ 데이터베이스 관련 작업 수행이 끝나면 커넥션을 반환한다.

 

JNDI를 이용한 커넥션 풀 사용

JNDl : 애플리케이션 구현 시 필요한 클래스와 파일과 같은 데이터를 명명하고 디렉터리 서비스를 사용하기 위한 API

(1)   커넥션 풀 사용을 위한 설정

□ 톰캣의 server.xml, context.xml, web.xml 파일에 추가로 작성

context.xml 파일의 설정 내용 지정 방식을 사용

□ 〈Resource〉태그 사용

auth 속성 “Container”로 지정 : 데이터베이스 접속 인증을 톰캣 컨테이너가 처리하도록 하기 위함

driverClassName 속성 : 사용할 드라이버명과

url 속성 : 데이터베아스 URL

username, password 속성 : 각각 접속할 데이터베이스 계정 정보를 지정

name 속성 : 이후 Java코드에서 데이터 소스를 가리킬 이름 지정

type 속성 : Java 코드에서 사용할 DataSource 명시

maxActive 속성 : 최대 커넥션 수를 지정(동시 접속 허용 커넥션 수)

maxWait 속성 : 커넥션이 남아있지 않을 경우 ms 단위로 대기할 시간을 지정

 

(2)   커넥션 풀 사용을 위한 유틸 클래스 제작

□ 커넥션풀의 Connection 인스턴스를 제공할 유틸 클래스를 제작

db 패키지 내 ConnectionPool 클래스

getConnection( 메서드는 이미 Connection객체가 생성되어 있는 상태일 경우 해당 Connection 객체를 리턴

Connection 객체가 생성되어 있지 않을 경우 DataSource 객체를 얻기 위해 Initialcontext 객체를 사용

lookup( ) 메서드의 입력 파라미터 "java:comp/env/” -> initContext 인스턴스 얻음

-> 입력 파라미터 : context.xml에 지정했던 "jdbc/mysql”

-> DataSource 객체 생성

->  DataSource객체의 getConnection( )메서드 사용하여 Connection 객체 반환

public static Connection getConnectionO {

if (conn != null) {

return conn

}else(

try(

Context initContext= (Context) new InitialContext( );

lookup(“java:comp/env/")

DataSource ds = (DataSource) initContext.lookup(“jdbc/mysql")

conn = ds.getConnectionO

}catch(Exception e) {

e.printStackTrace ()

return conn

)

 

@Resource 어노테이션을 통한 서블릿 페이지 커넥션 풀 사용

■ 서블릿 페이지의 경우 ConnectionPool 클래스와 같은 유틸 클래스 없이 @Resource 어노테이션을 이용한 커넥션 풀 사용이 가능

context.xml 파일에 설정이 선행

name 속성에는 context.xml 파일에 설정한 name="jdbc/mysql"을 지정

javax.annotation.Resource를 임포트

DataSource 객체의 참조 변수명을 ds로 지정

Connection 인스턴스인 conn ds 인스턴스의 getConnection( )메서드 사용하여 생성

@Resource  name="jdbc/mysql") javax.sql.DataSource ds;

를 서블릿 메서드 위에 해줌 (doGet이나 doPost)

 

'JSP > 이론' 카테고리의 다른 글

[JSP][이론]09 JSTL  (0) 2020.09.07
[JSP][이론]07 EL  (0) 2020.09.07
[JSP][이론]05 JSP 액션 태그  (0) 2020.09.07
[JSP][이론]04 JSP 세션 관리_HTTPSession  (0) 2020.09.05
[JSP][이론]04 JSP 세션 관리_쿠키  (0) 2020.09.05

+ Recent posts