IOC컨테이너와 빈 (2)


1. Spring으로 프로젝트를 생성했을때의 장점

  • 아래의 사진처럼 pom.xml에 spring-boot-starter-web만 포함하게 되면 많은 의존성들이 들어오게 됨.

2. @SpringbootApplication을 제거하고 빈 설정하기


2.1.1 application.xml을 활용한 빈 설정

BookRepository.java

public class BookRepository {
}

BookService.java

public class BookService {

BookRepository bookRepository;

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

application.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="bookService"
          class="me.menggi.springapplicationcontext.BookService">
        <property name="bookRepository" ref="bookRepository" />
    </bean>

    <bean id="bookRepository"
          class="me.menggi.springapplicationcontext.BookRepository" />
</beans>

DemoApplication.java

package me.menggi.springapplicationcontext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Arrays;

public class DemoApplication {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        System.out.println(Arrays.toString((beanDefinitionNames)));
        BookService bookService = (BookService) context.getBean("bookService");
        System.out.println(bookService.bookRepository != null);
    }

}

실행결과

  • 아래와 같이 정상적으로 application이 구동되었으며, bean설정이 되어 의존성 주입이 됨.

2.1.2 application.xml과 어노테이션을 활용한 빈 설정(component-scan)

  • 위 2.1.1에서 @Service, @Repository, @Autowired와 같은 어노테이션과 아래의 xml 파일에서 pacakage를 component-scan 하는 방법
<?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="me.menggi.springapplicationcontext"></context:component-scan>

</beans>

해당 방법은 xml 파일에 bean을 일일히 등록해줘야 하는 수고를 안해도 되기때문에 2.1.1 보다 더 유연한 방법


2.2.1 java 파일을 활용한 빈 설정 : @Bean 어노테이션 활용 (모든 Bean을 등록)

ApplicationConfig.java

@Configuration
public class ApplicationConfig {

    @Bean
    public BookRepository bookRepository(){
        return new BookRepository();
    }

    @Bean
    public BookService bookService(){
        BookService bookService = new BookService();
        bookService.setBookRepository(bookRepository());
        return bookService;
    }
}

Tip : 위와 같이 의존성을 직접 엮지않고, BookService에서 @Autowired를 사용해도 의존성 주입이 된다.

=> 모든 Bean을 일일히 등록해줘야 하는 단점이 있음.


2.2.2 java 파일을 활용한 빈 설정 : @ComponentScan 어노테이션 활용

@Configuration
@ComponentScan(basePackageClasses = DemoApplication.class) //클래스가 위치한곳 부터 componentScan을 해라.
public class ApplicationConfig {
    
}

=> Bean 설정이 필요 없음, DemoApplicaiton 클래스가 위치한곳 부터 component-scan을 함.


3. SpringBootApplication 어노테이션 활용

  • 아래와 같이 @SpringBootApplication만 붙여주면 ApplicationConfig.java // application.xml과 같은 Bean 설정 파일이 필요가 없다.
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
    }
}

이번에는 다양한 빈 설정 방법에 대해서 알아보았습니다.
점점 빈 설정이 자동으로 되어 편해지고 결국에는 하나의 어노테이션(@SpringBootApplication)으로 해결이 되었습니다.

굳이 원리를 알지 못해도 간단히 쓰는데는 문제가 없기 때문에 스프링의 원리에 대해서 무심 해진다는 생각이 드네요.
개인적인 생각으로는, 프로그램을 더 잘 짜기 위해서는 원리를 파악해야 한다고 생각합니다 ㅎㅎ

봐주셔서 감사합니다. 이상 포스팅을 마치겠습니다~

좋은 웹페이지 즐겨찾기