[ Spring ] JNDI 데이터 소스 테스트 하기

duck-ach·2022년 11월 4일
0

Spring

목록 보기
11/16
post-custom-banner

JNDI란?

JNDI (Java Naming and Directory Interface)는 java에서 각 데이터베이스에 대한 서비스를 디렉토리 형태로 등록할 수 있다.

DB와 Spring 연결하기

아래 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" />

JNDI 커스터마이징 하기

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();
	     }
	}

커스터마이징한 MySpringJUnit4ClassRunner을 사용하여 실행(Run)하기

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를 사용해 실행해준다.


이렇게 초록색이 뜨면 성공이다.

profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가
post-custom-banner

0개의 댓글