ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게시판 만들기 - 11. connectionPool 구현하기
    JAVA/웹 프로그래밍 - JSP 2020. 12. 4. 18:37

    아래의 내용에 이어서 할 것인데, 부록의 느낌으로 보자.

    designatedroom87.tistory.com/332

     

    게시판 만들기 - 10. 이미지 업로드 구현하기

    designatedroom87.tistory.com/331?category=901206 게시판 만들기 - 9. 검색 리스트 구현하기 아래의 내용에 이어서 계속 구현할 것이다. designatedroom87.tistory.com/329 게시판 만들기 - 8. 글 수정 & 글 삭..

    designatedroom87.tistory.com

     

    코드와 데이터를 분리한다는 의미는 데이터는 데이터 대로 코드는 코드 따로 분리 해서
    명령으로 이들을 불러온다. 나중에 connectPool을 구현할 때, xml문서를 활용한다.

    여기서의 xml은 WebContent/WEB-INF폴더에 있는 web.xml 파일이다.

    구현하기 전에 아래의 예제들을 충분히 보도록 하자.

    WebContent폴더에 xmlParse.jsp파일을 만든다.

    그리고 실행하고 웹 페이지 창을 우클릭해서 "페이지 소스보기"를 선택한다.

    그러면 소스 코드를 볼 수 있다.

    xmlParse.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    
    <body>
    	<p id="doc"></p>
    	<script>
    		text="<bookstore>" + 
    		"<book>"
    		+"<booktitle>생쥐가 물에 빠진날</booktitle>"
    		+"<author>홍길동</author>"
    		+"<price>20000</price>"
    		+"</book>"
    		+"</bookstore>"
    		
    document.getElementById("doc").innerHTML = text;
    	</script>
    </body>
    </html>

     

    위의 xmlParse.jsp 문서를 분리해보자. 그리고 실행해보자.

    xmlParse.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    
    <body>
    	<p id="doc"></p>
    	<script>
    		text="<bookstore>" + 
    		"<book>"
    		+"<booktitle>생쥐가 물에 빠진날</booktitle>"
    		+"<author>홍길동</author>"
    		+"<price>20000</price>"
    		+"</book>"
    		+"<book>"
    		+"<booktitle>생쥐가 물에 빠진날1</booktitle>"
    		+"<author>홍길동1</author>"
    		+"<price>30000</price>"
    		+"</book>"
    		+"</bookstore>"
    		
    document.getElementById("doc").innerHTML = text;
    
    	</script>
    </body>
    </html>

     

    그리고 아래의 내용도 실행해보자.

    xmlParse.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    
    <body>
    	<p id="doc"></p>
    	<script>
    		text="<bookstore>" + 
    		"<book>"
    		+"<booktitle>생쥐가 물에 빠진날</booktitle>"
    		+"<author>홍길동</author>"
    		+"<price>20000</price>"
    		+"</book>"
    		+"<book>"
    		+"<booktitle>생쥐가 물에 빠진날1</booktitle>"
    		+"<author>홍길동1</author>"
    		+"<price>30000</price>"
    		+"</book>"
    		+"</bookstore>"
    		
    /*	document.getElementById("doc").innerHTML = text;	*/
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(text,"text/html");
    document.getElementById("doc").innerHTML = 
    	xmlDoc.getElementsByTagName("author")[1].childNodes[0].nodeValue;
    
    	</script>
    </body>
    </html>

     

    src폴더에 xmlparser패키지에 XmlParserTest.java 파일을 만든다.

    현재 프로젝트의 바로 하위에 xml 파일을 하나 만들고 data 라 이름 붙인다.

    XmlParserTest.java 자바 파일에서 xml내용을 읽을 거다.

    XmlParserTest 자바 파일을 실행한다. 실행 시, "java Application"으로 실행을 한다.

    data.xml

    더보기
    <?xml version="1.0" encoding="UTF-8"?>
    <bookstore>
    	<book kind="인문">
    	<booktitle>생쥐가 물에 빠진날</booktitle>
    	<author>홍길동</author>
    	<price>20000</price>
    	</book>
    	<book>
    	<booktitle>생쥐가 물에 빠진날1</booktitle>
    	<author>홍길동1</author>
    	<price>30000</price>
    	</book>
    </bookstore>

     

    XmlParserTest.java

    더보기
    package xmlparser;
    
    import java.io.File;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import org.w3c.dom.Document;
    import org.w3c.dom.NodeList;
    
    public class XmlParserTest {
    	public static void main(String[] args) 
    	{
    		try 
    		{
    			//	1. 빌더 팩토리 생성
    			DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
    			
    			//	2. 빌더 팩토리로 부터 빌더 생성
    			DocumentBuilder builder = bf.newDocumentBuilder();
    			
    			//	3. 빌더로부터 도큐먼트 생성
    			//		파일의 위치는 프로젝트가 기준이 되므로 프로젝트에 파일 생성
    			Document doc = builder.parse(new File("data.xml"));				
    			
    			//	normalize함수를 통해 문서 안정화 작업
    			doc.getDocumentElement().normalize();
    			
    			//	xml문서의 내용을 가지고 오는 작업
    			//		book, bookstore, booktitle로 각 각 변경해서 결과를 확인하자.
    			NodeList taglist = doc.getElementsByTagName("bookstore");					//	태그 이름을 찾는다.
    			/*
    			System.out.println("nodeName : " +taglist.item(0).getNodeName());			//	tag의 이름
    			System.out.println("nodeValue : " +taglist.item(0).getNodeValue());			
    			System.out.println("nodeContent : " +taglist.item(0).getTextContent());		//	tag의 하위 내용 모두 출력
    			System.out.println("node Attribute : " +taglist.item(0).
    					getAttributes().item(0).getNodeName());								
    			
    			System.out.println("node Attribute : " +taglist.item(0).
    					getAttributes().item(0).getNodeValue());							
    			
    			System.out.println("tag length : " +taglist.getLength());					//	tag 리스트의 길이
    			
    			System.out.println("child Name : " 
    			+taglist.item(0).getChildNodes().item(0).getTextContent());						
    			*/	
    			
    			taglist = doc.getElementsByTagName("book");
    			
    			System.out.println("child Node Count : " +taglist.item(0).getChildNodes().getLength());
    			System.out.println("0' child Name : " +taglist.item(0).getChildNodes().item(0).getNodeName());
    			System.out.println("1' child Name : " +taglist.item(0).getChildNodes().item(1).getNodeName());
    			System.out.println("1' child Value : " +taglist.item(0).getChildNodes().item(1).getTextContent());
    			System.out.println("2' child Name : " +taglist.item(0).getChildNodes().item(2).getNodeName());
    			System.out.println("3' child Name : " +taglist.item(0).getChildNodes().item(3).getNodeName());
    			System.out.println("4' child Name : " +taglist.item(0).getChildNodes().item(4).getNodeName());
    			System.out.println("5' child Name : " +taglist.item(0).getChildNodes().item(5).getNodeName());
    			System.out.println("6' child Name : " +taglist.item(0).getChildNodes().item(6).getNodeName());
    		}
    		catch(Exception e) {}
    	}
    }

     

    본격적으로 connectionPoll을 만들어보자.

    DB에 연결을 할 때, DAO에서 다음과 같이 connect 함수를 만들었다.

    DB에 연결을 할 때, connect함수를 이용했는데, 이 내용을 우리가  원하는 내용만 빼와서 쓸 때 유용할 것 같다.

    connection pool은 DB에 접속하기 위한 설정이다.
    아래의 jar파일 2개를 다운로드하자. 이 두 파일을 CTRL + C해서 

    WebContent/WEB-INF/lib폴더에 CTRL + V해서 복사 붙여넣자.

    commons-dbcp-1.4.jar
    0.15MB
    commons-pool-1.5.7.jar
    0.10MB

    src/connectionPool패키지를 만들고, DBConn.java 파일을 만든다.

    DBConn.java

    더보기
    package connectionPool;
    
    import java.util.StringTokenizer;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    
    public class DBConn extends HttpServlet 
    {
    	private static final long serialVersionUID = 1L;
    
    	@Override
    	public void init(ServletConfig config) throws ServletException 
    	{
    		try {
    			//	web.xml에서 정보를 가지고 옴
    			String drivers = config.getInitParameter("jdbcDriver");
    			
    			StringTokenizer st = new StringTokenizer(drivers, ",");
    			
    			//	드라이버가 여러 개있을 수 있으므로 이에 대한 처리를 한다.(현재는 하나만 있다.)
    			while (st.hasMoreTokens())
    			{
    				String jdbcDriver = st.nextToken();
    				
    				Class.forName(jdbcDriver);
    			}
    			
    			Class.forName("org.apache.commons.dbcp.PoolingDriver");
    		}
    		catch(Exception e) {}
    	}
    }

     

    src폴더에 아래의 pool.jocl 파일을 붙여넣는다.

    (xml과 비슷한 역할)

    pool.jocl
    0.00MB

    위 파일의 내용은 아래와 같다.

    <object class="org.apache.commons.dbcp.PoolableConnectionFactory" 
    xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl">
        <object class="org.apache.commons.dbcp.DriverManagerConnectionFactory">
    		<string	value="jdbc:oracle:thin:@localhost:1521/xe" />
    		<string value="hr" />
    		<string value="1234" />
    	</object>
    
     <object class="org.apache.commons.pool.impl.GenericObjectPool">
            <object class="org.apache.commons.pool.PoolableObjectFactory" null="true" />
        </object>
         
        <object class="org.apache.commons.pool.KeyedObjectPoolFactory" null="true"/>
         
        <string null="true"/>
         
        <boolean value="false"/> 
         
        <boolean value="true"/>
    </object>

    위의 파일 내용에서 아래의 문구가 중요하다.

    2번째, 3번째, 4번째 문장은 위의 connect함수의 DriverManager.getConnection함수의 매개변수들이다.

    자신의 설정에 맞게 변경하도록 하자.

    이 파일의 해석은 클래스로부터 객체를 만들겠다는 의미이다.(object 태그)
    DB정보를 채워준다.

    DBConn클래스에 등록을 한다.

    WebContent/WEB-INF/web.xml 파일의 내용을 수정해야 한다.

    web.xml 의 내용

    더보기
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
      <display-name>Lji_Project</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
      	<servlet-name>DBConn</servlet-name>
      	<servlet-class>connectionPool.DBConn</servlet-class>
      	<init-param>
      	<param-name>jdbcDriver</param-name>
      	<param-value>oracle.jdbc.driver.OracleDriver</param-value>
      	</init-param>
      	<load-on-startup>1</load-on-startup>
      </servlet>
    </web-app>

    위의 <servlet-class> 태그에서 DBConn클래스는 connectionPool패키지에 있으므로, 패키지의 경로까지 적어줘야 한다.

    web.xml에서 DB정보를 넣어준다. DBConn을 자동으로 등록이 되게 된다.

    WebContent에 getbook .jsp파일을 만들자.

    getbook .jsp 파일에서는 위의 내용을 가지고 DB에 접속을 할 것이다.

    그리고 기존의 앞에서 한 DB에 접속해서 book 데이터를 가지고 오자.
    getbook.jsp 을 실행하자. 실행 시, "Run on Server"를 실행한다.

    getbook.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        
        <!-- 연결 작업 -->
        <%@ page import="java.sql.*" %>
        <% Connection conn=null;
        
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = null;
        
        try{
    	    //	pool.jocl파일에 관련 정보가 다 들어 있다.
    	    //	pool은 pool.jocl을 의미한다.
    	    conn = DriverManager.getConnection(
    	    		"jdbc:apache:commons:dbcp:/pool");
    	    
    	    if (conn != null)	System.out.println("DB접속 성공");
    	    else 				System.out.println("DB접속 실패");
    	    
    	    sql = "select * from book";
    	    
    	    pstmt = conn.prepareStatement(sql);
    	    rs = pstmt.executeQuery();
    	    
    	    while (rs.next()){
    	    %>
    	    	<%=rs.getInt(1) %>
    	    	<%=rs.getString(2) %>
    	    	<%=rs.getString(3) %>
    	    	<%=rs.getInt(4) %>
    	    	<%=rs.getString(5) %>
    		<% 
    	    }
    	   	rs.close();
    	   	pstmt.close();
    	   	conn.close();
        }catch(Exception e){e.printStackTrace();}
        %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    </body>
    </html>

     

     

     

    댓글

Designed by Tistory.