이번 글은 드디어 의존관계 주입을 하는 방법들에 대해서 알아보려고 한다.
첫번째 글에서는 xml 파일을 만들어 Spring을 통해 의존관계를 주입해주는 예를 들었었다.
그 방법은 이제 Spring의 기능을 직접 이용하지 않고, 파일을 직접 불러와서 해결했던 방법이었기에 생각보다 어려워 보였을 것이다.
하지만 이번에 소개할 방법을 Spring에서 제공하는 기능들을 통해서 의존관계 주입을 해보려고 한다.
일단 먼저 다형성만을 이용해 문제가 된 코드를 예로 들어보겠다.
public class Main {
public static void main(String[] args) {
Repository repository = new StuRepository();
Student stu1 = new Student(1, "GG_BB");
repository.save(stu1);
System.out.println("id : " + stu1.getId() + ", name : " + stu1.getName());
}
}
이 코드는 저번 글에서 예제가 되었던 코드를 약간 변형한 것이다.
현재 이 코드에서의 문제는 인터페이스에만 의존해야는 실행 코드가 구현클래스에도 의존하고 있다는 것이다.
그럼 문제점을 한 번 고쳐보도록 하자.
AppConfig 를 통해
public class AppConfig {
public Repository repository() {
return new StuRepository();
}
}
AppConfig appConfig = new AppConfig();
Repository repository = appConfig.repository();
Student stu1 = new Student(1, "GG_BB");
repository.save(stu1);
System.out.println("id : " + stu1.getId() + ", name : " + stu1.getName());
Repository 인터페이스에서 구현 클래스로 StuRepository를 고를 수 있도록 해놓고, 생성해서 사용하는 방법이다.
구현 클래스를 생성하지 않고 사용할 수 있다.
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">
<bean id="repository" class="Student.StuRepository"/>
</beans>
ApplicationContext applicationContext = new GenericXmlApplicationContext("appConfig.xml");
Repository repository = applicationContext.getBean("repository", StuRepository.class);
Student stu1 = new Student(1, "GG_BB");
repository.save(stu1);
System.out.println("id : " + stu1.getId() + ", name : " + stu1.getName());
다음으로는 xml 파일을 이용한 의존관계 주입이다.
일단 appConfig.xml 파일에서 Repository의 구현클래스인 StuRepository를 bean에 등록해준다
후에 실행 코드 내에서 Xml 파일을 읽어올 수 있게 설정을 해주고, StuRepository를 찾아 값을 출력하는 것이다.
Annotation 을 통해
@Configuration
public class AppConfig {
@Bean
public Repository repository() {
return new StuRepository();
}
}
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
Repository repository = applicationContext.getBean("repository", StuRepository.class);
Student stu1 = new Student(1, "GG_BB");
repository.save(stu1);
System.out.println("id : " + stu1.getId() + ", name : " + stu1.getName());
이번에는 annotation 을 이용한 의존관계 주입을 보겠다.
AppConfig.java 파일을 만들어서 각각 필요한 어노테이션을 붙혀준다.
설정파일이라는 표시를 위한 @Configuration 과 설정내용을 @Bean을 통해 넣어준 뒤에, 실행코드에서 불러와 실행시키는 것이다.
위에 xml에서 소개했던 방법과 모양만 다르지 사실상 똑같은 원리로 작동하는 것이다.
이렇게 스프링에서 제공하는 기능들로 의존관계 주입을 하면, 가독성이 좋아질 뿐만 아니라 좋은 객체지향 프로그램을 만들 수 있게되는 것이다.
실제로 코드내에 생성 된건 Repository, 즉 인터페이스 뿐이게 되는 것이다.
전 글에서 설명했던 SOLID의 DIP 원칙을 만족할 수 있게 되었고, 방법도 처음에 DI를 설명했던 방법보다 훨씬 간단해진 걸 볼 수 있다.
후에는 @AutoWired를 이용해 자동의존관계 주입도 사용할 수 있을 것 같은데, 이는 나중에 한 번 더 다뤄보도록 하겠다.
다음 글은 싱글톤에 대해서 정리하게 될 것 같다.
'Spring' 카테고리의 다른 글
[Spring 핵심 원리] 빈 생명주기 콜백 (0) | 2022.03.20 |
---|---|
[Spring 핵심 원리] 의존관계 주입에 대하여 (생성자 주입과 Lombok) (0) | 2022.03.20 |
[Spring 핵심 원리] 싱글톤 패턴 (0) | 2022.03.20 |
[Spring 핵심 원리] SOLID (0) | 2022.03.20 |
[Spring 핵심 원리] Spring이란? (0) | 2022.03.20 |