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에 담긴 조회 결과 데이터를 로우 단위로 사용
)
□ ResultSet의 next( )메서드를 통해 전달되는 로우의 데이터들은 자바에서 사용되는 데이터 타입으로 변환과정 필요
□ 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 |