Post

[Spring] 스프링 특징_ 느슨한 결합 과 Bean 그리고 IoC 컨테이너

Spring Framework의 주요 특징 중 느슨한 결합(Loose Coupling)과 스프링 빈(Spring Bean) IoC Container에 대해 알아보고자 한다.

1. 스프링에서 느슨한 결합(Loose Coupling) 이란?

스프링은 느슨한 결합을 촉진한다. 느슨한 결합은 서로 다른 클래스 간의 의존성을 최소화하는 것을 의미한다. 이는 클래스가 서로 강하게 연결되지 않고, 변경이나 확장이 필요할 때 한 클래스의 변경이 다른 클래스에 덜 영향을 미친다. 이러한 느슨한 결합은 유지 보수성을 향상 시키고, 테스트를 용이하게 한다.

❓ 강한 결합

: 강한 결합에서는 한 클래스가 다른 클래스의 구체적인 구현에 직접적으로 의존 한다. 이는 변경 사항이 생겼을 때, 이 의존성으로 인해서 관련 클래스 모두에 영향을 미칠 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class LightBulb {
  public void turnOn() {
    System.out.pritln("전구가 켜졌습니다.");
  }
  public void turnOff() {
    System.out.println("전구가 꺼졌습니다.");
  }
}

// Switch 클래스는 LightBulb 클래스에 강하게 결합
class Switch {
  private LightBulb lighBulb = new LightBulb();

  public void operateSwitch() {
    lightBulb.turnOn();
    // logic
    lightBulb.turnOff();
  }
}

❓ 느슨한 결합

느슨한 결합에서는 인터페이스나 추상 클래스를 사용하여 구체적인 구현에 의존하지 않는다. 이는 코드의 유연성과 확장성을 증가시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 인터페이스를 사용하여 느슨한 결합
interface Switchable {
    void turnOn();
    void turnOff();
}

// LightBulb 클래스는 Switchable 인터페이스를 구현
class LightBulb implements Switchable {
    public void turnOn() {
        System.out.println("전구가 켜졌습니다.");
    }

    public void turnOff() {
        System.out.println("전구가 꺼졌습니다.");
    }
}

// Switch 클래스는 Switchable 인터페이스에 의존함
class Switch {
    private Switchable switchable;

    public Switch(Switchable switchable) {
        this.switchable = switchable;
    }

    public void operateSwitch() {
        switchable.turnOn();
        // 다른 로직...
        switchable.turnOff();
    }
}

// 메인 클래스에서 사용
public class Main {
    public static void main(String[] args) {
        Switchable lightBulb = new LightBulb();
        Switch lightSwitch = new Switch(lightBulb);
        lightSwitch.operateSwitch();
    }
}

위, 느스한 결합 예시에서는 ‘Switch’ 클래스가 ‘Switchable’인터페이스에 의존하며, 이를 통해 ‘LightBulb’ 클래스의 구체적인 구현에 직접적으로 의존하지 않는다. 이 방식은 코드의 수정이나 확장이 필요할 때 더 유연하게 대응할 수 있게 해준다.

2. Bean 에 대해서

스프링에서 빈은 애플리케이션의 핵심 구성 요소이다. 빈은 일반적으로 Java객체로, 스프링의 IoC(제어의 역전) 컨테이너에 의해 인스턴스화, 관리 및 구성된다. 이러한 빈들은 애플리케이션의 비즈니스 로직, 데이터 액세스, 웹 서비스 등 다양한 역할을 담당한다.
IoC(Inversion Of Control) Container에 의해 관리되는 Java 객체를 Bean이라 한다.

📌 Java Bean vs Spring Bean vs POJO

👉 Java Bean

  • 자바 빈은 재사용 가능한 컴포넌트로 설계되었으며, 자바의 직렬화가 가능해야 한다.
  • 자바 빈은 ‘Private 멤버 변수’와 그 변수들을 접근할 수 있는 ‘Public한 Getter 와 Setter 메서드’를 가지고 있다.
  • 이러한 특징은 자바 빈이 쉽게 저장, 검색, 전송될 수 있도록 하며, 다양한 개발 도구에서 사용될 수 있게 한다.

👉 Spring Bean

  • 스프링 빈은 스프링 프레임워크에서 관리하는 객체이다.
  • 이러한 객체는 스프링의 IoC 컨테이너에 의해 인스턴스화되고, 구성 및 관리된다.
  • 스프링 빈은 자바 빈과 유사하게 구성될 수 있지만, 스프링 프레임워크와 통합될 수 있는 추가적인 기능을 가질 수 있다. 예를 들어, 의존성 주입(Dependency Injection)을 통해 다른 빈과 연동될 수 있다.
  • 스프링 빈은 일반적으로 XML 파일이나 애노테이션을 통해 정의 된다.

👉 POJO(Plain Old Java Object)

  • 특정 규약이나 인터페이스에, 클래스를 상속받지 않는, 단순한 자바 객체
  • POJO는 Java Bean과 달리 특정 형식이나 규칙을 따르지 않아도 되며, 자바의 기본적인 객체 지향 원리에 충실한다.

3. IoC 컨테이너 | DI 컨테이너

IoC(Inversion of Control: 제어의 역전)는 의존성 관리에 대한 접근 방식을 뜻한다. 스프링의 IoC 컨테이너는 객체의 생명주기와 의존성을 관리하며, 이를 통해 더 깔끔하고 유지보수가 용이한 코드를 작성할 수 있다.

❓ IoC (Inversion Of Control: 제어의 역전) 이란?

객체의 생성과 객체간의 의존성 관리를 개발자가 아닌 외부 컨테이너에 맡기는 방법론 이다.
장점:객체간 낮은 결합도, 유연한 코드작성, 유지보수 용이, 개발자가 비즈니스 로직에 집중할 수 있다.

Spring Context, IoC Context, IoC Container, Spring Container

해당 키워드는 사실상 같은 개념을 다른 이름으로 지칭하는 경우가 많다. 이들은 모두 스프링 프레임워크의 핵심 부분을 이루며, 객체의 생성과 관리, 의존성 주입 등을 담당한다. 기본적으로 같은 기능을 수행하지만, 컨텍스트나 컨테이너라는 용어는 사용되는 맥락에 따라 약간의 차이를 가질 수 있다. 예를 들자면 애플리케이션 컨텍스트는 IoC 컨테이너의 기능에 더 많은 엔터프라이즈 특정 기능을 추가한 것으로 볼 수 있다.

This post is licensed under CC BY 4.0 by the author.

© chanho. Some rights reserved.