Java Config, 어노테이션을 이용한 설정

oyeon·2021년 1월 14일
1

Java Config

  • 앞서 배운 xml 설정을 대체하여 의존성 주입을 할 수 있다.
  • 자바 클래스 파일을 설정 파일로 사용한다.
  • @Configuration 어노테이션으로 표시

Java config를 이용한 설정을 위한 어노테이션

@Configuration

  • 스프링 설정 클래스를 선언하는 어노테이션

@Bean

  • bean을 정의하는 어노테이션

@ComponentScan

  • @Controller, @Service, @Repository, @Component 어노테이션이 붙은 클래스를 찾아 컨테이너에 등록

@Component

  • 컴포넌트 스캔의 대상이 되는 애노테이션 중 하나로써 주로 유틸, 기타 지원 클래스에 붙이는 어노테이션

@Autowired

  • 주입 대상이되는 bean을 컨테이너에 찾아 주입하는 어노테이션

실습1 - @Configuration, @Bean

  1. Car.java
package kr.or.connect.diexam01;

public class Car {
	private Engine v8;
	
	public Car() {
		System.out.println("Car 생성자");
	}
	public void setEngine(Engine e) {
		this.v8 = e;
	}
	public void run() {
		System.out.println("엔진을 이용하여 달립니다.");
		v8.exec();
	}
}
  1. Engine.java
package kr.or.connect.diexam01;

public class Engine {
	public Engine() {
		System.out.println("Engine 생성자");
	}
	public void exec() {
		System.out.println("엔진이 동작합니다.");
	}
}
  1. ApplicationConfig.java 생성
package kr.or.connect.diexam01;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {
	@Bean
	public Car car(Engine e) {
		Car c = new Car();
		c.setEngine(e);
		return c;
	}	
	@Bean
	public Engine engine() {
		return new Engine();
	}
}
  1. ApplicationContextExam03.java 생성
package kr.or.connect.diexam01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ApplicationContextExam03 {
    public static void main(String[] args) {
    /* ApplicationContext중에서 AnnotationConfigApplicationContext는 
     * JavaConfig클래스를 읽어들여 IoC와 DI를 적용한다.
     * 이때 설정파일 중에 @Bean이 붙어 있는 메소드들을 AnnotationConfigApplicationContext는 자동으로 실행하여 
     * 그 결과로 리턴하는 객체들을 기본적으로 싱글턴으로 관리 한다.
     */
	ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        
	// Car car = (Car)ac.getBean("car"); // ApplicationConfig의 메서드 이름 "car"
    	// 다음 방식이 더 좋다.
	Car car = (Car)ac.getBean(Car.class); // class 이름이 변경되어도 상관없다.
	car.run();
    }
}

실습2 - @Configuration, @ComponentScan, @Component, @Autowired

  1. ApplicationConfig2.java 생성
package kr.or.connect.diexam01;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {

}
  1. Car.java 수정
package kr.or.connect.diexam01;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Car {
	// @Autowired : Engine 타입의 객체가 생성된 것이 있으면 알아서 v8에 주입하라는 의미
	@Autowired
	private Engine v8;
	
	public Car() {
		System.out.println("Car 생성자");
	}
	//  @Autowired로 setter메서드 대체
//	public void setEngine(Engine e) {
//		this.v8 = e;
//	}
	public void run() {
		System.out.println("엔진을 이용하여 달립니다.");
		v8.exec();
	}
}
  1. Engine.java 수정
package kr.or.connect.diexam01;

import org.springframework.stereotype.Component;

@Component
public class Engine {
	public Engine() {
		System.out.println("Engine 생성자");
	}
	public void exec() {
		System.out.println("엔진이 동작합니다.");
	}
}
  1. ApplicationContextExam04.java 생성
package kr.or.connect.diexam01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ApplicationContextExam04 {

	public static void main(String[] args) {
		ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig2.class);
		Car car = (Car)ac.getBean(Car.class);
		car.run();
	}
}

결과

생각해보기

  • 다루는 빈(Bean)이 많아질수록 xml로 설정하는 것과 @ComponentScan, @Component, @Autowired를 이용하는 것 중 어떤 것이 유지보수에 좋을까?
  • @AutoWired 는 Field, Constructor, Setter Method 에 사용할 수 있다. 각각의 방식에 장단점에 대해서 더 생각해보자.
  • @ComponentScan을 하면 편한데, @Bean을 등록하는 방법을 왜 배웠을까?
    - @ComponentScan은 약속된 어노테이션이 붙어있는 것만 읽어온다. 하지만 Spring JDBC와 같은 다른 라이브러리가 가진 객체를 사용할 때는 그 library에 어노테이션을 붙일 수 없다. 그럴 때 Bean이 사용된다.
profile
Enjoy to study

0개의 댓글