일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- httppie
- JDBC connection pool
- JPA프록시
- 제이피큐엘쿼리
- 임베디드타입
- 스프링부트기본설정
- jpqlquery
- jpa
- JPA값타입
- 스프링부트
- spring
- Git
- javageneric
- 자바제너릭
- gitinitial
- Open EntityManager
- JPAproxy
- OSIV
- 이해와 원리
- springboot기본설정
- springbootH2
- dockercmd
- embededtype
- 에이치투데이터베이스
- sql
- springbootproxy
- JPAmapping
- 데이터베이트h2
- JPA Hint & Lock
- MySqlType
- Today
- Total
빡코
[개념] 제어의 역전(IoC) + 의존성주입(DI) 본문
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 |