Spring 제어의 역전(Ioc) ,의존성 주입 (DI), ApplicationContext

2023. 9. 14. 02:09·Spring
728x90

IOC (Inversion of Control)

  • 제어의 역전이라는 의미
  • 애플리케이션 흐름의 주도권을 Spring이 갖는다라는 것
  • 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 함
  • 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 함
  •  IOC 컨테이너는 객체의 생성, 초기화, 서비스 소멸에 관한 모든 권한을 가지면서 객체의 생명주기를 관리

 

DI(Dependency Injection)

의존성

  • 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것
  • A 객체가 B 객체 없이 동작 불가능한 상황을 'A가 B에 의존적이다'라고 표현
  •  
public class Store {

    private Pencil pencil;

    public Store() {
        this.pencil = new Pencil();
    }
}
/*
두 클래스가 강하게 결합되어 있음
객체들 간의 관계가 아니라 클래스 간의 관계가 맺어짐
*/
연필 없으면 장사를 할 수 없는 일이 발생
➔ 하나의 객체가 다른 객체의 상태에 따라 영향을 받는 것을 의미

발생하는 근본적인 이유는 Store에서 불필요하게 어떤 제품을 판매할 지에 대한 관심이 분리되지 않았기 때문이다.
Spring에서는 DI를 적용하여 이러한 문제를 해결하고자 하였다.

 

의존성 주입

  • 어떤 객체가 필요한 객체를 외부에서 밀어 넣는 것
  • 종속적인 걸 느슨하게 만듬, 모듈 간의 결합도가 낮아지고 유연성이 높아짐
  • Spring Framework에서 적용한 것으로 생각해보면 생성자를 통해서 어떤 클래스의 객체를 전달 받는 것
  • 1) 생성자 주입과 2) Setter 주입을 사용
➔  주입은 받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없다.
➔  어떤 객체에 의존하든 자신의 역할은 변하지 않는다.
public class Store {

    private Product product;

    public Store(Product product) { 
    // 외부에서 상품을 주입(Injection)받아야 한다
    // Store에서 구체 클래스에 의존하지 않게 된다
        this.product = product;
    }
}

public interface Product {
}

public class Pencil implements Product {
}
public class BeanFactory {

    public void store() {
        // Bean의 생성
        Product pencil = new Pencil();
    
        // 의존성 주입
        Store store = new Store(pencil);
    }
}

 

  • A객체에서 B/C 객체를 직접 생성하는 방식
  • A는 B/C가 필요하다는 신호만 보내고, B/C 객체를 주입하는 것은 외부에서 이루어지는 방식

의존성 주입의 장점

  • 코드의 재사용성, 유연성이 높아진다. 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문이다.
  • 객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다
  • 유지보수가 쉬우며 테스트가 용이해진다
  • 확장성을 가진다

 

의존성 주입의 단점

  • 책임이 분리되어 있기 때문에 클래스 수를 늘림으로써 복잡성이 증가한다.
  • 주입된 객체들에 관한 코드 추적이 어렵다.
  • 초기 개발 노력이 필요하다.
  • 의존성 주입 프레임워크를 사용하면 빌드 시간이 늘어날 수 있으며, 프레임워크에 대한 의존도를 높인다.

 

 

ApplicationContext

  • 필요한 객체를 생성하고, 필요한 객체들을 주입하는 역할을 해주는 구조
  • 스프링에서는 ApplicationContext가 관리하는 객체들을 'Bean(빈)'이라는 용어로 부름
  • 빈과 빈 사이의 의존관계를 처리한느 방식으로 XML 설정, 어노테이션 설정, Java 설정 방식을 이용
  • 별도의 설정 정보를 참고하고 IoC를 적용하여 빈의 생성, 관계설정 등의 제어 작업을 총괄

 

의존성 주입 컨테이너 어노테이션

2023.09.14 - [Spring] - @Component, @Bean 어노테이션

 

@Component, @Bean 어노테이션

@Component 클래스를 Spring에서 알아서 관리해주는 자바 빈으로 표시하는 데 사용 Spring이 자동으로 클래스의 인스턴스를 생성하고 종속성을 포함하여 각종 lifecycle 관리 @Component public class MyComponent {

karla.tistory.com

 

 

 

728x90
'Spring' 카테고리의 다른 글
  • Spring AOP, 관점 지향 프로그래밍
  • @Component, @Bean 어노테이션
  • 객체지향의 설계, SOLID 원칙
  • [Redis] Spring Boot 연동, 객체 캐싱, MSA에서 사용 시 주의점 Serialize
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    조합
    구간합
    동적계획법
    덱
    다익스트라
    DP
    BFS
    자료구조
    트리
    재귀
    백준
    그래프
    큐
    LIS
    정렬
    힙
    그리디
    최소신장트리
    프로그래머스
    스택
    파이썬
    Algorithm
    알고리즘
    월간코드챌린지
    DFS
    최단거리
    구현
    플로이드워셜
    이분탐색
    최대공약수
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
Spring 제어의 역전(Ioc) ,의존성 주입 (DI), ApplicationContext
상단으로

티스토리툴바