빡코

[개념] 제어의 역전(IoC) + 의존성주입(DI) 본문

Java/Spring Framework

[개념] 제어의 역전(IoC) + 의존성주입(DI)

chris.djang 2020. 1. 25. 13:43

IoC란?

Inversion of Control(제어의 역전)

원래 의존성의 제어권은 자신이 가지고 있다.
Spring Framework를 사용하지 않을경우, new생성자를 통해서 객체를 생성후 사용해야만한다. 
Spring Framework안에서는 직접생성하지 않아도 되며, 외부에서 넣어주면 사용가능   

 

IoC 컨테이너? 

-빈(Bean)을 만들고 엮어주며 제공해준다. 

-빈 설정: 이름 or ID, 타입, 스코프

-컨테이너를 직접 쓸일이 많지 않음

 

-어노테이션 자체에는 기능이 없다. 

-컴포넌트는 컨트롤러와 같다  

 

Bean이란?

-Bean이란 스프링 IoC 컨테이너가 관리하는 객체

 

Bean이 등록되는 과정? 

1.어노테이션 활용

ComponentScan: 어노테이션을 처리하는 Handler 역할 즉, 프로세서의 역할을 한다. 

-Component Scanning
--@Component 
--@Repository 
--@Service -
--@Controller 

-어노테이션자체는 전혀 기능이 없다. 어노테이션을 마커로 사용해서 어노테이션을 처리하는 프로세서들이 있다.

-@SpringBootApplication을 밑으로 시작해서 같은패키지, 클래스 아래 @Component 어노테이션이 붙어있는 클래스들을 찾아서 Bean으로 등록을 해준다.

-@Controller 안에는 @Component가 내재되어있기때문에 Bean으로 등록이 가능하다. 결국 Controller ==

Component는 같은 개념이다

 

2.직접등록방법

-@Bean이라는 메소드를 정의(메소드의 이름이 Bean의 이름이된다)

-Cnfigeration이라는 어노테이션을 가지고 있는 메소드 안에다가 만들어야 한다.

@SpringBootApplication //어노테이션을 하나로 합쳐놓음
public class PetClinicApplication {

    @Bean
    public String keesun(){
        return "keesun";
    }

	public static void main(String[] args) {
 }
}

 

그럼 Bean을 사용하는 법은?

-@Autowired 또는 @Inject 
-또는 ApplicationContext에서 getBean()으로 직접 꺼내거나 

package org.springframework.samples.petclinic.owner;

import org.apache.catalina.core.ApplicationContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController //Bean들의 의존성을 관리해준다.
public class SampleController {

    @Autowired
    ApplicationContext applicationContext; // 이것 없이 바로 꺼내쓰는게 간편한 코드이다.

    @Autowired
    String keesun; //String type의 kessun이라는 이름의 bean을 사용하겠다.

    @GetMapping("/context")
    public String context() {
        return "hello" + keesun;
    }
}

@RestController는 Spring MVC Controlle에 @ResponseBody가 추가된 것입니다. 당연하게도 RestController의 주용도는 Json/Xml 형태로 객체 데이터를 반환하는 것입니다. 개인적으로는 VueJS + Spring boot 프로젝트를 진행할 때 Spring boot를 API 서버로 활용할 때 그리고 Android 앱 개발을 하면서 데이터를 반환할 때 사용하였습니다.

 

** 오로지 “빈"들만 의존성 주입을 해줍니다.

 

의존성 주입 

1) @Autowired가 없는 상황에서 의존성 주입은, 

-어떤 Bean이 되는 클래스에

-생성자가 오로지 하나만 있고
-그 생성자의 매개변수타입이 Bean으로 등록이 되어있다면,

-그 Bean을 등록해준다.

@Controller
class OwnerController {

	private static final String VIEWS_OWNER_CREATE_OR_UPDATE_FORM = "owners/createOrUpdateOwnerForm";

	private final OwnerRepository owners;

	private VisitRepository visits;

	//생성자를 통한 Bean주입 
	public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
		this.owners = clinicService;
		this.visits = visits;
	}

 

2) Filed에 @Autowired로 빈을 등록

3)Setter로 Bean을 등록 

 

@Autowired / @Inject를 어디에 붙일까?
● 생성자
● 필드
● Setter : 위처럼 Setter가 없는 상황에서는 굳이 setter 생성후 @Autorwired를 붙일 필요는 없음 

 

 

참조

https://drive.google.com/file/d/1Q8LGrUKzV_EX6MToQaynhv0CnPDCTgbM/view

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

리플렉션 API 개념 및 실습  (0) 2024.01.15
[Spring] 기본개념  (0) 2023.01.20
[개념] MVC 패턴_데이터의 흐름  (0) 2020.01.29
[개념] Maven_기본개념  (0) 2020.01.27
[개념] AOP(관점지향프로그래밍)  (0) 2020.01.25