Server/Info

    Custom Advisor 에 @Transactional 설정시 미적용 문제

    Custom Advisor 에 @Transactional 설정시 미적용 문제

    @Transactional은 Spring AOP 를 사용하여 동작한다. 그럼 만약 아래와 같은 상황처럼 Custom Advisor[customAdvisor] 와 해당 Adivsor를 적용하려는 메서드[test] 에 @Transactional 설정을 아래와 같이 했을 경우 어떤 구조로 동작할까? @Service public class TestService { @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true) public void test() { log.info("Test"); } } @Aspect @Component public class AspectConfig { private final TestJpaRepository tes..

    [Lombok] @Builder 로 객체 생성시, 초기화 안해준 필드 null 값으로 세팅

    Lombok의 @Builder 로 객체를 생성하는 경우가 종종 있을 것이다. 원하는 필드에만 값을 세팅할 수 있고, 파라미터의 순서를 고려하지 않아도 되기 때문에 상당히 편하다. 하지만 원하는 필드에만 값을 세팅할 시에, 값을 세팅하지 않은 필드에는 null 값이 들어가는 문제가 생긴다. default로 별다른 값을 설정을 하지 않았을 때는 문제가 되지 않지만, 기본 값 설정을 한 경우에는 default 값에 null 값이 덮어씌어지게 된다. 만약 이후에 해당 필드의 메서드를 호출하는 경우가 있다면 NullPointerException 이 발생할 것이다. 이를 방지하기 위한 방법으로 필드에 'final' 을 설정하면 된다. 이에 따라 초기 설정값을 보존할 수 있다. 참조 - https://velog.io..

    [Spring] Component Scan 범위

    스프링의 Component Scan 범위는 @ComponentScan이 명시된 클래스가 위치한 디렉토리를 포함해서 그 하위 디렉토리들이다. 스프링 생성 시에 @SpringBootApplication 이 main 메서드를 가진 클래스에 명시되어 있고, 이 어노테이션은 내부적으로 @ComponentScan을 포함하고 있다. 따라서 스프링의 기본적인 Component Scan 범위는 해당 클래스가 위치한 디렉토리를 포함한 하위 디렉토리들이 된다. [Spring] @Component와 컴포넌트 스캔 [Spring] @Component와 컴포넌트 스캔 이번 글에서는 @Component와 이 어노테이션이 어떻게 인식이 되며, 어떻게 사용되는지 알아보도록하자. 1. @ComponentScan의 범위 @Componen..

    [Spring] @Configuration 을 설정해줘야 하는 이유.

    스프링으로 프로젝트를 진행하다보면 스프링 컨테이너에 Bean 등록을 위해서 새롭게 클래스를 만든 후에 @Configuration 을 추가해주는 것을 볼 수 있다. 하지만 Bean 등록은 @Bean 을 추가해주는 것 만으로도 가능하다. 그렇다면 어째서 @Configuration 까지 추가해주는 수고를 하는 것 일까? 그 이유는 싱글톤 패턴을 위해서 이다. 스프링에서는 @Bean 설정만으로는 싱글톤을 보장해주지 않는다. 만약 @Configuration 없이 @Bean 만으로 빈 등록을 한다면 아래와 같은 상황이 발생할 수 있다. 만약 @Configuration 이 설정되어 있다면 바이트 조작을 통해서 싱글톤을 보장해주는 프록시 객체를 만들어 스프링 컨테이너에 등록해준다. 잘못된 내용에 대한 수정이나, 본문에..