김영한님의 스프링 핵심 기본편강의를 보면서 lombok을 쓰면서 @RequiredArgsConstructor 을 사용하게 되었는데,
설명상으로는 필드에 final을 지정하면, 반드시 값을 지정해줘야 하니까.
@RequiredArgsConstructor
라는 어노테이션이 알아서 값이 지정되야만 하는 것들을 위해서 생성자를 만들어낸다고 말씀하셨다.
과연 그럴까? (이런 의문이 든 이유는 신기해서이다... 어떻게 코드를 집어넣을 수 있는거지? )
코드상으로 실제로 생성자가 있는 것과 정확히 일치한다고 말씀하셨다... 그래서 직접 확인해보고 싶어서 .class 파일을 디컴파일 해보았다.
디컴파일러로는 jd-gui가 가장 흔하게 쓰이는 것 같아서 다운받아서 사용했다.
(그냥 검색하면 다운받는 곳이 주르르 나온다. )
왠지 모르게 프로그램에서 귀여운 느낌이 난다... 스윙으로 만들어진것같은 그런 냄새가 난다...
아래는 이제 인텔리제이에서 작성한 코드이다. 분명 생성자가 없다. 생성자가 없고, final로 선언된 필드가 있으며,
@RequiredArgsConstructor
가 클래스선언부 위에 선언되어있다. 실제로 컴파일될때, 생성자가 코드가 들어가게 된다는데, 이제 확인해보자. !!
결과는 아래와 같다...
jd-gui에서 .class 파일을 선택하면 바로 소스코드가 나오는데,
실제로 지금 보면 생성자가 만들어져있는 것을 확인할 수 있다.
신기하다...
이러한 기술을 어노테이션 프로세싱 기술이라고 하는데, 상당히 흥미로운 기술인 것 같다.
관련 블로그글들이 상당히 많던데, 조금 이해하기 어려운 부분들이 있었다.
몇번 더 알아보고 나중에 가능하다면, 직접 이러한 기능을 만들어보는 것도 재밌는 프로젝트가 될 수 있겠다 싶었다.