항해99 3기

IoC 컨테이너와 DI

na_o 2021. 10. 4. 11:55
728x90

[DI(Dependency Injection)]

- 의존성 주입

- 코드상 객체를 직접적으로 만드는 게 아닌 객체의 밖에서 객체를 넣어주는(주입하는) 방식

 

 

 

출처: https://devlog-wjdrbs96.tistory.com/165

배터리가 일체형인 장난감은 배터리가 다 떨어지면 장난감을 새로 사야하지만

배터리가 분리형인 장난감은 배터리가 다 떨어지면 배터리만 바꿔주면 된다

 

 

 

- 코드상 객체를 직접적으로 만드는 것

public class BugService { 
	public void countLeg() { 
		BugRepository bug = new Fly(); 
		bug.legCount(); 
	} 
}

이것을 일체형 배터리라고 생각하면 된다

코드에서 직접 new를 이용해 객체를 생성해주고, 수정할 일이 생긴다면 이 부분을 직접 찾아 수정해야 한다

이것을 "의존성이 생겼다""의존성을 가진다"라고 말을 할 수 있다

이렇게 코드를 짰을 때 직접 그 분을 가서 수정을 해줘야하기 때문에 

코드의 재활용성이 떨어지고, 결합도가 높아졌다 라고도 할 수 있다

 

 

 

- 객체의 밖에서 객체를 넣어주는(주입) 

public class BugService { 
	privateBugRepository bugRepository; 
		
	public BugService(BugRepository bugRepository) { 		
		this.bugRepository = bugRepository; 
	} 

	public void countLeg(){ 
		bugRepository.legCount(); 
	} 
}

이것을 분리형 배터리라고 할 수 있다

new를 이용해 객체를 생성하는 게 아니고

생성자의 매개변수에 다른 클래스를 넣어주면서 클래스를 가져오는것이다

이것을 "DI"라고 한다

이것은 "의존성을 주입받았다" 라고 할 수도 있고, "느슨한 결합"이라고도 한다

생성자를 이용해서 다른 객체를 주입받으면 결합도를 낮출 수 있다

BugServiceBugRepositoryBean으로 등록을 했을 때

BugService의 생성자만 만들어주면

IoC 컨테이너라는 것이 BugRepository에 주입을 알아서 해준다

 

 

 

[IoC(Inversion of Control)]

- 제어권이 역전된 것

- 이전까지는 개발자가 코드의 흐름이나 제어의 주체였다면,

  스프링에서는 프레임워크(컨테이너)가 주체가 됨

 

 

 

"DI랑 IoC와 같은 말인가..?" 라고 생각이 들었다

- 의존성을 주입하는 "일" DI

- 의존성을 대신 만들어주는 "상황"IoC

이렇게 이해했다

 

 

 

[IoC 컨테이너]

- 객체들을 담는 용기

- 컨테이너를 통해 등록된 빈(Bean)들은 시스템에서 사용 가능하다

  * 빈(Bean): IoC 컨테이너가 관리하는 일반적인 객체

 

 

 

[IoC 컨테이너에 Bean 등록 방법]

1. @Component & @Autowired

@Component
public class Student {
	@Autowired
	private Pencil pencil;

	public Student(){ 
		System.out.println(”hi”);
	} 
}

클래스 위에 Component 어노테이션을 달아주고

빈으로 등록한 클래스를 불러오려면 AutoWired 어노테이션을 써주면 된다

 

 

 

출처: https://cbw1030.tistory.com/54

@Controller, @Service, @Repository는 @Component를 상속받고 있기 때문에

위의 어노테이션을 적어주면 컨테이너에 자동으로 빈으로 등록됨

 

 

 

2. @Bean & @Configuration

@Configuration
public class ApplicationConfig {
	@Bean
	public ArrayList<String> array(){ 
		return new ArrayList<String>();
	} 
}

클래스 위에 Configuration 어노테이션을 달아주고

Bean 어노테이션을 적어주면 컨테이너에 등록이 된다

 

 

 

"Bean 등록 방법이 왜 두 가지?"

- 둘의 용도가 다르다!

 

* @Bean

- 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용

  ex: Spring Security

      Spring Security에서 제공하는 PasswordEncoderSpring Security 개발자에 의해 만들어진 라이브러리이다

      때문에 따로 수정하는것은 힘들다

      PasswordEncoder를 사용하기 위해서는 스프링에 Bean으로 등록을 해야하는데

      이 때 사용할 수 있는 방법이 @Bean 어노테이션을 이용한 등록 방법이다

* @Component

- 개발자가 직접 컨트롤할 수 있는 클래스에 사용

  개발자가 컨트롤 할 수 있는 클래스는 개발자가 만든 클래스를 의미하며, 컨트롤러 등에 사용하는 클래스를 의미한다

  그래서 @Configuration, @Controller, @Service, @Repository 등의 어노테이션들은 @Component을 포함하고 있다

 

 

 

* 참고

- https://velog.io/@albaneo0724/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-Bean%EA%B3%BC-Component%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

[Spring] 스프링 @Bean과 @Component의 차이

공부를 하며 여러가지 스프링 프로젝트를 생성하고 만들어 나갔다. 그러면서 항상 쓰던것이 @Bean과 @Component였다.그러다 문득, @Bean과 @Component의 차이가 궁금해져 정의를 내려보려 했으나 제대로

velog.io

- https://cbw1030.tistory.com/54

 

[스프링부트] Bean 객체를 등록하는 두 가지 방법(@Component, @Bean)

빈 객체를 등록하는 방법을 설명하기에 앞서 빈(Bean)이 무엇인지 알아보겠습니다. [ 스프링에서의 빈이란? ] 우선 스프링은 경량 컨테이너로서 객체 생성, 소멸과 같은 Life Cycle을 관리하며 스프

cbw1030.tistory.com

- https://devlog-wjdrbs96.tistory.com/165

 

[Spring] 스프링 의존성 주입(DI) 이란?

Spring 삼각형 스프링의 기반이 되는 설계 개념을 표현한 것 스프링이란 IoC와 AOP를 지원하는 경량의 컨테이너 프레임워크이다. 1. DI(Dependency Injection)이란? Inversion of Control 이라고도 하는 의존 관..

devlog-wjdrbs96.tistory.com

 

 

- https://ecsimsw.tistory.com/entry/Spring-IoC-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88

 

Spring / IoC 컨테이너 / 정리

1) IoC 컨테이너 IoC  Inversion of Control : 제어의 주체가 뒤바뀜. 이전까진 개발자가 코드의 흐름, 제어의 주체였다면, 스프링에서는 프레임워크 (컨테이너) 가 주체가 된다. class Controller{ private Obje..

ecsimsw.tistory.com

 

 

 

IoC컨테이너와 DI.pptx
0.67MB