객체에 변수에 직접 접근하는 것을 막기 위해 보통 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은 위와 같은 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의 메소드를 정의하는 것을 대신할 수 있다.