Java Config를 이용한 설정

최준영·2021년 9월 27일
0

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


  • @Configuration : 스프링 설정 클래스를 선언하는 어노테이션
  • @Bean : bean을 정의하는 어노테이션
  • @ComponentScan : @Controller, @Service, @Repository, @Component 어노테이션이 붙은 클래스를 찾아 컨테이너에 등록
  • @Component : 컴포넌트 스캔의 대상이 되는 어노테이션 중 하나로써 주로 유틸, 기타 지원 클래스에 붙이는 어노테이션
  • @Autowired : 주입 대상이 되는 bean을 컨테이너에 찾아 주입하는 어노테이션

Java Config를 이용해 설정하기(1)


ApplicationConfig.java

@Configuration
public class ApplicationConfig {
  @Bean
  public Car car(Engine e) {
    Car c = new Car(); // 빈 car 객체 먼저 생성 후 
    c.setEngine(e);
    return c;
  }
  
  @Bean
  public Engine engine() {
    return new Engine();
  }
}
  • aplicationContext는 파라미터를 받아들이지 않는 빈 생성 메서드를 먼저 실행해서 반환받은 객체를 관리한다.
  • 그 후 파라미터에 생성된 객체들과 같은 타입이 있는 객체가 있을 경우에 파라미터로 전달해서 객체를 생성한다.
  • 어노테이션을 더 활용하면 이런 설정을 더 간단하게 할 수 있다.

@Configuration

  • jdk 5부터 지원한다. 사전적인 의미는 주석이지만 자바 어노테이션은 특수한 의미를 부여하는 역할 수행한다.
  • 이런 특수한 의미는 컴파일 시 혹은 런타임 시 해석된다.
  • configuration어노테이션은 spring 설정 클래스라는 의미를 가진다.
  • ApplicationContext중에서 AnnotationConfigApplicationContext는 JavaConfig클래스를 읽어들여 IoC와 DI를 적용한다.
  • @Bean이 붙어있는 메소드들을 AnnotationConfigApplicationContext는 자동으로 실행해서 그 결과로 리턴하는 객체들을 기본적으로 싱글톤으로 관리하게 해준다.

ApplicationContextExam03.java

public class ApplicationContextExam03 {

  public static void main(String[] args) {
    ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class); 
    // Bean 만드는 공장

    // Car car = (Car) ac.getBean("car");
    Car car = (Car) ac.getBean(Car.class);
    // class 타입으로 지정 가능하다.
    car.run();
  }
}

Java Config를 이용해 설정하기(2)


ApplicationConfig2.java

@Configuration
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {
}
  • 기존 JavaConfig에서 빈을 생성하는 메소드를 모두 제거했다.
  • ComponentScan을 달고 기존의 Car 클래스와 Engine 클래스 위에 @Component를 붙여주면 같은 기능을 한다.

@ComponentScan

  • 알아서 너가 여기에 있는거 읽어들여서 지정하라는 말이다. 광범위하기 때문에 반드시 스캔을 할 정확한 패키지명을 기입해야한다.
  • 스캔은 기본적으로 클래스 이름의 첫글자를 소문자로 바꾼 이름을 기본으로 한다.

Car.java

@Component
public class Car {
  // 엔진타입 객체가 생성된게 있으면 여기에 주입해달라는 말이다. 그래서 setter 메소드가 필요없다.
  @Autowired
  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();
  }
}
  • @AutoWired는 엔진 타입의 객체가 생성된 것이 있으면 여기에 주입해주기 때문에 setter 메소드가 필요없다.
  • Engine.java에도 @Component를 붙여준다.

ApplicationContextExam04.java

public class ApplicationContextExam04 {
  public static void main(String[] args) {
    ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig2.class); 

    Car car = (Car) ac.getBean(Car.class);
    car.run();
  }
}
  • exam3과 같은 코드이다.
  • spring에서 사용하기 알맞게 @Controller, @Service, @Repository, @Component 어노테이션이 붙어 있는 객체들은 ComponentScan을 이용해서 읽어들여 메모리에 올리고 DI를 주입하도록 한다.
  • 이런 어노테이션이 붙어있지 않은 객체는 @Bean어노테이션을 이용하여 직접 생성해주는 방식으로 클래스들을 관리하면 편하다.

componentScan을 사용하면 편한데, bean을 등록하는 방법을 배운 이유

  • componentScan은 약속된 어노테이션이 붙어있는 것만 가져온다. 나중에 spring JDBC를 쓴다던가 다른 라이브러리가 가지고 있는 객체를 사용하는 등의 상황에는 우리가 그 라이브러리를 열어서 어노테이션을 붙일 수 없다.
  • 그럴 때 bean을 등록하는 방법을 이용해서 해당 bean을 등록하면 편리하게 쓸 수 있다.

Cannot load configuration class 관련 오류


profile
do for me

0개의 댓글