본문 바로가기
Spring/이론

@Builder 와 @AllArgsConstructor @NoArgsConstructor

by jungmin.park 2023. 11. 23.

 

개요

 

Spring 프로젝트 중 생성자에 값을 넣어주는 문제에 대해 잠시 고민해보았다.

생성자에 넣어주는 값이 예를 들면 title만 넣으려다 title, name, phoneNumber 로 늘어나게 된다면 생성자 수정/추가가 계속 필요하다.

그래서 찾아보던 중 @Builder를 사용해보고자 했다.

 


@Getter
public class ColResponseDto {
	private String title;
	private int position;
	private Long boardId;

	public ColResponseDto(Col columns) {
		this.title = columns.getTitle();
		this.position = columns.getPosition();
		this.boardId = columns.getBoard().getId();
	}
}

 

ColResponseDto 클래스를 .builder() 를 사용하고 싶다.

 

 

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ColResponseDto {
	private String title;
	private int position;
	private Long boardId;

	public ColResponseDto(Col columns) {
		this.title = columns.getTitle();
		this.position = columns.getPosition();
		this.boardId = columns.getBoard().getId();
	}
}

 

클래스 위에 @Builder을 추가해주면 된다.

Builder의 장점은 무엇일까?

 


1. 빌더 패턴(Builder Pattern)을 사용해야 하는 이유

  • 필요한 데이터만 설정할 수 있음 -> 위에 말한것처럼 필요할때마다 생성자 수정이 아닌 필요한것만 설정이 가능해진다.
  • 유연성을 확보할 수 있음
  • 가독성을 높일 수 있음
  • 변경 가능성을 최소화 할 수 있음

 

2. 그럼 빌더 패턴이 무조건 필요한가?

  • 객체의 생성을 라이브러리로 위임하는 경우
  • 변수의 개수가 2개 이하이며, 변경 가능성이 없는 경우

만약,  엔티티(Entity) 객체나 도메인(Domain) 객체로부터 Dto를 생성하는 경우

  • 직접 빌더를 만들고 하는 작업이 번거롭기 때문에 MapStruct나 Model Mapper와 같은 라이브러리를 통해 생성을 위임할 수 있다.

     변수가 2개 이하인 경우에는

  • 변수가 늘어날 가능성이 없기 때문에 정적 팩토리 메소드를 사용하는 것이 더 좋을 수 있다.

빌더의 남용은 오히려 코드를 비대하게 만들 수 있으므로 변수의 개수와 변경 가능성 등을 중점적으로 보고 필더 패턴을 적용할지 판단하면 된다.

 

더 자세한 예시는 이 블로그에 예시와 함께 나와있다.

https://mangkyu.tistory.com/163

 


내가 주목하고 싶었던건 @AllArgsConstructor 달아주지 않으면 오류가 난다.

 

저 어노테이션을 달아주지 않으면 오류가 발생했다. 모든 멤버변수를 받는 생성자가 없는 것이 이유였다.

 

Q. @AllArgsConstructor 어노테이션이 필요한 이유

빌더는 필드의 초기화 작업을 도와주는 역할

 

Lombok 공식사이트를 보면

@Builder 사용 시, 생성한 생성자가 없으면 @AllArgsConstructor(access = AccessLevel.PACKAGE)가 암묵적으로 적용된다.

또한 @Builder 내에서 모든 파라미터를 갖는 생성자를  필요로 한다.

그러니 @Builder를 사용하는 엔티티(Entity)에서는 꼭 @AllArgsConstructor을 달아주자

 

 

 

 

'Spring > 이론' 카테고리의 다른 글

[DB] MyBatis vs JPA  (0) 2024.03.12
[Spring] Jmeter  (0) 2023.11.24