오늘의하루

Unable to proxy interface-implementing method [public final void org.springframework.web.filter.OncePerRequestFilter.doFilter(jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse,jakarta.servlet.FilterChain) throws jakarta.servlet.ServletExcep.. 본문

Spring/JPA

Unable to proxy interface-implementing method [public final void org.springframework.web.filter.OncePerRequestFilter.doFilter(jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse,jakarta.servlet.FilterChain) throws jakarta.servlet.ServletExcep..

오늘의하루_master 2024. 3. 12. 12:47

오류 발생 시점

Spring Security와 JWT를 통해 인증 인가를 진행하려고 했고 Jwt Filter에서 @Transactional를 사용했기 때문에 발생하였다.

원인

정확한 원인은 아닌 것 같지만 @Transactional 어노테이션을 사용하면 스프링은 해당 메서드를 실행할 때 트랜잭션을 시작하려고 하지만, 이미 실행 중인 트랜잭션이 없기 때문에 오류가 발생할 수 있습니다.

느낀점

내가 @Transactional을 적용한 곳은 단순히 데이터를 조회하는 용도이므로 트랜젝션이 필요없다.

트랜젝션 관리는 데이터를 변경하는 작업에만 필요하다는건 알고 있었지만 깜빡하고 썻던거 같다.

@Transcational은 일반적으로 서비스 계층에서 DB 트랜젝션을 처리하는데 사용된다.

그리고 필터에서 DB에 직접 접근하는것은 권장하지 않는다는 글이 있어서 생각 해볼 것들이 있따.

  1. 성능 : 필터는 모든 요청에 대해 실행되므로 DB에 대한 접근이 많아 질 수 있다.
  2. 트랜젝션 관리 : 필터에서는 트랜잭션의 시작과 종료를 명확하게 관리하기 어렵기 때문에 원하지 않는 동작이 발생할 우려가 있다.
  3. 확장성 : 필터는 서블릿 컨테이너에서 실행되므로 다양한 부분에서 재사용하기 어려우므로 유지 관리하는데 어려움이 생긴다.
Comments