Gidhub BE Developer

Spring 프레임워크 핵심 기술 - Bean 설정 방법 : XML 파일에 Component Scan 방식

2019-09-17
goodGid

이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.

개요

  • Application에 Baen 설정 파일을 어떻게 설정하는지

  • 여러 가지 방법을 통해 알아보자.

  • 글의 순서는 큰 상관은 없지만

  • 가능하다면 순서로대 보는걸 추천한다.

  1. XML 파일에 직접 Bean 등록 방식

  2. XML 파일에 Component Scan 방식

  3. Java 설정 파일에 직접 Bean 등록 방식

  4. Java 설정 파일에 Component Scan 방식

  5. @SpringBootApplication


머릿말

  • 이전 글에 이어서 Bean 설정 방법에 대해 알아보자.

  • 이전 글 : XML 파일에 직접 Bean 등록 방식에서는

  • 직접 Bean을 등록해줘야했다.

  • 그렇기 때문에

  • Bean을 등록하는 과정은

  • 굉장히 번거롭고

  • 유지 보수 또한 힘들었다.

  • 그래서 나온 방식이

  • Component Scan 방식이다.


XML 파일에 Component Scan 방식

  • Component Scan으로 Bean을 등록하는 방법은 다음과 같다.

  • 우선 application.xml을 수정한다.

application.xm

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

  <context:component-scan base-package="goodgid.study.spring"/>

</beans>
  • 위 코드를 해석하자면

  • 나는 goodgid.study.spring 이 패키지 부터

  • Scan을 해서

  • Bean을 등록하겠다.

  • 라고 해석할 수 있다.


Bean Scan

  • Bean Sacn 시

  • 기본적으로 @Component 애노테이션을 사용하여

  • Bean으로 등록한다.


  • 즉 다른 애노테이션(=B)의 메타 애노테이션

  • @Component이 존재한다면

  • 다른 애노테이션(=B)을 사용한 클래스 혹은 객체도

  • Bean으로 등록이 된다.


  • 예를 들어보자.

  • @Service라는 애노테이션이 있다.

  • @Service 애노테이션의 정의를 보면 다음과 같다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}
  • 메타 애노테이션

  • @Component를 사용하고 있다.

  • 그렇기 때문에

  • @Service 애노테이션을 사용하면

  • Bean으로 등록이 된다.


  • 추가적으로 자주 사용되는

  • @Repository도 같은 원리로

  • @Repository 애노테이션을 사용하면

  • 해당 클래스 혹은 객체는

  • Bean으로 등록이 된다.


Business Code

BookRepository

@Repository
public class BookRepository {
}

BookService

@Service
public class BookService {
    BookRepository bookRepository;

    public void setBookRepository_XML(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}
  • Repository와 Service에

  • 각각 @Repository와 @Service 애노테이션을 사용하여

  • Component Scan이 이뤄지면

  • Bean으로 등록된다.


  • 하지만 BookService에서 사용하는

  • bookRepository의 의존성 주입은 되지 않는다.

  • 여기서 bookRepository의 의존성 주입을 시키기 위해선

  • @Autowired 애노테이션을 사용한다.


  • BookService의 코드를 수정해보자.

BookService

@Service
public class BookService {
    @Autowired
    BookRepository bookRepository;

    public void setBookRepository_XML(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}

Application의 Bean 설정

  • 실제로 Application을 실행시켜

  • Component Scan이 정상적으로 이뤄지는지 확인해보자.

public class Application {

    public static void main(String[] args) {
        // xml 파일로 ApplicationContext를 생성하기 때문에
        // ClassPathXmlApplicationContext 클래스를 사용한다.
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");

        // ApplicationContext 안에 등록된 Bean들을 출력해본다.
        String[] beans = context.getBeanDefinitionNames();
        System.out.println(Arrays.toString(beans));

        // context.getBean()을 호출하면 Object 타입이 Return되기 때문에
        // 타입 캐스팅을 해줘야한다.
        BookService bookService = (BookService) context.getBean("bookService");

        // 정상적으로 주입이 되었는지 체크해본다.
        System.out.println(bookService.bookRepository != null);
    }
}

Result

[bookService, bookRepository_id]
true
  • application.xml에서

  • Component Scan 방식으로

  • Bean 등록을 하도록 설정하였으며

  • Component Scan이 끝난 후

  • bookService의 bookRepository에 주입이

  • 정상적으로 되었음을 확인 할 수 있다.


XML 설정 방법이 답인가?


참고


Comments

Content