본문 바로가기

Back-End/Spring

Spring IoC(제어의역전),DI(의존성주입)란?

Spring IoC(제어의역전),DI(의존성주입)란?

Spring으로 코딩하면서 IoC와 DI에 대한 용어를 자주 접하게 된다. @Autowired, @Bean 어노테이션 덕분에 객체 생성과 설정에 대한 걱정없이 우리는 편하게 작업을 해왔다.

하지만, 내부적으로 Spring Framework가 어떻게 돌아가는지 @Autowired,@Bean 어노테이션을 통해 얻는 장점이 무엇인지 제대로 공부하지 않았다.

이번 포스팅을 통해 Spring IoC,DI에 대해 제대로 알아보려 한다.

1. @Bean,@Component,@Service,@Controller,@Repository 도대체 뭐임?

@Bean, @Component에 대해 알아보자.

두가지 어노테이션은 스프링에 빈을 등록하기 위해 사용되는 어노테이션이다. 
  • @Bean : 함수 위에 사용됨 ( 외부 라이브러리라서 클래스 제어가 불가능한 경우 )
  • @Component : 클래스 위에 사용됨

@Service,@Controller,@Repository에 대해 알아보자.

3가지 어노테이션을 보면 모두 @Component를 상속받고 있다. 결국 이 어노테이션들도 스프링에 빈을 등록하기 위해 사용되는 어노테이션이다.


@Component 어노테이션과 차이점은 특정한 사용용도를 가진다는 것이다.


  • @Controller : Spring MVC에서 사용하기 위함. @RequestMapping과 함께 사용할 수 있음
  • @Service : service layer
  • @Repository : persistence layer


2. @Autowired - 등록된 빈을 사용하는 방법

@Autowired는 Spring 2.5부터 지원하는 의존성 주입(Dependency Injection) 방법이다. 의존성 주입에 대해 알아보기 전에 먼저 Autowired의 사용법에 대해 먼저 살펴보자.

@Autowired를 이용한 의존성 주입 ( 생성자 주입 vs Setter 함수 주입 )

public class Store {

private Hello hello;

/**
* 생성자를 통한 의존성 주입
* 장점 : 생성자를 통해 객체주입을 함으로 실수로 객체주입 안하는 경우 발생 X
* 단점 : 생성자 매게변수가 많아지면 어떤 것을 주입하는지 보기 힘듦
*/
@Autowired
public Store(Hello hello) {
this.hello = hello;
}

/**
* Setter 함수를 이용한 의존성 주입
* 장점 : 어떤 객체를 주입하는지 확실함
* 단점 : 실수로 객체주입을 안할 수도 있음.
*/
@Autowired
public void setHello(Hello hello) {
this.hello = hello;
}
}


@Autowired가 설정된 프로퍼티를 반드시 설정한 필요가 없는 경우 처리 방법 3가지 

/**
* Spring 5 부터 지원하는 방법
*/
@Autowired
public void setHello_optional(Optional<Hello> hello) {
if (hello.isPresent()) {
System.out.println("null인 경우 처리");
} else {
this.hello = hello.get();
}
}

/**
* hello Bean 객체가 없는 경우인데도 hello는 null값이 아니라
* 아래 코드 동작하지 않음
*/
@Autowired(required = false)
public void setHello_required(Hello hello) {
if (hello == null) {
System.out.println("null인 경우 처리");
} else {
this.hello = hello;
}
}

@Autowired
public void setHello_nullable(@Nullable Hello hello) {
if (hello == null) {
System.out.println("null인 경우 처리");
} else {
this.hello = hello;
}
}


의존성 주입이란?