@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
키워드를 필드에 붙여주어야 한다.