먼저 이 패턴을 사용하게 된 계기는 api response에서 http status code처럼 result를 return하려고 하려다 보니 이 result라는 놈이 특정 에러에 따라 정해지는 것이라 메소드 이름에 내용을 정해서 파라미터를 정하면 어떨까 하고 사용하게 되었습니다.
Result model입니다. builder 패턴에 Success, failWithNotFoundPath같은 이름에 따라 내용이 정해지게 됩니다.
@Getter
@ToString
@Builder(builderClassName = "Builder")
public class MyResult {
private boolean succeed;
private String majorCode;
private String minorCode;
public static class Builder {
public Builder success() {
this.succeed = true;
this.majorCode = "200";
this.minorCode = "0000";
return this;
}
public Builder failWithNotFoundPath() {
this.succeed = false;
this.majorCode = "404";
this.minorCode = "4001";
return this;
}
}
}
builder 패턴은 객체 생성에 관련된 파라미터가 많을 때 깔끔하게 생성을 해주는 장점이 있습니다. 또한 builder에 변경된 파라미터들이 세팅된 후 build()를 하는 시점에 불변하게 만들 수 있는 장점도 있습니다. 하지만 결국 이 패턴도 변경될 파라미터들이 많아지면 복잡해 지는건 마찬가지 입니다.
위의 예제는 3개밖에 안되는 파라미터지만 더 많아도 메소드 이름을 잘 지으면 숫자로 된 result code들이 사람이 읽을 수 있는 string으로 대체되는 효과가 있습니다.
아래는 해당 result를 test하는 코드입니다.
@Component
public class BuilderRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
MyResult myResult = MyResult.builder().failWithNotFoundPath().build();
System.out.println(myResult.toString());
System.out.println("Value of majorCode on failure : " + myResult.getMajorCode());
myResult = MyResult.builder().success().build();
System.out.println(myResult.toString());
System.out.println("Before changed value of majorCode : " + myResult.getMajorCode());
myResult = MyResult.builder().success().majorCode("201").build();
System.out.println(myResult.toString());
System.out.println("After changed value of majorCode : " + myResult.getMajorCode());
}
}
결과는 예상하신 것과 같으실 거예요.
MyResult(succeed=false, majorCode=404, minorCode=4001)
Value of majorCode on failure : 404
MyResult(succeed=true, majorCode=200, minorCode=0000)
Before changed value of majorCode : 200
MyResult(succeed=true, majorCode=201, minorCode=0000)
After changed value of majorCode : 201
'Programming > Java' 카테고리의 다른 글
java print api 주의 사항 (0) | 2021.01.15 |
---|---|
왜 돈 연산에는 Floating-point type을 쓰면 안되나? (0) | 2020.06.30 |
JVM Garbage Collection Basic (0) | 2019.05.10 |
Non-blocking, Blocking (0) | 2019.03.18 |
Asynchronous (VS Synchronous) (0) | 2019.03.18 |