본문 바로가기
BackEnd

Java Service Tree Framework 의 컴퍼지트(Composite) 패턴 설명 ( Tree Entity 의 1:N, N:1, N:N, 양방향, 단방향 )

by 313devgrp 2023. 6. 29.

컴퍼지트(Composite) 패턴은 객체들을 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴입니다. 이 패턴은 개별 객체와 그 객체들을 조합한 복합 객체를 동일한 방식으로 다룰 수 있도록 해줍니다. 자바 코드를 통해 컴퍼지트 패턴의 예시를 살펴보겠습니다.

가정해보겠습니다. 우리는 조직 구조를 표현하는 프로그램을 개발하고 있습니다. 조직은 부서(Department)와 직원(Employee)으로 구성되어 있습니다. 부서는 여러 개의 부서와 직원을 가질 수 있습니다. 컴퍼지트 패턴을 사용하여 조직 구조를 표현해보겠습니다.

먼저, 조직 구성원을 나타내는 Component 인터페이스를 정의합니다:

public interface Component {
    void showDetails();
}

다음으로, 부서(Department) 클래스를 만듭니다. 이 클래스는 Component를 구현하며, 부서 이름과 부서에 속한 구성원들을 저장하는 리스트를 가지고 있습니다:

import java.util.ArrayList;
import java.util.List;

public class Department implements Component {
    private String name;
    private List<Component> members;
    
    public Department(String name) {
        this.name = name;
        this.members = new ArrayList<>();
    }
    
    public void addMember(Component member) {
        members.add(member);
    }
    
    public void removeMember(Component member) {
        members.remove(member);
    }
    
    @Override
    public void showDetails() {
        System.out.println("Department: " + name);
        for (Component member : members) {
            member.showDetails();
        }
    }
}

Department 클래스는 addMember() 메서드와 removeMember() 메서드를 사용하여 부서에 구성원을 추가하거나 제거할 수 있습니다. showDetails() 메서드에서는 부서 이름을 출력하고, 속한 구성원들의 세부 정보를 출력합니다.

마지막으로, 직원(Employee) 클래스를 만듭니다. 이 클래스는 Component를 구현하며, 직원의 이름과 역할을 가지고 있습니다:

public class Employee implements Component {
    private String name;
    private String role;
    
    public Employee(String name, String role) {
        this.name = name;
        this.role = role;
    }
    
    @Override
    public void showDetails() {
        System.out.println("Employee: " + name + " (" + role + ")");
    }
}

Employee 클래스는 showDetails() 메서드에서 직원의 이름과 역할을 출력합니다.

이제 컴퍼지트 패턴을 사용하여 조직 구조를 표현하는 예시 코드를 작성합니다:

public class Main {
    public static void main(String[] args) {
        // 부서 생성
        Department engineering = new Department("Engineering");
        
        // 직원 생성
        Employee john = new Employee("John", "Engineer");
        Employee jane = new Employee("Jane", "Engineer");
        Employee mark = new Employee("Mark", "Manager");
        
        // 부서에 직원 추가
        engineering.addMember(john);
        engineering.addMember(jane);
        engineering.addMember(mark);
        
        // 하위 부서 생성
        Department development = new Department("Development");
        Employee mike = new Employee("Mike", "Developer");
        Employee lisa = new Employee("Lisa", "Developer");
        
        // 하위 부서에 직원 추가
        development.addMember(mike);
        development.addMember(lisa);
        
        // 상위 부서에 하위 부서 추가
        engineering.addMember(development);
        
        // 조직 구조 출력
        engineering.showDetails();
    }
}

위 예시에서는 Department 클래스와 Employee 클래스를 사용하여 조직 구조를 표현합니다. 부서와 직원을 생성하고, 부서에 구성원을 추가합니다. Department 클래스는 자신의 구성원들을 관리하며, showDetails() 메서드를 사용하여 조직 구조를 출력합니다.

실행 결과는 다음과 같습니다:

Department: Engineering
Employee: John (Engineer)
Employee: Jane (Engineer)
Employee: Mark (Manager)
Department: Development
Employee: Mike (Developer)
Employee: Lisa (Developer)

이 예시에서는 컴퍼지트 패턴을 사용하여 조직 구조를 표현하였습니다. Department 클래스와 Employee 클래스는 동일한 방식으로 다루어지며, 조직 구조의 확장과 유지보수에 용이한 구조를 제공합니다.