나는 여태 프로젝트를 진행하면서 Class에 lombok을 사용해서 @Builder 어노테이션으로 Entity를 생성했다.
클래스에 @Builder를 붙이면 해당 클래스가 가진 모든 필드를 파라미터로 넣어서 객체를 생성해야 했기에 Entity를 생성하는 데 적합하다고 생각해서였다.
그런데 오늘 나왔던 얘기중에 Class에 @Builder를 붙이지 말고, 생성자를 만들어서 해당 생성자에 @Builder를 붙이라는 말씀이 나왔다.
우선 @Builder에 대해 자세하게 알아봐야한다.
디자인 패턴중에서 빌더 패턴을 사용하면 인스턴스를 생성할 때 명시적으로 파라미터를 넣어줄 수 있다는 장점이 있다.
또한 파라미터 순서대로 넣지 않아도 된다는 아주아주 큰 장점이 있다.
만약에 빌더를 사용하지 않고 생성자로 인스턴스를 생성하게 되면
위 코드와 같이 생성자 파라미터 순서대로 넣어줘야 하는 불편함이 생긴다.(순서도 지켜야하고, 뭔가 보기 어지럽다)
그러나 빌더를 사용하게 되면
순서대로 값을 넣어주지 않아도 되고, 어떤 필드에 어떤 값을 넣어주는지 명시적으로 확인할 수 있는 장점이 있다.
결국 모든 필드를 바탕으로 생성해주어야 하기 때문에 @Builder를 붙이면 전체 생성자가 필요하다.
그러면 전체 생성자를 개발자가 직접 만들어야 하냐???
@Builder 클래스에 대한 설명을 보면 특이한 부분이 있다.
간단하게 얘기하면, 클래스에 @Builder를 달게 되면 모든 필드를 인수로 사용해서 패키지 전용 생성자를 만든다고 명시돼있다.
단 조건으로 어떠한 @XArgsConstructor도 붙이지 않은 경우다.
(@AllArgsConstructor는 결국 전체 필드 생성자를 만드는 경우라 문제 없는데, 여기서 말하는 X는 No를 의미하는 것 같다.)
실제로 @NoArgsConstructor를 붙이면 어노테이션이 하나라도 존재하니, 개발자가 직접 전체 생성자를 만들어줘야 컴파일 에러가 해결된다.
그럼 본론으로 돌아가서 왜 클래스 레벨에 @Builder를 붙이지 말라고 했을까?
내용을 찾아보니 클래스에 @Builder를 붙이나, 전체 생성자를 만들어서 @Builder를 붙이나 성능의 차이는 없다.
그러나 전체 생성자를 만들어서 @Builder를 붙이는 경우 명시적으로 파라미터를 지정해주기에 객체의 불변성을 강화할 수 있다는 장점이 있다.
즉 명시적인 제어, 이해하기 쉬운 코드를 위해서는 생성자에 @Builder를 붙이는 것이 좋다는 결론이 내려졌다
'JAVA' 카테고리의 다른 글
자바 실행 과정 및 JVM 개념 정리 (1) | 2024.03.01 |
---|---|
equals()와 hashcode() 정리(재정의) (2) | 2024.02.24 |
자바 Record (자바 16에서 채택된 새로운 클래스) (0) | 2024.01.10 |
자바 Collections(List, Set) (0) | 2023.12.23 |