사용자 정의 예외처리(Custom Exception)

JAVA에서 발생 될 수 있는 다양한 예외처리..

값이 null 객체에 접근시 발생하는 NullPointException..

숫자가 아닌 문자를 숫자로 변환 시 발생하는 NumberFormatException 등..

JAVA에는 다양한 Exception(예외)이 정의되어있다.

또한 미리 정의된 메시지 역시 있지만..

사용자가 필요에 의해 예외를 정의 할 수 있다.

오류가 발생 한 경우 특정 메시지, 코드 등을 정의 하여 반환 하는 경우라 생각한다.

– 사용자 정의 클래스 생성

public class CustomException extends Exception {
	
	private static final long serialVersionUID = 1L;
	
	Exception exception;
	private String message;
	
	public CustomException(String message) {
		this.message = message;
	}
	
	public String getMessage() {
		if(message != null) {
			return message;
		}else {
			return exception.getMessage();
		}
	}
}

Exception.class 를 상속 받아 작성(message 뿐 아니라 코드, 객체 다양하게 추가하여 사용 가능..

 

– 사용하기..

try {
	TestVO testVO= testService.getTestInfo(key);
	ArrayList<TestVO> testList = testService.getTestList(testVO.getKey());
	
	request.setAttribute("testVO", testVO);
	request.setAttribute("testList", testList);
}catch (CustomException custom) {
	request.setAttribute("message", custom.getMessage());
	return ERROR_PAGE;
}catch (Exception e) {
	request.setAttribute("message", e.getMessage());
	return ERROR_PAGE;
}

위와 같이 작성하고 testVO가  null 이면 CustomException 에서

JAVA 기본 예외가 작동할 줄 알았다..

(Exception.class 상속 받았으니까…)

그러나 아무러 작동도 하지 않을 뿐더라..

생성자에 정의한 message 역시 설정 할 수 없다..

또한 아래와 같은 에러 메시지가 발생한다.

try 구문안에 CustomException 을 사용하는 경우가 없기 때문…

getTestInfo 메소드를 정의한 인터페이스에  throws CustomException을 추가

TestVO getTestInfo(String key) throws ErsException;

실제 서비스에서는 CustomException 을 발생시키고

생성자를 이용하여 오류 메시지를 작성한다.

@Override
public TestVO getTestInfo(String key) throws CustomException {
	TestVO testVO = testMapper.getTestInfo(key);
	if(testVO == null) {
		throw new CustomException("정보를 조회 할 수 없습니다.");
	}
	return testVO; 
}

try 구문 안에 해당 예외처리를 발생(throw new CustomException) 시켜줘야 한다.

 

Service 단에서 객체 null 여부를 체크하여 처리하는 방식..

또한

catch (CustomException custom) {
	request.setAttribute("message", custom.getMessage());
	return ERROR_PAGE;
}catch (Exception e) {
	request.setAttribute("message", e.getMessage());
	return ERROR_PAGE;
}

CustomException 에서 catch 할 수 없는 예외를 위해 JAVA 에서 제공하는

Exception 을 추가로 처리하여 발생 할 수 있는 예외를 처리하여 준다.

 

0 글이 마음에 드셨다면 하트 꾸욱~

@Transaction 어노테이션 설정

처음 @Transactional 어노테이션을 사용할 당시에는 다른분이 설정을 해둔 값을 보지 않고 가져다가 사용만 한 터라…

대충 Service 객체 내에서 여러 CRUD 중 exception 발생한 경우

지금까지 실행한 CRUD 를 모두 rollback 하는 정도로만 알고 사용…

이번에 프로젝트(?)를 설정하면서 무조건 rollback 이 아니라

특정상황에서는 commit 을 해야 되는 경우도 있다는 것을 알게 되었고..

(혼자 상상해보기로는.. log 내역은 에러가 발생해도 남겨야 하니까..?)

삽질한 내역?이 조금 아쉬워서 글로 남김..ㅠ

servlet-context.xml

xml 상단추가
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

<!-- @Transaction 어노테이션 설정 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
</bean>

 

TestServiceImpl.java

@Transactional
@Override
public JSONObject setCustInfo(HttpServletRequest request) {
	블라블라~
}

@Transactional 에 다양한 옵션 값을 통해 commit, rollback 설정이 가능하며

예외발생한 클래스에 따라 다르게 설정도 가능하다.

 

DB 관련 (dataSource, Mapper 경로 등) context.xml 에 추가하였을 때 작동하지 않았으나..

servlet 관련 설정한 servlet-context.xml 에 설정하니 정상 작동하였다..

아직도 블라블라-context.xml 에 대해 불러오는 방법?

설정되는 순서에 대해 이해가 부족한 것 같다..ㅠ


빠진 부분이 있어서 추가…

servlet-context.xml 에서 추가한 transactionManager에서 proeprty로 사용되는

dataSource 정의

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
</bean>

 

web.xml (root path 설정)

<context-param>
	<param-name>webAppRootKey</param-name>
	<param-value>ers.root</param-value>
</context-param>

 

web.xml root-context.xml 정의

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>

 

root-context.xml
(데이터베이스 속성 관리 파일 정의)

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="location" value="/WEB-INF/spring/db.properties"/>
</bean>

 

데이터베이스 접속정보

DB : MSSQL
접속 url : 192.168.0.1
포트 : 1234
DatabaseName : test
접속아이디 : username
접속비밀번호 : password
위와 같을때… 아래와 같이 사용( = 앞부분.. ex : jdbc.driver는 변수로 생각)

jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.url=jdbc:sqlserver://192.168.0.1:1234;databaseName=test
jdbc.username=username
jdbc.password=password

 

다시 root-context.xml 로 와서

mapper 관련 xml 정의

<import resource="mapper-context.xml" />

 

mapper-context.xml

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="${jdbc.driver}" />
	<property name="url" value="${jdbc.url}" />
	<property name="username" value="${jdbc.username}" />
	<property name="password" value="${jdbc.password}" />
</bean>

여기서 정의한 dataSource를 참조..!!

0 글이 마음에 드셨다면 하트 꾸욱~

톰캣 에러 페이지 처리 (403, 404, 500 등)

프로젝트 내에 web.xml

welcom-file-list 밑에 추가

<error-page>
	<error-code>403</error-code>
	<location>/WEB-INF/views/error/403.html</location>
</error-page>
<error-page>
	<error-code>404</error-code>
	<location>/WEB-INF/views/error/404.html</location>
</error-page>
<error-page>
	<error-code>500</error-code>
	<location>/WEB-INF/views/error/500.html</location>
</error-page>
0 글이 마음에 드셨다면 하트 꾸욱~

스프링 properties 파일 접근…

기존에 가지고 있던 자료를 통해 구현 하였으나 오류…

(여기서 부터 문제.. context.xml 설정이 바뀐걸 잊어버림)

여기서 찾고 저기서 찾고 해도해도 안되다가..

우연찮게 발견..-_-

2시간 이상 삽질한 걸 땅을 치며 후회

properties 파일의 경우 ISO-8859-1 인코딩이 default 값이므로…

ISO-8859-1 -> UTF-8 또는 EUC-KR  변환 필요..

properties Editor 플러그인 설치하는 경우 보이는 방식과 달리
저장할 때 유니코드 방식으로 저장되므로 한글 정상적으로 읽혀짐

  1. pom.xml 추가
<dependency>
	<groupId>commons-configuration</groupId>
	<artifactId>commons-configuration</artifactId>
	<version>1.10</version>
</dependency>

 

2. 3번에서 사용한 ${pring.root} 추가

<context-param>
	<param-name>webAppRootKey</param-name>
	<param-value>pring.root</param-value>
</context-param>

 

3. root-context.xml

(web.xml 에서 contextConfigLocation의 value에 설정한 xml 참고!!)

<bean id="configuration" class="org.apache.commons.configuration.PropertiesConfiguration">
	<constructor-arg type="java.lang.String" value="${pring.root}/WEB-INF/application/property/application.properties" />
	<property name="reloadingStrategy" ref="reloadingStrategy" />
</bean>
<!-- 동기화를 위한 추가 -->
<bean id="reloadingStrategy" class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy" />

 

4. application.properties 파일

config.test=test

 

5. 사용하기

//공통클래스에 추가 후
@Resource(name="configuration")
protected PropertiesConfiguration config;
//사용할 클래스에서 아래와 같이 사용
config.getString("config.test");

 

6. propertiesEditor 설치

이클립스 -> Help -> Install New Software

http://propedit.sourceforge.jp/eclipse/updates/

제일 밑에 PropertiesEditor 만 설치~!!

 

0 글이 마음에 드셨다면 하트 꾸욱~

request 에서 넘어온 parameter HashMap 으로 반환

별건 아니지만… 자주 사용하는 방법이라… 기록..

 

public String test(HttpServletRequest request){
	HashMap<String, String> pMap = getParam(request);
	return "test";
}

private HashMap<String, String> getParam(HttpServletRequest request){
	HashMap<String, String> rMap = new HashMap<String, String>();
	Enumeration e = request.getParameterNames();
	while ( e.hasMoreElements() ){
		String name = (String) e.nextElement();
		String[] values = request.getParameterValues(name);		
		for (String value : values) {
			rMap.put(name, value);
		}   
	}
	return rMap;
}
0 글이 마음에 드셨다면 하트 꾸욱~