트랜잭션 결과가 의도한 상태가 아닐 경우 

일일이 조건문을 만들어 에러코드를 설정하는 것은 번거롭고 중복 코드를 발생시키는 일이다.

간단히 입셉션으로 처리하고 입셉션을 따로 관리하는 클래스와 페이지를 만든다면 편리다.

스프링은 이를 위해 Interface HandlerExceptionResolver를 사용한다.

빈등록에는 많은 방법들이 있는데

@ControllerAdvice 애노테이션을 이용하는 방법이 있다.

@ControllerAdvice(value="test.mapping") public class ExceptionAdivisor { @ExceptionHandler(InsertException.class) public ModelAndView handleInsertException(InsertException e) { System.out.println("ControllerAdvice: "+e); ModelAndView mav = new ModelAndView("/common/insertError"); mav.addObject("exception", e); return mav; } }


사용 방법은 아주 간단하다.

@ControllerAdvice(value="적용 패키지") 를 적용한 클래스를 만들고

@ExceptionHandler(예외 클래스) 를 적용한 메서드를 만들면 된다.

파라메터로 입섹션을 받을 수 있고

return값은 뷰리졸버에 의해 처리 되기때문에 ModelAndView를 적용할 수 있다.

@ControllerAdvice가 아닌 @Controller 클래스에 @ExceptionHandler 메서드를 적용한다면

해당 클래스에서 발생하는 예외에 우선권을 가지고 처리한다.


하지만 스프링에서는 이것보다는 SimpleMappingExceptionResolver를 이용한 입셉션처리를 권장하고 있다.

SimpleMappingExceptionResolver를 상속받아  커스텀 클래스를 만들면

ajax와 페이지 이동 방식등을 구분해서 사용할 수 있는 등 좀 더 디테일하게 예외처리를 할 수 있다.

이부분은 아직 공부가 덜 되서 다음에 쓰도록 하겠습니다.


transact는 거래하다라는 뜻이다. 

transaction은 DB와의 거래가 완전히 이루어진후 commit하는 것을 말한다.

그렇지 않으면 rollback을 한다.


Mapper자동 설정을 했을 때

transaction을 어떻게 처리할 것인가 고민할 것입니다.


스프링에는 트랜잭션을 관리해주는 클래스가 있습니다.

이를 aop를 이용해서 활용하면 됩니다.



<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"> </property></bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes>      <tx:method name="*" rollback-for="Exception"></tx:method> </tx:attributes> </tx:advice> <bean id="myAdvice" class="test.mapping.Advisor"></bean> <aop:config> <aop:pointcut id="requiredTx" expression="execution(* test..*Impl.*(..))"> <aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx"></aop:advisor> </aop:pointcut></aop:config>


(코드 프리티파이 xml처리가 안되서 보기가 이상하나 양해바랍니다.)


누구나 한번 쯤 

sqlSessionFactory.openSession()

sqlSession.쿼리

sqlSession.close() 

이 중복코드가 귀찮다고 생각해봤을 것이다.


이를 위해서 MyBatis에서는 interface를 이용한 자동 매퍼 설정을 만들어났다.

@MapperScan이라는 애노테이션을 이용하면 된다.


1. 일단 @Configuration 클래스를 만든다.

@Configuration @MapperScan(basePackages="test.mapping", annotationClass=Mapper.class) public class MapperConfigurer { }

2. 매퍼 인터페이스를 만든다.

@Mapper public interface DynamicMapper { @Select("select * from lcate where seq = #{num }") public List<Map> selectList(Map num);

@Insert("insert into lcate(code, name) values('003', '김성욱')") public int insertListMember(); }

편의상 xml 파일을 만들지 않고 애노테이션을 사용해서 쿼리문을 만들었다.

3. @Autowired로 다음과 같이 Injection을 한다.

@Autowired
DynamicMapper dynamicMapper;

4. 메서드를 호출한다

dynamicMapper.insertListMeber(); 와 같이 호출하면 된다.


+ Recent posts