-
제어의 역전, ApplicationContextspring/스프링 입문 주차 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