ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 제어의 역전, ApplicationContext
    spring/스프링 입문 주차 2024. 1. 22. 20:59

     

    이전 글에서 DI패턴에 대해서 알아봤다.
    외부에서 만들어진 객체를 주입받는 것으로 느슨한 결합 즉, 유연한 코드를 만들 수 있었다.
    그런데 '외부'라는 것은 대체 어디일까?

     



    IoC Container 와 Bean

    Bean : 스프링이 관리하는 객체
    IoC Container : 관리하는 객체들이 모여있는 컨테이너

    @Component 어노테이션을 달아주면 해당 클래스를 스프링 빈에 등록한다. 
    (빈을 등록할 땐 클래스 이름에서 첫글자를 소문자로 변경한 상태 그대로 저장된다.)
    앱이 기동할 때 그 클래스들을 모두 객체화 하여 IoC Container 에 저장하고,
    그것들이 필요한 위치에 주입한다.

    스프링 부트를 사용하지 않았다면, 프로젝트 최상단 폴더 위치에 Config 클래스를 생성하여
    @Configuration 을 통해 직접 객체를 생성하고 주입하는 IoC Container를 만들어야 하지만,
    스프링 부트는 그것을 자동으로 해 준다.

    또한 스프링 부트 4.3 이전에는 스프링 빈에서 꺼내 주입할 생성자를 @Autowired를 통해 명시해 주어야 했다.
    4.3버전 이후에는 '생성자가 한개'인 경우에는 @Autowired를 생략해도 자동으로 등록되도록 변경 되었다.

    수정자 주입, 필드 주입에서도 마찬가지로 @Autowired 를 사용해야 스프링 빈에서 가져올 수 있다.
    (수정자 주입은 가끔 사용, 필드 주입은 사용 x )

    롬복의 @RequiredArgsContructor 를 통해 자동으로 생성자 주입을 사용할 수도 있다.
    이 때도 당연히 생성자가 한개라면 자동으로 @Autowired가 적용된다.

    @Component 로 등록된 클래스가 아니라면 @Autowired로 주입해 줄 수 없다.

     


     

     

    ApplicationContext 를 통해 직접 주입할 수 있다.
    ApplicationContext == IoC 컨테이너 라고 할 수 있다.

    1. 빈 이름으로 가져오는 방법
    {
    MemoRepository memoRepository = context.getBean("memoRepository);
    this.memoRepository = memoRepository;
    }
    2. 빈 클래스 형식으로 가져오는 방법
    {
    MemoRepository memoRepository = context.getBean("MemoRepository.class);
    this.memoRepository = memoRepository;
    }
    와 같은 형식으로 직접 주입하는 것도 가능하다.
    실제로 사용할 일은 별로 없겠지만, 스프링 부트를 사용하지 않을 때는 이렇게 사용해야 하며,
    AppConfig 클래스 또한 만들어 주어야 한다.


    마지막으로 @Controller, @Service, @Repository 에 대한 의문을 풀어보자
    @Service와 @Repository 를 등록하는 이유는 상위 계층이 주입 받아 사용하고 있는 것을 코드로 확인할 수
    있기 때문에 직관적으로 알 수 있다.
    하지만 @Controller, @RestController 와 같은 경우에는 누가 사용하고 있길래 스프링 빈에 등록을 하는걸까?
    사실 눈에 보이지 않을 뿐, 이전에 배운 DisPatcherServlet 이 HandlerMapping을 통해서
    해당하는 컨트롤러를 찾는다는 것을 기억할 것이다.
    찾았다면 메서드를 호출하는데, 그 때 @Controller를 IoC 컨테이너에서 꺼내 사용한다.

    'spring > 스프링 입문 주차' 카테고리의 다른 글

    영속성 컨텍스트의 기능  (0) 2024.01.25
    JPA란 무엇일까  (0) 2024.01.23
    IoC Container 와 Bean  (0) 2024.01.22
    JDBC란 무엇일까?  (0) 2024.01.18
    HTTP 데이터를 객체로 처리하는 방법  (0) 2024.01.18
Designed by Tistory.