[Spring] 빌더패턴(Builder Pattern)

류재성's avatar
Apr 01, 2024
[Spring] 빌더패턴(Builder Pattern)
 

1. 빌더 패턴

 

1.1 빌더패턴이란?

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

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 + '\'' + '}'; } }
notion image
 
 
💡
빌더패턴을 사용했을 때 빈 생성자를 만든다. 빈 생성자를 호출해 아직 어떠한 속성 값도 설정되지 않은 새로운 User 객체를 생성한다. 아래의 빌더 메서드가 자기 자신을 반환하는 이유는 메서드 체이닝을 사용하기 위해서이며, 메서드 체이닝을 통해 연속적인 메서드 호출을 할 수 있다.
 

3. @Builder 어노테이션

 
💡
@Builder 어노테이션을 통해 쉽게 빌더패턴을 만들 수 있다. 클래스에 생성자를 만든 후 어노테이션을 붙이면 된다.
 
notion image
 
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; }
 
 
notion image
 
 
 
💡
@Builder 으로 원하는 필드값만 설정해서 담을 수 있다.
Share article
RSSPowered by inblog