-
[WEB : Servlet] JDBC 연동 - (1)비전공자 공부일기/:: WEB & Front-End 2019. 7. 3. 20:49
2019. 07. 03 필기
이번에는 웹과 DB를 연동하는 법에 대해 배워보겠다.
※ 예전 작성 글: 2019/05/29 - [비전공자 성장기/:: ORACLE] - 오라클 DB 정리09-JDBC
※ 참고한 블로그 글 : https://opentutorials.org/module/3569/21222
자바를 통해 DB를 활용하기 위해 필요한 게 JDBC라고 배웠었었다. 다시 정의를 돌이켜 보면 JDBC란 Java DataBase Connectivity의 약자로서, 자바로 관계형 데이터베이스에 접속하고 SQL문을 수행, 처리하고자 할 때 사용되는 표준 SQL 인터페이스 API (=java.sql 패키지)이다.
JDBC는 자바의 표준 에디션(SE)에서 지원한다. 그러나 DBMS 서버에 따라서 JDBC 드라이버가 필요하다. JDBC 드라이버를 통해 DB를 연동하는 방법을 간단히 나타내면 다음과 같다.
JDBC 프로그램 => java.sql => JDBC 드라이버 => DB
이어서 JDBC 드라이버를 셋팅하는 방법을 배워보자. 편의상 오라클DB를 기준으로 하겠다.
JDBC 환경 셋팅
오라클 홈페이지에서 'ojdbc6.jar'라는 이름의 JDBC 드라이버를 내려받을 수 있다.
하지만 이 url은 바뀔 수 있으므로 일단 이 포스팅에 파일로 첨부하겠다.
>> https://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
혹은 데이터베이스가 설치되어 있는 폴더에 저장된 파일을 사용할 수도 있다.
>> c:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
내려받은 드라이버 파일을 자동으로 인식할 수 있는 곳은 두 군데이다.
파일을 복사해서 다음 디렉토리에 저장해넣기만 하면 자동으로 빌드된다.
1) WAS가 설치된 HOME 폴더 아래 lib 폴더
--- 현재 WAS에서 실행되는 모든 서블렛이 가져다 쓸 수 있음
--- 서버가 시작될 때 자동으로 인식
2) 각 웹 애플리케이션의 WEB-INF 아래 lib 폴더
--- 해당 웹 애플리케이션에서만 사용할 수 있음
* cf * 웹 프로젝트 속 WebContent 폴더 아래
자동으로 생성되는 폴더들의 용도
> META-INF --- DB자원 저장
> WEB-INF --- 웹자원 저장이 외에도 1)DB API / 2)JDBC 드라이버 / 3)DBMS 셋팅이 완료되어야 한다. 필요하면 나중에 따로 써보기로 하겠다.
이제 본격적으로 웹과 DB를 연동하는 방법을 배워보자. 웹과 DB를 연동하는 방법은 다음 두 가지가 있다.
1) JDBC 프로그램 구현 방법
2) DTO, DAO 클래스로 연동이 중에 먼저 JDBC 프로그램 구현 방법으로 연동하는 방법부터 차근히 살펴보자.
JDBC 프로그램 구현 방법으로 Web-DB 연동하는 방법
일단 JDBC 프로그래밍의 순서를 간략히 정리해보겠다.
- JDBC 드라이버 로딩
- DBMS 서버와 접속
- Statement 또는 PreparedStatement 객체 생성
- SQL문 전달받아 실행
- 자원 해제
그럼 이제 1번부터 차례로 자세히 살펴보자.
*** 1, 2, 3을 커넥션풀이 없애주고 4번을 DAO DTO가 없애준다...?
1. JDBC 드라이버 로딩
자바SE가 제공하는 java.sql 패키지는 다양한 DB들을 자유롭게 이용할 수 있도록 자바가 제시해 준 일종의 기준이다. 따라서 인터페이스로 선언부만 존재할 뿐, 실제 기능은 각기 JDBC 드라이버에 구현되어 있다. DB 작업을 할 때마다 개발자는 JDBC 드라이버 파일을 메모리에 로딩하고 사용할 수 있도록 준비를 해줘야 한다. 이게 지금 다루는 1. JDBC 드라이버 로딩 작업이다.
OracleDriver 클래스를 읽어 메모리에 저장하면, OracleDriver 인스턴스가 생성되어 DriverManager 클래스의 JDBC 드라이버로 등록되는 과정으로 이루어진다. 이 작업은 forName() 메소드로 한다. 오라클 드라이버를 로딩할 때는 다음과 같이 쓴다.
Class.forName("oracle.jdbc.driver.OracleDriver");
2. DBMS 서버와 접속
3. Statement 또는 PreparedStatement 객체 생성
4. SQL문 전달받아 실행검색은 그냥 응답할 수는 없고
5. 자원 해제xml파일 : WAS가 실행될 때 읽는 파일
JNDI(Java Naming Directory Interface) : 인스턴스 생성에 필요한 정보를 이름
- API와 SPI로 이루어져 있다. API는 앱에서 네이밍 혹은 디렉토리 서비스에 접근하는 데 사용한다.
- SPI는 새로운 서비스를 개발할 때 사용한다.
Resource : 서블릿에서 사용할 수 있는 자원(인스턴스)에 이름을 부여하는 엘리먼트
=> 속성과 속성값을 이용하여 인스턴스에 필요한 정보를 설정
하지만 실제 웹 어플리케이션에서 위 방법으로 DB처리를 하게 되면 여러가지 문제점이 발생할 수 있다. 예를 들어, 웹에서 서비스를 요청하는 클라이언트는 응답속도에 민감하다.(다시말하면, 3초만 지연되어도 한국인들은 빡치게 된다!) 그런데 웹 클라이언트의 요청이 있을 때마다 DB 서버에 연결을 시도하게 되면 속도지연에 화가 난 한국인들이 회사로 몰려올 것이다. 이 외에도 다른 문제점이 있을 수 있는데, 정리하면 다음으로 요약할 수 있다.
- DB 프로그램에서 트랜잭션 처리와 Connection 관리는 시스템의 성능과 안전성에 큰 영향
- Connection 과정이 클라이언트 요청 때마다 일일이 발생하면 시간이 많이 소요
- 불필요한 연결에 의한 서버 자원의 낭비
커넥션풀을 이용하는 방법
이전이나 DB작업을 하기 위해서는 반드시 DB서버와 연결하여 Connection 객체를 얻어내야 한다.(JDBC 프로그램도 마찬가지) 그런데 이번에는 웹과 연동해야 하는 프로그램이다. 웹 프로그램은 동시에 여러 사용자에 의해 요청이 일어날 수 있는 특성이 있으므로, 자원 배분과 응답 속도에 대하여 효율적으로 구현할 수 있는 방안을 고려해야 한다. 위 JDBC 프로그램 방식의 문제점을 해결하기 위해 나온 기술이 Connection Pool을 활용하는 방법이다.
이전에 JDBC를 배울 때, 커넥션풀이라는 개념을 배웠었다. 이 개념을 다시 정리해보자.
커넥션 풀Connection Pool의 개념을 간단히 설명하면, 프로그램이 실행될 때마다 Connection 객체를 생성하는 것이 아니라 웹 어플리케이션이 서비스되기 전에 웹서버에서 미리 Connection 객체를 생성하여 준비해 둔 다음, 필요할 때마다 이미 만들어진 Connection을 가져다 사용함으로써 JDBC 프로그래밍의 문제점들을 개선한 기술이다.
Connection 객체는 서버가 시작할 때 서버에서 여러 개를 준비할 수 있는데, 이렇게 준비된 Connection 객체들을 가지고 있는 리소스를 Connection Pool이라고 한다.
또한 나중에 서버가 바뀌더라도 서블릿을 바꿀 필요 없이 커넥션풀만 바꿔주면 되기 때문에 유지보수의 효율이 좋고, 가독성이 훨씬 좋다.
컨넥션풀 다운로드 링크 >> https://www.oracle.com/technetwork/database/application-development/jdbc/downloads/jdbc-ucp-183-5013470.html >>cos.jar
혹은 아파치 톰캣에서도 기본적으로 커넥션풀 제공 >> tomcat-dbcp.jar >> BasicDataSource DBCP 클래스
※ DBCP(DataBase Connection Pool) : Connection 인스턴스를 저장하여 제공하는 기능 구현
DTO, DAO 클래스로 Web-DB 연동하는 방법
커넥션풀이 있으면 DAO, DTO 클래스 생성이 가능하다. 이걸로 웹-JDBC 연동을 또한번 더 편하게 만들 수 있다.
일단, DTO와 DAO의 개념을 다시 살펴보자. (예전글: https://codingwanee.tistory.com/20)
- DTO 클래스 Data Transfer Object
: 로직을 갖고 있지 않는 순수한 데이터 객체이며 속성과 그 속성에 접근하기 위한 getter, setter 메소드만 가진 클래스--- DB의 data에 접근하기 위한 객체 - Database에 접근하기 위한 로직과 비즈니스 로직을 분리하기 위해서 사용
--- DB를 사용해 데이터를 조회 또는 조작하는 기능을 전담하도록 만든 오브젝트
--- DB의 한 테이블당 DAO 클래스를 하나씩 만들어 두면 유지보수가 쉬워진다
--- 한 개 이상이 존재할 수도 있음 (JOIN 기능 때문)
- DAO 클래스 Data Access Object / VO 클래스 Value Object
: 데이터 저장소를 이용하여 데이터 삽입, 삭제, 변경, 검색 기능을 제공하는 클래스--- 각 계층간 데이터 교환을 위한 객체
--- DAO와 VO는 거의 같다고 볼 수 있지만, VO는 읽기전용read only라는 점이 다르다.
--- 무조건 한 개만 존재
DB에 대한 접근을 DAO가 담당하도록 하여 데이터베이스 엑세스를 DAO에서만 하게 되면 다수의 원격호출을 통한 오버헤드를 VO나 DTO를 통해 줄일 수 있고 다수의 DB 호출문제를 해결할 수 있습니다. 또한 단순히 읽기만 하는 연산이므로 트랜잭션 간의 오버헤드를 감소할 수 있습니다.
DAO 클래스 예제
DB와 연결할 Connection을 가져온다.
어떤 DB를 사용할 것이며, 어떤 드라이브와 로그인 정보를 사용할 것인가.
작업이 끝나면 사용한 리소스를 시스템에 돌려준다.
Database와 통신 시에 사용하는 Design Pattern중 하나이다.----
서버는 xml 파일 받는다
이클립스에서 프로젝트>WebContent>META-INF 오른쪽버튼 누르고 new>other>xml>xml파일 눌러서 신규 xml 파일 생성컨넥션풀 다운로드 링크 >> https://www.oracle.com/technetwork/database/application-development/jdbc/downloads/jdbc-ucp-183-5013470.html
'비전공자 공부일기 > :: WEB & Front-End' 카테고리의 다른 글
[WEB : JSP] include 포함 - 모든 페이지에 들어갈 헤더, 푸터 넣기 (0) 2019.07.08 [WEB : JSP] error - 에러메시지를 띄우는 방법 세 가지 (2) 2019.07.08 [WEB : Servlet] Session 세션 (6) 2019.07.03 [WEB : Servlet] Cookie 쿠키(생성, 읽기, 제거) (5) 2019.07.02 Servlet - 파일 업로드 (0) 2019.07.02