보통 생성자 주입으로 DI를 하잖아. 그런데 Lombok 같은 라이브러리를 사용할 경우에 @RequiredArgsConstructor를 사용하면 생성자 메서드도 없고 @Autowired도 없는데 어떻게 의존성 주입이 되는지 단계적으로 설명할 수 있는 백붕이?
너무 디테일하게 설명은 안해도 돼.
설명할 줄 알면 Spring 어디가서 좀 안다고 해도 됌 ㅇㅇ
보통 생성자 주입으로 DI를 하잖아. 그런데 Lombok 같은 라이브러리를 사용할 경우에 @RequiredArgsConstructor를 사용하면 생성자 메서드도 없고 @Autowired도 없는데 어떻게 의존성 주입이 되는지 단계적으로 설명할 수 있는 백붕이?
너무 디테일하게 설명은 안해도 돼.
설명할 줄 알면 Spring 어디가서 좀 안다고 해도 됌 ㅇㅇ
1. 스프링이 클래스 훑어보면서 @RequiredArgsConstructor 발견함 2. "오 이거 롬복 어노테이션이네" 하고 파악함 3. 롬복이 final 필드랑 @NonNull 필드 찾아서 생성자 만들어줌 4. 스프링이 그 생성자 보고 "오 이거 의존성 주입할 생성자구나" 하고 깨달음 5. 스프링 컨테이너에서 필요한 빈들 찾아서 생성자에 주입해줌
롬복은 스프링이랑 관련없음 - dc App
스프링없어도 롬복 라이브러리 가능 - dc App
생성자 세터 필드 주입 -> 빈을 주입할 필드를 파이널로 선언하고 require constructor 어노테이션시 컴파일시점에서 파이널 생성자 생성 -> 생성자 주입 끝이다 아님? - dc App
어노테이션 프로세서를 통한 바이트코드 조작? 정확히는 잘 모르겠다..
Lombok이 빌드과정에서 생성자를 만들어주니까... 그 다음은 그냥 수동으로 한 생성자 주입이랑 똑같음
이건 스프링이 아니라 lombok 이랑 intellij lombok 플러그인에 대한 질문임
+ gradle annotation processor
질문이 잘못된거같아요
그러게 왜지? 난 그냥 썼는데
RequiredArgsConstructor가 생성자 만드는거 아니었음? 공식문서 봤을때 생성자에서 description 없으면 NPE 띄우던데
Lombok @RequiredArgsConstructor Retension 정책이 SOURCE 임. SOURCE는 바이트코드로 바꾸기 직전에만 생존하고 클래스파일에선 존재안함 즉, 컴파일러만 사용하는 건데 일단 스프링 DI는 런타임시점이고 롬복 어노테이션은 컴파일 시점이라서 질문 자체가 잘못된거같애 일단 계속 설명하면 컴파일시점에는 어노테이션프로세서도 동작함 이때 RequiredArgsConstructor 어노테이션을 붙은 클래스를 찾고 생성자 메서드를 직접 만듬 자세히 들어가면 구문트리라는 AST 조작하는 과정이 있는데 그건 알필요없고 (직접 롬복 어노테이션 만들어보면 배우게됨) 암튼 바이트코드에서는 생성자메서드가 자동으로 생성되는것을 확인할 수 있어
오 구문분석 단계까지 가서 롬복이 개입하는거구나 직접 만들어보는것도 해봐야겟다 신기하네
그냥 ㅈㄴ 쉽게 확인하는 방법 => 컨트롤+f12눌러보면 생성자가 생성되어 있는거 볼수있음 - dc App