김모씨
2k
2013-08-06 17:04:25
7
15069

spring 에서 controller 부분에 트랜잭션을 걸수 없나요?


지금 구현하고자 하는게 
1. 이전거 다 지운다(delFlag ='Y').
2. list의 내용을  전부 insert 한다. 
3. 끝인데. 
2의 과정중에 exception이 뜬다면 롤백을 하고 싶습니다. 

현재 다른 컨트롤러에서는 autocommit 중이고 이 컨트롤러에서만 트랜잭션을 걸어주고 싶은데요. 
appricationContext.xml에 아래와 같이 설정했고요. 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

해당 컨트롤러에서
@Transactional
@RequestMapping("wp/i/excelRegProc")
@ResponseBody
해서 
public ModelMap excelRegProc(HttpServletRequest request, @ModelAttribute Excel excel) {
try {1. 2실행.
} catch (Exception e) {
// TODO Auto-generated catch block
// transactionManager.rollback(status);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.debug("====!롤백========" );
e.printStackTrace();
}
//transactionManager.commit(status);
ModelMap modelMap = new ModelMap();
modelMap.put("count", nRet);
return modelMap;
}
의 식으로 구성하였습니다. 그리고 Exception 을 걸었더니. 

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope
at org.springframework.transaction.interceptor.TransactionAspectSupport.currentTransactionStatus(TransactionAspectSupport.java:112)

이라고 나왔습니다. 인터넷을 보는중인데 컨트롤러에 위와같이 걸라고 되어있던데 위와같은 에러가 나왔습니다. 

이와같은 문제를 해결할수는 없나요?
0
3
  • 답변 7

  • 제타건담
    5k
    2013-08-06 17:24:26
    초보이신듯 한데..Controller에 @Transactional을 걸게끔 유도하는 곳은 그 어느곳도 없습니다..설명을 시작하면 한도끝도 없기 때문에..자세히 설명할수는 없으나..일단..

    1. Spring MVC 에 대한 예제를 하나 이상은 접하세요..
    2. @Controller, @Service, @Repository 어노테이션을 사용하는 소스를 보세요..

    이 두가지를 먼저 하라고 권유하고 싶네요..

    설명을 좀더 드리면 Service 계층(@Service 어노테이션이 붙은 클래스)에서 @Repository 어노테이션이 붙은 DAO 계층의 bean을 연결하여 거기에서 DB 관련 메소드를 호출합니다..이때 Service 계층의 메소드에 @Transactional을 붙이는거죠..그러면 Exception이 발생할 경우 자동 롤백을 하게 됩니다..문제가 없다면 커밋하겠죠..
    0
  • 1K
    1k
    2013-08-06 17:34:40
    추가적으로는 Controller에서는 @Transactional을 지정하셔도 transaction이 처리되지 않습니다.
    기본적으로 인터페이스가 있는 경우만 Spring AOP가 적용되기 때문입니다.
    혹.. Controller와 같인 class 자체에 @Transactional을 적용하시려면.. <annotation-driven proxy-target-class="true" />로 지정하시면 됩니다. (추천해 드리지 않는 방식)

    라고 하네요,,
    0
  • 재희
    190
    2013-08-06 17:35:24
    구지 controller에서 트랜잭션을 처리할 필요가 있나요?
    트랜잭션이 시작되면 그 만큼 오래동안 디비의 커넥션을 가지고 있다는 것이고, 그러면 그만큼 비효율적이라고 생각합니다.
    구지 하겠다면 딱히 말릴 수는 없지만, 온갖 책에서도 그렇고, 스프링 관련 사이트에서도 그렇고, 일단 서비스 계층에 트랜잭션을 적용하는 게 좋을 듯 싶습니다.
    0
  • 김모씨
    2k
    2013-08-06 17:45:23
    컨트롤러에 붙일수 있으면 나중에 이런저런 다른 서비스의 작업을 해당 컨트롤러에서 한번에 처리해보려고 했었는데요. 일단 서비스에 붙이는쪽으로 만든다음에 다른걸 물어보겠습니다.
    0
  • 재희
    190
    2013-08-06 18:06:54
    서비스에 트랜잭션을 적용해도 이런 저런 작업들 다 하나의 트랜잭션에서 동작하게끔 할 수 있습니다.
    트랜잭션의 PROPAGATION 속성을 확인해 보세요.
    0
  • 김모씨
    2k
    2013-08-06 20:09:31
    일단은 서비스에서 본문을 시도한결과 깔끔하게 성공했습니다. 하지만 컨트롤러딴에 붙이는것도 한번 시도해보겠습니다.
    0
  • 김모씨
    2k
    2013-08-06 20:22:19
    우선 주말에 스프링책부터 사러가야되겠네요 ㅎㅎ.
    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.