자바썸
자바랑 썸타는중
자바썸

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
자바썸
Spring/Spring

[Spring] Spring Triangle? 그게 뭔데 - IoC/DI

Spring/Spring

[Spring] Spring Triangle? 그게 뭔데 - IoC/DI

2022. 6. 30. 14:40

출 처:https://dev-coco.tistory.com/83

 

이전 포스팅에서 AOP에 대해 알아보았다면 이번 시간에는 IoC/DI에 대해 알아보자. 

 

 

[Spring] AOP란?

AOP(Aspect Oriented Programming) AOP(Aspect Oriented Programming)는 '관점 지향 프로그래밍'이라고 한다. 여기서 말하는 관점 지향이란? → 어떤 로직을 기준으로 핵심적인 관점과 부가적인 관점으로 나눠서..

gwamssoju.tistory.com

 

IoC(Inversion of Control)란?

 

IoC란 '제어의 역전'이라고 한다. '제어의 역전'이라는 말은 상당히 어렵게 느껴지는 말이지만 이렇게 설명할 수 있다.

개발자가 제어하는 것이 아닌 스프링 컨테이너에게 제어권이 넘어간다.

 

그렇다면 여기서 말하는 스프링 컨테이너는 뭘까?

 

스프링에서는 오브젝트(빈)의 생성, 의존 관계 설정, 사용 등 작업을 스프링 컨테이너가 담당한다. 그래서 이를 IoC라고 부르고 스프링 컨테이너와 IoC 컨테이너는 같은 개념이라고 본다.

 

IoC를 적용하지 않은 방법과 IoC를 적용한 방법을 코드로 비교해보면 더 쉽게 이해할 수 있을 거라고 생각한다.

 

public class IoCEx1 {
   
   A a ;
    
    public IoCEx1(){
        this.a = new A();
    }
}

class A{

}

IoC를 적용하지 않으면 개발자가 직접 new 연산자를 사용해서 'a'라는 변수에 인스턴스를 할당해줘야 한다.

 

반면에 IoC를 적용한 방법을 어떨까?

public class IoCEx2 {

    B b;

    IoCEx2(B b){
        this.b = b;
    }
}

interface B{

}

@Component // 스프링 컨테이너가 관리할 수 있도록 하기 위한 어노테이션. 즉, Bean 등록을 해줌.
class BImpl implements B{

}

 

이전과 동일한 점은 어떤 클래스가 들어와야 하는지에 대한 정보가 있다는 것이다. 즉, IoCEx2 클래스는 B라는 타입의 객체가 필요하다는 것을 알고 있다는 것이다. 그렇다는 것은 B 타입이나 B 타입을 상속받은 클래스만 들어올 수 있다는 것이다.

 

반면, 다른 점은 IoC를 적용하니 개발자는 스프링 컨테이너에게 관리될 수 있도록 Bean 등록만 해주고 나머지 권한은 스프링 컨테이너에게 넘겨주었다. 그래서 스프링 컨테이너가 B 인터페이스를 상속한 BImpl의 객체를 생성하고 해당 객체를 할당시켜준 것이다.

 

개발자가 아닌 제3 자가 처리하도록 하는 것을 IoC(제어의 역전)이라고 한다.

 

DI(Dependency Injection)란?

위 관계를 보면 외부에서 두 객체 간의 관계를 결정해주고 있으며, 인터페이스를 사이에 두어 런타임 시에 관계를 주입하여 느슨한 결합도를 보여준다. 'B → A'라는 의존 관계가 성립하고 A는 B에 의존한다고 할 수 있다. B의 내용에 따라 A가 변할 수 있기 때문이다. 

 

외부에서 의존 주입을 해주는 것을 DI(Dependency Injection)라고 한다. 우리말로는 '의존 관계 주입'이라고 한다.

 

의존 관계를 주입하는 방법을 3가지로 분류한다.

 

  • 필드 주입
  • 수정자 주입
  • 생성자 주입

 

필드 주입 

@Component
public class IoCEx2 {

    @Autowired
    B b;
}

interface B{

}

@Component
class BImpl implements B{

}

@Autowired 어노테이션을 사용한다. Bean 등록된 객체 중에 타입에 맞는 객체를 주입해주는 것이다. 가장 간단하기 때문에 사용하기 편하지만 지양해야 할 DI 방법이다. 

 

장점

  • 가장 간편하다.

단점

  • 의존성이 눈에 안 뜨인다. → 다른 방법에 비해 한눈에 의존 관계를 파악하기 어렵다.
  • DI 컨테이너와 결합도가 커지고, 테스트하기가 어렵다.
  • 불변성을 보장할 수 없고 순환 참조가 발생할 수 있다.

 

수정자 주입

@Component
public class IoCEx2 {

    private B b;

    public void setB(B b){
        this.b = b;
    }
}

interface B{

}

@Component
class BImpl implements B{

}

 

장점

  • 선택적인 의존성을 할 수 있다는 것이다. 

 

 단점

  • 선택적인 의존성을 할 수 있다는 말은 곧 IoCEx2에 모든 구현체를 주입받지 않아도 B 객체를 생성하고 객체의 메서드를 호출할 수 있다는 것이다. 그래서 주입받지 않은 구현체를 사용하는 메서드에서 NullPointException이 발생할 수 있다. 
  • 순환 참조의 문제가 발생한다.

 

생성자 주입 

@Component
public class IoCEx2 {

    private B b;

    IoCEx2(B b){
        this.b = b;
    }
}

interface B{

}

@Component
class BImpl implements B{
    
}

DI 방법 중에서 가장 권장되는 주입 방식이다. 

 

장점

  • 모든 의존 관계를 주입해야 객체 생성이 가능하므로 NullPointException이 발생하지 않는다.
  • 순환 참조를 컴파일 과정에서 찾아낼 수 있다.
  • final 키워드를 사용하여 불변성을 보장할 수 있다.

▽ 도움을 주신 분들

 

[Spring] 의존성 주입(Dependency Injection, DI)이란? 및 Spring이 의존성 주입을 지원하는 이유

1. 의존성 주입(Dependency Injection)의 개념과 필요성 [ 의존성 주입(Dependency Injection) 이란? ] Spring 프레임워크는 3가지 핵심 프로그래밍 모델을 지원하고 있는데, 그 중 하나가 의존성 주입(Depen..

mangkyu.tistory.com

 

[Spring] 스프링 DI, IoC 이해하기

자동차에서 만약 엔진이 오래되서 엔진을 바꾸고 싶다면, 자동자 전체가 아닌 엔진만 뽑아서 바꿔주면 됩니다. 객체 지향 프로그래밍에서도 클래스에 대한 변경이 필요하면 다른 클래스에 영향

kingofbackend.tistory.com

 

[Spring] IoC와 DI

IoC(Inversion of Control) IoC(Inversion of Control)를 해석하면 제어의 역전입니다. 이는 스프링 뿐만 아니라 모든 프로그래밍에서 사용될 수 있는 범용적인 개념입니다. 쉽게 말해 객체를 개발자 본인이 제

yoo11052.tistory.com

 

[Spring] Spring IoC와 DI란?

spring-study에서 스터디를 진행하고 있습니다. IoC란? IoC란 Inversion of Control의 줄임말이며, 제어의 역전이라고 한다. 스프링 애플리케이션에서는 오브젝트(빈)의 생성과 의존 관계 설정, 사용, 제거

steady-coding.tistory.com

 

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

[Spring] Spring Boot에서 MockMvc 사용해보자!  (0) 2022.07.15
[Spring] Spring Triangle? 그게 뭔데 - PSA  (0) 2022.07.05
[Spring] Spring Triangle? 그게 뭔데 - AOP  (0) 2022.06.29
[Spring] 인터셉터(Interceptor)에 대해 알아보자!  (0) 2022.06.28
[Spring] Filter에 대해 알아보자 !  (0) 2022.06.24
  • IoC(Inversion of Control)란?
  • DI(Dependency Injection)란?
'Spring/Spring' 카테고리의 다른 글
  • [Spring] Spring Boot에서 MockMvc 사용해보자!
  • [Spring] Spring Triangle? 그게 뭔데 - PSA
  • [Spring] Spring Triangle? 그게 뭔데 - AOP
  • [Spring] 인터셉터(Interceptor)에 대해 알아보자!
자바썸
자바썸

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.