본문 바로가기
Java/Spring 기초

[Spring 기초] Spring 3대 요소 (1) Inversion of Control

by 개미는뚠뚠딴 2021. 9. 19.
반응형

이번엔 갑분 스프링으로 돌아왔다.

스프링을 공부해볼 것이다.

먼저 스프링 필수 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)

반응형

댓글