본문 바로가기

IT/Spring83

스프링의 트랜잭션 프로그래밍 방식 트랜잭션 소스코드에 직접 트랜잭션을 넣어 관리하는 방법 트랜잭션이 필요한 모든 메서드에 선언을 해주기 때문에 유연하나 유지보수가 힘들다. 선언적 트랜잭션 AbstractPlatformTransactionManager 를 상속하여 일관되게 형식으로 적용이 가능하도록 되어있어 주로 사용한다. 스프링의 @Transactional은 CGlibAopProxy를 사용하여 구현하였는데 흐름을 분석해보자. class CglibAopProxy implements AopProxy, Serializable { private static class DynamicAdvisedInterceptor implements MethodInterceptor, Serializable { @Override @Nullable .. 2023. 10. 12.
Spring AOP 분석 Spring AOP 는 타겟이 클래스냐 인터페이스냐에 따라 두가지 방법으로 aop를 처리한다. 인터페이스 인 경우 JdkDynamicAopProxy를 사용하며 클래스인 경우 ObjenesisCglibAopProxy 를 사용하여 처리한다. public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory { /** * Central method of this class: creates a bean instance, * populates the bean instance, applies post-processors, etc. * @see #doCreateBe.. 2023. 10. 10.
RestControllerAdvice 사용하여 로깅 @RestControllerAdvice 혹은 @ControllerAdvice 를 사용하여 로깅하는 방법도 존재한다. Request import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.core.MethodParameter import org.springframework.http.HttpInputMessage import org.springframework.http.converter.HttpMessageConverter import org.springframework.web.bind.annotation.RestControllerAdvice import org.springframework.web.servlet.mvc.met.. 2023. 9. 25.
AOP 사용하여 로깅 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 을 사용하는 메서드를 찾아서 로깅을 해주는 방식이다. getPointCut()에 return을 주지 않으면 데이터가 유실되는 현상이 나타나므로 return을 붙여줘야한다. getBody()에서는 사용된 어노테이션중 RequestBody를 찾아서 데이터를 가져 오도록 처리 하였다. @Aspect @Component class ApiLogAop { private val logger = KotlinLogging.logger {} @Pointcut( "@annotation(org.springframework.web.bind.annotation.GetMapping) ||" + "@annotation(org.sprin.. 2023. 9. 25.