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;
}
}
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;
}
}
의존성 주입이란?
'Back-End > Spring' 카테고리의 다른 글
Lombok 사용하기 (0) | 2019.03.15 |
---|---|
스프링 5에서 Reactive Programming 하기 (1) (0) | 2018.11.26 |
POJO(plain old java object)란? (0) | 2018.09.16 |
Spring Boot와 Docker를 이용한 개발환경 구축하기 (0) | 2018.09.02 |
Spring Boot 2.0 - 스프링 부트 기본 로깅 (0) | 2018.07.22 |