๐ค ์ํฉ
@OneToMany ์ ๋ ธํ ์ด์ ์ ํตํด ์ฐ๊ด ๊ด๊ณ ๋งคํ ์ NPE๋ฅผ ํผํ๊ธฐ ์ํด ๊ด๋ก์ ๋ฐ๋ผ Collection์ ์ด๊ธฐํ ํด์ฃผ์์ง๋ง ์ง์์ ์ผ๋ก ๋งคํ ํ๋์์ NullPointerException์ด ๋ฐ์ํ๋ ์ด์๊ฐ ์์๋ค.
๐ง๐ป ๋ฌธ์ ํ์
์ด๊ธฐํ๋ฅผ ํด์ค์๋ ํ๋์ ์ด๊ธฐํ๊ฐ ๋์ง ์๋ ๊ฒ์ @Builder ์ ๋ ธํ ์ด์ ์ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์๋๋๊ฑด ์๋๊น ๊ณ ๋ฏผํด๋ณด์๋ค.
@Builder ์ ๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ ์์ฑ ์ ๋์ผํ ํ๋๋ฅผ ๊ฐ์ง ๋ด๋ถ Builder ํด๋์ค๋ฅผ ํตํด ์ค์ ๋ ์์ฑ์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค.
์ด ๋, ๋ด๋ถ ํด๋์ค์ ํ๋๋ ํ ๋ฒ ๊ฐ์ด ์ง์ ๋ ์ดํ์๋ ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ Non-Final ํํ๋ก ํ๋๊ฐ ์ง์ ๋๋ค.
๋ฐ๋ผ์, ๋ด๋ถ Builder ํด๋์ค์ Non-final ํํ๋ก ์ง์ ๋ ํ๋๋ ์ ์ญ๋ณ์๋ก ์กด์ฌํ๊ฒ ๋๊ณ ์ด๊ธฐ ์์ฑ ์์ ์ด๋ค ๊ฐ์ผ๋ก๋ ์ด๊ธฐํ ๋์ง ์์๊ธฐ ๋๋ฌธ์ null๊ฐ์ด ๋ค์ด๊ฐ ์๋ ์ํ์ด๋ค.
์ด๋ฐ ์ด์ ๋ก, ํด๋์ค ๋ ๋ฒจ Builder ์ฌ์ฉ ์ ํ๋๋ฅผ ์ด๊ธฐํ ํด๋ NPE๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
class Example<T> {
private T foo;
private final String bar; // final
private Example(T foo, String bar) {
this.foo = foo;
this.bar = bar;
}
public static <T> ExampleBuilder<T> builder() {
return new ExampleBuilder<T>();
}
public static class ExampleBuilder<T> {
private T foo;
private String bar; // non-final
private ExampleBuilder() {}
public ExampleBuilder foo(T foo) {
this.foo = foo;
return this;
}
public ExampleBuilder bar(String bar) {
this.bar = bar;
return this;
}
@java.lang.Override public String toString() {
return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
}
public Example build() {
return new Example(foo, bar);
}
}
}
๐ก ํด๊ฒฐ
@Builder๋ฅผ ํตํด ๊ฐ์ฒด ์์ฑ ์ ํ๋ ๊ฐ์ ์ด๊ธฐํ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ด๊ธฐํ ํ๊ณ ์ ํ๋ ํ๋์ @Builder.Default๋ฅผ ์ฌ์ฉํด์ค๋ค.