JNDI (Java Naming and Directory Interface)는 java에서 각 데이터베이스에 대한 서비스를 디렉토리 형태로 등록할 수 있다.
아래 XML은 Eclipse에서 Dynamic Web Project를 생성하고, DBCP를 연결하기 위해 04_Dbcp
- src
- main
- webapp
- META-INF
에 만들어둔 context.xml 파일이다.
파일 내부에는 oracle과 mySQL 등 연결을 위한 정보들이 담겨있는데 나는 Oracle을 사용할 것이니 이 부분만 참고했다.
<!-- Oracle XE Resource -->
<Resource
auth="Container"
name="jdbc/oracle11g"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="SCOTT"
password="TIGER"
maxTotal="8"
maxIdle="8"
maxWait="-1" />
SpringJUnit4ClassRunner
를 상속받은 MySpringJUnit4ClassRunner
라는 클래스를 하나 생성하여, JNDI방식으로 커스터마이징 하겠다.
아래 이미지는 SpringJUnit4ClassRunner 클래스의 생성자이다.
우선 위의 이미지를 참고하여 SpringJUnit4ClassRunner
의 생성자를 생성해준다.
// 생성자
public class MySpringJUnit4ClassRunner extends SpringJUnit4ClassRunner {
public MySpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
super(clazz);
jndi();
}
}
원래는 Oracle의 정보가 담긴 context.xml 파일을 Tomcat이 읽어들여서 읽고 실행 해주는데, JUnit에서는 Tomcat을 통한 서버실행이 아닌 JUnit Test를 수행하므로 읽어들이지 못한다.
그러므로 JNDI 방식을 사용해 "java:comp/envb/jdbc/oracle11g"
이름으로 여기서 생성하는 BasicDataSource
를 참조하게 한다.
public class MySpringJUnit4ClassRunner extends SpringJUnit4ClassRunner {
public MySpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
super(clazz);
jndi();
}
}
public void jndi() {
// JNDI 방식으로 "java:comp/envb/jdbc/oracle11g" 이름의 Resoucre를 호출하면
// 톰캣이 확인하는 context.xml을 참조하는 대신
// 여기서 만든 BasicDataSource를 사용하시오.
try {
// SimpleNamingContextBuilder는 현재 사용을 하지 않는 것이 좋다.
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.activate();
BasicDataSource dataSource = new BasicDataSource(); // tomcat-dbcp 디펜던시가 필요
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUsername("SCOTT");
dataSource.setPassword("TIGER");
JndiTemplate jndiTemplate = new JndiTemplate();
jndiTemplate.bind("java:comp/env/jdbc/oracle11g", dataSource);
} catch(Exception e) {
e.printStackTrace();
}
}
JUnit Test를 위한 클래스를 같은 test를 위한 패키지에 하나 생성해준다.
그리고 @RunWith
라는 애너테이션을 사용하여 커스터마이징한 클래스를 참조해주면 된다.
package com.gdu.app07;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.gdu.app07.config.BoardAppContext;
import com.gdu.app07.domain.BoardDTO;
import com.gdu.app07.repository.BoardDAO;
// JUnit4를 사용한다.
// 커스터마이징한 MySpringJUnit4ClassRunner를 사용한다.
@RunWith(MySpringJUnit4ClassRunner.class) // JUnit4를 사용한다.
// Bean은 BoardAppContext 에 정의되어있다.
@ContextConfiguration(classes = {BoardAppContext.class})
public class BoardUnitTest {
@Autowired
private BoardDAO dao;
/* Tomcat이 context.xml을 읽는데 톰캣이 없어서 못읽는다. */
// 삽입테스트
@Test
public void 삽입테스트() {
BoardDTO board = new BoardDTO(0, "테스트제목", "테스트내용", "테스트작성자", null, null);
assertEquals(1, dao.insertBoard(board));
}
}
프로젝트 우클릭
- Run As
- JUnit Test
를 사용해 실행해준다.
이렇게 초록색이 뜨면 성공이다.