[Spring] Spring DI @Autowired 대신 @RequiredArgsConstructor 사용하기 :: 순환참조 이슈

동민·2021년 10월 18일
0
@RestController
@RequiredArgsConstructor
public class OOORestController {
    
    // 생성자 주입
    private final OOOService oooService; // @RequiredArgsConstructor Lombok 생성자 자동 주입 일 때, final or @NonNull 키워드 사용
    
    /* Deprecated */
    @Autowired
    private OOOService oooService;
    
    /* 로직 */
    public T method(){
    	...
    }
}

Spring DI의 필드 주입 방식인 @Autowired 어노테이션은 Deprecated 되는 추세이다.
@RequiredArgsConstructor 생성자주입 방식을 사용하는 것이 Spring 순환참조 등을 컴파일 시점에 알 수 있어 많이 사용함!

순환참조가 있을 경우, 서버 Start/Debug 시 아래와 같은 로그가 찍힌다.
(@Autowired 를 사용하여 주입했을 때 발견하지 못했던 순환참조를 @RequiredArgsConstructor 를 사용하면서 발견하게 되었다.)

The dependencies of some of the beans in the application context form a cycle:

   ItemServiceImpl defined in file [/Users/.../ItemServiceImpl.class]
┌─────┐
|  PriceServiceImpl defined in file [/Users/.../PriceServiceImpl.class]
↑     ↓
|  OptionServiceImpl defined in file [/Users/.../OptionServiceImpl.class]
└─────┘

=> 해결: PriceServiceImpl -> OptionServiceImpl -> PriceServiceImpl 연결고리를 끊어주어야 함!

참고)
DI를 생성자 주입 방식인 @RequiredArgsConstructor 롬복 어노테이션으로 할 때 final or @NonNull 키워드를 필드에 붙여주어야 한다.

[Spring] @NonNull 어노테이션

https://velog.io/@kmdngmn/Spring-NonNull

profile
BE Developer

0개의 댓글