25.02.21 TIL 강한 결합과 느슨한 결합

신성훈·2025년 2월 21일
0

TIL

목록 보기
136/162

1. 결합(Coupling)이란?

결합은 모듈 간의 의존성을 나타내는 개념입니다.

  • 강한 결합(Tightly Coupled): 모듈 간 의존성이 높아 변경 시 영향을 많이 받음.
  • 느슨한 결합(Loosely Coupled): 모듈 간 의존성이 낮아 변경이 용이함.

소프트웨어 설계에서는 결합도를 낮추고, 응집도를 높이는 것이 중요합니다.


2. 강한 결합(Tightly Coupled)

강한 결합이란, 한 모듈이 다른 모듈에 직접적으로 의존하는 구조를 의미합니다.

특징

  • 모듈 간 변경이 어렵고 유지보수가 어려움
  • 코드 재사용성이 낮음
  • 테스트하기 어려움

강한 결합 예제

class Keyboard {
    void type() {
        System.out.println("Typing...");
    }
}

class Computer {
    private Keyboard keyboard;

    public Computer() {
        this.keyboard = new Keyboard(); // 직접 객체 생성 (강한 결합)
    }

    void useKeyboard() {
        keyboard.type();
    }
}

public class Main {
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.useKeyboard();
    }
}

문제점

  • Computer 클래스가 Keyboard 클래스에 직접 의존하고 있음
  • 다른 키보드(MechanicalKeyboard, WirelessKeyboard)로 변경하려면 Computer 코드를 수정해야 함

3. 느슨한 결합(Loosely Coupled)

느슨한 결합이란, 모듈 간 의존성을 줄이고 인터페이스나 DI(Dependency Injection)를 활용하는 방식입니다.

특징

  • 모듈 간 변경이 용이하고 유지보수가 쉬움
  • 코드 재사용성이 높음
  • 테스트하기 쉬움

예제 (느슨한 결합 적용 - 인터페이스 사용)

interface Keyboard {
    void type();
}

class MechanicalKeyboard implements Keyboard {
    public void type() {
        System.out.println("Typing on Mechanical Keyboard...");
    }
}

class Computer {
    private Keyboard keyboard;

    public Computer(Keyboard keyboard) { // 의존성 주입 (DI)
        this.keyboard = keyboard;
    }

    void useKeyboard() {
        keyboard.type();
    }
}

public class Main {
    public static void main(String[] args) {
        Keyboard keyboard = new MechanicalKeyboard();
        Computer computer = new Computer(keyboard); // 의존성 주입
        computer.useKeyboard();
    }
}

장점

  • Computer 클래스가 Keyboard 인터페이스에 의존하여 구체적인 구현체(Concrete Class)에 대한 의존성이 없음
  • 인터페이스를 활용하여 새로운 키보드 타입을 쉽게 추가 가능
  • DI(Dependency Injection)를 활용하여 객체 변경이 가능

4. 강한 결합 vs 느슨한 결합 비교

항목강한 결합 (Tightly Coupled)느슨한 결합 (Loosely Coupled)
의존성직접 객체 생성 (new)인터페이스, DI 사용
유지보수변경이 어려움변경이 용이함
테스트단위 테스트 어려움단위 테스트 쉬움
확장성코드 변경 필요새로운 기능 추가 용이
재사용성낮음높음

5. 느슨한 결합을 위한 주요 기법

  1. 인터페이스(Interface) 활용
    • 모듈 간 의존성을 줄이고 유연성을 높임
  2. 의존성 주입(Dependency Injection, DI)
    • 객체를 외부에서 주입하여 코드 변경 없이 모듈 변경 가능
  3. 팩토리 패턴(Factory Pattern)
    • 객체 생성을 별도의 클래스에서 처리하여 결합도를 낮춤
  4. 이벤트 기반 설계
    • 이벤트 리스너를 활용하여 모듈 간 직접적인 의존성을 제거

6. 마무리

강한 결합은 코드가 간단해 보이지만 유지보수와 확장성이 떨어지는 단점이 있습니다.
반면 느슨한 결합을 적용하면 코드 변경 없이 새로운 기능을 추가할 수 있고 테스트가 쉬워지는 장점이 있습니다.
Spring Framework에서는 DI와 인터페이스를 적극 활용하여 느슨한 결합을 구현하므로
실무에서도 의존성 주입(DI)을 활용하는 것이 매우 중요하다는 것을 다시금 깨달았습니다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글