티스토리 뷰
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() 가 자동으로 호출된다.
반응형
'[JAVA] > Spring' 카테고리의 다른 글
[Spring] Spring 게시판 예제 마무리 & 구조 정리 (0) | 2021.06.14 |
---|---|
[Spring] 게시판 예제를 통한 Spring 구조 정리 (0) | 2021.06.10 |
[Spring] spring.xml 문서 작성 (0) | 2021.06.10 |
[Spring] web.xml 문서에 Servlet 등록 (0) | 2021.06.10 |
[Spring] Spring 라이브러리 사용 전 사전 지식 (0) | 2021.06.10 |
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
- 이탈리안 레스토랑
- 인천 구월동 이탈리안 맛집
- react
- AsyncStorage
- Async
- 정보보안기사 #실기 #정리
- 파니노구스토
- 맛집
- redux-thunk
- await
- Promise
- 인천 구월동 맛집
- redux
- javascript
- react-native
- Total
- Today
- Yesterday