0. 왜 applicationContext.xml 을 나누어야 하나?
이전까지 우리는 spring에서는 new 를 통해 instance(object)를 생성하는게 아니라
applicationContext.xml을 통해 container에 bean이라는 object를 생성하고 그걸 필요할 때 getBean() method로 불러와서 사용한다는 것까지 배웠다.
그러면 하지만 이러면 어느 순간 문제가 생길 수밖에 없다.
new GenericXmlApplicationContext("classpath:applicationContext.xml") 을 통해 container (IoC)에 beans가 생성된다.
그리고 필요할 때 꺼내오는 방식이다.
하지만 모든 객체를 applicationContext.xml 파일에 적어두면 유지보수는 어떻게 할까?
나중에 어떤 객체가 어디에 있는지 구분은 할 수 있을까?
이런 여러 문제가 생긴다.
사실 java라는 언어 자체가 OOP(객체지향프로그래밍) 언어이다.
즉, 이런 식으로 코드가 무리하게 길어지고 필요에 따라 나누지 못 하는 것을 싫어한다.
우리는 이를 해결하기 위해 applicationContext.xml 파일을 쪼개고 필요할 때 container에 beans를 생성하는 방법을 배워보려고 한다.
1. applicationContext.xml 나누기
사실 나누는 방법은 너무 너무 간단하다.
우선 기존의 applicationContext.xml 에 적어둔 bean들을 기능에 따라서 구분한다.
그리고 appCtx1.xml, appCtx2.xml, appCtx3.xml 등 파일을 새로 만든 뒤 구분된 코드를 적어주면 끝이다.
굉장히 간단하다.
물론 파일이름을 appCtx1 이런 식을 지을 필요는 없다.
기능에 따라 나누는 것이 훨씬 효율적인 것이다.
예를 들어, appService.xml , service.xml 등 알아보기 쉽도록 이름을 지으면 된다.
2. 사용 방법 (1) MainClass에 String[ ] 만들기
사실 여기가 문제다.
그동안은 pom.xml 을 제외하고 src\main\resources 에 있는 xml 파일은 1개였기 때문에 이 과정이 간단했다.
GenericXmlApplicationContext ctx = new GenericXmlApplication("classpath:applicationContext.xml");
을 통해 container에 bean을 생성하고, ctx로 getBean()을 하면 끝이었다.
하지만 이제 xml 파일이 여러 개이다.
그러면 어떻게 해야 할까??
모든 xml 별로 ctx를 각각 만들어야 할까??
그건 굉장히 비효율적이다.
하나의 xml 파일이 커지면 유지보수가 어렵기 때문에 xml 파일을 나눈 것인데,
xml 별로 ctx를 따로 만들어줘야 한다면 이것 또한 너무나 비효율적일 것이다.
xml 파일 수가 많아지면 하나 하나 만들어주고, 각 ctx object를 관리하는 것도 문제다.
spring에서는 이 모든 걸 한 번에 처리해준다.
바로 Array를 활용해서 말이다.
String[] appCtx = {"classpath:appCtx1.xml", "classpath:appCtx2.xml", "classpath:appCtx3.xml"};
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(appCtx);
String[] 안에 각각의 classpath를 다 넣어주고,
한 번에 GenericXmlApplicationContext( ) 생성자에 넣어줘서 spring container를 만들어준다.
3. 사용 방법 (2) xml 파일 <import> 하기
String[ ] 을 만들어서 각 xml 별 classpath를 따로 저장하지 않고도 한 번에 사용하는 방법이 있다.
하나의 xml에 나머지 모든 xml을 import하는 것이다.
예를 들어, appCtx1.xml , appCtx2.xml , appCtx3.xml 총 3개의 xml 파일이 있다고 가정해보자.
이 중에서 appCtx1.xml 을 중심으로 잡아보자.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath:appCtx2.xml" />
<import resource="classpath:appCtx3.xml" />
<!-- 여러 <bean>들이 존재하는 위치 -->
</beans>
이제 MainClass에서 container를 만들 때, 모든 xml의 classpath를 String[ ] 에 담을 필요가 없다.
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:appCtx1.xml")
이것만 해도 된다.
이미 appCtx1.xml 안에는 appCtx2.xml 과 appCtx3.xml 둘 다 들어가 있기 때문이다.
'Web > Spring' 카테고리의 다른 글
[Gradle] 1. spring boot 프로젝트 만들기 (0) | 2022.02.22 |
---|---|
7. [스프링] Bean 과 Singleton(싱글톤)의 관계 (0) | 2022.02.02 |
5. DI (의존성 주입) (Dependency Injection) 이란? (0) | 2022.02.02 |
4. 이클립스 없이 spring 프로젝트를 만드는 방법 (0) | 2022.02.01 |
3. spring 으로 첫 프로젝트를 만들어보자 (0) | 2022.02.01 |