[SpringBoot] 01. 빌더 패턴

Dami·2025년 4월 29일

빌더 패턴

복잡한 객체를 단계별로 구성(조립)할 수 있게 하는 생성 패턴

특히 필드가 많은 객체를 깔끔하고 명확하게 생성할 때 유용

일반 생성자 예제

//Member 객체 [생성]!!
Member m1 = new Member();
m1.setSeq(1L);
m1.setName("강아지");
m1.setAge(2);
m1.setAddress("서울시");
m1.setGender("m");
  • 인자의 개수와 순서, 이름을 파악 불편
  • 만들 수 있는 오버로딩 개수의 한계가 있음
  • 다양한 생성 패턴 > 비용 발생 + 한계 발생(오버로딩)

빌더 패턴 적용

Student s1 = Student.builder()
				.seq(6L)
				.name("타조")
				.address("제주시")
				.age(5)
				.gender("f")
				.build();
  • 자유롭게 필드 선택 가능 (필수/선택 매개변수 구분 쉬움)
  • 생성자 인자 순서 기억할 필요 없음
  • 가독성이 매우 좋아짐
  • *불변 객체(Immutable)**도 쉽게 만들 수 있음

빌더 패턴 생성 방법

public class Member {

    private String name;
    private int age;
    private String job;
    private String address;

    // 2. private 생성자 추가
    private Member(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.job = builder.job;
        this.address = builder.address;
    }

    // 3. static Builder 클래스 만들기
    public static class Builder {
        private String name;
        private int age;
        private String job;
        private String address;

        public Builder name(String name) {
            this.name = name;
            return this;   // ⭐ return this → 체이닝 가능
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public Builder job(String job) {
            this.job = job;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        public Member build() {
            return new Member(this);  // 최종적으로 Member 객체 생성
        }
    }

    // (선택) getter 추가
    public String getName() { return name; }
    public int getAge() { return age; }
    public String getJob() { return job; }
    public String getAddress() { return address; }
}

빌더 패턴 생성 방법 (Lombok)

@Builder
@ToString
public class Student {
	private Long seq;
	private String name;
	private Integer age;
	private String address;
	private String gender;
}

0개의 댓글