통상적으로 JNDI는 Was를 통해 쓰이는 경우가 대부분이다. 결론적으로 Web Application 에서 쓰인다고 봐야한다.

Tomcat 같은경우에는 JNDI Name 앞에 "java:/comp/env/"를 명시해주어야 하기떄문에 서버정보만 있으면 동적으로 처리가 가능하다.

그런데 고맙게도 서버정보는  ServletContext 객체안에 getServerInfo() 메소드를 통하여 얻어올수가 있다. 


1. 객체 생성

String serverInfo = request.getSession().getServletContext().getServerInfo();
JNDIConnection jndiConnection = new JNDIConnection(serverInfo);
Connection connection = jndiConnection.create("jndiName");


JNDIConnection 클래스의 생성자 쪽에 HttpServletRequest 객체를 넘겨줄수도 있다.

하지만 좋지가 않은 방법이다 Connection을 하는 쪽이 일반 JavaProject일 수도 있기때문이다.

일반 JavaProject일 경우 서블릿 jar들을 해당 프로젝트에 추가를 시켜줘야 하기때문이다.


2. 전체소스

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.sql.DataSource;


public class JNDIConnection {
	private String serverInfo;
	private Connection connection;
	
	public JNDIConnection(String serverInfo) {
		this.serverInfo = serverInfo;
	}
	
	public Connection create(String jndiName) {
		try {
			InitialContext initialContext = new InitialContext();
			DataSource dataSource = null;
			if (serverInfo.startsWith("Apache")) {
				dataSource = (DataSource) initialContext.lookup("java:/comp/env/" + jndiName);
			} else {
				dataSource = (DataSource) initialContext.lookup(jndiName);
			}
			connection = dataSource.getConnection();
		} catch (Exception e) {
			/*
			 * NamingException, SQLException catch
			 */
			e.printStackTrace();
		} 
		return connection;
	}
}


Writing...

'JAVA Platform > JAVA' 카테고리의 다른 글

[JAVA] - Swing size, preferredSize 차이점  (0) 2015.03.31
[JAVA] - File 실행하기  (0) 2015.03.22
[JAVA] - DBMS JDBC Connection  (0) 2015.02.13
[JAVA] - Properties File 읽기  (0) 2015.01.25
[JAVA] - Swing JScrollPane 스크롤  (0) 2015.01.21
블로그 이미지

행복그리고..

,

각각의 DBMS 마다 JDBC Connection URL 형식이 달라서 정리를 하였습니다.



Host : localhost

Port Number : 8080

Database Name : connectionTest


- Oracle

ClassName : oracle.jdbc.driver.OracleDriver

URL : jdbc:oracle:thin:@localhost:8080:connectionTest


- MySQL

ClassName : com.mysql.jdbc.Driver

URL : jdbc:mysql://localhost:8080/connectionTest


- SQL_Server (2005, 2008, 2012)

ClassName : com.microsoft.sqlserver.jdbc.SQLServerDriver

URL : jdbc:sqlserver:localhost:8080;databaseName=connectionTest


- SQL_Server 2000

ClassName : com.microsoft.jdbc.sqlserver.SQLServerDriver

URL : jdbc:microsoft.sqlserver:localhost:8080;databaseName=connectionTest


- Tibero

ClassName : com.tmax.tibero.jdbc.TbDriver

URL : jdbc:tibero:thin:@localhost:8080:connectionTest


- Sybase

ClassName : com.sybase.jdbc2.jdbc.SybDriver

URL : jdbc:Sybase:Tds:localhost:8080/connectionTest

'JAVA Platform > JAVA' 카테고리의 다른 글

[JAVA] - File 실행하기  (0) 2015.03.22
[JAVA] - JNDI Database Connection  (0) 2015.03.19
[JAVA] - Properties File 읽기  (0) 2015.01.25
[JAVA] - Swing JScrollPane 스크롤  (0) 2015.01.21
[JAVA] - File 최종 수정일 알기  (0) 2014.11.15
블로그 이미지

행복그리고..

,
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesFileReader {
	public static Properties readProperties(String propertiesFilePath) {
		Properties properties = new Properties();
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(propertiesFilePath); 
			if (fis != null) {
				properties.load(fis);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (fis != null) {
					fis.close();
				}
			} catch (IOException e) { 
				e.printStackTrace();
			}
		}
		return properties;
	}  
}


블로그 이미지

행복그리고..

,

마우스 스크롤 현재값 알아오기

@Override
public void adjustmentValueChanged(AdjustmentEvent event) {
	System.out.println("adjustmentValueChanged");
	JScrollBar vertical = scrollPane.getVerticalScrollBar();
	int currentValue = event.getValue();
	int maxValue = vertical.getMaximum() - vertical.getHeight();
	int minValue = vertical.getMinimum();
}


마우스 스크롤 방향 알기

@Override
public void mouseWheelMoved(MouseWheelEvent event) {
	int notches = event.getWheelRotation();
	if (notches < 0) {
		System.out.println("mouseWheelMoved Up");
	} else {
		System.out.println("mouseWheelMoved Down");
	}
}


마우스 스크롤 증가 설정하기

JScrollPane verticalScrollPane = new JScrollPane();
verticalScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
verticalScrollPane.getVerticalScrollBar().setUnitIncrement(16);

setUnitIncrement 값을 16으로 설정했을때 스크롤의 값은 16씩 증가됩니다.

블로그 이미지

행복그리고..

,
File file = new File("C:\\Program Files\\Java");
System.out.println(new java.util.Date(file.lastModified()));
file = new File("C:\\Program Files\\Java\\jdk1.8.0_20\\src.zip");
System.out.println(new java.util.Date(file.lastModified()));
블로그 이미지

행복그리고..

,

지정한 시간이 되면 지정되어 있는 폴더안의 파일들을 지우는 스케쥴러를 구현해 보도록 하겠습니다. 


package Scheduler;

import java.io.File;

class FileCleaner {
	public static void deleteFolder(String path) {
		File folder = new File(path);
		if (folder.isDirectory()) {
			File[] files = folder.listFiles();
			for (File file : files) {
				if (file.isDirectory()) {
					FileCleaner.deleteFolder(file.getPath());
				}
				file.delete();
			}
		} 
	}
}

FileCleaner 클래스의 deleteFolder 메소드는 해당 폴더를 지우는 작업을 합니다. 폴더일경우 다시 자기자신을 호출하여 파일들을 지웁니다. 해당경로의 폴더를 다 지울때까지 재귀적인 메소드 호출은 계속됩니다.

package Scheduler;

import java.util.TimerTask;

class FileDeleteScheduler extends TimerTask {
	private String folderPath;
		
	public void setFolderPath(String folderPath) {
		this.folderPath = folderPath;
	}
	
	public void run() {
		FileCleaner.deleteFolder(folderPath);
	}
}

FileDeleteScheduler는 해당시간이 되면 폴더안의 파일들을 삭제하는 작업을 수행합니다. 

package Scheduler;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

class Scheduler {
	private Timer timer;
	private FileDeleteScheduler fileDeleteScheduler;
	
	public Scheduler() {
		timer = new Timer();
		fileDeleteScheduler = new FileDeleteScheduler();
	}
	
	public void start() {
		fileDeleteScheduler.setFolderPath("C:\\Test");;
		
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.AM_PM, Calendar.AM);
		cal.set(Calendar.HOUR, 5);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		
		timer.scheduleAtFixedRate(fileDeleteScheduler, cal.getTime(), 1000 * 60 * 60 * 24 * 2);
	}
}

새벽 5시를 기점으로 작업이 진행되고 이틀간격으로 해당 위치의 폴더안의 파일들을 삭제하는 스케쥴러가 되겠습니다.

'JAVA Platform > JAVA' 카테고리의 다른 글

[JAVA] - Swing JScrollPane 스크롤  (0) 2015.01.21
[JAVA] - File 최종 수정일 알기  (0) 2014.11.15
[JAVA] - 배열 복사 방법  (0) 2014.11.02
[JAVA] - SQLite Connection  (0) 2014.09.21
[JAVA] - 파일(File) 무조건 생성하기  (0) 2014.09.19
블로그 이미지

행복그리고..

,
public class ArrayCopyTest {
	
	public static void main(String[] args) {

		int[] arr = {1, 2, 3, 4, 5};
		
		int[] arrClone = arr.clone();
		arrClone[0] = 6;
		System.out.println("arrClone");
		printArray(arrClone);
		
		int[] arrCopy = new int[arr.length];
		System.arraycopy(arr, 0, arrCopy, 0, arr.length);
		arrCopy[1] = 6;
		System.out.println("arrCopy");
		printArray(arrCopy);
	}
	
	public static void printArray(int[] arr) {
		System.out.println(java.util.Arrays.toString(arr));
	}
}

 

블로그 이미지

행복그리고..

,
블로그 이미지

행복그리고..

,
import java.io.File;

class FileLibrary {
	public static void makeFile(String path) {
		File file = new File(path);
		if (file.exists() == false) {
			new File(file.getParentFile().getPath()).mkdirs();
			try {
				file.createNewFile();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

블로그 이미지

행복그리고..

,

JUnit은 테스트를 쉽게 작성하고 실행하도록 도와주는 기능을 다수 제공한다.


- 부작용 예방을 위한 테스트별 독립 테스트 클래스 인스턴스와 클래스 로더

- 자원 초기화와 회수를 위한 JUnit 애노테이션

* @Before, @BeforeClass, @After, @AfterClass

- 테스트 결과 확인을 도와주는 다양한 assert 메서드

- 유명 툴과 IDE의 통합 : Ant, Maven, Eclipse, NetBeans, IntelliJ, JBuilder 등

package testCase;

import static org.junit.Assert.*;
import org.junit.Test;
import calculator.Calculator;

public class CalculatorTest {								
	@Test	
	public void testAdd() {		
		Calculator calculator = new Calculator();		
		double result = calculator.add(10, 50);		
		assertEquals(60, result, 0);
	}	
}

테스트 실행은 CalculatorTest파일을 클릭하고 오른쪽버튼 Run-As / JUnit Test를 실행하면 테스트가 실행된다.

테스트 클래스가 되는 조건은 두 가지인데 일단 public 클래스여야 하고, 파라미터를 받지 않는 생성자를 제공해야 한다. 일반적으로 Test로 끝나는 이름을 사용한다. 한 가지 JUnit 3에서는 TestCase를 상속받아야 했지만, JUnit 4에 와서는 이 제약이 사라졌다.

테스트 메서드가 되기 위한 조건은 좀 더 많다. @Test 애노테이션이 부여되어 있어야 하고, public이고, 파라미터도 받아서는 안된다. 마지막으로 반환형은 void여야 한다. 일반적으로 테스트 메서드 이름은 test** 패턴을 따른다. 정적 임포트(static import)한 assertEquals 메서드를 호출해 테스트 결과를 확인하였다.

JUnit은 각 @Test 메서드를 호출할 때마다 테스트 클래스의 인스턴스를 새로 생성한다. 테스트 메서드들을 독립된 공간에서 실행시킴으로써, 혹시 모를 의도치 않은 부작용을 방지하기 위함이다. 모든 테스트 메서드는 각기 다른 테스트 클래스 인스턴스에서 실행되므로, 인스턴스 변수는 공유될 수 없다.

파라미터 두 개를 받는 assert 메서드 항상 같은 패턴을 따른다. 첫 번째 파라미터는 예상값을, 두 번째 파라미터는 실제 값을 의미한다.

여러 개의 테스트 클래스를 동시에 실행해야 할 때는, 테스트 스위트라 불리는 또 다른 객체를 생성한다. 테스트 스위트는 특수한 형태의 테스트 러너로, 테스트 클래스와 똑같은 방식으로 실행할 수 있다.

JUnit 핵심 객체


JUnit 개념

역할

Assert

테스트 하려는 조건을 명시한다. assert 메서드는 조건이 만족되면 그냥 지나가지만 만족되지 못하면 예외를 던진다.

Test

@Test 애노테이션이 부여된 메서드로, 하나의 테스트를 뜻한다. JUnit 먼저 메서드를 포함하는 클래스의 인스턴스를 만들고, 애노테이션된 메서드를 찾아 호출한다.

Test Class

@Test 메서드를 포함한 클래스이다. 

Suite

스위트는 여러 테스트 클래스를 하나로 묶는 수단을 제공한다.

Runner

러너는 테스트를 실행시킨다. JUnit 4는 하위 호환성을 유지하여, JUnit 3의 테스트도 실행가능하다.


파라미터화 테스트 실행하기

package testCase;
 
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import calculator.Calculator;
 
@RunWith(Parameterized.class)
public class ParameterizedTest {    
	private double expected;    
    private double valueOne;    
    private double valueTwo;        
     
    @Parameters
    public static Collection getTestParameters() {      
        return Arrays.asList(new Integer[][] {              
                { 2, 1, 1 },                        
                { 3, 2, 1 },                
                { 4, 3, 1 }     
        }); 
    }       
     
    public ParameterizedTest(double expected, double valueOne, double valueTwo) {       
        this.expected = expected;       
        this.valueOne = valueOne;       
        this.valueTwo = valueTwo;   
    }       
     
    @Test  
    public void testAdd() {     
        Calculator calculator = new Calculator();       
        assertEquals(expected, calculator.add(valueOne, valueTwo), 0);  
    }
}

파라미터화 테스트 러너를 사용하려면 몇 가지 조건을 만족시켜야 한다.

1. 테스트 클래스에는 반드시 @RunWith 애노테이션 부여
2. 테스트에 사용할 인스턴스 선언필요
3. @Parameters라 표시된 메서드 필요

* 반드시 public static java.util.Collection이어야 하며, 어떠한 파라미터도 입력 받아서는 안되고, Collection의 원소는 배열이고 길이는 모두 같아야한다. 그 길이는 유일한 public 생성자와 파라미터 수가 일치해야 한다.

테스트의 반복 횟수는 @Parameters 메서드가 반환하는 컬렉션의 크기에 의해 결정된다. 즉 이 테스트 케이스를 한 번만 실행하면, 아래처럼 매번 다른 값으로 testAdd 메서드를 세번 호출한 것과 동일한 효과를 갖는다.

testAdd: assertEquals(2, calculator.add(1, 1), 0);
testAdd: assertEquals(3, calculator.add(2, 1), 0);
testAdd: assertEquals(4, calculator.add(3, 1), 0);
JUnit은 먼저 정적 메서드인 getTestParameters를 호출해 컬렉션 객체를 얻는다. 다음으로 컬렉션에 저장된 배열의 수만큼 순환하면서 JUnit은 유일한 public 생성자를 찾는다. 이때 만약 public 생성자가 2개 이상이라면 AssertionError를 던진다. 찾은 생성자에 배열의 원소를 파라미터로 넣어 호출한다. 마지막으로 @Test 메서드를 호출한다.


스위트를 이용한 테스트 조직

스위트는 테스트를 담는 그릇으로, 여러 테스트를 묶어 한 번에 실행할 목적으로 사용된다. JUnit 스위트는 하나 이상의 테스트 케이스를 실행하도록 설계되었다. 테스트 러너가 스위트를 실행시키면, 어떤 테스트 케이스를 실행할지는 전적으로 스위트가 결정한다. 사용자가 스위트를 따로 제공하지 않으면 테스트 러너가 자동으로 하나를 만든다.
기본 스위트는 포함된 테스트 클래스들을 살펴 @Test가 부여된 모든 메서드를 찾아낸다. @Test 메서드별로 하나씩 테스트 클래스의 인스턴스를 생성하는 일이 바로 이 스위트 안에서 이루어진다. JUnit은 모든 @Test 메서드를 차례로 실행시키되, 서로 독립적으로 실행시켜 잠재적인 부작용을 예방한다.

package testCase;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({	
	ParameterizedTest.class,	
	CalculatorTest.class
})

public class AllTests {
	
}

JUnit은 스위트의 스위트도 만들 수 있게 설계되어있다. 여러 파일의 스위트를 만들고 최종적으로 하나의 마스터 스위트를 통해 테스트를 할 수가 있다.

package testCase;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({	
	AllTests.class
})

public class MasterTestSuite {
	
}
[ 출저 ] - JUnit in Action 2장


블로그 이미지

행복그리고..

,