java/Spring

템플릿 콜백 패턴

킨글 2024. 4. 23. 21:17

스프링이 TransactionTemplate이라는 편리한 기능을 제공

스프링은 `TransactionTemplate`라는 템플릿 클래스를 제공한다.

 

트랜잭션을 없애기 전 코드 

 

트랜잭션을 없앤 코드.

PlatformTransactionManager에 new TransactionTemplate(transactionManager)를 주입한다. 

(this.txTemplate은 TransactionTemplate txTemplate 이다) 

한번 더 없앨 수 없는 이유는 bizLogic() 메서드를 호출하면 SQLException 체크 예외를 넘겨준다. 해당 람다에서 체크 예외를 밖으로 던질 수 없기 때문에 언체크 예외로 바꾸어 던지도록 예외를 전환했다. 

- 체크 예외(Checked Exception) : 컴파일러가 확인할 수 있는 예외로서, 반드시 예외 처리를 해주어야 하는 예외. 대표적으로 파일을 읽거나 쓸 때 발생할 수 있는 `IOException`, 데이터베이스 연결 시 발생할 수 있는 `SQLException`등이 체크 예외의 예시입니다.메서드가 체크 예외를 던질 가능성이 있는 경우, 메서드를 호출하는 곳에서는 try-catch 블록을 사용하거나 예외를 선언하여 해당 예외를 처리해야 합니다.

- 언체크 예외(Unchecked Exception) : 컴파일러가 확인할 수 없는 예외로서, 명시적인 예외 처리가 필요하지 않은 예외입니다. 대부분의 언체크 예외는 프로그램의 오류나 예기치 않은 상황에서 발생합니다. 대부분의 언체크 예외는 프로그램의 오류나 예기치 않은 상황에서 발생합니다. 대표적으로 `NullPointerException`, `ArrayIndexOutOfBoundsException`, `ClassCastException`등이 언체크 예외의 예시입니다. 언체크 예외는 주로 프로그램 코드의 오류를 나타내며, 예외 처리를 강제하지 않습니다. 적절한 예외 처리를 통해 프로그램의 안정성을 높일 수 있습니다. 

언체크 예외는 `RuntimeException` 클래스를 상속받는 예외 클래스를 포함하며, 보통 실행 시 발생하는 오류에 대해 발생합니다. 따라서 언체크 예외는 명시적인 예외 처리가 필요하지 않지만, 프로그래머가 적절한 예외 처리를 해주는 것이 좋습니다. 

 

정리

  • 트랜잭션 템플릿 덕분에, 트랜잭션을 사용할 때 반복하는 코드를 제거할 수 있었다.
  • 하지만 이곳은 서비스 로직인데 비즈니스 로직 뿐만 아니라 트랜잭션을 처리하는 기술 로직이 함께 포함되어 있다.
  • 애플리케이션을 구성하는 로직을 핵심 기능과 부가 기능으로 구분하자면 서비스 입장에서 비즈니스 로직은 핵심 기능이고, 트랜잭션은 부가 기능이다.
  • 이렇게 비즈니스 로직과 트랜잭션을 처리하는 기술 로직이 한 곳에 있으면 두 관심사를 하나의 클래스에서 처리하게 된다. 결과적으로 코드를 유지보수하기 어려워진다.
  • 서비스 로직은 가급적 핵심 비즈니스 로직만 있어야 한다. 하지만 트랜잭션 기술을 사용하려면 어쩔 수 없이 트랜잭션 코드가 나와야 한다.