Jsp-JavaBeans & JDBC연동
JavaBeans
- 자바빈즈가 사용되어진 배경
- jsp페이지에 html외의 jsp요소가 많기 때문에 디자이너들과의 협업이 어려워짐.
- jsp페이지에 작성된 프로그램 코드는 재사용하기가 힘들다. 코드조각(snippet) 에 불과하다. 데이터베이스에 연결하는 일, 에처처리를 위해 로그남기기 등과 같은 기본적인 구조는 반복적으로 이루어지기 때문에 매 페이지마다 반복되면 비효율적이다.
- 자바빈즈의 목적
- jsp페이지가 복잡한 자바코드로 구성되는 것을 피하고 html코드들만 남겨놓기 위함이다.
- 복잡한 로직을 jsp페이지에 넣지않고 자바빈즈와 같은 컴포넌트(부품)기술을 이용하면 재사용성, 효율성이 증진된다.
- 빈(bean)은 클래스이다.
- 빈의 형식
public class SimpleBean { private String message = ""; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
- jsp페이지에서 자바빈즈 사용하기
- useBean 액션 태그 → 빈을 생성하여 둔다.
- id는 빈의 이름(자바에서 객체명과 같은 느낌), class는 생성을 위해 필요한 클래스이름, scope은 생성한 빈이 유효한 영역
- setProperty 액션 태그 → 생성된 빈에 값을 저장한다.
- name은 생성된 빈을 지정하기 위해 사용하는데 useBean에서 id값과 정확히 일치해야한다.
- property로 값을 저장할 빈의 변수를 선택한다. 만약 property =”age”라면 jsp컨테이너는 빈의 setAge()메소드를 찾아가 값을 저장한다.
- 그리고 그 값은 value로 저장한다.
- getProperty 액션 태그 → 빈의 값을 가져온다.
- setProperty와 동일하게 name에다가 생성된 빈의 id값을 똑같이 저장한다.
- 그 다음 필요한 값이 저장된 변수를 불러올 때에는 똑같이 property를 사용한다.
<jsp : useBean id = "myBean" class = "ch09.SimpleBean" scope = "page"/>
<jsp : setProperty name ="myBean" property = "name" value = "김명관"/>
<jsp : getProperty name ="myBean" property = "name"/>
- 자바빈즈 안의 변수(필드)이름과 input태그의 name속성값과 get/setProperty액션 태그의 property속성값이 전부 일치해야함. → 따라서 빈을 작성하는 시점에서부터 jsp페이지에서 전송될 파라미터의 이름을 생각해서 작성하는 것이 필요함. → 매우 중요
JDBC
- Java DataBase Connectivity (java.sql패키지)
- 구성 : jdbc드라이버 + jdbc인터페이스
- 목적 : 데이터베이스 연동 자바 프로그램 시 인터페이스의 사용만으로 데이터베이스를 다루기 위함.
- JDBC API
- JDBC를 사용함에 있어 전체적인 흐름
- 데이터베이스에 연결하기
- 질의 던지기
- 질의에 대한 결과 받아오기
- 연결 해제하기
- 이런 흐름 속에서 사용하는 API들이 필요하고 이 API는 java.sql패키지에 담겨있다.
- Driver : 모든 드라이버 클래스들이 구현해야 하는 인터페이스
- DriverManger : 드라이버를 로드하고 데이터베이스에 연결해준다.
- Connection : 특정 데이터베이스와의 연결을 담당
- Statement : sql문을 실행해 작성된 결과를 돌려준다.
- ResultSet : sql문에 대한 결과를 얻어낸다.
- CSR이 중요..!
- JDBC를 사용함에 있어 전체적인 흐름
//1. jdbc 드라이버의 인스턴스생성
Class.forName("org.gjt.mm.mysql.Driver");
//2. jdbc 드라이버 인스턴스를 통해 DBMS에 대한 연결 생성
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234");
//3. Statement 생성
Statement stmt = conn.createStatement();
//4. 질의문 실행 / ResultSet으로 결과 받음
ResultSet rs = stmt.executeQuery("select * from tblRegister");
//5. ResultSet, Statement, 데이터베이스와의 연결해지
rs.close();
stmt.close();
conn.close();
JDBC를 통한 JSP와 데이터베이스 연동
- JSP페이지에서 직접 JDBC를 통해 데이터베이스와 연동
- 페이지 내에 데이터베이스 관련 코드가 혼재되어있어 추후 변경작업을 할 때 유리하지 못함.
- usingJDBCJsp.jsp 파일 참고
- 자바빈브를 이용한 데이터베이스 연동 (jsp페이지와 분리) → 이 방법을 쓰는 걸 추천
- 회원정보의 형태인 RegisterBean.java를 만든다.
- JDBC연결 설정 코드들과 RegisterBean의 틀을 갖고와서 빈에다가 setter메소드를 이용해 저장하는 RegisterMgr.java를 만든다. 실제로 데이터베이스에 연동되어 질의를 수행해 얻는 결과를 받는 작업을 한다.
public class RegisterMgr { private final String JDBC_DRIVER = "org.gjt.mm.mysql.Driver"; private final String JDBC_URL = "jdbc:mysql://localhost:3306/mydb"; private final String USER = "root"; private final String PASS = "1234"; public RegisterMgr() { // 생성자에서 jdbc드라이버 로딩 try { Class.forName(JDBC_DRIVER); } catch (Exception e) { System.out.println("Error : JDBC 드라이버 로딩 실패"); } } public Vector<RegisterBean> getRegisterList() { // 빈타입으로 반환해내는 벡터생성 Connection conn = null; Statement stmt = null; ResultSet rs = null; Vector<RegisterBean> vlist = new Vector<RegisterBean>(); try { conn = DriverManager.getConnection(JDBC_URL, USER, PASS); String strQuery = "select * from tblRegister"; stmt = conn.createStatement(); rs = stmt.executeQuery(strQuery); while (rs.next()) { RegisterBean bean = new RegisterBean(); bean.setId(rs.getString("id")); bean.setPwd(rs.getString("pwd")); bean.setName(rs.getString("name")); bean.setNum1(rs.getString("num1")); bean.setNum2(rs.getString("num2")); bean.setEmail(rs.getString("email")); bean.setPhone(rs.getString("phone")); bean.setZipcode(rs.getString("zipcode")); bean.setAddress(rs.getString("address")); bean.setJob(rs.getString("job")); vlist.addElement(bean); } } return vlist; }
- jsp페이지에선 아래와 같이 값을 꺼내온다.
<%@ page import="java.util.*, ch11.*"%>
<jsp:useBean id="regMgr" class="ch11.RegisterMgr" />
<%
Vector<RegisterBean> vlist = regMgr.getRegisterList();
int counter = vlist.size();
for (int i = 0; i < vlist.size(); i++) {
RegisterBean regBean = vlist.get(i);
%>
<tr>
<td><%=regBean.getId()%></td>
<td><%=regBean.getPwd()%></td>
<td><%=regBean.getName()%></td>
<td><%=regBean.getNum1()%></td>
<td><%=regBean.getNum2()%></td>
<td><%=regBean.getEmail()%></td>
<td><%=regBean.getPhone()%></td>
<td><%=regBean.getZipcode()%>/<%=regBean.getAddress()%></td>
<td><%=regBean.getJob()%></td>
</tr>
<%
}
%>
3, ConnectionPool을 사용한 JavaBeans-데이터베이스 연결
- 데이터베이스 연동과 관련된 시간이 사용자에게 응답을 제공하기까지 걸리는 시간을 connection pool을 통해 효율적으로 만든다.
- 데이터베이스 연결객체를 매번 생성, 사용, 해제 단계를 걸쳐 사용하는 건 굉장한 메모리비용을 요구한다. 이를 해결하기 위해 나온 것이 connection pool기법이다.
- 비유를 하면 수영장에 여러 튜브를 미리 준비해두고 풀장 위에 띄어두는 것이다. 그럼 여러 사용자가 쓰고 반납하고 하면 효율적이다. 매번 관리자가 튜브에 바람넣고 수영장에 띄우고 다 쓰면 바람 빼고하는 귀찮음이 없어지는 것이다.
- 결국 connection pool기법은 웹어플리케이션처럼 많은 사용자가 데이터베이스에 접근하고 사용하는 특성에 알맞는 기법이라고 할 수 있다. → 다중 사용자에 대한 서비스 제공에 최적화
- RegisterMgrPool.java, RegisterBean.java, DBConnectionMgr.java, UsingJDBCPoolBean.jsp 이 네개의 파일로 구현가능 - 참조
댓글남기기