웹 애플리케이션과 데이터베이스(Database)
웹 애플리케이션 제작 시 서비스할 여러 기능은 데이터와 연관되어 있는 경우가 대부분이다.
회원가입 처리, 로그인에 필요한 아이디 및 비밀번호의 검사, 게시판 글의 작성, 작성된 글의 수정 혹은 삭제와 같이 일상적으로 사용되는 웹 애플리케이션의 기능 외에도 기업에게 필요한 고객정보, 상품정보, 공공기관에서 사용되는 다양한 공공 정보 등을 데이터베이스로 처리해야 한다.
데이터베이스는 여러가지 작업에 사용될 데이터를 해당 작업에 관련된 사용자가 동시에 공유하며 사용하기 위한 데이터의 집합을 의미한다.
이러한 데이터베이스의 효과적인 사용과 관리를 위해 사용하는 시스템을 DBMS(Database Management System)라고 하며, 웹 애플리케이션은 DBMS와의 연동을 통해 서비스 제공에 필요한 데이터를 사용하게 된다.
Java로 제작한 프로그램이 DBMS를 통해 데이터베이스를 사용하기 위해서는 양측을 연결하는 매개체 역할을 해줄 프로그램인 JDBC(Java Database Connectivity)가 필요하다.
데이터베이스는 데이터의 관리 방식에 따라 여러 방식으로 분류되며, 그 중 웹 애플리케이션 제작 시 일반적으로 많이 사용되는 데이터베이스는 관계형 데이터베이스(Relational Database)이다.
이러한 관계형 데이터베이스를 관리하는 시스템을 RDBMS(Relational Database Management System)라고 하는데 RDBMS에는 오라클, MS-SQL, DB2 그리고 MYSQL 등과 같은 다양한 종류가 존재한다.
관계형 데이터베이스는 데이터를 2차원 표 형태로 저장하고 관리하는데, 이 표형태의 데이터 저장소를 테이블(Table)이라고 부른다.
테이블은 엑셀과 같은 스프레드시트 프로그램에서 데이터를 작성할 때 처럼 세로줄을 표시하는 컬럼(Column)과 가로줄을 표시하는 로우(Row)로 구성되며, 하나의 컬럼은 테이블 내에 들어갈 데이터의 타입과 길이를 지정하고 ,로우에는 각 컬럼에 지정된 규칙에 맞게 들어가 있는 데이터들의 덩어리로 구성되며 레코드(Record)라고 부르기도 한다.
테이블에 저장될 수 있는 데이터들은 자바와 마찬가지로 테이블 생성 시 지정한 데이터 타입을 준수해야 하며, 정해진 길이를 넘어서는 데이터는 저장할 수 없다.
데이터가 저장될 테이블은 자동으로 생성되는 것이 아니라 사용될 용도에 따라 생성하여 사용하게 된다.
테이블 생성 시 저장될 데이터들의 타입과 길이, 그리고 데이터 저장에 필요한 다양한 정보를 컬럼을 통해 명시하게 되며, 이러한 테이블 구조 관련 정보를 스키마(Schema)라고 한다.
테이블을 구성하는 컬럼 중 각 로우를 구분할 수 있는 유일한 식별자로서의 의미를 지닌 값을 저장하는 컬럼을 기본키(Primary key)라고 하며, 기본키로 지정된 컬럼의 데이터는 중복되거나 널(Null)값을 가질 수 없다.
즉 핵심 컬럼이 된다.
JDBC 프로그래밍의 개요
JDBC는 자바 애플리케이션이 데이터베이스를 이용하기 위해 사용하는 API로 , MySQL 데이터베이스에 SQL문을 수행할 때 사용했던 SQL 프롬프트 없이 간단한 JDBC 관련 프로그래밍 코드를 추가함으로써 자바 애플리케이션에 데이터 관련 기능을 구현할 수 있다.
JDBC 동작 구조
JDBC 프로그래밍의 가장 큰 장점이자 특성은 사용하려는 DBMS에 알맞은 JDBC 드라이버만 있으면 어떤 종류의 DBMS를 사용하더라도 독립적인 데이터베이스 프로그래밍이 가능하다는 것이다.
이는 각 DBMS의 JDBC 드라이버 클래스가 java.sql.Driver 인터페이스를 구현하여 동작하기 때문이다.
자바 애플리케이션에 데이터베이스 관련 작업 수행을 위한 기능을 프로그래밍 할 경우 JDBC API에 정의되어 있는대로 구현해주면 이후 데이터베이스의 연결과정부터 SQL문이 실행된다.
그 결과 반환 등의 과정들이 각 DBMS에 대응되는 JDBC 드라이버를 통해 이루어진다.
JDBC 프로그래밍의 작성 순서
JDBC 드라이버를 통한 데이터베이스 프로그래밍은 기본적으로 JDBC 드라이버를 로딩하고, 자바 애플리케이션과 데이터베이스를 연결한다.
다음 SQL문 실행을 통한 데이터베이스 작업을 수행하고 데이터베이스와 연결을 종료하는 순서로 구현된다.
JDBC 드라이버 로딩 → 데이터베이스 연결 수립 → 데이터베이스 관련 작업 수행 → 연결종료
JDBC 드라이버 로딩
데이터베이스 작업에 필요한 JDBC 드라이버를 로딩하는 것이다.
CLass.forName()을 사용하여 JDBC 드라이버를 로딩한다.
데이터베이스 연결 수립
자바 애플리케이션을 데이터베이스에 연결 한다.
JDBC :URL 과 접속 계정정보를 지정하여 Connection 객체 생성
데이터 베이스 관련 작업 수행
연결된 데이터베이스에 SQL실행 : SQL 실행을 위한 Statement 객체 생성/SQL 실행
SQL 실행 결과 사용(필요시 사용) : ResultSet 객체를 통해 SQL 실행 결과를 저장한 후 사용
데이터베이스 연결 종료
자바 애플리케이션과 데이터베이스와의 연결을 끊음 : 사용했던 ResultSet, Statement 객체를 종료한 후 Connection 객체를 종료 시킴
JDBC 프로그래밍 코드
서블릿과 같은 자바 클래스 파일이나 JSP 페이지 모두 JDBC 프로그래밍을 하기 위해서는 먼저 JDBC 프로그래밍에 필요한 요소들을 포함하는 java.sql 패키지를 임포트해주어야 한다.
<%@page import="java.sql.*"%>
자바 애플리케이션이 데이터베이스에 접근하기 위해서는 사용하는 DBMS에 적합한 JDBC 드라이버를 로딩해주어야 하며, Class 클래스의 forName() 메서드를 이용하여 다음과 같이 MySQL JDBC 드라이버를 로딩한다.
Java.lang.Class의 forName메서드
java.lang.Class의 forName 메서드를 사용하면 입력된 클래스 정보를 찾아 로드할수 있다.
forName 메서드를 이용하여 MySQL 드라이버가 로드되면 MySQL 데이터베이스와 연결할 수 있는 준비가 된 것이다.
MySQL JDBC 로딩 시 "com.mysql.cj.jdbc.Driver"은 mysql-connector-java-5.1.29-bin.jar 파일 내 패키지 구조의 클래스를 명시하여 com 패키지 내 mysql 패키지내 cj 패키지내 jdbc 패키지 내 Drive 클래스를 로딩함을 의미한다.
MySQL 데이터베이스를 사용하기 위한 JDBC 드라이버 로딩이 끝났다면 접속할 데이터베이스의 DB정보를 JDBC URL 작성을 통해 지정해야 한다.
JDBC URL은 접속할 데이터의 정보를 나타내며 JDBC URL 작성은 ":"을 통해 3구간으로 분류되고 아래와 같이 첫번째 구간에는 웹 서비스 주소에 http와 마찬가지로 프로토콜을 입력한다.
첫 구간은 DBMS종류에 상관없이 jdbc로 입력한다.
두번째 구간 subprotocol은 DBMS 종류에 따라 달라지며 MySQL은 'mysql'로 지정한다.
세번째 구간인 subname 구간에는 현재 자바 애플리케이션에서 사용할 데이터베이스를 지정하고, 사용할 데이터베이스의 주소와 port를 명시한 후 '/데이터베이스명'을 함께 작성하여 사용할 데이터베이스의 이름까지 지정해준다.
protocol:subprotocol:subname
jdbc:mysql:localhost:3306/jspbook
JDBC URL과 사용할 데이터베이스의 계정과 비밀번호를 지정하여 데이터베이스 작업 수행을 위해 데이터베이스 세션을 얻는 역할을 하는 Connection 인스턴스를 다음과 같이 DriverManager 클래스의 getConnection 메서드를 통해 생성한다.
DriverManaver클래스는 JDBC 드라이버의 관리를 위해 사용하며, JDBC URL을 통해 Connection 인스턴스를 생성할 수 있다.
getConnection 메서드의 첫 번째 입력 파라미터는 앞서 보았던 JDBC URL 을 입력하고 , 두 번째 세번째 입력 파라미터는 데이터베이스 접속을 위한 계정 정보로 각각 계정 아이디, 비밀번호를 다음과 같이 지정한다.
getConnection() 메서드를 통해 생성된 Connection 인스턴스는 Connection conn에 할당하도록 하여, 이후 JDBC 프로그래밍에 사용할 것이다.
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jspbook", "root", "jspbook");
위 과정가지 정상적으로 동작한다면 자바 애플리케이션은 이제 데이터베이스와의 연결이 이루어진 것이다.
이제 SQL문을 사용하여 데이터베이스 내 작업을 명령할 수 있다.
SQL문 실행을 위해 사용하는 java.sql 패키지의 Statement 인터페이스는 SQL문을 데이터베이스에 전달하고 그 실행결과를 ResultSet 인터페이스로 전달하는 역할을 한다.
ResultSet은 실행된 SQL 문의 질의결과를 처리하기 위해 사용하며, Statement 인스턴스는 앞서 생성한 Connection 인스턴스의 createStatement() 메서드를 사용하여 아래와 같이 획득할 수 있다.
Statement stmt = conn.createStatement();
Statement를 통해 SQL 문을 데이터베이스에 전달하기 위해서는 SQL문의 종류에 따라 아래의 메서드를 사용한다.
각 메서드의 입력 파라미터로 사용될 SQL문은 Java 문자열 형태, 즉 String 타입으로 입력된다.
int executeUpdate(String sql) : INSERT, UPDATE, DELETE 쿼리에 사용되며 실행 결과로 변경되거나 삽입된 로우의 개수를 리턴한다.
ResultSet execureQuery(String sql) : SELECT 쿼리에 사용되며 실행 결과로 조회된 데이터들을 Result Set 객체에 저장하여 리턴한다.
Boolean execute(String sql) : 모든 쿼리를 사용할 수 있고, boolean을 리턴한다.
Statement를 통한 SQL문 실행은 ResultSet과 연동되어 사용된다.
ResultSet 인터페이스를 통해 데이터베이스에 연전달한 SQL문에 결과 데이터를 처리할 수 있으며, Statement의 executeQuery() 메서드로 반환되는 인스턴스로 할당된다.
만약 STUDENT 테이블의 데이터를 조회하고 싶을 경우 , 아래와 같이 Statement의 executeQuery() 메서드를 통해 SQL문을 지정하고 그 결과 값을 ResultSet 타입의 참조변수 rs에 할당하는 방식으로 구현할 수 있다.
ResultSet rs = stmt.executeQuery("SELECT * FROM STUDENT");
이렇게 데이터베이스를 조회한 결과를 담은 ResultSet 인스턴스 rs에는 위 SQL문의 결과, 즉 STUDENT 테이블의 데이터가 저장되어 있으며, next() 메서드를 통해 하나의 로우 단위로 저장된 데이터 사용이 가능하다.
rs.next();
ResultSet의 next()메서드는 결과 로우가 더 남아있을 경우 true를, 더이상 반환할 로우가 없을 경우 false를 리턴하므로 반복문과 함께 사용한다.
while(rs.next())
ResultSet의 next()메서드를 통해 전달되는 로우의 데이터들은 자바에서 사용되는 데이터타입으로 변환과정이 필요하며, 조회한 데이터의 컬럼 별로 각각 데이터 타입을 지정해준다.
문자열로 표현되는 VARCHAR 데이터 타입은 자바에서는 ResultSet의 getString() 메서드를 사용한다.
getString() 메서드 내 숫자는 결과 데이터의 컬럼 번호를 의미하며, 1을 사용한 경우 첫번째 컬럼을 자바의 String타입으로 변환하여 리턴하게 된다.
rs.getString(1);
SQL문을 Statement를 통해 전달하고, 그 결과값을 ResultSet을 통해 사용하는 드으이 데이터베이스 관련 작업 수행이 끝나면, 반드시 DriverManager를 통해 획득한 Connection 객체를 종료시켜 사용 중인 자원을 반환해주어야 한다.
접속 종료는 close() 메서드를 사용며 아래와 같이 인스턴스를 획득한 순서와 반대로 ResultSet, Statement, Connection 순서대로 종료한다.
rs.close();
stmt.close();
conn.close();
JDBC 프로그래밍을 이용한 데이터 삽입
JDBC 프로그래밍을 통해 데이터베이스에 새로운 데이터를 삽입하는 기능을 구현하자.
데이터베이스에 새로운 데이터를 삽입한다는 것은 데이터베이스 내 테이블에 INSERT 문을 사용하여 데이터를 추가함을 의미하며 이는 신규 회원가입, 게시판 글 등록 등 웹 애플리켕션의 다양한 영역에서 활용된다.
JDBC 프로그래밍을 통해 INSERT 문을 실행할 경우는 앞서 살펴본 SELECT문을 위해 사용한 executeQuery()와는 달리 Statement의 executeUpdate() 메서드를 사용한다.
stmt.executeUpdate(INSERT문)
executeUpdate() 메서드는 실행 후 int 타입의 값을 리턴하며, 이는 실행된 INSERT 문으로 추가된 로우의 수를 의미한다.
INSERT문을 실행하기 위해 executeUpdate()메서드를 사용한다.
JDBC 프로그래밍을 이용한 데이터 수정
추가한 데이터를 변경하는 것도 INSERT문과 마찬가지로 Statement의 executeUpdate() 메서드를 사용한다. UPDATE 문을 사용한다.
JDBC 프로그래밍을 이용한 데이터 삭제
테이블에 저장되어 있는 데이터를 삭제하기 위해서도 executeUpdate 를 사용해 DELETE 문을 사용한다.
JDBC 프로그래밍은 실행되는 SQL문의 종류가 다르더라고 그 기능 구현의 순서나 사용되는 코드 대부분 비슷하다.
JDBC 프로그래밍을 활용하여 데이터 정의어(DDL:Data Definition Language)를 사용하면 데이터베이스 내 테이블을 추가하거나 이미 생성되어 있는 테이블을 변경, 삭제하는 기능을 구현하는 것도 가능하다.
그러나 일반적으로 데이터베이스 내 요소들을 생성하거나 수정, 삭제하는 기능을 웹 애플리케이션 내에서 다루는 경우는 흔치 않다.
PreparedStatement 사용
java.sql.PreparedStatement는 java.sql.Statement 인터페이스를 확장한 인터페이스로 기존 Statement보다 효과적으로 SQL문을 구현할 수 있다.
SQL문을 미리 컴파일 하여 사용하므로 Statement를 사용한 SQL문 실행보다 실행속도 면에서 이점을 가진다.
PreparedStatement는 Statement와 마찬가지로 다양한 SQL문을 사용할 수 있으며, Connection 객체의 prepareStatement() 메서드에 실행할 SQL문을 지정하는 방식으로 획득한다.
PreparedStatement pstmt = conn.preparedStatement(SQL문);
preparedStatement() 메서드 내에 지정하는 SQL문의 경우 Statement에서의 사용과 차이를 보이는데 SQL문 내에는 위치 표시자라 불리는 물음표 ? 사용이 가능하다.
PreparedStatement에 정의된 set~형태의 메서드를 통해 이후 값을 아래와 같이 지정할 수 있다.
PreaparedStatement pstmt = conn.prepareStatement("SELECT * FROM STUDENT WHERE DEPARTMENT_ID=? AND STUDENT_ID LIKE ?");
pstmt.setString(1, "M001");
pstmt.setString(2, "2014%");
setString() 메서드는 문자열 타입의 데이터를 SQL문 물음표에 넣어준다는 의미이며 메서드 내 첫번째 입력 파라미터 숫자는 SQL문의 물음표를 지칭한다.
위와 같이 1로 지정되어있을 경우 두번째 입력 파라미터인 M001 문자열은 DEPARTMENT_ID와 비교될 첫번째 물음표에 대입되는 것이다.
따라서 위에서 구현한대로 PreparedStatement를 사용했을 경우 최종적으로 SQL문은 아래와 같이 완성되어 실행될 것이다.
SELECT * FROM STUDENT
WHERE DEPARTMENT_ID = 'M001' AND STUDENT_ID LIKE '2014%'
WHERE 절 조건에 사용될 실제 값은 setString()메서드를 사용하여 지정한다.
Statement를 사용했던 WSQL문들은 완전하게 완성되어 있는 상태였지만, 웹 애플리케이션 제작 시 사용되는 SQL문의 대부분은 사용자의 요청에 따라 입력된 값들이 SQL문에 포함되는 형식으로 제작되며 입력된 값들은 미리 선언된 자바의 변수에 담긴 상태로 사용되는 경우가 많다.
따라서 String 타입의 SQL문에 해당 변수들의 값을 추가할 경우, Statement와 같이 완성된 상태의 SQL문을 제작하거나 수정해야 할 때 SQL문과 여러 변수들이 혼합되어 작업 능률이 떨어뜨리는 원인이 된다.
그에 반해 PreparedStatement는 위와 같이 추가될 값들에 대해서 위치 표사자를 사용하여 값을 추후에 따로 지정하는 형태로 SQL문을 사용하므로 , 여러 개의 동적인 변수를 통한 값의 할당이 한결 손쉬어진다는 장점을 가진다.
SQL문 실행 효율성 측면뿐만 아니라, 프로그래밍의 효율도 높일 수 있는 것이다.
커넥션 풀(Connection Pool)
지금까지 했던 JDBC를 이용한 데이터베이스 프로그래밍은 데이터 관련 작업이 필요할 때마다 JSP 페이지 내에서 Connection 객체를 생성하는 방식으로 구현되었다.
Connection 객체를 통한 데이터베이스 연결과 종료는 일반 Java 클래스에 비해 훨씬 많은 시간 및 자원을 필요로 하므로, 웹 애플리케이션 이용자가 늘어날 경우 웹 서비스 전체 효율을 낮추는 원인이 된다.
커넥션 풀은 이러한 JDBC를 통한 데이터베이스 연결의 성능을 향상시키기 위해 일반적인 방식이다.
커넥션 풀의 개요
커넥션 풀은 JDBC를 사용한 데이터베이스 연동 시 가장 많은 시간을 필요로 하는 Connection 객체를 미리 여러개 생성해두고, 데이터베이스 관련 작업 수행 시 생성해둔 Connection 객체를 빌려준 후 사용이 끝나면 반환받는 방식으로 데이터베이스 연결 효율을 높인다.
따라서 커넥션 풀을 사용한 웹 애플리케이션의 데이터베이스 작업 수행은 아래와 같은 순서로 이루어 진다.
- 웹 애플리케이션 내 데이터베이스 관련 작업이 수행되어야할 경우 커넥션 풀에서 미리 생성되어있는 커넥션을 빌려온다.
- 커넥션 풀로부터 받아온 커넥션을 통해 데이터베이스 관련 작업을 수행한다.
- 데이터베이스 관련 작업 수행이 끝나면 커넥션을 반환한다.
웹 애플리케이션은 데이터베이스와 연동되는 작업이 주를 이룬다.
웹 애플리케이션과 데이터베이스간의 연결을 위해 Connection 인스턴스를 생성 및 종료하는 과정은 JDBC를 통한 데이터베이스 관련 작업 과정 중 가장 시간이 많이 소요되는 부분이다.
커넥션 풀을 활용하면 이러한 Connection 인스턴스 생성 및 종료에 관련된 처리 시간이 필요치 않아 웹 서비스의 성능 향상에 도움을 주므로 일반적으로 대부분의 웹 애플리케이션은 커넥션 풀을 사용하여 제작한다.
과거에는 커넥션 풀 기능을 수행하기 위한 클래스를 직접 구현하기도 하였으나 최근에는 커넥션 풀 기능을 제공하는 다양한 오픈 소스 라이브러리가 많이 존재하므로 해당 라이브러리를 다운받아 사용한다.
톰캣에서 제공하는 JNDI를 사용하여 커넥션 풀 기능을 사용해보자.
JNDI를 이용한 커넥션 풀 사용
JNDI(Java Namaing and Directory Interface)는 애플리케이션 구현 시 필요한 클래스와 파일과 같은 데이터를 명명하고 디렉터리 서비스를 사용하기 위한 API이다.
JNDI를 통한 데이터베이스 접속 시 커넥션 풀 방식을 사용할 수 있고, 톰켓에서 기본적으로 제공되므로 별 다른 다운로드 및 설치과정 없이 커넥션 풀 기능을 구현할 수 있다.
(1) 커넥션 풀 사용을 위한 설정
JNDI의 커넥션 풀 기능을 사용하려면 톰캣의 server.xml, context.xml, web.xml 파일에 추가로 작성해야한다.
<Resource auth="Container" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/jspbook" username="jspbook" password="1234' name="jdbc/mysql" type="javax.sql.Datasource" maxActive="20" maxWait="10000" />
context.xml에 JNDI 커넥션 풀 설정을 위해서는 <Resource> 태그를 사용하며 , auth속성이 "Container"로 지정된 것은 데이터베이스 접속 인증을 위한 톰켓 컨테이너가 처리하도록 하기 위함이다.
driverClassName 속성에 사용할 드라이버명과 url속성에 데이터베이스URL, 그리고 username, password 속성에 각각 접속할 데이터베이스 계정 정보를 지정한다.
name 속성에는 이후 java 코드에서 데이터소스를 가리킬 이름을 지정한다.
type에는 Java 코드에서 사용할 DataSource를 명시하고 maxActive 속성은 최대 커넥션 수를 지정한다. 즉 위와같이 20을 지정하면 총 20개의 커넥션 까지 동시접속을 허용한다는 의미이다.
만약 -1로 둘 경우 커넥션의 제한을 두지 않는다.
maxWait 속성은 커넥션이 남아있지 않을 경우 ms 단위로 대기할 시간을 지정한다.
10000으로 짖어할경우 커넥션을 얻기 위해 10초간 대기함을 의미한다.
(2) 커넥션 풀 사용을 위한 유틸 클래스 제작
앞서 커넥션 풀의 설정이 끝났다면 서블릿 및 JSP 페이지에서 커넥션 풀을 사용할 수 있으며, 데이터베이스 접속을 위하여 커넥션 풀의 Connection 인스턴스를 제공할 유틸 클래스를 제작한다.
db 패키지 내 ConnectionPool 클래스를 제작한다.
Connection 클래스는 Connection 인스턴스를 관리하기 위한 용도로 사용되며 서블릿 및 JSP 페이지에서는 ConnectionPool 클래스의 정적 메서드인 getConnection() 메서드를 사용하여 간단히 Connection 인스턴스를 사용할 수 있다.
getConnection() 메서드는 이미 Connection 객체가 생성되어 있는 상태일 경우 해당 Connection 객체를 리턴한다.
그렇지 않을 경우 DataSource 객체를 얻기 위해 InitialContext 객체를 사용한다.
lookup() 메서드를 통해 "java:comp/env/" 를 입력 파라미터로 사용하여 initContext인스턴스를 얻은 후 context.xml에 지정했던 "jdbc/mysql"값을 입력 파라미터로 생성된 DataSource객체의 getConnect() 메서드를 사용하여 Connection 객체를 메서드를 호출한측으로 반환한다.
package db;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class ConnectionPool {
private static Connection conn = null;
public static Connection getConnection(){
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.getConnection();
}catch(Exception e){
e.printStackTrace();
}
return conn;
}
}
}
이렇게 제작한 ConnectionPool 클래스를 사용하면 JSP 및 서블릿 페이지에서 커넥션 풀을 이용한 데이터베이스 작업 수행이 가능해진다.
후에 JSP 페이지에섯 커넥션 풀을 사용하려면 Connection 인스턴스를 직접 생성하지 않고 앞서 제작한 ConnectionPool 클래스의 getConnection()메서드를 사용한다.
conn = ConnectionPool.getConnection()
@Resource 어노테이션을 통핸 서블릿 페이지 커넥션 풀 사용
서블릿 페이지의 경우 ConnectionPool 클래스와 같은 유틸 크랠스 없이 @Resource 어노테이션을 이용한 커넥션 풀 사용이 가능하다.
ConnectionPool 클래스를 사용하진 않지만 이 경우도 context.xml 파일에 설정이 선행되어야 한다.
@Resource 어노테이션을 사용하기 위해선 javax.annotation.Resource를 임포트하고, name 속성에는 context.xml 파일에 설정한 name="jdbc/mysql"을 지정하고 DataSource 객체의 참조 변수명을 ds로 지정한다.
이후 Connection 인스턴스인 conn을 ds 인스턴스의 getConnecdtion() 메서드를 사용하여 생성해주면 동일하게 사용이 가능하다.
웹 애플리케이션의 데이터베이스 프로그래밍은 기존 웹 애플리케이션 제작방식과 Java 방식을 통한 데이터베이스 접근 및 작업에 대한 기능 구현이 함께 이루어져 다소 복잡하게 느껴질 수도 있다.
그러나 웹 애플리케이션이 웹 브라우저를 통해 사용자에게 제공하는 서비스의 중심에는 항상 데이터베이스라는 정보저장소가 중요한 역할을 담당하므로 반드시 숙지해야 한다.
'Back-end' 카테고리의 다른 글
10. JSTL (0) | 2021.09.11 |
---|---|
EL(Expression Language) (0) | 2021.09.05 |
시큐리티 커스텀 로그인 폼 (0) | 2021.09.03 |
스프링 시큐리티 (0) | 2021.09.02 |
JSP의 액션태그 (0) | 2021.08.29 |