๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- ๊ธฐํƒ€

[๊ฐœ๋ฐœ์ž ์ฑ…์ฝ๊ธฐ] Java๋กœ ํ•ด์„ํ•œ GoF ์˜ Design Pattern (์ƒ์„ฑ - ๋นŒ๋” ํŒจํ„ด)

by Wonit 2022. 3. 12.

ํ•ด๋‹น ๊ธ€์€ Gang of Four์˜ ๋””์ž์ธ ํŒจํ„ด ์ด๋ผ๋Š” ์ฑ…์„ ์ฝ๊ณ  ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ ํ•˜๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ YES 24 GoF์˜ ๋””์ž์ธ ํŒจํ„ด ์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

 

GoF ์˜ ๋””์ž์ธ ํŒจํ„ด - ์žฌ์‚ฌ์šฉ์„ฑ์„ ์ง€๋‹Œ ๊ฐ์ฒด์ง€ํ–ฅ ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ•ต์‹ฌ ์š”์†Œ

 

  • ํ”„๋กœํ… ๋ฏธ๋””์–ด
  • ์ง€์€์ด: ์—๋ฆญ ๊ฐ๋งˆ, ์กด ๋ธ”๋ฆฌ์‚ฌ์ด๋“œ์Šค, ๋ฆฌ์ฒ˜๋“œ ํ—ฌ๋ฆ„, ๋ž„ํ”„ ์กด์Šจ
  • ์˜ฎ๊ธด์ด: ๊น€์ •์•„

 

 


 

Builder Pattern, ๋นŒ๋” ํŒจํ„ด

 

๋นŒ๋” ํŒจํ„ด์€ ์ƒ์„ฑ ํŒจํ„ด์ค‘ ํ•˜๋‚˜๋กœ, ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํŒจํ„ด์ด๋‹ค. ๋นŒ๋” ํŒจํ„ด์„ ํ†ตํ•ด์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋กœ ๋‹ค์–‘ํ•œ ์„ฑ์งˆ์„ ๋„๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋ณ„๋„๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.
  • ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑ์ด ๋˜์—ˆ๋”๋ผ๋„ ๋™์ผํ•œ ์ ˆ์ฐจ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

๋™๊ธฐ

 

๋งŒ์•ฝ ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์‡ผํ•‘๋ชฐ ์‹œ์Šคํ…œ์—์„œ ๋ฌผํ’ˆ์„ ๋“ฑ๋กํ•  ๋•Œ ํ• ์ธ ๊ธฐ๊ฐ„, ์ ์šฉ ์ด๋ฒคํŠธ, ๊ตฌ๋งค ๊ถŒํ•œ ๋“ฑ๋“ฑ ์ด ํ•„์š”ํ•˜๊ณ  ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ๋“ค์ด ์žˆ์„ ๋•Œ์™€ ์—†์„ ๋•Œ ๋ฌผํ’ˆ์˜ ํ‘œํ˜„์ด ๋‹ฌ๋ผ์ ธ์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

์ฆ‰, ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ์„ฑ์ž์— ์—ฌ๋Ÿฌ ์กฐ๊ฑด์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š”๊ฒƒ ์ž์ฒด๋งŒ์œผ๋กœ๋„ ๊ฝค๋‚˜ ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์ด ๋  ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋‹ค์–‘ํ•œ Builder ํด๋ž˜์Šค ๋ฅผ ํ†ตํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๋ฅธ ์ƒ์„ฑ ํด๋ž˜์Šค

 

๊ตฌํ˜„

 

์ฐธ์—ฌ ๊ฐ์ฒด

 

  • Builder
    • Product ์˜ ์ƒ์„ฑ ๋‹จ๊ณ„๋ฅผ ์„ ์–ธํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ชจ๋“  Builder ์˜ ์ถ”์ƒ ๊ฐ์ฒด์ด๋‹ค
      • ItemBuilder
  • Director
    • ํŠน์ • Product ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋œ ๋‹จ๊ณ„๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ˆœ์„œ๋ฅผ ์ •์˜ํ•œ๋‹ค
      • Director
  • ConcreteBuilder
    • ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  Builder ์˜ ๊ตฌํ˜„์ฒด์ด๋‹ค
      • NotebookBuilder
  • Product
    • ๊ฒฐ๊ณผ ๊ฐ์ฒด๋กœ ์„œ๋กœ ๋‹ค๋ฅธ Builder ์— ์˜ํ•ด์„œ ์ƒ์„ฑ๋œ๋‹ค.
      • Notebook
    • ์ด์™ธ์—๋„ Product ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์„ ๋‚˜์—ดํ•ด๋ณด์ž๋ฉด
      • CPU ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด์ธ Intel, M1
      • OS ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด์ธ OSX, Windows
      • GraphicCard ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด์ธ GTX1080, Radeon

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
    • ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐฉ๋ฒ•๊ณผ ์กฐ๋ฆฝ(๊ตฌ์„ฑ) ๋ฐฉ๋ฒ•์˜ ๋ถ„๋ฆฌ์— ์ค‘์ 
    • ์•„ํ‚คํ…์ฒ˜์™€ ๊ฐ์ฒด ์ง€ํ–ฅ์— ์ค‘์ ์„ ๋‘  (์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”๋ณด๋‹ค ์˜ค๋ž˜ ์ „ ์ถœํŒ๋จ)

๋Œ“๊ธ€