Spring 프로젝트를 진행하면서 Lombok 라이브러리는 매우 유용하게 사용하고 있습니다. 그런데 일반적인 상황에서 지양해야 하는 어노테이션이 존재합니다.
@AllArgsConstructor 어노테이션은 클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성하는데, 인스턴스 멤버의 선언 순서에 영향을 받기 때문에 변수의 순서를 바꾸면 생성자의 입력 값 순서도 바뀌게 되어 검출되지 않는 치명적인 오류를 발생시킬 수 있습니다.
(참고 : https://kwonnam.pe.kr/wiki/java/lombok/pitfall
@RequiredArgsConstructor 어노테이션도 같은 이유로 지양해야 합니다.
@Data 어노테이션도 남용하는 것을 지양해야 합니다.
사실 @RequiredArgsContructor 어노테이션은 자주 사용합니다. 바로 IoC 상황에서 많이 사용하죠.
스프링을 사용하면 스프링 빈의 라이프 사이클은 알아서 관리해줍니다. 직접 인스턴스를 생성하지 않기 때문에 생성자를 호출하지 않습니다. 그렇다면 @RequiredArgsConstructor 어노테이션의 생성자 변수 순서의 위험성은 신경 쓸 필요가 없는 것이죠.
@Data 어노테이션의 경우에도 dto 클래스에서는 사용해도 무방하다고 생각합니다. 필수 필드(식별자 필드) 1개만 final 옵션으로 지정해서 생성자 주입을 하고 나머지 필드는 setter를 사용해서 설정하는 방식으로 사용하면 될 것 같습니다.