builder 패턴,Lombok

ttomy·2022년 1월 16일

개념정리

목록 보기
5/6

builder 패턴

객체에 변수에 직접 접근하는 것을 막기 위해 보통 private로 변수를 선언하고 getter,setter로 변수에 우회적으로 접근을 허용한다.
이 때 class의 인자들은 필수적으로 받아야할 것이 있고,선택적으로 받아야 할 것이 있다. 이로 인해 인자들의 선택적으로 입력되는 경우의 수만큼 생성자가 더 선언되어야 해 번거롭고, 생성자의 인자만으로 어떤 변수에 값이 할당되는지 알기힘든 면이 있어 명시성이 떨어지는 단점이 있다.

이를 보완하기 위해 builder패턴이 있다.

public class UserInfoBuilder {
   private String name;
   private int age;
   private String addr;

   public UserInfoBuilder setName(String name){
       this.name = name;
       return this;
   }

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

   public UserInfoBuilder setAddr(String addr){
       this.addr = addr;
       return this;
   }

   public UserInfo build(){
       return new UserInfo(name, age, addr);
   }
}

위의 코드처럼 builder안에서 변수마다 set하는 함수를 정의한다.

UserInfoBuilder userInfoBuilder = new UserInfoBuilder();
UserInfo userInfo3 = userInfoBuilder
        .setName("테스트")
        .setAddr("address")
        .setAge(25)
        .build();

그리고 위 코드처럼 builder.set변수()함수.build() 형식으로 더 명시적으로 객체를 생성할 수 있다. 단점이라면 생성자 하나로 객체를 생성할 때보다 많은 함수를 실행하게 되어 속도면에서 조금이지만 불리하다.

Lombok

Lombok은 위와 같은 getter,setter,builer 등의 메서드를 지원하는 라이브러리이다. 이외에도 toString(),생성자 등 클래스에 대한 다양한 코드작성을 어노테이션으로 간단하게 대체할 수 있다.


@Getter 
@NoArgsConstructor 
public class Store { 
private String companyName;
private String industryTypeCode;

	@Builder 
	public Store(String companyName, String industryTypeCode){ 
    		this.companyName = companyName;
    		this.industryTypeCode = industryTypeCode; 
        } 
}


@RestController 
@RequestMapping(value = "/store") 
public class StoreController { 

	@GetMapping(value = "/init") 
	private ResponseEntity init(){ 
		Store store = Store.builder()
    	    	.companyName("회사이름") 
            	.industryTypeCode("업종코드") 
            	.build(); 
            
        	return ResponseEntity.ok(store);
       } 
}

Builder 패턴를 예로 들면 위와 같이 @Builder 어노테이션으로
Builder의 메소드를 정의하는 것을 대신할 수 있다.

0개의 댓글