[Spring] 7.스프링 DI 지시서 작성하기(Spring Bean Configuration)에서 작성했던 xml파일을 읽어서 지시했던대로 객체를 만들고 그 만들어진 객체를 활용하는 방법을 알아보자.
ApplicationContext 구현체 Class
스프링에서 DI 또는 그 지시서를 읽어가지고 객체를 생성해주고 조립해주는 스프링의 구체적인 객체 이름은 ApplicationContext 인터페이스이다.
ApplicationContext를 구현하고 있는 클래스들이 여러 개가 있는데 대표적인 것은 ClassPathXmlApplicationContext이다. 구현하고있는 Class는 ClassPathXmlApplicationContext 외에도 3가지가 더 존재한다.
아래의 4가지 class는 어떻게 xml의 위치를 넘겨주냐에 대한 차이점을 갖고 있다.
ApplicationContext 구현 클래스 | 설명 |
ClassPathXmlApplicationContext | ClassPath에 위치한 xml 파일을 읽어 설정 정보를 로딩, root로부터 경로를 지정함 |
FileSystemXmlApplicationContext | 파일 경로로 지정된 곳의 xml을 읽어 설정 정보를 로딩 |
XmlWebApplicationContext | xml파일을 웹에 둬서 웹의 URL을 통해 xml파일을 읽어 설정 정보를 로딩 |
AnnotationConfigApplicationContext | @Configuration 어노테이션이 붙은 클래스를 이용하여 설정 정보로 로딩 |
ClassPathXmlApplicationContext 사용법
ClassPathXmlApplicationContext의 경우, src를 root로 보고 경로를 적어주면 된다.
하지만 스프링의 ApplicationContext 클래스를 사용하려면 해당 스프링 라이브러리를 import해야하는데 스프링 라이브러리를 import하지않아 오류가 발생하고 있다.
스프링 라이브러리를 가져오는 방법은 스프링 라이브러리를 직접 다운로드하는 방법과 Maven을 이용하는 방법이 있다. Maven을 사용하면 자동으로 라이브러리를 다운받아주기 때문에 Maven을 사용하는것이 좋다.
현재 우리의 프로젝트는 일반 자바 프로젝트이다. 아래의 이미지대로 우리의 프로젝트를 Maven 프로젝트로 변경해보자.
Maven Repository 라이브러리 가져오기
1.이클립스의 기능 활용
이클립스의 메이븐 플러그인은 메이븐 저장소 웹사이트로 가서 다운받을 필요없이 라이브러리를 검색하고 추가할 수 있는 기능이 있다.
위의 이미지의 과정처럼 pom.xml의 하단 Dependencies탭에서 Add버튼 클릭하면 아래의 이미지에서 원하는 플러그인과 버전을 선택할 수 있지만 이것을 하기 위해 사전으로 해야하는 작업이 있다.
사전 작업으로 아래의 그림처럼 Window > Show View > Other... > Maven Repositories - Open > Global Repositories > central 우측 마우스 클릭 > Rebuild Index 과정을 거쳐야하는데 필자의 이클립스에서는 Rebuild Index가 확인되지 않았다. stackoverflow에 따르면 성능상의 이유로 인덱스 다운로드는 Maven Central을 직접 검색하는 것으로 대체되었다고 한다.
2.직접 가져오기
직접 Maven repository에 가서 가져와보자 https://mvnrepository.com/에 들어간 후 springframework 검색 -> Spring Context -> 6.1.14(최신버전) -> copy
그 후 pom.xml에 가서 <version></version> 과 <build></build> 사이에 <dependencies>태그를 만들고 그 안에 복사한것을 붙어넣기하고 저장하면 라이브러리를 다운로드 받기 시작한다.
또한 pom.xml 하단탭의 Dependency Hierarchy를 클릭해보면 spring-context 라이브러리를 의존성으로 추가하면, Maven이 해당 라이브러리가 필요로 하는 다른 라이브러리들도 자동으로 가져오는 것을 확인할 수 있다.
Maven의 이러한 특징은 "전이적 의존성 관리"(Transitive Dependency Management)라고하는데 이러한 Maven의 전이적 의존성 관리는 개발자가 필요한 의존성들을 일일이 관리할 필요 없이, 간편하게 필요한 라이브러리들을 계층적으로 가져올 수 있도록 도와주는 중요한 기능이다.
이 기능이 없다면 개발자가 관련된 버전의 라이브러리를 모두 직접 가져와야 한다.
이제 아래의 그림처럼 ctrl+shift+o를 누르면 자동으로 import 해준다.
DI 사용하기
이제 context가 pom.xml를 잘 읽었다면 지시서대로 객체를 2개 만들고 그리고 injection까지 해서 얘를 IOC 컨테이너에 담아놨을 것이다.
객체를 사용할 때 두 가지 방식이 있다. 첫 번째는 id를 통해 객체를 가져오는 방법이고, 두 번째는 타입을 통해 가져오는 방법이다.
id를 통해 객체 가져오기
package spring.di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.di.entity.*;
import spring.di.ui.*;
public class Program {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
ExamConsole console = (ExamConsole) context.getBean("console");
console.print();
}
}
id로 객체를 가져오는 경우에는 캐스팅이 필요하다. id만으로는 해당 객체의 구체적인 타입을 알 수 없기 때문에 객체를 Object 형으로 반환하기 때문이다. 따라서 원하는 타입으로 형 변환을 해야만 해당 객체를 사용할 수 있다. 반면 타입을 통해 객체를 가져오는 방식은 이러한 형 변환이 필요하지 않아서 더 간편하다.
타입을 통해 객체 가져오기
package spring.di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.di.entity.*;
import spring.di.ui.*;
public class Program {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
// ExamConsole console = (ExamConsole) context.getBean("console");
ExamConsole console = context.getBean(ExamConsole.class);
console.print();
}
}
getBean()의 ExamConsole.class는 ExamConsole 타입에 맞는 객체를 요청하는 것이다. ExamConsole이 인터페이스라면, 해당 인터페이스를 구현한 객체를 찾아서 반환한다. 더 구체적인 클래스 이름을 사용한다면 그 클래스에 해당하는 구체적인 객체를 반환하게 된다.
id를 통해 객체를 가져오는 방법과 타입을 통해 객체 가져오는 방법중 타입을 통해 객체 가져오는 방법이 형 변환을 따로 할 필요가 없어서 더 선호되는 방법이다.
테스트
setting.xml에서 GridExamConsole로 출력할 때와 InlineExamConsole로 변경하여 출력하는 것도 잘 실행된다. 우리는 위의 이미지에서 코드 수정 없이 setting.xml 파일만 수정하여 다른 객체를 주입해 준 것을 확인할 수 있다.
참고자료
[1] 유튜브 채널 뉴렉처 - 스프링 프레임워크 강의 8강 - 스프링 IoC 컨테이너 사용하기(ApplicationContext 이용하기)
'🖥️ Backend > Spring' 카테고리의 다른 글
[Spring] 9.값 형식 DI (1) | 2024.11.08 |
---|---|
[Spring] 7.스프링 DI 지시서 작성하기(Spring Bean Configuration) (0) | 2024.10.20 |
[Spring] 6.스프링 DI 설정을 위해 이클립스 플러그인 설치하기 (3) | 2024.10.20 |
[Spring] 5.Spring없이 Dependency를 직접 Injection하기 (0) | 2024.10.08 |
[Spring] 4.IoC(Inversion Of Control) 컨테이너 (1) | 2024.10.02 |