Whiteship's Note


@Repository를 쓴다면 하이버네이트 예외 변환기 직접 만들 필요 없습니다.

Spring/Chapter 12 : 2008.11.12 10:52


스프링이 2.0부터 제공하고 있었는데, 이제서야 알게 됐습니다. 저는 그동안 뭘...;;;; 한 거죠.. ㅋㅋㅋ 이 것 참..;; 혹시 저만 빼고 다들 알고 계셨던건 아니겠죠? 저는 게다가 항상 @Repository 애노테이션을 쓰고 있었거든요. 그런데도 몰랐습니다. @Repository 애노테이션 API에도 안 나와있네요.

하이버네이트 예외 변환기가 언제 필요하냐면.
1. 하이버네이트 DAO 구현을 스프링 API에서 독립적으로 구현하고 싶을 때. 다른 말로 하이버네이트 SessionFacotry를 직접 주입해서 사용하고 싶을 때.
2. 하이버네이트 예외를 스프링 DataAccessException으로 변환하고 싶을 때.

위 두 가지 조건이 만족한다면 사용하고 싶을 겁니다. 그럴 때 만약 @Reposity라는 애노테이션으로 빈 스캔을 사용해서 빈을 등록하고 있다면 예외 처리기를 만들 필요 없이 빈 하나만 등록해주면 끝납니다.

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

끝~ 저 클래스는 이름이 암시하듯이 스프링의 빈 포스트 프로세서로, 등록된 빈 중에 @Repository가 붙어있는 빈에 persistenceExceptionTranslationAdvisor 이런 어드바이저를 적용한 프록시 빈으로 교체해주는 멋진 녀석입니다. AOP와 빈 포스프 프로세서의 조합. 캬오... 스프링엔 이렇게 멋진 코드가 곳곳에 숨어있군요.

핵심코드 감상 하기...
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        Class<?> targetClass =
                (bean instanceof Advised ? ((Advised) bean).getTargetSource().getTargetClass() : bean.getClass());
        if (targetClass == null) {
            // Can't do much here
            return bean;
        }
       
        if (AopUtils.canApply(this.persistenceExceptionTranslationAdvisor, targetClass)) {
            if (bean instanceof Advised) {
                ((Advised) bean).addAdvisor(this.persistenceExceptionTranslationAdvisor);
                return bean;
            }
            else {
                ProxyFactory proxyFactory = new ProxyFactory(bean);
                // Copy our properties (proxyTargetClass etc) inherited from ProxyConfig.
                proxyFactory.copyFrom(this);
                proxyFactory.addAdvisor(this.persistenceExceptionTranslationAdvisor);
                return proxyFactory.getProxy(this.beanClassLoader);
            }
        }
        else {
            // This is not a repository.
            return bean;
        }
    }

위 코드는 유겐 휄러와 로드 좐슨이 작성한 코드입니다.

ProxyFactory를 사용해서 직접 프록시 만드는 방법은 어제 올린 스크린 캐스팅에 포함되어 있었죠. Advised 인터페이스에 대해서도 언급 했었구요. 스프링 AOP 스캐를 보신 분들이라면 무리 없이 이해하실 수 있을 겁니다. 귿~
top

  1. Favicon of http://toby.epril.com BlogIcon 토비 2008.11.12 12:29 PERM. MOD/DEL REPLY

    이걸 몰랐단 말이야? @.@ 스프링 전문가 맞아?

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.11.12 13:02 신고 PERM MOD/DEL

    저 스프링 초본데요. @.@

  2. Favicon of https://helols.tistory.com BlogIcon is윤군 2008.11.12 17:36 신고 PERM. MOD/DEL REPLY

    @service도 어떻게 안될까요;;; ㅋ

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.11.12 17:56 신고 PERM MOD/DEL

    응용해서 필요한 걸 만들 수 있겠죠. @Service가 붙어있는 빈 중에 특정 예외를 특정 예외로 변환해주는 코어 클래스, 어드바이저, 빈 포스트 프로세서를 만든다던가...덩덩덩

    그런 용도로 쓰라고 @Service, @Repositoy, @Controller 처럼 세분화 해둔거 아닐까요. 커스텀 애노테이션 만들어서 써도 되구요. 음~ 애노테이션이 참.. 편해요.

Write a comment.