SpringBoot 공부 중에 @Builder 패턴에 대한 이해가 필요하여 @Builder 어노테이션설정으로 인하여 어떻게 동작 하는지 알아보기 위하여 정리
1. Java Builder Pattern
@Builder
public class Response {
private Long id;
private String name;
public Response(Long id, String name) {
this.id = id;
this.name = name;
}
public static ResponseBuilder builder() {
return new ResponseBuilder();
}
public static class ResponseBuilder {
private Long id;
private String name;
ResponseBuilder() {}
public ResponseBuilder id(Long id) {
this.id = id;
return this;
}
public ResponseBuilder name(String name) {
this.name = name;
return this;
}
public Response build() {
return new Response(id, name);
}
@Override
public String toString() {
return "ResponseBuilder{" + "id=" + id + ", name='" + name + '\'' + '}';
}
}
}
2. @Builder
- 빌더패턴을 이용했을 때 가장 큰 장점은 멤버변수의 optional과 required를 컴파일하는 시점에서 체크할 수 있다는 점
- 특정 멤버변수에 접근하기 위한 메서드가 정해져 있기 때문에 실수로 다른 멤버변수에 다른 값을 집어넣는 실수를 막을 수 있다.
@Builder
public class Response {
private Long id;
private String name;
public Response(Long id, String name) {
this.id = id;
this.name = name;
}
}
3. Builder를 활용하기
import static java.lang.Thread.sleep;
public class ThreadBuilderTest {
public static void main(String[] args) {
ThreadOuter th = new ThreadOuter();
th.start();
ThreadOuter01 th01 = new ThreadOuter01();
th01.start();
for(int i = 11 ; i < 20 ; i++) {
Response res = Response.builder()
.id(Long.valueOf(i))
.name("thread" + i)
.build();
System.out.println(res.toString() + " :: " + Thread.currentThread().getName());
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class ThreadOuter extends Thread {
@Override
public void run() {
for(int i = 0 ; i < 10 ; i++) {
Response res = Response.builder()
.id((long) i)
.name("thread01" + i)
.build();
System.out.println(res.toString() + " :: " + getName());
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class ThreadOuter01 extends Thread {
@Override
public void run() {
for(int i = 21 ; i < 30 ; i++) {
Response res = Response.builder()
.id((long) i)
.name("thread02" + i)
.build();
System.out.println(res.toString() + " :: " + getName());
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}