지난 포스팅까지 SpringBoot의 작동에 핵심적인 역할을 하는 Dispatcher Servlet에 대해 알아보았다.
이번에는 Spring에서 제공하는 핵심적인 기능 중 IOC에 대해 포스팅을 해보려 한다.
IOC란?
의존 관계 주입(Dependency Injection)이라고도 하며,
어떤 객체가 사용하는 의존 객체를 직접 생성하여 사용하지 않고, 주입받아 사용하는 방법을 말한다.
IOC 컨테이너란?
IOC를 제공하는 Bean들을 담고 있는 Container이다.
Bean이란?
IOC 컨테이너에서 관리하는 객체를 말한다.
즉 Spring은 IOC 컨테이너에서 Bean이라는 객체들을 Spring framework에서 관리하며 (제어권 -> Spring) 이를 필요에 따라 적절하게 주입하여 사용할 수 있게 해준다.
한번 예제로 이해해 보자
@Service
public class BookService {
@Autowired
private BookRepository bookRepository;
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
public Book save(Book book) {
book.setCreated(LocalDateTime.now());
book.setBookStatus(BookStatus.DRAFT);
return bookRepository.save(book);
}
}
BookService라는 간단한 Service class가 있다고 해보자
일반적인 코드라면 BookService라는 Class가 bookRepository를 사용하려면
private BookRepository bookRepository = new BookRepository();
이러한 방식으로 직접 class를 생성하여 의존성을 설정해 주어야 한다. Class 간에 의존성이 있다는 것은 어떠한 class에서 다른 class를 사용하는 것을 말한다.
하지만 위 Service class 코드를 보면 BookRepository라는 class를 사용하지만(의존관계가 존재하지만), 직접 만들지는 않는다(의존성을 직접 설정하지 않는다). 즉 의존성이 있지만, 그 의존성을 직접 만들어 사용하는 것이 아니라 IOC 컨테이너에서 관리하는 객체를 주입받아 (의존성을 주입받아) 사용하게 되는 것이다.
이렇게 의존성을 주입받는 것을 Dependency Injection이라고 표현하고, Dependency Injection은 Inversion Of Control의 일부라고 할 수 있다. 왜? 의존성 설정에 대한 제어권이 Spring framework에게 있기 때문이다.
그렇다면 이러한 방식의 작동이 우리에게 주는 이점이 무엇일까?
스프링 관련 서적 중 권위 있는 책인 "토비의 스프링" 에서는 IOC/DI를 다음과 같이 소개하고 있다.
* 스프링 프레임워크의 근간
* 오브젝트의 생명주기와 의존관계에 대한 프로그래밍 모델
* 유연하고 확장성이 뛰어난 코드를 만들 수 있게 해주는 프로그래밍 모델
이 세 가지 중 마지막 문장에 집중해보면,
객체 내부에서 다른 객체를 생성자를 호출하여 생성하는 것은 어떻게 보면 결합도가 굉장히 높은 코드라고 할 수 있다. 하지만 이처럼 외부에서 의존성을 주입받으면 결합도를 낮춘 유연한 코드를 작성할 수 있다.
이렇게 되면 의존관계를 맺은 class들 사이에 일부 class에 변경점이 존재하더라도, 프로그래머 입장에서 변경해야 할 수정사항이 적어진다. 즉 수정이 용이하기 때문에 확장성이 뛰어난 코드를 작성할 수 있다.
*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.
'Backend > Spring' 카테고리의 다른 글
[Spring] AOP란? (1) | 2021.06.23 |
---|---|
[Spring/SpringBoot] 코드로 확인하는 Dependency Injection (0) | 2021.06.22 |
[Spring] IOC 컨테이너와 Bean이란? (0) | 2021.06.16 |
[Spring/SpringMVC] Dispatcher Servlet이란? (1) | 2021.06.15 |
[Spring/SpringBoot] IntelliJ 소개 및 Gradle 프로젝트 설정 (0) | 2021.06.12 |