Design Pattern with Java

4. builder 패턴(gof)

초코너무조코 2025. 1. 7. 14:37
728x90

gof builder 패턴 코드에 대한 분석을 바탕으로 Builder 패턴에 대해서 알아보기로 했습니다.

 

MakeReport는 Java 인터페이스로, 보고서를 생성하는 기본 구조를 정의합니다. 이 인터페이스는 Header, Body, Footer 세 가지 주요 요소를 생성하는 메서드와 최종적으로 보고서를 반환하는 메서드를 포함하고 있습니다. 이러한 설계는 확장성과 유연성을 고려한 객체지향 프로그래밍(OOP)의 인터페이스 기반 설계 원칙을 잘 보여줍니다.


코드 분석

package gof;

public interface MakeReport {

    public void MakeHeader();
    public void MakeBody();
    public void MakeFooter();

    public String getReport();
}

주요 구성 요소

  1. MakeHeader()
    • 보고서의 헤더를 생성하는 메서드입니다.
    • 헤더에는 회사 이름, 날짜, 제목과 같은 일반적인 정보가 포함될 수 있습니다.
  2. MakeBody()
    • 보고서의 본문을 작성합니다.
    • 주요 내용, 통계 데이터, 분석 결과 등을 담을 수 있습니다.
  3. MakeFooter()
    • 보고서의 푸터를 생성합니다.
    • 작성자 정보, 페이지 번호, 저작권 정보 등이 포함될 수 있습니다.
  4. getReport()
    • 보고서를 생성한 후 최종적으로 반환하는 메서드입니다.
    • 이 메서드를 통해 완성된 보고서를 String 형태로 전달받을 수 있습니다.

인터페이스 설계 특징

  • 추상화: 구체적인 구현 내용이 없으며, 이를 통해 다양한 보고서 형식에 대해 동일한 메서드 구조를 강제합니다.
  • 유연성: 다양한 보고서 형식(HTML, PDF, Plain Text 등)을 지원하려면 해당 인터페이스를 구현하여 커스텀 보고서를 쉽게 제작할 수 있습니다.
  • 확장성: 새 보고서 형식을 추가할 때 기존 코드를 변경하지 않고도 확장이 가능합니다. (OCP 원칙 준수)

활용 사례

  1. HTML 보고서 생성
public class HtmlReport implements MakeReport {

    private StringBuilder report = new StringBuilder();

    @Override
    public void MakeHeader() {
        report.append("<header><h1>HTML Report</h1></header>");
    }

    @Override
    public void MakeBody() {
        report.append("<body><p>This is the body of the report.</p></body>");
    }

    @Override
    public void MakeFooter() {
        report.append("<footer><p>Footer Information</p></footer>");
    }

    @Override
    public String getReport() {
        return report.toString();
    }
}
  1. Plain Text 보고서 생성
public class TextReport implements MakeReport {

    private StringBuilder report = new StringBuilder();

    @Override
    public void MakeHeader() {
        report.append("=== Report Header ===\n");
    }

    @Override
    public void MakeBody() {
        report.append("This is the body of the report.\n");
    }

    @Override
    public void MakeFooter() {
        report.append("=== Report Footer ===\n");
    }

    @Override
    public String getReport() {
        return report.toString();
    }
}

사용 예제

public class ReportDemo {
    public static void main(String[] args) {
        MakeReport htmlReport = new HtmlReport();
        htmlReport.MakeHeader();
        htmlReport.MakeBody();
        htmlReport.MakeFooter();
        System.out.println(htmlReport.getReport());

        MakeReport textReport = new TextReport();
        textReport.MakeHeader();
        textReport.MakeBody();
        textReport.MakeFooter();
        System.out.println(textReport.getReport());
    }
}

출력 결과

<header><h1>HTML Report</h1></header><body><p>This is the body of the report.</p></body><footer><p>Footer Information</p></footer>
=== Report Header ===
This is the body of the report.
=== Report Footer ===

장점 및 단점

장점

  1. 코드 재사용성: 동일한 인터페이스를 통해 다양한 보고서 형식을 구현할 수 있습니다.
  2. 유지보수성: 보고서 형식을 변경하거나 추가할 때 기존 코드에 영향을 주지 않습니다.
  3. OCP(Open-Closed Principle): 새로운 보고서 형식을 추가할 때 기존 인터페이스 구조를 변경할 필요가 없습니다.

단점

  1. 복잡성 증가: 간단한 보고서 생성에도 여러 클래스를 만들어야 할 수 있습니다.
  2. 구현 의존성: 인터페이스를 사용할 때 구현체를 직접 지정해야 하므로, DI(Dependency Injection) 또는 Factory 패턴이 필요할 수 있습니다.

결론

MakeReport 인터페이스는 확장성과 재사용성을 극대화하기 위해 설계되었습니다. 이를 활용하면 다양한 보고서 형식을 체계적으로 생성하고 관리할 수 있습니다. 그러나 단순한 요구사항에서는 과도한 설계가 될 수도 있으므로, 프로젝트의 복잡도와 요구사항에 따라 적절히 활용하는 것이 중요합니다.

728x90