관리 메뉴

샐님은 개발중

트랜잭션 문제 해결 - 트랜잭션 템플릿 본문

스프링 DB 1편 - 데이터 접근 핵심 원리

트랜잭션 문제 해결 - 트랜잭션 템플릿

샐님 2023. 7. 21. 17:40
728x90
반응형

MemberService.java

 public void accountTransfer(String fromId, String toId, int money) throws SQLException {
        // 트랜잭션 시작
        TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
        try{
            // 비지니스 로직
            bizLogic(fromId, toId, money);
           transactionManager.commit(status);
        }catch (Exception e){
            transactionManager.rollback(status);
            throw new IllegalStateException(e);
        }

    }

서비스단에서 try {...}catch{..} 구문이 반복적으로 발생되고 있는 것을 확인할 수 있다. 

- > 템플릿 콜백 패턴을 활용해서 해결 가능 현재로서는 템플릿 콜백 패턴을 자세히 이해하지 않아도 되고 'TransactionTempate' 이라는 편리한 기능을 제공하는 정도로 이해하자.

 

트랜잭션 템플릿

 

public MemberServiceV3_2(PlatformTransactionManager transactionManager, MemberRepositoryV3 memberRepository) {
        this.txTemplate = new TransactionTemplate(transactionManager);
        this.memberRepository = memberRepository;
    }


    public void accountTransfer(String fromId, String toId, int money) throws SQLException {

        txTemplate.executeWithoutResult((status) ->{  // 메소드안에서 예외 발생시 롤백처리, 정상 작동시 커밋처리한다.
                    try{
                        // 비지니스 로직
                        bizLogic(fromId, toId, money);
                    }catch (Exception e){
                        throw new IllegalStateException(e);
                    } }
                );

    }

트랜잭션 템플릿 사용으로 커밋/롤백 코드가 제거됨.

해당 람다에서는 체크 예외를 던질 수 없어서 언체크 예외로 바꾸어 던지도록 함. (언체크 공부필요!)

 

결과

코드는 줄였지만 아직도 서비스 로직에서 트랜잭션 처리 기술을 사용하고 있으므로 향후 유지보수의 어려움이 있다. 

서비스 로직은 가급적 핵심 비지니스 로직만 있어야한다. 

 

이문제를 해결하기 위해 스프링 AOP 를 통해 프록시를 도입해서 해결할 수 있다. 

 

 

 

728x90
반응형