jdbctemplate로 db update하는데 있어 종종 궁금했던 점이 몇가지 있었다.
- update하고 나온 결과 int를 어떻게 처리하는게 좋을까?
- parameter로 넘어가는 값들의 valid는 어디서 어떻게 처리해주는 것이 좋을까?
Spring Batch를 보던 중, getJobReposiotry().update(stepExecution); 이 눈에 띄었고, 이는 저 두 질문의 실마리가 될 수 있었다.
해당 메소드를 타고 들어가보니
SimpleJobRepository가 JobRepository를 구현하고 있었고, 해당 클래스는 여러 Dao를 가지고 있었다.
봐야할 건 update 메소드!
우선 여기서 dao에 넘길 값들의 validation을 체크하고 있었다. 오 그럼 dao를 호출하기 전에 valid를 체크하고 넘겨주는걸까?? updateJobExecution메소드를 보도록 하자.
여기서도 validation을 체크하고 있다! 왜 두번이나 체크하는걸까...?
생각해본바로는 각각의 기능을 잘 수행하기 위함인 것 같다. SimpleJobRepository의 update 메소드를 수행하기 위해선 저런 validation 체크가 필요한 것이고, JdbcJobExecutionDao의 updateJobExecution 메소드를 수행하기 위해선 저런 validation 체크가 필요한 것이다.
아무튼 이로써 validation 체크는 어떻게 수행되는 것이 좋을까에 대한 해답은 "각 메소드의 기능을 잘 수행할 수 있게 validation을 체크해야한다." 이다.
다음은 두번째 의문에 대한 답변이다.
update 결과는 반드시 처리되어야 한다. 일반적으로 update의 결과에 따라서 그 후 로직이 달라지기 때문이다. 여기서는 런타임 예외를 발생시켜서 이후 로직들이 진행되지 않도록 했다.
결과적으로 런타임 예외를 발생시키고, 예외를 처리한다.(이 메소드는 reflection을 통해 호출되어서 InvocationTargetException예외로 캐치가 되고, 다시 언랩하여 예외를 다시 던진다. 마지막엔 TransactionAspectSupport의 Throwable로 캐치가 된다.)
어떻게 보면 당연한가?