IoC/Di (제어의 역전, 의존성 주입)

sion Jeong·2024년 6월 24일
0

약간의 복습시간.

💡 빈(Bean)이란?

  • 스프링에서 빈(Bean)이란 "자바 객체"를 말한다.

💡 근데 왜 Bean이라고 불러?

  • 정확히 말하면 "자바 객체 > Bean"이다.

💡 Bean과 자바 객체는 뭐가 다른데?

  • Bean은 스프링 Ioc 컨테이너가 관리하는 자바 객체다.
  • 자바 객체는 스프링 Ioc 컨테이너가 관리하지 않는 객체도 포함된다.

결론
우리는 스프링 빈으로 Car클래스를 등록해서 → Car객체를 스프링 빈 + 싱글톤으로 사용함
DTO를 사용하는 이유는 (DTO: 데이터 전송을 담당) (어떤 API요청이이나 응답에 필요한 정보만 담아서 딱딱 전달해주기 위해서)


1. 의존성 주입 (/DI) (Dependency Injection)

💡 어떤 객체에 스프링 컨테이너가 또 다른 객체와 의존성을 맺어주는 행위

예시:

  • 군인이 총을 가지고 있는 것을 나타내기 위해 → Soldier 객체와 Gun 객체가 의존관계가 맺어진다고 해보자.
  • 의존성 주입을 적용하지 않은 경우와 적용한 경우는 다음과 같다.

의존성 주입을 적용하지 않은 경우

<Gun.java>

public class Gun {
    ...
    ...
}

<Soldier.java>

public class Soldier {
    private Gun gun;

    public Soldier() {
        gun = new Gun();
    }
}
  • 위 코드의 경우에는 Soldier 클래스 내부에서 Gun 객체를 생성하였기 때문에
  • 의존성을 주입받은것이 아닌, → 의존성을 스스로 만든 것이라고 볼 수 있다.

의존성 주입을 적용한 경우

<Gun.java>

@Component // 스프링 컨테이너에 Bean으로 등록
public class Gun {
    ...
    ...
}

<Soldier.java>

public class Soldier {
    @Autowired // 스프링 컨테이너에 있는 Gun 타입의 Bean을 주입
    private Gun gun;
}
  • 위 코드의 경우에는 Gun 객체(Bean)를 스프링 컨테이너에 등록하고 (@Component)
  • 스프링 컨테이너에서 Soldier의 gun 멤버 변수에 Bean을 주입할 수 있게 해준 것이다. (@Autowired)

2. 제어의 역전(IOC) (Inversion of Control)

  • 제어의 역전은 의존성 주입의 상위 개념으로, 다음과 같다.

💡 스프링 컨테이너가 개발자 대신 Bean들을 관리(제어)해주는 행위

  • 일반적인 상황에서는 개발자가 직접 객체를 제어해야 했다. new 연산자를 통해 객체를 생성하고, 객체의 의존성을 맺어주고, 초기화를 해주고 등등…
  • 하지만 Spring 에서는 어노테이션 방식으로 스프링 컨테이너에 Bean(객체)를 등록하기만 하면, 스프링 컨테이너에서 Bean의 생명주기(생성 -> 의존성 설정 -> 초기화 -> 소멸)를 전부 관리해준다.
  • 즉, 객체에 대한 제어권이 컨테이너로 역전 되기 때문에 제어의 역전이라고 하는 것이다.

그냥 이분이 너무 명확하게 설명을 잘 해놓으셨다. 이거보고 공부하자

https://velog.io/@damiano1027/Spring-의존성-주입-제어의-역전

profile
개발응애입니다.

0개의 댓글