티스토리 뷰

백엔드 공부하기/TIL

231005 TIL : [Spring] Bean, IoC, DI

개발중인 감자 2023. 10. 6. 23:14

📌 231005 TIL : [Spring] Bean, IoC, DI


1. Spring Bean이란? 

쉽게 생각하면 스프링에서 관리하는 객체이다. 

 

2. IoC / DI

 

IoC : Inversion of Control의 약자로 제어의 역전을 뜻한다. 

Inverse : 뒤집다. (명) inversion

Control : 제어

 

뜻을 정리하자면, 프로그램의 흐름을 제어하는 주체가 정반대로 뒤집힌다. 

여기서 프로그램 흐름은 객체의 흐름을 제어하는 주체.

객체의 흐름이란 객체의 생성, 사용, 라이플 사이클 등을 의미한다. 

 

DI : Dependency Injection의 약자로 의존성 주입을 뜻한다.

Dependency : 의존

inject : 주입하다. 사용하다. (명) Injection

 

의존성을 주입한다.

= 객체의 의존성을 사용한다. 

 

즉 외부에서 생성된 객체를 사용한다는 뜻이다. "IoC의 기능이 DI이다" 라는게 이해하기 쉬울 것 같다. 

스프링에서 사용하는 방법에는

@Autowird 어노테이션을 이용해 생성자를 가져와서 사용하거나,

setter를 통해 사용하거나,

인터페이스를 사용하는 방법 (@Autowired가 인터페이스다)이 있다. 

스프링에서는 생성자를 사용해 가져오는 방법을 권장한다. (참고 : @ohzzi 님 블로그)

 

객체를 외부에서 주입시킴 으로 인하여, 의존성을 역전 시킨다. 
이로 인해 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성이 좋아지고 코드 중복이 감소할 수 있다. 

 

3. 예시

public class MemberService {
    public void welcome(String name) {
        System.out.println(name + "님 환영합니다.");
    }
}

 

여기 MemberService 클래스가 있다. 

IoC / DI를 사용하지 않으려면 메인에서는

public class Main {
    public static void main(String[] args) {
        MemberService ms = new MemberService();    
        ms.welcome("gamja");
    }
}

바로 객체를 만들어서 사용하면 된다. 

 

그렇지만 IoC / DI 를 이용하면, 외부(AppConfig)에서 생성된 객체를 이용하여 값을 설정할 수 있다.

만약 코드가 길어질 경우, 가독성 및 코드 중복을 생각하면 이 방법이 훨씬 깔끔해진다. 

여기서 AppConfig 클래스는 IoC 컨테이너 역할을 한다. 

 

public class AppConfig {
    public MemberService memberService() {
        return new MemberService();
    }
}
public class Main {
    public static void main(String[] args) {
        //MemberService ms = new MemberService();
        
        /** IoC && DI **/
        AppConfig ac = new AppConfig();
     	MemberService ms = ac.memberService();
        ms.welcome("gamja");
    }
}

 

 


 

4. 스프링에서 IoC / DI?

 

그렇다면 스프링에서 IoC, 컨테이너, DI가 무엇을 뜻할까?

 

- 스프링 빈?

스프링에서 관리하는 객체

cf. 자바 빈은 자바에서 관리하는 객체이다. 

 

- IoC / DI?

스프링이 주도권을 가지어 객체(빈)을 개발자 대신에 주입해준다. 

스프링이 객체를 주입하는 행위를 DI라고 하면 이해가 될 것 같다. 

 

- 컨테이너 ?

IoC 컨테이너라고도 하는데 스프링에서 빈을 생성, 관리하도록 빈을 모아놓은 공간이다.

스프링에서는 Bean을 관리하기 위해 IoC 컨테이너인 BeanFectory 와 ApplicationContext가 존재한다. 

 

결론적으로, 스프링은 IoC 컨테이너에서 관리하는 스프링 빈을 꺼내다가 빈을 DI 시켜주는 기능을 한다. 
따라서 스프링이 모든 의존성 객체를 스프링이 실행될 때 다 만들어주고 필요한 곳에 주입시켜줌으로써
Bean들은 싱글톤 패턴의 특징을 가지며, 
제어의 흐름을 사용자가 컨트롤하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.

 

5. Bean 등록 방법 / 주입 시키는 방법

 

등록 방법 :

@Configuration + @Bean : 스프링에게 해당 객체를 빈으로 등록하라는 의미를 가진 어노테이션.

 

주입시키는 방법 : 

@Autowired : 스프링에게 빈을 주입시켜 달라는 어노테이션. 

 

스프링에서 객체를 주입시키는 (DI) 하는 방법 
- 개발자는 @Autowired 를 사용하여 따로 객체를 생성하지 않아도, 스프링 빈을 관리하는 IoC 컨테이너에서 객체를 주입시켜준다.