Java 프로그래밍으로 객체를 생성하는 경우 생성자를 통해 만드는 경우가 대부분이다.
생성자를 생성할 때 매개변수가 적다면(2~3개) 생성을 하는 것이 어렵지는 않지만, 만약 매개변수가 많아진다면 코드리뷰를 하는 사람도, 코드를 작성한 본인도 추후 코드를 고칠때 가독성이 매우 떨어진다.
예를 들어,
아래와 같이 요청에서 받아야하는 매개변수가 대충 눈으로만 보아도 족히 10개는 되어 보인다.
@Data
public class PostRequestDto {
private String title;
private String content;
private int like_count;
private boolean temporary_state;
private boolean state;
private long member_id;
private long blog_id;
@Getter
private List<String> hashtags;
@Getter
private String name;
@Getter
private String photo_url;
public PostRequestDto(String title, String content, boolean temporary_state, boolean state, long member_id, long blog_id,
List<String> hashtags, String name, String photo_url){
this.title = title;
this.content = content;
this.temporary_state = temporary_state;
this.state = state;
this.member_id = member_id;
this.blog_id = blog_id;
this.hashtags = hashtags;
this.name = name;
this.photo_url = photo_url;
}
public void setBlogId(long blogId) {
this.blog_id = blogId;
}
}
이 짧은 코드에서도 가독성이 떨어진다는 것을 볼 수가 있다. 특히 매개변수를 넘겨받을 때 그 순서, 혹은 자료형 타입에 실수가 있으면 바로 오류가 생겨버린다. 그리고 찾는것도 쉬운일이 아니다.
하지만 Springboot의 Lombok에서 지원해주는 @Builder는 다르다.
Builder 패턴이란 객체의 생성 과정과 표현 방법을 분리하여 동이한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 한다는 것인데, 말이 어려우니 실제 비교를 해보면 쉽다.
아래는 @Builder 를 사용한 코드이다.
package com.justdo.plug.blog.domain.post.dto;
import com.justdo.plug.blog.domain.post.Post;
import lombok.*;
import java.util.List;
@Data
@Builder
public class PostRequestDto {
private String title;
private String content;
private int like_count;
private boolean temporary_state;
private boolean state;
private long member_id;
private long blog_id;
private List<String> hashtags;
private String name;
private String photo_url;
public Post toEntity(){
return Post.builder()
.title(title)
.content(content)
.temporary_state(temporary_state)
.state(state)
.member_id(member_id)
.blog_id(blog_id)
.build();
}
}
코드가 훨씬 줄어든 것을 볼 수 있다.
어노테이션부터 설명해보겠다.
이전에는 @Getter, @Setter 등 전부 입력을 해주거나 혹은 setBlog_id 메서드를 직접 만들어주면서 인자값을 받아왔었다.
하지만 @Builder 메서드 같은 경우에는 @Getter, @Setter 를 전부 지원해주기때문에 불필요한 어노테이션이나 메서드가 필요 없어지는것이다.
다음은 builder를 사용하는 코드를 보면, 직관적으로 알 수가 있도록 되어 있다.
이전에는 아래와 같이 하나하나 인자를 받아서 넘겨주었다. 정말 알아보기도 힘들고 하나하나 순서도 맞춰줘야했다.
public PostRequestDto(String title, String content, boolean temporary_state, boolean state, long member_id, long blog_id,
List<String> hashtags, String name, String photo_url)
하지만 builder를 사용하면 아래와 같이 직관적으로 이해도 쉽고 실수할 확률도 엄청나게 줄어든다.
public Post toEntity(){
return Post.builder()
.title(title)
.content(content)
.temporary_state(temporary_state)
.state(state)
.member_id(member_id)
.blog_id(blog_id)
.build();
}
처음에는 builder에 대한 이해없이 블로그 글을 참고해가며 짬뽕하면서 코딩을 했더니 가독성이 매우 떨어졌다. 여러개의 어노테이션, 메서드가 있으니 코드를 딱 봤을때 읽어야 할 것이 너무나 많았기 때문이다.
하지만 @Builder 를 사용함으로서 정말 코드가 한눈에 들어올 수 있었기에 나중에 수정하기도, 혹은 코드 리뷰하기가 훨씬 편한 것 같다.

'Springboot' 카테고리의 다른 글
SpringBoot: TDD(Test-Driven-Development)란? (3) | 2025.01.03 |
---|---|
Spring Batch 활용 (1) | 2024.12.09 |
Spring boot: DDD(Domain Driven Design)란? (0) | 2024.09.23 |
Spring boot 쿼리 최적화 문제와 Spring Cloud Openfeign (2) | 2024.06.19 |
Spring Boot 순환 참조 오류(Error creating bean with name) (0) | 2024.06.18 |