빌더패턴을 이용한 객체 생성

장현진·2022년 2월 8일
0

Spring

목록 보기
2/3

서론

객체를 생성하고 객체를 사용하는데는 여러 방법이 있다. 그중 loombok을 활용한 방법으로
@NoArgsConstructor , @RequiredArgsConstructor 등을 이용해 생성할수있지만 좀더 자유로운 객체생성과 안전한 관리를 위해 @Builder를 써보려 한다.




본론

빌더패턴의 장점은

  1. 필요한 데이터만 설정할 수 있음
  2. 유연성을 확보할 수 있음
  3. 독성을 높일 수 있음
  4. 불변성을 확보할 수 있음

이있고 이는 예시를 통해 보려고 한다.

1. 필요한 데이터 저장

public class User { 
private String name; 
private int age; 
private int height; 
private int iq; 

	public User (String name, int height, int iq){ 
		this.name = name; 
    	this.height = height; 
        this.iq = iq; 
   } 
	public User (String name, int height){ 
		this.name = name; 
    	this.height = height; 
   } 
	public User (String name){ 
		this.name = name; 
   } 

	
}

이처럼 user객체를 생성해야 할때 필요 파라티미터에따라 생성자를 만들어 줄수 있지만 필요에따라 매번 만들어 주어야 하며 생성자를 사용할때 개발자가 파라미터에대해 모두 알고있어야 사용할수 있으며 불필요한 중복코드가 늘어 나게 된다.

2. 유연성

위와같이 생성자를 모두 만들었더라도 user객체에 몸무게 정보를 추가하여야 할경우

public User (String name, int height, int iq , int weight){ 
		this.name = name; 
    	this.height = height; 
        this.iq = iq; 
        this.weight = weight;
   } 

와 같이 매번 새로운 코드를 생성하여야 한다.

3. 가독성

User user = new User("name", 28, 180, 150)

User user = User.builder() 
.name("현진") 
.age(28) 
.height(180) 
.iq(150)
.build();

비교한것과 같이 생성자 객체생성은 각 값이 의미하는 바를 한번에 알아보기 힘들지만 builer는 각 값이 의미하는 바를 바로 알수 있다.

4. 불변성

수정자 패턴(Setter)는 불필요하게 확장 가능성을 열어두는 것이다. 이는 Open-Closed 법칙에 위배되고, 불필요한 코드 리딩 등을 유발한다. 그렇기 때문에 클래스 변수를 final로 선언하고 객체의 생성은 빌더에 맡기는 것이 좋다.

@Builder 
public class User { 

	private final String name; 
	private final int age; 
	private final int height; 
	private final int iq; 
    
}



builer 패턴

위와 같은 장점을 가진 빌더 패턴은 다음과 같이 사용한다.

public class User {

    private String name;
    private int age;
    private int heigth;
   
   
   //생성자는 외부에서 사용할수 없게 막아둔다
    private User(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.heigth = builder.heigth;
    }

    // 빌더 호출, 외부에서 접근할 수 있도록 static 메소드로 생성
    public static Builder builder() {
        return new Builder();
    }

    // static 형태의 inner class 생성
    public static class Builder {
        private String name;
        private int age;
        private int heigth;

        private Builder() {};

		//빌더 저장후 자기자신을 return 하여 함수형으로 다시 호출하도록한다.
        public Builder name(String name) {
            this.name = name;
            return this;
        }

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

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

       
        // 마지막에 build 메소드를 실행하면 this가 return 되도록 구현
        public User build() {
            return new User(this);
        }
    }
}

하지만 빌드 패턴은 구현시 많은 코드양이 필요하고, Builder라는 객체를 하나 더 만드는 것이기 때문에 사용하는 코드에 따라 성능이 낮아질 수 있다.
따라서 클래스를 설계할 때 필수, 선택 인자들이 많은 경우 Builder 패턴을 사용하는 것이 효율적입니다.

@Builer

롬복에서는 위와같은 과정을 피하기 위해 어노테이션을 제공한다.

@Builder
public class User {
    private String name;
    private int age;
    private int hieght;
}

0개의 댓글