[Web] SpringFramework DI java config로 설정하기

앞서 수행했던 SpringFramework DI 설정을 java Configuration으로 수행해보자.

ApplicationConfig.java 파일을 생성한다.
@Configuration
public class ApplicationConfig {
    @Bean
    public Car car(Engine e) {
        Car c = new Car();
        c.setEngine(e); //전달받은 Engine 객체
        return c;
    }
 
    // 컴파일 혹은 런타임시에 인식되는 어노테이션. 자바는 다양한 어노테이션을 제공
    @Bean
    public Engine engine() {
        return new Engine();
//jdk5부터 지원. 그것보다 낮은 버전에서는 사용이 불가능         
    }
}
cs

@Configuration 어노테이션을 앞에 붙여줘야 해당 클래스가 Config임을 알릴 수 있다.
ApplicationContext는 파라미터를 받아들이지 않는 빈 생성자 메서드를 모두 실행하고 반환받은 객체를 관리한다. 그래서 Car 에서 c.setEngine(e) 에 e에는 생성되었던 Engine객체가 들어갈 수 있는 것이다.

테스트 하기 위한 ApplicationContextExam03.java
public class ApplicationContextExam03 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
 
        // Car.class -> type이 Car인 bean을 가져온다
        Car car = ac.getBean(Car.class); // 등록했던 bean아이디
        // engine 탑재한 car 객체가 만들어진것
        car.run();
    }
 
}
 
cs

xml 파일을 불러오는 대신 AnnotationConfigApplicationContext() 를 사용한다.
또하나 달라진 점은 getBean() 에서 만들어뒀던 bean의 아이디가 아니라 Car.class를 사용하는 점이다. 아이디를 써주면 오타가 나서 오류가 발생하기 쉽다. Car.class를 사용하면 Car 타입을 갖는 bean을 찾아서 불러오기 때문에 오타를방지 할 수 있는 것!

조금 더 수정해 보자
ApplicationConfig2.java
@Configuration
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {
 
}
cs

@ComponentScan("패키지명") 을 추가했다. 이 어노테이션은 Component, controller, service, 등의 어노테이션을 패키지에서 스캔하여 모두 등록해준다. 이제 이 Config 파일에는 따로 bean을 선언 할 필요가 없다!
대신 Car, Engine클래스를 조금 수정해야 한다.
먼저 Car.java
@Component
public class Car {
    @Autowired
    private Engine v8;
 
cs
Car 클래스 또한 @Component를 붙여주고 의존관계를 표시하기 위해 Engine 엘리먼트 앞에 @Autowired를 붙여준다. 이제 setEngine 메서드는 필요없다.
Engine.java
@Component
public class Engine {
    public Engine() {
cs

위와 같이 수정하고 setter 메서드를 없앳다.

'ApplicationContextExam04.java'를 만들었다. 03.java와 모두 같고 ApplicationConfig2로만 바꿔줬다. 정상적으로 출력이 된다.

다루는 bean이 많아질 수록 xml로 설정하는 것보다 @ 어노테이션을 사용하여 관리하는 것이 더 수월할 것 같다.
@AutoWried는 Field , Construtor, Setter method에 사용할 수 있다. 사용하기 매우 편리하지만 장단점이 있다고 한다.

참고 : https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/



No comments:

Powered by Blogger.