1. 빌더 패턴
1.1 빌더패턴이란?
빌더 패턴(Builder Pattern)은 객체의 생성 과정과 표현 방법을 분리하여, 동일한 생성 절차에서도 다른 표현 결과를 생성할 수 있는 디자인 패턴 중 하나이다. 이 패턴은 복잡한 객체를 조립하는 방법을 정의할 때 유용하다.

1.2 빌더패턴의 장점
- 가독성: 각 필드가 어떤 값을 의미하는지 명확히 할 수 있으므로 생성 코드의 가독성이 좋아진다.
- 유연성: 객체의 생성과 표현 방식을 독립적으로 변경할 수 있다.
- 필요한 속성만 설정: 사용자는 필수적인 속성만 설정하고, 선택적인 속성은 설정하지 않을 수 있다.
2. 빌더패턴 예제
public class User {
private Integer id;
private String username;
private String password;
private String email;
public static User builder(){
return new User(); // 빈 생성자
}
//세터와 다르게 자기 자신을 리턴함.
public User id(int id){
this.id =id ;
return this ;
}
public User username(String username){
this.username =username ;
return this ;
}
public User password(String password){
this.password =password ;
return this ;
}
public User email(String email){
this.email =email ;
return this ;
}
//빌더패턴. 자기자신을 리턴하기 때문임. 생성자가 없어도 원하는 데이터만 넣을 수 있음.
//데이터넣는 순서 상곤없음
//값을 초기화할 때 쓰는 패턴
public static void main(String[] args) {
User user = User.builder().id(1).username("ssar");
User user1 = User.builder().id(2).username("ssar").password("1234");
User user2 = User.builder().username("love").password("1234").id(3);
System.out.println(user);
System.out.println(user1);
System.out.println(user2);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
}

빌더패턴을 사용했을 때 빈 생성자를 만든다. 빈 생성자를 호출해 아직 어떠한 속성 값도 설정되지 않은 새로운 User 객체를 생성한다.
아래의 빌더 메서드가 자기 자신을 반환하는 이유는 메서드 체이닝을 사용하기 위해서이며, 메서드 체이닝을 통해 연속적인 메서드 호출을 할 수 있다.
3. @Builder
어노테이션
@Builder
어노테이션을 통해 쉽게 빌더패턴을 만들 수 있다. 클래스에 생성자를 만든 후 어노테이션을 붙이면 된다.
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import shop.mtcoding.blog.user.User;
import java.sql.Timestamp;
@NoArgsConstructor // 빈생성자가 필요
@Entity
@Data
@Table(name = "board_tb")
public class Board {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
private Integer id;
private String title;
private String content;
//@JoinColumn(name="user_id") 변수명을 직접 지정 가능
@ManyToOne
private User user ; // 변수명이 user. user_id 를 만들어줌
@CreationTimestamp // persistance centext 에 전달될 때 자동으로 주입됨.
private Timestamp createdAt;
@Builder //엔티티에는 다 걸기
public Board(Integer id, String title, String content, User user, Timestamp createdAt) {
this.id = id;
this.title = title;
this.content = content;
this.user = user;
this.createdAt = createdAt;
}

@Builder
으로 원하는 필드값만 설정해서 담을 수 있다.Share article