목차
@Transactional
로 묶어주기문제점 : 캐싱이 적용된 메서드를 트랜잭션이 걸린 메서드에서 호출함
public class TxClass {
@Transactional // 트랜잭션이 시작되면서 커넥션을 획득 (불필요한 작업)
public Object txMethod() {
/* 작업 수행 */
return cacheMethod();
}
}
public class CacheClass {
@Cacheable
public Object cacheMethod() {
/* 작업 수행 */
return obj;
}
}
해결 : txMethod()
에 트랜잭션이 걸릴 이유가 없어 cacheMethod()
쪽으로 트랜잭션을 이동
@Slf4j
@Aspect
@Component
public class TimeTraceAop {
@Around("within(com.mrblue.home.*..*) && !this(com.mrblue.home.common.EnvironmentRepository)")
public Object timeLog(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
log.info("START: %s".formatted(joinPoint));
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
log.info("END: %s %dms".formatted(joinPoint, timeMs));
}
}
}