룸북의 @Builder, @All/NoArgsConstructor에 대한 오해

주현·2024년 7월 18일

공부방

목록 보기
5/14

📌 이글을 작성하는 이유?

이때까지 프로젝트를 하면서 @Builder, @AllArgsConstructor, @NoArgsConstructor 애노테이션들을 사용해왔다. 분명 어떤 건지는 알고는 사용했지만, @Bilder, @NoArgsConstructor만을 사용하니 저번에 에러가 발생했던 적이 있다. 그래서 그냥 @AllArgsConstructor를 추가해서 그대로 진행했었던 적이 있다. 그래서 쫌 많은 글을 읽고 알았던 점에 대해서 작성한다.

✔️ @NoArgsConstructor, @Builder 두개만 사용?

이미지 설명

해당 하는 어노테이션 두개만 사용했을때, 위에 그림처럼 바로 에러가 뜨는 것을 확인할 수 있다. 왜 그럴까? 이렇게 선언 했을때, 룸북이 자동으로 만들어주는 메서드를 확인해보았다.
전체 파라미터를 필요로하는 생성자가 없는 것을 확인할 수 있었다.

@Builder는 @Builder를 통해서 필요한 파라미터만 받아서 객체를 만들 수도 있고, 전체 파라미터를 받아서 객체를 만들 수도 있는데 전체 생성자가 없으니 당연히 에러가 발생한다.

그렇다면, @NoArgsConstructor없이 @Builder 어노테이션만을 사용하여 해보았다.

이미지 설명

허걱,, 근데 에러가 발생하지 않는 것을 확인할 수 있었다. 왜 그럴까?? 그 이유를 한번 알아보도록 하자.

✔️ Builder

builder 어노테이션 내부를 한번 읽어보았는데,
@~ArgsConstructor 주석을 추가하지 않은 경우에만 @AllArgsConstructor 어노테이션의 역할과 같이 모든 필드를 파라미터로 사용하는 생성자가 생성이 됩니다.

즉, 정리해보자면
@NoArgsConstructor 어노테이션이나 다른 생성자들이 존재하지 않을 경우 -> 전체 생성자를 자동을 생성해 주고,
기본 생성자나 다른 생정자들이 존재하면 @AllArgsConstructor을 사용해서 직접 전체 생성자를 만들어줘야 하는 것이죠.

결과적으로 가장 효율적으로 필요한 객체만 생성해서 사용하기 위한 좋은 방법인 @NoArgsConstructor와 @Builder를 함께 쓰려면 @AllArgsConstructor을 이용하면 된다.

✔️ 근데 또 궁금증이 생긴다?

그럼 그냥 @Builder어노테이션만 쓰면 되는 게 아닌가?
왜 굳이 @NoArgsConstructor와 @AllArgsConstructor 친구들과 같이 쓰는 걸까? @Builder 어노테이션를 사용하면 끝인 게 아닌가? @Builder 어노테이션만 사용해도 기본적인 생성자도 만들고, 필요에 따라 필요한 생성자만도 만들고, 전체 파라미터만 가지는 생성자도 만드는데 말이죠..? 이 해답을 알고싶네여 일단 개발 커뮤니티에 한번 물어볼 생각입니다.. 허허 수고하세용~

이미지 설명

-> 이에 대한 동기의 답변이 이랬다.. 이건 그냥 뇌 없는 소리였다...@Builder 어노테이션을 사용하게 되면, 기본생성자도 생성되는 줄 알았는데, 이게 아니네....생각해보면 당연하다. 기본 생성자가 있어야 jpa가 객체를 생성하고 값을 주입하기 때문이다. 내가 왜 @Builder만 있어도 되는 거 아닌가?라고 생각한 이유는

아래보면 응답값에 값을 넣기위한 dto이다. 생각해보면 응답 값에는 기본 생성자가 없어도 된다. 왜?JPA가 객체를 생성하고 값을 주입할 필요가 없기 때문이지.. ㅎ 그래서 그냥 해당되는 필드들을 builder패턴으로 주입해서, 응답 값을 주기 떄문에, 기본 생성자가 필요없어서 @Builder만 사용해도 에러가 발생하지 않는 것이였다...

이미지 설명

✔️ @Builder를 사용하는 2가지 방법

    1. 클래스에 @Builder를 붙이기
    1. 생성자에 @Builder를 붙이기

1번은 클래스 레벨에서 @Builder와 @NoArgsConstructor를 함께 쓰며, 근데 이렇게 사용하게 되면 모든 필드를 가지는 생성자가 생성되지않는데, 이를 해결하기 위해서 모든 필드를 가지는 생성자를 만들어줘야한다. 이때, @AllArgsConstructor를 사용되는 것은 추천되지 않는다고 한다.

추천되지 않는 이유는@AllArgsConstructor는 클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성해주는데, 인스턴스 멤버의 선언 순서에 영향을 받기에 두 변수의 순서를 바꾸면 생성자의 입력값 순서도 바뀌게 되어 검출되지 않는 치명적인 오류를 발생시킬 수 있다.. 그렇기에 2번을 사용하는 것이 좋다고 한다.

이미지 설명

요런식으로 말이다.

또한 이렇게 작성해서 얻는 장점은

가독성: 코드가 더 읽기 쉽고 직관적입니다.
유연성 : 필요한 필드만 설정할 수 있어, 선택적 매개변수가 많은 경우 유용하다


✔️ 나의 고찰

어노테이션이든 기술스택이든 뭐든, 조금 안다고 무지성으로 쓰게 된다면 결국엔 그게 좋지않고 독이 될 수도 있다고 생각하게 되었다.. 역시 개발에는 끝이 없으며 배울게 정말 많다고 생각한다. 자만하지마 정주현.. 무지성으로 조금 안다고 사용하지말고 언제나 잘 알고 사용하자라는 생각이 들었다!

참고

https://dev-jhl.tistory.com/entry/Lombok-%EC%98%AC%EB%B0%94%EB%A5%B8-Lombok-%EC%82%AC%EC%9A%A9%EB%B2%95-Builder

0개의 댓글