티스토리 뷰

JNDI(Java Naming Directory Interface)로 DB 연결의 정보를 Context.xml에 저장하여 이름으로 DB를 검색하여 사용할 수 있는 기법이다.


이 방법을 사용하기 위해서는 우선 MATA-INF 내부에 Context.xml을 새로 생성해야한다.

이후 생성한 xml문서를 다음과 같이 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name = "jdbc/orcl"
    auth = "container"
    type = "javax.sql.DataSource"
    username = "spring_ex"
    password = "1234"
    driverClassName = "oracle.jdbc.driver.OracleDriver"
    factory = "org.apache.commons.dbcp.BasicDataSourceFactory"
    url = "jdbc:oracle:thin:@localhost:1521:XE"
    maxActive = "20"
    maxIdle = "10" >

  </Resource>
</Context>

 

각 속성의 역할은 다음과 같다.


이후 DAO쪽에서 Context.xml을 사용할 수 있도록 작성해야한다. Context.xml을 이용한 Connection은 다음과 같이 구성할 수 있다.

package com.choonham.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import javax.naming.InitialContext; // InitialContext implements Context
import javax.naming.NamingException;
import javax.sql.DataSource;

import com.choonham.dto.BoardDTO;

public class BoardDAO {

	DataSource ds;
	//DataSource 객체는 getConnection() 과 동일한 역할을 담당한다.
	public BoardDAO() {
		// 1. Context 객체 얻기 : Context.xml 문서에서 name = "jdbc/orcl" 속성 값을 추출
		// 방법 : InitialContext 객체를 이용(해당 객체가 가지고 있는 lookUp() 을 통해 name 속성 값을 추출할 수 있다.
		//  단, jdbc/orcl을 찾기 위해서는 java:comp/evn/jdbc/orcl 와 같이 적어야 한다.
		try {
			InitialContext ctv = new InitialContext();
			
			ds = (DataSource)ctv.lookup("java:comp/env/jdbc/orcl");
		} catch (NamingException e) {
			e.printStackTrace();
		}
	
	}
	
	/** 글 목록 조회 **/
	public ArrayList<BoardDTO> list() {
		ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
		
		try {
			String sql = "SELECT * FROM SPRINGBOARD ORDER BY NUM DESC";
			Connection conn = ds.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			
			while(rs.next()) {
				BoardDTO data = new BoardDTO();
				
				data.setNum(rs.getInt("num"));
				data.setAuthor(rs.getString("author"));
				data.setTitle(rs.getString("title"));
				data.setContent(rs.getString("content"));
				data.setDate(rs.getString("writeday"));
				data.setReadcnt(rs.getInt("readcnt"));
				
				list.add(data);
			}
			
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		return list;
	}

}

 

핵심은 name속성을 lookUp하여  DataSource 객체를 생성하는 것이다. 이를 위해 InitialContext 객체가 사용되었다.


이후에 작성해뒀던 spring(servlet).xml에서 해당 DAO를 등록해야한다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- 요청에 따른 컨트롤러 반환 담당 : /list.do  -->
	<bean id="defaultHandlerMapping"  class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
	
	<!--  DB 접속 : JNDI 방식 -->
	<bean id = "boardDAO" class = "com.choonham.dao.BoardDAO"></bean> 
	
	
	<!-- viewResolver(위치, 이동할 페이지 지정) -->
	<bean id="viewResolover"  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	    <property name="viewClass"   value="org.springframework.web.servlet.view.InternalResourceView"/>
	    <property name="prefix" value="/"/>
	    <property name="suffix" value=".jsp"/>
	</bean>
	
</beans>

이제 스프링 라이브러리가 dao를 자동 호출할 수 있도록 controller 또한 생성해준다.

package com.choonham.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.choonham.dao.BoardDAO;

public class ListActionController implements Controller {
	
	private BoardDAO dao;

	public ListActionController() {
		// TODO Auto-generated constructor stub
	}

	
	/**  요청사항이 전달되면 자동 호출되는 메서드 **/
	@Override
	public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}


	public void setDao(BoardDAO dao) {
		this.dao = dao;
	}

}

다음으로 생성한 controller를 다시 spring(servlet).xml 파일에 등록해준다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<bean id="defaultHandlerMapping"  class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
	
	<!--  DB 접속 : JNDI 방식 -->
	<bean id = "boardDAO" class = "com.choonham.dao.BoardDAO"></bean> 
	
	<!-- 글 목록 보기 컨트롤러 등록 -->
	<bean name = "/list.do" class = "com.choonham.controller.ListActionController">
		<property name = "dao">
			<ref bean = "boardDAO" />
		</property>
	</bean>
	
	<!-- viewResolver(위치, 이동할 페이지 지정) -->
	<bean id="viewResolover"  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	    <property name="viewClass"   value="org.springframework.web.servlet.view.InternalResourceView"/>
	    <property name="prefix" value="/"/>
	    <property name="suffix" value=".jsp"/>
	</bean>
	
</beans>

이렇게 등록을 해놓아야 요청이 들어왔을 때, 최종적으로 controller에 handleRequest() 가 자동으로 호출된다.

Comments