[Spring] Spring IoC(Inversion of Control)와 DI(Dependency Injection)

2024. 10. 16. 22:22·🌱 Spring/Spring Boot

Spring IoC와 의존성 주입(DI)에 대한 이해

Spring 프레임워크에서는 IoC(Inversion of Control, 제어의 역전) 개념을 사용하여 객체의 생성과 관리를 스프링 컨테이너에 맡깁니다. 이를 통해 개발자는 비즈니스 로직 작성에 집중할 수 있으며, 의존성 주입(DI)과 관점 지향 프로그래밍(AOP) 등의 기능을 보다 쉽게 사용할 수 있습니다.

Spring IoC (Inversion of Control)

IoC는 객체의 관리를 스프링 컨테이너에 맡겨 제어권이 개발자에서 컨테이너로 넘어가는 것을 의미합니다. 이를 통해 개발자는 객체의 생성과 라이프사이클 관리와 같은 번거로운 작업에서 벗어나 비즈니스 로직에 집중할 수 있습니다.

IoC의 결과로 의존성 주입(DI), 관점 지향 프로그래밍(AOP) 등이 가능해집니다.

DI 컨테이너

DI 컨테이너는 의존성 주입(Dependency Injection)을 실현하도록 돕는 프레임워크입니다. Spring에서는 이러한 역할을 수행하는 스프링 IoC 컨테이너가 존재하여 객체의 생성과 의존성 관리를 담당합니다.

의존성의 개념

  • 사용하는 객체: A 클래스
  • 사용되는 객체: B 클래스

예를 들어 A 클래스에서 B 클래스의 메소드를 사용하려면 new 키워드를 사용해 B 클래스의 인스턴스를 생성한 후 B 클래스의 메소드를 호출해야 합니다. 이 경우, B 클래스의 변경 사항이 A 클래스에도 영향을 미치게 되며, 이를 A 클래스는 B 클래스에 의존한다고 표현합니다.

의존성의 유형

  1. 클래스의 의존 (구현 의존)
  2. 인터페이스 의존

클래스의 의존

A 클래스가 B 클래스의 메소드를 호출하는 경우, A 클래스에서 직접 new 키워드로 B 클래스의 인스턴스를 생성하게 됩니다.

class A {
    public void 메서드1() {
        B b = new B();
        b.methodX();
    }
}

class B {
    public void methodX() {
        // ...
    }
}

이후 B 클래스를 변경하여 C 클래스를 사용해야 하는 경우, A 클래스의 모든 B 클래스 관련 코드를 수정해야 합니다. 이러한 의존 관계는 수정 작업의 비용과 리스크를 증가시킵니다.

인터페이스 의존

A 클래스가 B 클래스를 사용하는 대신, 인터페이스 I를 사용하여 추상화합니다. B 클래스와 C 클래스 모두 I 인터페이스를 구현하여 유연하게 사용될 수 있습니다.

class A {
    public void 메서드1() {
        I i = new B();
        i.methodX();
    }
}

interface I {
    void methodX();
}

class B implements I {
    public void methodX() {
        // ...
    }
}

class C implements I {
    public void methodX() {
        // ...
    }
}

위와 같이 인터페이스를 사용하여 의존성을 분리하면, B 클래스 대신 C 클래스를 사용할 때 한 곳만 수정하면 되므로 유지보수가 용이합니다.

의존성 주입(DI)

의존성 주입이란 의존하는 객체를 외부에서 주입하는 것을 의미합니다. 기존에는 인스턴스를 생성하기 위해 new 키워드를 사용했지만, 스프링 프레임워크에서는 DI 컨테이너가 이를 담당합니다.

DI 컨테이너의 다섯 가지 규칙

  1. 인터페이스를 이용해 의존성을 생성한다: 의존하는 부분에 인터페이스를 사용하여 의존성을 만든다.
  2. 인스턴스를 명시적으로 생성하지 않는다: 인스턴스 생성 시 new 키워드를 사용하지 않는다.
  3. 어노테이션을 클래스에 부여한다: 인스턴스를 생성하려는 클래스에 어노테이션을 부여한다.
  4. 스프링 프레임워크에서 인스턴스를 생성한다: 클래스에 인스턴스 생성 어노테이션(@Component 등)을 부여한다.
  5. 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다: 참조를 받는 필드를 선언하고 @Autowired 어노테이션을 부여하여 생성된 인스턴스를 주입받는다.

의존성 주입 방법

  1. 생성자를 통한 의존성 주입
  2. 필드 객체 선언을 통한 의존성 주입
  3. Setter 메서드를 통한 의존성 주입

인스턴스 생성 어노테이션

스프링에서는 특정 역할을 수행하는 클래스에 어노테이션을 부여하여 인스턴스를 생성할 수 있습니다.

어노테이션 개요
@Controller 인스턴스 생성 지시. 스프링 MVC의 컨트롤러에 사용됨
@Service 인스턴스 생성 지시. 트랜잭션 경계가 되는 도메인(서비스)에 사용
@Repository 인스턴스 생성 지시. 데이터베이스 액세스 기능에 사용
@Component 인스턴스 생성 지시. 위 용도 이외의 클래스에 사용

마무리

스프링의 IoC와 DI는 객체 관리의 복잡성을 줄이고, 코드의 유연성과 재사용성을 높이는 데 중요한 역할을 합니다. 이를 통해 개발자는 객체의 생성 및 라이프사이클 관리에서 벗어나 비즈니스 로직에 더욱 집중할 수 있게 됩니다.

'🌱 Spring > Spring Boot' 카테고리의 다른 글

[Spring] Spring Security  (1) 2024.10.16
[Spring] Spring Batch - Batch와 Job, Step  (1) 2024.10.16
[Spring] Spring MVC  (0) 2024.10.16
[Spring] @Annotation  (0) 2024.10.16
[Spring] Spring AOP  (0) 2024.10.16
'🌱 Spring/Spring Boot' 카테고리의 다른 글
  • [Spring] Spring Batch - Batch와 Job, Step
  • [Spring] Spring MVC
  • [Spring] @Annotation
  • [Spring] Spring AOP
kkongdo
kkongdo
kkongdo 님의 블로그 입니다.
  • kkongdo
    숲을 바라보며 나무를 심는 아이
    kkongdo
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • 🌏 Web (0)
      • ☕ Java (5)
      • 🌱 Spring (9)
        • Spring Boot (7)
        • Spring Data JPA & QueryDSL (2)
      • 🗂️ Database (5)
      • 💻 CS (12)
        • 운영체제 (4)
        • 네트워크 (5)
        • 자료구조 (3)
      • 🗃️Git (1)
      • 🔍 Algorithm (0)
      • 📡 DevOps (0)
        • Docker (0)
      • 🔭 ETC (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • GitHub
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자료구조
    운영체제
    java
    조인
    SpringMVC
    QueryDSL
    CS
    복잡도
    SpringSecurity
    DI
    네트워크기기
    데이터베이스
    스케줄링
    JPA
    spring
    springbatch
    db
    네트워크
    OS
    @annotation
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kkongdo
[Spring] Spring IoC(Inversion of Control)와 DI(Dependency Injection)
상단으로

티스토리툴바