Jsp-JavaBeans & JDBC연동

3 분 소요

JavaBeans

  • 자바빈즈가 사용되어진 배경
    1. jsp페이지에 html외의 jsp요소가 많기 때문에 디자이너들과의 협업이 어려워짐.
    2. jsp페이지에 작성된 프로그램 코드는 재사용하기가 힘들다. 코드조각(snippet) 에 불과하다. 데이터베이스에 연결하는 일, 에처처리를 위해 로그남기기 등과 같은 기본적인 구조는 반복적으로 이루어지기 때문에 매 페이지마다 반복되면 비효율적이다.
  • 자바빈즈의 목적
    1. jsp페이지가 복잡한 자바코드로 구성되는 것을 피하고 html코드들만 남겨놓기 위함이다.
    2. 복잡한 로직을 jsp페이지에 넣지않고 자바빈즈와 같은 컴포넌트(부품)기술을 이용하면 재사용성, 효율성이 증진된다.
  • 빈(bean)은 클래스이다.
  • 빈의 형식
      public class SimpleBean {
              private String message = "";
              public String getMessage() {
                      return message;
              }
              public void setMessage(String message) {
                      this.message = message;
              }
      }
    
  • jsp페이지에서 자바빈즈 사용하기
    1. useBean 액션 태그 → 빈을 생성하여 둔다.
    • id는 빈의 이름(자바에서 객체명과 같은 느낌), class는 생성을 위해 필요한 클래스이름, scope은 생성한 빈이 유효한 영역
      1. setProperty 액션 태그 → 생성된 빈에 값을 저장한다.
    • name은 생성된 빈을 지정하기 위해 사용하는데 useBean에서 id값과 정확히 일치해야한다.
    • property로 값을 저장할 빈의 변수를 선택한다. 만약 property =”age”라면 jsp컨테이너는 빈의 setAge()메소드를 찾아가 값을 저장한다.
    • 그리고 그 값은 value로 저장한다.
      1. 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를 사용함에 있어 전체적인 흐름
      1. 데이터베이스에 연결하기
      2. 질의 던지기
      3. 질의에 대한 결과 받아오기
      4. 연결 해제하기
    • 이런 흐름 속에서 사용하는 API들이 필요하고 이 API는 java.sql패키지에 담겨있다.
      1. Driver : 모든 드라이버 클래스들이 구현해야 하는 인터페이스
      2. DriverManger : 드라이버를 로드하고 데이터베이스에 연결해준다.
      3. Connection : 특정 데이터베이스와의 연결을 담당
      4. Statement : sql문을 실행해 작성된 결과를 돌려준다.
      5. ResultSet : sql문에 대한 결과를 얻어낸다.
        • CSR이 중요..!
    //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와 데이터베이스 연동

  1. JSP페이지에서 직접 JDBC를 통해 데이터베이스와 연동
    • 페이지 내에 데이터베이스 관련 코드가 혼재되어있어 추후 변경작업을 할 때 유리하지 못함.
    • usingJDBCJsp.jsp 파일 참고
  2. 자바빈브를 이용한 데이터베이스 연동 (jsp페이지와 분리) → 이 방법을 쓰는 걸 추천
    1. 회원정보의 형태인 RegisterBean.java를 만든다.
    2. 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;
               }
      
    3. 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 이 네개의 파일로 구현가능 - 참조

카테고리:

업데이트:

댓글남기기