[Spring] 느슨한 결합 vs 강한 결합

ian kwon·2024년 8월 23일

스프링에서 느슨한 결합과 강한 결합

스프링 프레임워크는 객체 지향 프로그래밍의 중요한 원칙 중 하나인 느슨한 결합을 지원하는 강력한 도구입니다. 느슨한 결합은 코드의 유연성과 유지 보수성을 높이는 데 중요한 역할을 합니다. 이 글에서는 스프링에서 느슨한 결합과 강한 결합의 차이점에 대해 설명하고, 각각의 예시를 통해 개념을 명확히 이해할 수 있도록 하겠습니다.


1. 강한 결합 (Tight Coupling)

강한 결합은 두 클래스가 서로 직접적인 의존성을 가지며, 하나의 클래스가 다른 클래스를 직접 인스턴스화하는 경우를 말합니다. 이로 인해 두 클래스 간의 변경 사항이 발생할 때, 다른 클래스에도 영향을 미치게 됩니다. 이러한 구조는 코드의 유연성을 저하시키고 유지 보수를 어렵게 만듭니다.

예시

public class MarioGame {
    public void play() {
        System.out.println("Playing Mario");
    }
}

public class NintendoConsole {
    private MarioGame marioGame;

    public NintendoConsole() {
        this.marioGame = new MarioGame();
    }

    public void startGame() {
        marioGame.play();
        System.out.println("Game has started on the Nintendo Console");
    }
}

위 코드에서 NintendoConsole 클래스는 MarioGame 클래스를 직접 인스턴스화하고 있습니다. 이는 강한 결합의 예로, 만약 MarioGame 클래스의 구현이 변경되거나 다른 게임으로 교체해야 한다면 NintendoConsole 클래스도 수정이 필요하게 됩니다.


2. 느슨한 결합 (Loose Coupling)

느슨한 결합은 클래스 간의 의존성을 최소화하는 방식으로, 한 클래스가 다른 클래스에 의존하더라도 그 의존성을 인터페이스나 추상 클래스를 통해 해결합니다. 이를 통해 코드의 유연성을 높이고, 클래스 간의 의존성을 쉽게 변경할 수 있습니다.

스프링에서는 주로 DI(Dependency Injection, 의존성 주입)를 통해 느슨한 결합을 구현합니다.

예시

public interface Game {
    void play();
}

public class MarioGame implements Game {
    @Override
    public void play() {
        System.out.println("Playing Mario");
    }
}

public class ZeldaGame implements Game {
    @Override
    public void play() {
        System.out.println("Playing Zelda");
    }
}

public class NintendoConsole {
    private Game game;

    public NintendoConsole(Game game) {
        this.game = game;
    }

    public void startGame() {
        game.play();
        System.out.println("Game has started on the Nintendo Console");
    }
}

위의 코드에서 NintendoConsole 클래스는 Game 인터페이스에 의존하고 있으며, 실제 구현체는 스프링의 DI를 통해 주입됩니다. 이를 통해 NintendoConsole 클래스는 Game의 구현체가 변경되더라도 영향을 받지 않으며, 필요에 따라 MarioGame이나 ZeldaGame으로 쉽게 교체할 수 있습니다.


결론

  • 강한 결합은 클래스 간의 직접적인 의존성으로 인해 재사용이 어렵고 유연성이 부족합니다. 하나의 클래스가 변경되면 다른 클래스도 함께 수정이 필요할 수 있어 유지 보수가 어렵습니다.

  • 느슨한 결합은 클래스 간의 의존성을 인터페이스나 추상 클래스를 통해 관리하여 재사용이 용이하고 유연성이 높습니다. 새로운 기능 추가나 기존 기능 변경 시에도 코드 수정이 최소화됩니다.

따라서, 느슨한 결합은 코드의 재사용성과 유지 보수성, 확장성을 높여주는 중요한 설계 원칙입니다. 스프링 프레임워크는 이러한 느슨한 결합을 지원하여 더 유연하고 확장 가능한 애플리케이션을 개발할 수 있도록 돕습니다.

profile
“당신이 두려워하는 일을 매일 하라.” -엘리너 루스벨트-

0개의 댓글