DI (Dependency Injection)
: DI는 의존관계를 외부에서 결정하는 것이기 때문에, 클래스 변수를 결정하는 방법들이 곧 DI를 구현하는 방법이다. 런타임 시점의 의존관계를 외부에서 주입하여 DI 구현이 완성된다.
Burger 레스토랑 주인이 어떤 레시피를 주입하는지 결정하는 예시로 설명하고자 한다.
"햄버거 가게 요리사는 햄버거 레시피에 의존한다." 라는 DI를 아래코드로 표현
- 생성자를 이용
class BurgerChef {
private BurgerRecipe burgerRecipe;
public BurgerChef(BurgerRecipe burgerRecipe) {
this.burgerRecipe = burgerRecipe;
}
}
class BurgerRestaurantOwner {
private BurgerChef burgerChef = new BurgerChef(new HamburgerRecipe());
public void changeMenu() {
burgerChef = new BurgerChef(new CheeseBurgerRecipe());
}
}
- 메소드를 이용 (대표적으로 Setter 메소드)
class BurgerChef {
private BurgerRecipe burgerRecipe = new HamburgerRecipe();
public void setBurgerRecipe(BurgerRecipe burgerRecipe) {
this.burgerRecipe = burgerRecipe;
}
}
class BurgerRestaurantOwner {
private BurgerChef burgerChef = new BurgerChef();
public void changeMenu() {
burgerChef.setBurgerRecipe(new CheeseBurgerRecipe());
}
}
LIST, MAP, SET context.xml 설정
<beans>
<bean id="def" class="org.websparrow.beans.DefaultType">
<!--java.util.List-->
<property name="fruits">
<list>
<value>Apple</value>
<value>Mango</value>
</list>
</property>
<!--java.util.Set-->
<property name="cricketers">
<set>
<value>Sachin</value>
<value>Virat</value>
<value>Sehwag</value>
</set>
</property>
<!--java.util.Map-->
<property name="countryCapital">
<map>
<entry key="India" value="New Delhi" />
<entry key="Russia" value="Moscow" />
<entry key="France" value="Paris" />
</map>
</property>
</bean>
</beans>
Application Context
- Web Application 최상단에 위치하고 있는 Context
- Spring에서 ApplicationContext란 BeanFactory를 상속받고 있는 Context
- Spring에서 root-context.xml, applicationContext.xml 파일은 ApplicationContext 생성 시 필요한
설정정보를 담은 파일 (Bean 선언 등..) - Spring에서 생성되는 Bean에 대한 IoC Container (또는 Bean Container)
- 특정 Servlet설정과 관계 없는 설정을 한다 (@Service, @Repository, @Configuration, @Component)
- 서로 다른 여러 Servlet에서 공통적으로 공유해서 사용할 수 있는 Bean을 선언한다.
- Application Context에 정의된 Bean은 Servlet Context에 정의 된 Bean을 사용할 수 없다.
Servlet-Context (servlet-context.xml)
- Servlet 단위로 생성되는 context
- Spring에서 servlet-context.xml 파일은 DispatcherServlet 생성 시에 필요한 설정 정보를 담은 파일
(Interceptor, Bean생성, ViewResolver등..) - URL설정이 있는 Bean을 생성 (@Controller, Interceptor)
- Application Context를 자신의 부모 Context로 사용한다.
- Application Context와 Servlet Context에 같은 id로 된 Bean이 등록 되는 경우,
Servlet Context에 선언된 Bean을 사용한다. - Bean 찾는 순서
- Servlet Context에서 먼저 찾는다.
- 만약 Servlet Context에서 bean을 못찾는 경우 Application Context에 정의된 bean을 찾는다.
- Servlet Context에 정의된 Bean은 Application Context의 Bean을 사용할 수 있다.
web.xml 설정
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
https://jaehun2841.github.io/2018/10/21/2018-10-21-spring-context/#Web-Application-Context
https://websparrow.org/spring/spring-collection-list-set-and-map-dependency-injection-example
https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/
'WEB개발 > Spring' 카테고리의 다른 글
[Spring] Spring Security (0) | 2024.08.23 |
---|---|
하이버네이트(Hibernate) & JPA(Java Persistence API) (0) | 2024.05.23 |
[SpringBoot] 스프링부트 오류모음 (0) | 2024.03.27 |
[Spring] MessageSource 다국어 (0) | 2023.01.19 |
[Spring] 주석 1(Annotation) (0) | 2021.11.02 |