개발/Java

Exception처리시 트랜잭션처리와 Return값 받는 방법

Ridiss 2020. 6. 3. 15:10

만약 성공하면 "200"을 리턴받고 오류시 "502"를 리턴받되 트랜잭션이 걸린 서비스를 생성하고 싶다고 가정해보자

 

//SericeImpl
@Override
@Transactional(rollbackFor=Exception.class)
public String checkService(Map<String, Object> params) {
	
    String result = "200";
    
    try{
    	checkTest(params);
    } catch(Exception e) {
    	result = "502";
        throw new Exception();
    }
    
    return result;
}

 

위와같이 코드를 생성할 경우 익셉션이 발생하면서 트랜잭션은 발동이 되나 result값을 리턴할 수는 없다.

 

그렇다고해서 

//SericeImpl
@Override
@Transactional(rollbackFor=Exception.class)
public String checkService(Map<String, Object> params) {
	
    String result = "200";
    
    try{
    	checkTest(params);
    } catch(Exception e) {
    	result = "502";
        throw new Exception();
    } finally {
    	return result;
    }
}

finally를 통해 result값을 리턴할 경우 리턴은 되지만 트랜잭션이 실행되지 않는다.

 

 

그래서 해당 문제를 처리하기 위해서는

1. Exception을 처리 후 특정 밸류를 리턴할 클래스를 하나 생성

2. 서비스에서 해당 오류처리를 1번에서 만든 클래스로 처리

3. 컨트롤러에서 해당 서비스를 try catch문으로 감싸서 처리

해야한다.

 

 

익셉션 처리 클래스 생성

public class ReturnException extends Exception{
	private static final long serialVersionUID = 1L;
	
	final Object value;
	
	public ReturnException(Object value, String message){
		super(message);
		this.value = value;
	}
	
	public Object getValue(){
		return value;
	}

}

 

ServiceImpl

//SericeImpl
@Override
@Transactional(rollbackFor=Exception.class)
public String checkService(Map<String, Object> params) {
	
    String result = "200";
    
    try{
    	checkTest(params);
    } catch(Exception e) {
    	result = "502";
        throw new ValueReturnException(result, "실행중 에러가 발생"); //변경
    }
    return result;
}

 

Controller

try{
  resultCode = testService.checkService(params);
} catch (ValueReturnException e) {
  resultCode = (String) e.getValue();
}

이렇게 만들면

Exception발생시에도 트랜잭션처리와 리턴값을 제대로 받을 수 있다.

'개발 > Java' 카테고리의 다른 글

Legacy프로젝트 Maven변환  (0) 2022.01.13
JPA 장점과 단점  (0) 2021.08.04
Log4j 특정 로그 표시하지 않게하기 (Filter 사용)  (0) 2021.03.05
Exception 고의 생성  (0) 2020.06.02
JSON데이터가 배열로 넘어온경우 파싱  (0) 2019.12.17