[Spring Boot] DI 와 IoC는 무엇일까?

2023. 5. 11. 22:45·개발/Spring Boot
728x90
반응형

스프링에서는 IoC와 DI가 전부라는 말을 들었다.

도데체 IoC와 DI가 얼마나 중요하길래 그럴까 라는 생각을 했다.

 

1. DI (Dependency Injection)

DI는 "의존성" 주입이다.

예를 들어 A는 B에 의존한다라는 말은 A는 B의 상황에 따라 바뀔수도 있다라는 말로 될수도 있다.

의존하기 때문에 B가 바뀌면 A에게도 변화가 올 수 있다는 것이다.

class A{
	public B makeB(){
    		B b = new B();
       		return b;
	}
}

코드로 본다면 위와 같은 예시가 있다.

A클래스 안에서 b라는 객체를 만들었다.

그런데 갑자기 B라는 클래스에서 생성자를 수정하여 매개변수가 필요하다면 컴파일 오류가 난다.

이와 같이 B의 상황이 바뀌면서 A까지 영향을 미치는 상황이 의존한다 라고 표현할 수 있다.

 

class A{
	public B makeB(B b){
       		return b;
	}
}

위 코드를 보면 이미 생성된 객체 b가 매개변수로 주어진다.

이는 A클래스 밖에서 b라는 객체를 생성하여 넣어준 것이다.

위에서 A클래스 안에서 b를 만든것과 b를 매개변수로 받은것 둘다 A는 B에 의존한다라고 말할 수 있다.

B클래스를 변경하여 b객체가 달라진다면 둘다 영향을 미치기 때문이다.

하지만 여기서는 B클래스의 생성자를 수정하여도 A클래스 내부에서는 컴파일 오류가 발생하지 않는다.

 

두 코드는 의존 대상을 직접 생성하는 것과 외부에서 의존대상을 생성하여 주입 받는다는 차이가 있다.

이처럼 밖에서 의존대상을 만들어 주입하는 것을 의존성 주입이라고 한다.

 

2. IoC (Inversion of Control)

IoC는 제어 역전이라고 한다.

 

먼저 스프링은 프레임워크 라고 다들 부른다.

왜 스프링은 프레임워크일까?

 

프레임워크는 프레임 + 워크 두개의 단어로 분리할 수 있다.

즉 프레임이 일을한다.

프레임은 일을 하기 위해 우리들에게 많은 것을 제공해준다.

메소드, 어노테이션 등등 우리는 이를 활용하여 코드를 작성한다.

그 코드를 프레임워크가 작동시켜준다.

결론적으로 주어진 프레임 안에서 주어진 도구를 가지고 프로그래밍을 하면 된다.

나는 위와 같이 프레임워크를 이해했다.

 

그럼 제어 역전이란 무엇인가..

제어 하는 대상이 역전된 것이다.

예를 들면  내가 직접 객체를 생성하며 객체를 관리해야 하지만 스프링은 객체를 대신 생성해주고 관리해준다.

즉 객체를 제어하는 주체가 바뀌었다.

이를 제어 역전이라고 한다.

 

 

 

 

 

728x90
반응형

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

[Spring Boot] 어노테이션 정리  (0) 2023.05.17
[Spring Boot] Setter vs Constructor vs Builder  (0) 2023.05.16
[Spring Boot] Controller, Service, Repository  (0) 2023.05.16
[Spring Boot] DTO vs VO vs Entity  (1) 2023.05.14
[Spring Boot] mysql 연결 삽질기  (0) 2023.04.16
'개발/Spring Boot' 카테고리의 다른 글
  • [Spring Boot] Setter vs Constructor vs Builder
  • [Spring Boot] Controller, Service, Repository
  • [Spring Boot] DTO vs VO vs Entity
  • [Spring Boot] mysql 연결 삽질기
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    하이퍼레저
    go언어
    node.js
    go
    React
    js
    30일챌린지
    ERC721
    erc20
    node
    프로그래머스
    30일 챌린지
    컨테이너
    nodejs
    CSS
    mysql
    도커
    블록체인
    명령어
    html
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[Spring Boot] DI 와 IoC는 무엇일까?
상단으로

티스토리툴바