본문 바로가기
Spring

스프링 3대 핵심 - ① IoC (Inversion of Control)

by 성건희 2020. 2. 18.
반응형
스프링 3대 핵심 IoC

IoC 제어의 역전

 

IoC가 아닐경우

private Person person = new Person();

내가 쓸 놈은 내가 만들어서 쓸게..

 

IoC인 경우

private Person person;

public PersonController(Person person) {
    this.person = person;
}

내가 쓸 놈은 이 놈인데, 누군가 알아서 주겠지..

 

IoC 컨테이너

빈들의 의존성을 관리 (빈이 아니면 관리 X)

 

IoC 컨테이너의 종류

1) BeanFactory

빈의 등록 / 생성 / 조회 / 반환을 관리함

getBean()을 호출해야 빈을 생성함 (Lazy Loading)

 

2) ApplicationContext

BeanFactory 인터페이스를 상속하여 좀 더 많은 기능을 제공한다

BeanFactory 보다는 ApplicationContext를 사용하는 것이 좋다

 

applicationContext를 호출하여 직접 쓸 일은 거의없다.

 

IoC 컨테이너를 굳이 보고싶다면..

@RestController
public class ExampleController {
    
    @Autowired
    ApplicationContext applicationContext; // applicationContext 자신도 빈으로 등록되어 있다
    
    @GetMapping("")
    public String context() {
        return applicationContext.getBean(Person.class);
    }
}

 

빈 (Bean)

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

 

빈으로 등록하는 법

1) Component Scanning


@Component

  • @Controller
  • @Service
  • @Repository

 

스프링 부트로 어플리케이션을 실행 시키는 어노테이션인 @SpringBootApplication를 들어가보자

...
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

어플리케이션 실행 시 @ComponentScan을 통해서 @Component어노테이션이 달려있는 녀석들을 스캔하여 빈으로 등록해주는 것이다

 

2) XML이나 자바 설정 파일에 등록

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

빈을 정의할 때는 @Configuration 을 정의한 곳에서 정의해야 한다

 

등록한 빈을 꺼내서 쓰는 방법

1) @Autowired / @Resource / @Inject


@Autowired

  • Spring에서 지원하는 어노테이션 (스프링에 종속적)
  • 타입으로 연결 안되면 이름
  • 강제 연결 : @Qualifier("title")

 

@Resource

  • Java에서 지원하는 어노테이션
  • 이름으로 연결 안되면 타입
  • 강제 연결 : @Resource(name="title")

 

@Inject

  • Java에서 지원하는 어노테이션
  • 타입으로 연결 안되면 이름

 

2) ApplicationContext에서 getBean()으로 직접 꺼내서 사용

  • 비추

 

DI (Dependency Injection)

의존성 주입

 

의존성 주입을 어떻게 해야할까

  • 생성자

생성자가 1개이고, 파라미터가 빈이면 @Autowired를 생략해도 주입을 해준다.

 

  • 필드

 

  • Setter

 

어떤 주입 방식을 쓰는게 좋을까

어떠한 클래스에 반드시 필요한 의존성인 경우 -> 생성자

Setter가 있다면 -> Setter

Setter가 없다면 -> 필드

 

참고

https://www.inflearn.com/course/spring/dashboard

https://jjunii486.tistory.com/84

https://itjava.tistory.com/54

반응형

댓글