ํด๋น ๊ธ์ Gang of Four์ ๋์์ธ ํจํด ์ด๋ผ๋ ์ฑ ์ ์ฝ๊ณ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌ ๋ฐ ํ๊ณ ํ๋ ๊ธ ์ ๋๋ค. ์์ธํ ์ฌํญ์ YES 24 GoF์ ๋์์ธ ํจํด ์์ ํ์ธํด์ฃผ์ธ์.
GoF ์ ๋์์ธ ํจํด - ์ฌ์ฌ์ฉ์ฑ์ ์ง๋ ๊ฐ์ฒด์งํฅ ์ํํธ์จ์ด์ ํต์ฌ ์์
- ํ๋กํ ๋ฏธ๋์ด
- ์ง์์ด: ์๋ฆญ ๊ฐ๋ง, ์กด ๋ธ๋ฆฌ์ฌ์ด๋์ค, ๋ฆฌ์ฒ๋ ํฌ๋ฆ, ๋ํ ์กด์จ
- ์ฎ๊ธด์ด: ๊น์ ์
- ๋ค์ ๊ธ์ ํจ๊ป ์ฝ์ผ๋ฉด ์ข์ต๋๋ค.
Builder Pattern, ๋น๋ ํจํด
๋น๋ ํจํด์ ์์ฑ ํจํด์ค ํ๋๋ก, ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ๋๋ ์ ์๋๋ก ๋์์ฃผ๋ ํจํด์ด๋ค. ๋น๋ ํจํด์ ํตํด์ ๋์ผํ ์ฝ๋๋ก ๋ค์ํ ์ฑ์ง์ ๋๋ ํ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.
- ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ ํํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ ํด๋์ค๋ฅผ ๋ณ๋๋ก ๋ถ๋ฆฌํ๋ค.
- ์๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑ์ด ๋์๋๋ผ๋ ๋์ผํ ์ ์ฐจ๋ฅผ ์ ๊ณตํ ์ ์๋๋ก ํ๋ค.
๋๊ธฐ
๋ง์ฝ ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๊ณ ํ์ ๋, ์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ํ์๋ก ํ๋ค๊ณ ํด๋ณด์.
์๋ฅผ ๋ค์ด์ ์ผํ๋ชฐ ์์คํ ์์ ๋ฌผํ์ ๋ฑ๋กํ ๋ ํ ์ธ ๊ธฐ๊ฐ, ์ ์ฉ ์ด๋ฒคํธ, ๊ตฌ๋งค ๊ถํ ๋ฑ๋ฑ ์ด ํ์ํ๊ณ ๊ฐ๊ฐ์ ํญ๋ชฉ๋ค์ด ์์ ๋์ ์์ ๋ ๋ฌผํ์ ํํ์ด ๋ฌ๋ผ์ ธ์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ฆ, ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ์์ฑ์์ ์ฌ๋ฌ ์กฐ๊ฑด์ด ์๋ค๊ณ ํ๋ค๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๋๊ฒ ์์ฒด๋ง์ผ๋ก๋ ๊ฝค๋ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด ๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ ๋ค์ํ Builder ํด๋์ค ๋ฅผ ํตํด์ ์ฌ๋ฌ ๊ฐ์ ๋ค๋ฅธ ์์ฑ ํด๋์ค
๊ตฌํ
์ฐธ์ฌ ๊ฐ์ฒด
- Builder
- Product ์ ์์ฑ ๋จ๊ณ๋ฅผ ์ ์ธํด์ฃผ๋ ์ธํฐํ์ด์ค๋ก ๋ชจ๋ Builder ์ ์ถ์ ๊ฐ์ฒด์ด๋ค
ItemBuilder
- Product ์ ์์ฑ ๋จ๊ณ๋ฅผ ์ ์ธํด์ฃผ๋ ์ธํฐํ์ด์ค๋ก ๋ชจ๋ Builder ์ ์ถ์ ๊ฐ์ฒด์ด๋ค
- Director
- ํน์ Product ๋ฅผ ์์ฑํ ์ ์๋๋ก ๊ตฌ์ฑ๋ ๋จ๊ณ๋ฅผ ํธ์ถํ๋ ์์๋ฅผ ์ ์ํ๋ค
Director
- ํน์ Product ๋ฅผ ์์ฑํ ์ ์๋๋ก ๊ตฌ์ฑ๋ ๋จ๊ณ๋ฅผ ํธ์ถํ๋ ์์๋ฅผ ์ ์ํ๋ค
- ConcreteBuilder
- ์๋ก ๋ค๋ฅธ ๋จ๊ณ์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ Builder ์ ๊ตฌํ์ฒด์ด๋ค
NotebookBuilder
- ์๋ก ๋ค๋ฅธ ๋จ๊ณ์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ Builder ์ ๊ตฌํ์ฒด์ด๋ค
- Product
- ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ก ์๋ก ๋ค๋ฅธ Builder ์ ์ํด์ ์์ฑ๋๋ค.
Notebook
- ์ด์ธ์๋ Product ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ํ์ํ ๊ฐ์ฒด๋ค์ ๋์ดํด๋ณด์๋ฉด
CPU
์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธIntel
,M1
OS
์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธOSX
,Windows
GraphicCard
์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธGTX1080
,Radeon
- ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ก ์๋ก ๋ค๋ฅธ Builder ์ ์ํด์ ์์ฑ๋๋ค.
Builder - ItemBuilder Interface
Builder ์ธํฐํ์ด์ค๋ Product ์์ฑ์ ํ์ํ Step ๋ค์ ํํํ ์ ์๋ค.
Step ์ด๋ผ๊ณ ํจ์ ๊ฐ๊ฐ์ Product ๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ตฌ์ฑ๋ค์ ์ ์ธํ๋ค๋ ์๋ฏธ์ด๋ค.
public interface ItemBuilder {
void graphicCard(GraphicCard part);
void cpu(CPU part);
void os(OS os);
}
ConcreteBuilder - Desktop & Notebook Builder class
์ค์ Builder ์ ๊ตฌํ์ฒด๋ก ํ์ฌ๋ setter ๋ฅผ ์ฌ์ฉํ์ฌ Notebook ๊ฐ์ฒด์ ๋ ํผ๋ฐ์ค๋ค์ ์ ๋ฌํด์ค๋ค.
public class NotebookBuilder implements ItemBuilder {
private Notebook notebook = new Notebook();
public Notebook getProduct() {
return notebook;
}
@Override
public void graphicCard(GraphicCard graphicCard) {
notebook.setGraphicCard(graphicCard);
}
@Override
public void cpu(CPU cpu) {
notebook.setCpu(cpu);
}
@Override
public void os(OS os) {
notebook.setOs(os);
}
}
Product - Noteboo class ์ ๊ฐ๊ฐ์ ๋ถํ๋ค
Product ๋ ์ค์ Director
์ ์ํด์ ์์ฑ๋ ๋์์ธ๋ฐ, ๊ฐ์ฒด ์์ฑ์ ๋ณต์ก์ฑ์ ์ผ๋ถ ํํํ๊ธฐ ์ํด์ ์ฌ๋ฌ ์ธํฐํ์ด์ค์ ๊ฐ๊ฐ์ ๊ตฌํ์ฒด๋ฅผ ์ถ๊ฐํด๋ณผ ์๊ฐ์ด๋ค.
์ด๋ค์ Notebook ์ ์์ฑํ๊ธฐ ์ํด์ ํ์ํ ๋ถํ๋ค์ด๋ค.
public interface CPU {
String describe();
}
public interface GraphicCard {
String describe();
}
public interface OS {
String describe();
}
public class Intel implements CPU {
@Override
public String describe() {
return "Intel CPU";
}
}
public class M1 implements CPU {
@Override
public String describe() {
return "M1 CPU";
}
}
public class GTX1080 implements GraphicCard {
@Override
public String describe() {
return "GTX1080 Graphic Card";
}
}
public class Radeon implements GraphicCard {
@Override
public String describe() {
return "Radeon Graphic Card";
}
}
public class OSX implements OS {
@Override
public String describe() {
return "Apple's OSX";
}
}
public class Windows implements OS {
@Override
public String describe() {
return "MS's Windows";
}
}
์ด์ ์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ Product ์ธ ๊ฐ์ฒด๋ฅผ ์ ์ํด๋ณด์.
public class Notebook {
private CPU cpu;
private GraphicCard graphicCard;
private OS os;
public void setCpu(CPU cpu) {
this.cpu = cpu;
}
public void setGraphicCard(GraphicCard graphicCard) {
this.graphicCard = graphicCard;
}
public void setOs(OS os) {
this.os = os;
}
@Override
public String toString() {
return "{" +
"cpu=[" + cpu.describe() + "] " +
", graphicCard=[" + graphicCard.describe() + "] " +
", os=[" + os.describe() + "] " +
"} ์
๋๋ค.";
}
}
Director - Director Class
Director ๋ ์ค์ ๋ก Builder ์ ๊ตฌํ์ฒด๋ค์ ํตํด์ ์ด๋ค ์์๋ก, ์ด๋ค ๋ฐฉ์์ผ๋ก Product ๋ฅผ ์์ฑํ ์ง ๋ช ์ํด์ฃผ๊ณ ์์ฑํ๋ ์ฑ ์์ ๊ฐ๋๋ค.
public class Director {
public Notebook macBook2022(NotebookBuilder builder) {
builder.cpu(new M1());
builder.graphicCard(new Radeon());
builder.os(new OSX());
return builder.getProduct();
}
public Notebook macBook2021(NotebookBuilder builder) {
builder.cpu(new Intel());
builder.graphicCard(new Radeon());
builder.os(new OSX());
return builder.getProduct();
}
public Notebook samsungGalaxyBook(NotebookBuilder builder) {
builder.cpu(new Intel());
builder.graphicCard(new GTX1080());
builder.os(new Windows());
return builder.getProduct();
}
}
์์ ์ฝ๋๋ฅผ ๋ณด๊ฒ ๋๋ค๋ฉด, Builder ๋ฅผ ํตํด์ ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ค์ํ ๋ฐฉ๋ฒ์ ํตํด์ ์์ฑํ ์ ์๊ณ , ์ด๋ค์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํํํ ์ ์๊ฒ ๋๋ค.
์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ๊ฐ์ฒด๋ฅผ step-by-step ์ผ๋ก ์์ฑํ ์ ์๋๋ก ๋์์ค๋ค.
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํํ์ ํต์ผ์์ผ์ค๋ค
- ๋ณต์กํ ์์ฑ ๊ณผ์ ์ ๋ถ๋ฆฌํจ์ผ๋ก SRP ๋ฅผ ๋ง์กฑ์ํฌ ์ ์๊ฒ ๋๋ค
๋จ์
- ์ฌ๋ฌ ๊ฐ์ ์๋ก์ด ํด๋์ค๋ฅผ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์คํ ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ค
์ ๋ฆฌ
Builder ํจํด์ ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ๋จ๊ณ๋ณ๋ก ๊ตฌ์ฑํจ์ ์ค์ ์ ๋๊ณ ์๋ค.
์ด์ ๊ฐ์ ๋งฅ๋ฝ์ผ๋ก๋ Effective Java ์์ ์๊ฐ๋ Builder ์ฆ, Spring ์ง์์์ ๋ง์ด ์ฌ์ฉ๋๋ Lombok ์ Builder ๊ณผ ๋งฅ๋ฝ์ ๊ณต์ ํ๊ณ ์๋ค.
ํ์ง๋ง Effective Java ์ Gof ์์ ๋งํ๋ Builder ๋ ์กฐ๊ธ ๋ค๋ฅด๋ค.
- Effective Java's Builder
- ์ ์ฆ์ ์์ฑ์ ํจํด
- ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ์ฑ, ๊ฐ์ฒด ์ผ๊ด์ฑ, ์ฝ๋ ๊ฐ๋ ์ฑ ์ค์
- ์ฝ๋ฉ ์คํ์ผ์ ์ค์ ์ ๋
- GoF's Builder
- ๊ฐ์ฒด์ ์์ฑ ๋ฐฉ๋ฒ๊ณผ ์กฐ๋ฆฝ(๊ตฌ์ฑ) ๋ฐฉ๋ฒ์ ๋ถ๋ฆฌ์ ์ค์
- ์ํคํ ์ฒ์ ๊ฐ์ฒด ์งํฅ์ ์ค์ ์ ๋ (์ดํํฐ๋ธ ์๋ฐ๋ณด๋ค ์ค๋ ์ ์ถํ๋จ)
๋๊ธ