당니의 개발자 스토리
다양한 설정 형식 지원 - 자바 코드, XML 본문
다양한 설정 형식 지원 - 자바 코드, XML
지금까지는 Java 코드로 설정하는 걸 알아봤는데, 이번 시간에는 XML로 설정하는 것도 잠깐 알아보겠습니다. 깊이 있게 할 건 아니고요. 이렇게 동작하는 걸 한번 정도 이해해두시면, Java 설정이랑 거의 똑같거든요. 그래서 어렵지는 않아요.

스프링은 다양한 설정 형식을 지원합니다. 그래서 Java 코드, XML 이런 것들을 지원하는데요.
스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있게 정말 유연하게 설계가 돼있어요. 그래서 자바 코드, XML, Groovy 등등, 심지어 임의의 뭘 만들 수도 있어요.
자 이 그림을 보시면,

제일 위에 BeanFactory가 있고 그 밑에 ApplicationContext가 있었죠.
이 ApplicationContext를 구현한 것 중에 하나가 우리가 사용했던 AnnotationConfigApplicationContext가 있습니다. AnnotationConfigApplicationContext는 AnnotationConfig를 설정 정보로 사용하는 ApplicationContext라고 보면 돼요. 얘는 AppConfig 클래스를 사용했죠.
그리고 또 다른 구현체로, ApplicationContext를 구현한 것 중에 GenericXmlApplicationContext 라는 것도 있어요. 이건 자바 코드가 아니라, XML 이라는 문서를 설정 정보로 사용한 거예요.
그리고 맨 오른쪽의 XxxApplicationContext 처럼, 임의로 구현해서 또 만들 수도 있습니다.
요즘 주로 많이 사용하는 건 거의 자바 코드 기반의 AnnotationConfig를 많이 사용하고, 과거에는 XML 많이 사용했거든요. 그래서 스프링을 공부하다 보면, 그래도 XML 정도는 '아 이렇게 돌아가는구나' 정도는 알고 계시는 게 좋습니다.
그래서 Annotation 기반의 자바 코드 설정을 사용하는 것을 정리를 해보면,

지금까지 했던 겁니다. new 해가지고 AnnotationConfigApplicationContext를 만들면서 자바 코드로 된 설정 정보(AppConfig.class)를 넘겨줬죠.
XML도 똑같습니다.

그런데 최근에는 Spring Boot를 많이 사용하면서, XML 기반의 설정을 잘 사용하지 않아요. 김영한t는 아예 사용을 안 합니다.
그러나 아직 많은 레거시 프로젝트들이 XML로 되어 있습니다. 또 Xml을 사용하면 장점이 있어요. 뭐냐면, 컴파일 없이 XML 문서를 그냥 바꿔치기 하면, 빈 설정 정보를 완전 바꿔치기 할 수 있어요. 되게 이상적이죠? 그렇게 할 수 있는 장점도 있기 때문에, 한 번쯤 배워두는 것도 괜찮습니다.
GenericXmlApplicationContext를 사용하면서, xml 설정 파일을 넘기면 됩니다.
XmlAppConfig 사용해서 자바 코드로 한 번 짜보겠습니다.
test의 hello.core에다가 xml이라는 패키지를 만들겠습니다.

그리고 나서,

여기에다가 XmlAppContext 라는 테스트 클래스를 만들겠습니다.

그리고 아까 봤던 GenericXmlApplicationContext로 생성하면 됩니다.

appConfig.xml 이라는 설정 파일을 넘기겠습니다. 그리고 반환 값을 cmd + option + v 해서 부르면,

GenericXmlApplicationContext로 반환되는데, 얘를 ApplicationContext로 바꿔줘도 됩니다. 어차피 부모니까요.

이렇게 해놓고, ApplicationContext에서 Bean을 조회할 거에요.

memberService 라는 이름의 MemberService 객체를 조회할 거야. 하고 전달하는 거죠.

그래서 검증을 해보고 돌려보면,

당연히 오류가 납니다. 테스트를 먼저 작성을 했기 때문이죠.

이제 appConfig.xml을 만들어볼게요.
appConfig.xml은 테스트를 위한 거기 때문에 test 폴더에 둬도 되지만 resources에 담겠습니다. 자바 코드가 아닌 건 resources 밑에 두면 됩니다.

이렇게 New File로 appConfig.xml을 만들어도 되는데,

이렇게 만들면 되는데, 엔터프라이즈 전용이니 복붙하세요.

xml 기반의 스프링 빈 설정 정보 입니다. 그 다음에 뭘 해야하냐면,

bean으로 등록할 건데, id에다가 memberService 라고 하고 class에는 MemberServiceImpl 라고 하면 됩니다. 이건 패키지 명까지 다 적어줘야 합니다.
그 다음에 생성자를 넘겨줘야 합니다.

reference는 ref로 넘겨주시면 돼요.
근데 memberRepository가 없기 때문에 bean으로 또 등록하면 됩니다.

이렇게 하면, MemoryMemberRepository까지 완성이 됩니다. AppConfig.java를 보면

여기까지가 완성이 된 겁니다. 이 부분이랑

이거랑 완전히 똑같습니다. 그러면 밑에 bean으로 등록한 memberRepository가 위의 생성자의 ref로 넘어갑니다.

위의 memberRepository의 실제 구현 객체는 MemoryMemberRepository인 거죠.
그 다음에 할인 정책을 만들어야 됩니다.

할인 정책(OrderServiceImpl)는 AppConfig에서 봤듯이,

memberRepository랑 discountPolicy를 의존했기 때문에,

이렇게 ref, 참조 값을 넣어서 의존관계를 설정할 수 있습니다.
이렇게 appConfig.xml은

AppConfig랑 완전히 똑같다고 보시면 됩니다. 형식이 XML 일 뿐이지 완전히 똑같아요.
그리고 다시 test 폴더에 돌아와서,

돌리면, 클래스 path에 있는 걸 자동으로 읽어서 잘 동작할 겁니다. resources 밑에 있는 걸 알아서 읽습니다.

녹색불이 떴습니다. 이 4개가 싱글톤 빈으로 등록이 되었다고 나옵니다.
정리하면, GenericXmlApplicationContext로 만들고, 설정 정보가 class 파일에서 XML로 바뀐 거 밖에 없어요. 나머지는 코드는 똑같아요.


이렇게 해서 XML 기반의 appConfig.xml 설정 정보와 java 코드로 된 AppConfig.java 설정 정보를 비교해 보면 거의 비슷한 것을 알 수 있습니다.
xml 기반으로 설정하는 것은 최근에 잘 사용하지 않으므로 이정도로 마무리 하고, 필요하면 스프링 공식 레퍼런스 문서를 찾아보면 도움이 되실 거예요.
그러니까 옛날에 xml 기반으로 하셨던 분에게는 너무 익숙한 내용인데, 최근에 Spring boot를 쓰면서 하셨던 분들은 걱정할 필요가 없죠. @Bean 으로 했던 것처럼, 그냥 1대 1로 이렇게 맵핑 하면 되는구나. 하고 이해하시면 됩니다.

사실 XML로 해본 이유는 이 그림 때문에 그래요.
스프링이 java 코드든, XML이든 이러한 설정들을 얼마나 유연하게 할 수 있는가를 보여드리고 싶었던 것도 있습니다.
자 다음 시간에는 스프링 빈 설정 메타 정보, BeanDefinition에 대해서 알아보겠습니다.
'스프링 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
| 웹 애플리케이션과 싱글톤 (0) | 2024.01.23 |
|---|---|
| 스프링 빈 설정 메타 정보 - BeanDefinition (0) | 2024.01.23 |
| BeanFactory와 ApplicationContext (0) | 2024.01.21 |
| 스프링 빈 조회 - 상속 관계 (0) | 2024.01.21 |
| 스프링 빈 조회 - 동일한 타입이 둘 이상 (0) | 2024.01.21 |