중앙정보기술인재개발원/JAVA

[JAVA] Depdency, DI, Composition, Aggregation

soidev 2025. 3. 26. 16:56

1. Dependency (의존성)

✔ 개념

  • A 클래스가 B 클래스를 잠깐 사용하는 관계
  • A가 동작할 때 B가 필요하지만, A가 B를 직접 소유하진 않음.
  • 즉, A는 B 없이는 기능을 수행할 수 없지만, B가 A와 완전히 묶여 있진 않음.

✔ 예제 코드

class BBB {
    public void bbbMethod() {
        System.out.println("BBB 메서드 실행!");
    }
}

class AAA {
    public void method1(BBB b) { // 의존성 (Dependency)
        b.bbbMethod();  // AAA는 필요할 때만 BBB를 사용
    }
}

public class Main {
    public static void main(String[] args) {
        AAA a = new AAA();
        BBB b = new BBB();
       
        a.method1(b);  // BBB 객체를 만들어서 AAA에 전달
    }
}

📌 설명

  • AAA 클래스는 BBB가 없으면 method1()을 실행할 수 없음.
  • 하지만 AAA가 BBB를 직접 생성하진 않음! (BBB는 외부에서 만들어서 넣어줌)
  • 이런 관계를 "의존성(Dependency)" 이라고 해.
    (AAA는 BBB를 "잠깐" 필요로 하는 거지, 소유하고 있진 않아.)

2. 의존성 주입 (Dependency Injection, DI)

DI는 Dependency(의존성)를 해결하는 방법 중 하나

✔ 개념

  • A가 B를 직접 생성하지 않고, 외부에서 주입받는 방식
  • A가 B의 생성 책임을 가지지 않음 → 유지보수가 쉬움
  • DI에는 3가지 방법이 있음:
    1. 생성자 주입 (Constructor Injection)
    2. 세터 주입 (Setter Injection)
    3. 필드 주입 (Field Injection) (Spring에서 주로 사용됨)

3. 생성자 주입 (Constructor Injection)

✔ 개념

  • A 클래스가 생성될 때, 외부에서 B 객체를 받아서 저장하는 방식
  • B 객체를 먼저 생성해야 A를 만들 수 있음.

✔ 예제 코드

class BBB {
    public void bbbMethod() {
        System.out.println("BBB 메서드 실행!");
    }
}

class AAA {
    private BBB b;

    // 생성자로 의존성 주입 (Constructor Injection)
    public AAA(BBB b) {
        this.b = b;
    }

    public void method1() {
        b.bbbMethod();
    }
}

public class Main {
    public static void main(String[] args) {
        BBB b = new BBB();  // BBB 객체 먼저 생성
        AAA a = new AAA(b);  // 생성자를 통해 BBB를 AAA에 주입

        a.method1();
    }
}

📌 설명

    • AAA가 BBB 객체를 직접 생성하는 게 아니라, 생성자로 전달받음.
    • AAA를 만들려면 BBB가 먼저 있어야 함 → A와 B의 관계가 느슨해짐(유연함).
    • 유지보수가 쉬워지고, 테스트하기 쉬워짐.

4. 세터 주입 (Setter Injection)

✔ 개념

      • A가 B를 직접 생성하지 않고, set 메서드를 통해 나중에 주입받는 방식
      • 객체를 생성한 후에도 다른 B 객체를 넣을 수 있음.

✔ 예제 코드

class BBB {
    public void bbbMethod() {
        System.out.println("BBB 메서드 실행!");
    }
}

class AAA {
    private BBB b;

    // 세터 메서드를 통한 의존성 주입 (Setter Injection)
    public void setB(BBB b) {
        this.b = b;
    }

    public void method1() {
        if (b != null) {
            b.bbbMethod();
        } else {
            System.out.println("BBB 객체가 없습니다.");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        AAA a = new AAA();
        BBB b = new BBB();

        a.setB(b);  // 나중에 BBB를 주입
        a.method1();
    }
}

📌 설명

  • AAA 객체를 만들 때 BBB가 없어도 됨.
  • setB(BBB b) 메서드를 이용해서 나중에 BBB 객체를 주입할 수 있음.
  • 유연성이 높음! (객체 생성 후에도 B를 바꿀 수 있음.)

5. 집합 (Aggregation)

✔ 개념

  • A가 B를 포함하고 있지만, B의 생명주기는 A와 독립적
  • 즉, A가 없어져도 B는 계속 존재할 수 있음.
  • 외부에서 만든 B 객체를 A에 전달하는 방식 → 의존성 주입(DI)과 비슷함.
  • "약한 관계"

✔ 예제 코드

class BBB {
    public void bbbMethod() {
        System.out.println("BBB 메서드 실행!");
    }
}

class AAA {
    private BBB b; // Aggregation: AAA가 BBB를 포함

    public AAA(BBB b) { // 생성자로 외부에서 주입
        this.b = b;
    }

    public void method1() {
        b.bbbMethod();
    }
}

public class Main {
    public static void main(String[] args) {
        BBB b = new BBB(); // BBB 객체는 독립적으로 생성됨
        AAA a = new AAA(b); // AAA가 BBB를 포함하지만, BBB는 다른 곳에서도 사용 가능

        a.method1();
    }
}

📌 설명

  • AAA는 BBB를 포함하고 있지만, 직접 생성하진 않음.
  • BBB 객체는 AAA가 없어져도 다른 곳에서 사용할 수 있음.
  • 의존성 주입(DI)과 비슷한 개념!

6. 구성 (Composition)

✔ 개념

    • A가 B를 "완전히 소유"하는 관계 (B는 A의 일부)
    • A가 없어지면 B도 함께 삭제됨.
    • 즉, B의 생명주기는 A에 종속됨.
      class BBB {
          public void bbbMethod() {
              System.out.println("BBB 메서드 실행!");
          }
      }

      class AAA {
          private BBB b = new BBB(); // Composition: AAA가 BBB를 완전히 소유

          public void method1() {
              b.bbbMethod();
          }
      }

      public class Main {
          public static void main(String[] args) {
              AAA a = new AAA();  // AAA가 생성될 때 BBB도 함께 생성됨
              a.method1();
              // AAA가 없어지면 BBB도 함께 없어짐
          }
      }

📌 설명

    • AAA는 BBB를 포함하고 있지만, 직접 생성하진 않음.
    • BBB 객체는 AAA가 없어져도 다른 곳에서 사용할 수 있음.
    • 의존성 주입(DI)과 비슷한 개념!
    • 독립적으로 존재 가능한 관계

🔹 1. 유연성과 의존성의 관계

유연성이 높다 = 변경하기 쉽다
유연성이 낮다 = 변경하기 어렵다

즉, AAA 클래스가 BBB 클래스에 얼마나 강하게 묶여 있는지에 따라 유연성이 달라짐.

  • 의존성이 낮을수록 → 유연성이 높아짐 (다른 코드로 쉽게 교체 가능)
  • 의존성이 높을수록 → 유연성이 낮아짐 (다른 코드로 바꾸기 어려움)

'중앙정보기술인재개발원 > JAVA' 카테고리의 다른 글

[JAVA] Linked List  (3) 2025.04.01
[JAVA] 상속, 다형성  (0) 2025.03.27
[JAVA] 싱글톤  (1) 2025.03.24
[JAVA] 메소드  (1) 2025.03.21
[JAVA] 클래스  (0) 2025.03.20