이번엔 갑분 스프링으로 돌아왔다.
스프링을 공부해볼 것이다.
먼저 스프링 필수 3대 개념 중 하나인 Inversion of Control 에 대해서 알아보겠다.
Inversion of Control 이란 ?
직역하자면 '제어의 역전' 이라는 뜻이다.
처음에는 이게 무슨 말이지 !? 싶었는데 열심히 이해해본 과정을 글로 남겨보고자 한다.
(백기선님의 강의를 보면서 기초를 학습했다.)
샘플 프로젝트 : Github Link (스프링 공식 홈페이지 가이드)
보통 자바에서 객체를 생성하려면 new 키워드로 생성자 함수를 호출하여 객체를 생성할 것이다.
class OwnerController {
private OwnerRepository repository = new OwnerRepository();
}
(내가 사용할 의존성은 내가 만든다 ! => 의존성에 대한 제어권이 사용하는 클래스에 있다.)
그러나 스프링에서는 조금 다르다.
내가 의존성을 직접 만들지 않아도 누군가 만들어둔 걸 사용하면 되지 않을까 ?
직접 의존성을 생성하지 않는다. 누군가에 의해 주입받는다.
이것을 '제어의 역전' 이라고 부른다.
class OwnerController {
private OwnerRepository repo;
// 객체를 사용하는 생성자에서 parameter 로 Repository 를 받는다.
public OwnerController(OwnerRepository repo) {
this.repo = repo;
}
}
// Test Class 에서의 사용 예시
class OwnerControllerTest {
@Test
public void create() {
// 생성된 객체를 parameter 로 넘겨준다.
// 해당 repository 를 사용하는 OwnerController 가 직접 Repository 객체를 생성해서 사용하지 않는다.
OwnerRepository repo = new OwnerRepository();
OwnerController controller = new OwnerController(repo);
}
}
위 코드에서도 알 수 있듯이 객체를 사용하는 class 내부의 생성자에서 해당 객체를 생성하지 않고 주입받아 사용한다.
이것을 DI(Dependency Injection) 이라고 한다. (의존성 주입)
그럼 누가 이 객체를 생성해주는 걸까 ?
(Spring 이겠지 ... )
맞다 바로 Spring 의 IoC Container 이다 ! !
이 특별한 Container 친구 덕분에 내가 직접 의존성을 만들고 관리하지 않아도 편하게 개발할 수 있다 ! (개발자의 편의성 증가)
IoC Container 는 Bean 이라고 불리는 객체들을 관리해주는데 이 Bean 객체들을 등록하고 등록된 Bean 객체들의 의존성을 관리해주고 (객체를 생성해) 주입시켜주는 역할을 한다.
IoC Container 가 Bean 객체의 의존성을 관리하기 때문에 Bean 객체가 아니면 의존성을 주입시켜 줄 수 없다.
(Bean 객체끼리만 가능 => 그럼 위 코드의 Controller 와 Repository 는 모두 Bean 객체 !)
그럼 Bean 객체인지 아닌지는 어떻게 알 수 있을까 ?
IntelliJ IDEA 를 사용하면 간편하게 알 수 있다.
OwnerContaoller 와 OwnerRepository Class 바로 옆에 초록 동그라미 (콩처럼 생겼다. 그래서 Bean 인가...) 표시가 있으면 Bean 으로 등록되어 있다고 볼 수 있다.
그럼 어떻게 등록하는 것일까 ?
Component Annotation 을 사용하거나 직접 XML 이나 설정 파일에 등록하는 방법이 있다.
- @Component Annotation
- @Repository
- @Service
- @Controller
- @Configuration
Component Scanning 이 해당 Annotation 이 붙은 Class 를 찾아 Bean 객체로 등록시켜준다.
직접 등록하는 일은 많지 않지만 예제 코드를 찾아보았다.
@SpringBootApplication
public class Application {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
return container;
}
...
}
해당 출처 코드에 ApplicationContext 에 참조하는 방법이 나오는데
이를 통해 직접 Bean 객체를 등록시키거나 getBean()
으로 Bean 객체를 꺼내 접근할 수 있다.
이렇게 Java Spring 3대 주요 개념 중 하나인 Inversion of Control 의 개념에 대해서 알아보았다.
(다음 편 예고 : 다음 주요 개념 AOP 와 PSA)
'Java > Spring 기초' 카테고리의 다른 글
[Spring 기초] Spring 3대 요소 (3) Portable Service Abstraction (0) | 2021.09.22 |
---|---|
[Spring 기초] Spring 3대 요소 (2) Aspect Oriented Programming (0) | 2021.09.22 |
댓글