개발강의정리/Spring

[스프링 프레임워크 핵심 기술] 2-2. IoC컨테이너-ApplicationContext와 다양한 빈 설정 방법

nineDeveloper 2019. 10. 6.
728x90

스프링 프레임워크 핵심 기술

포스팅 참조 정보

GitHub

공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다

해당 포스팅에 대한 내용의 GitHub 주소

실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다

https://github.com/freespringlecture/spring-core-tech/tree/chap02-02-applicationcontext

 

freespringlecture/spring-core-tech

백기선님의 스프링 프레임워크 핵심 기술 강의 내용 정리. Contribute to freespringlecture/spring-core-tech development by creating an account on GitHub.

github.com

해당 포스팅 참고 인프런 강의

https://www.inflearn.com/course/spring-framework_core/dashboard

 

스프링 프레임워크 핵심 기술 - 인프런

이번 강좌는 스프링 부트를 사용하며 스프링 핵심 기술을 학습합니다 따라서 스프링 부트 기반의 프로젝트를 사용하고 있는 개발자 또는 학생에게 유용한 스프링 강좌입니다. 초급 웹 개발 Java Spring 온라인 강의

www.inflearn.com

SpringBoot Version

  • 실습 Version: 2.1.2.RELEASE

2-2. IoC 컨테이너 2부: ApplicationContext와 다양한 빈 설정 방법

빈 설정 -> 스프링 IoC 컨테이너

고전적인 Application 설정

<?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/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd" >

    <bean id="bookService" class="me.freelife.BookService"> <!-- bookService 빈 등록 -->
        <!-- bookRepository 프로퍼티에 bookRepository 빈을 레퍼런스로 주입  -->
        <!-- bookRepository name은 setter에서 가지고 온 것 -->
        <!-- ref는 레퍼런스로 다른 빈을 참조한다는 뜻 -->
        <!-- ref에는 setter 에 들어갈 수 있는 다른 bean의 id가 와야됨 -->
        <property name="bookRepository" ref="bookRepository"/>
    </bean>

    <bean id="bookRepository" class="me.freelife.BookRepository"/> <!-- bookRepository 빈 등록 -->

</beans>
  • BookRepository
public class BookRepository {
}
  • BookService
public class BookService {

    BookRepository bookRepository;

    public void setBookRepository(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}
  • application
public class Application {

    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);
    }

}

일일히 빈으로 등록하는 단점을 보완하기 위한 방법

단점을 보완하기위해 패키지를 스캔해서 @Component @Service @Repository 처럼
@Component를 확장한 애노테이션들을 스캐닝해서 빈으로 자동으로 등록해줌
이렇게 등록된 빈은 @Autowired@Inject를 통해 의존성을 주입하여 사용
애너테이션 기반에 빈을 등록하고 설정하는 기능은 스프링 2.5부터 가능한기능

<!-- @Compnent @Service @Repository 애노테이션을 스캐닝 해서 빈으로 등록 해줌 -->
<context:component-scan base-package="me.freelife"/>
  • BookRepository
@Repository
public class BookRepository {
}
  • BookService
@Service
public class BookService {

    @Autowired
    BookRepository bookRepository;

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

java 설정 파일

빈 설정 파일을 xml이 아닌 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;
    }
}
  • BookRepository
public class BookRepository {
}
  • BookService
public class BookService {

    BookRepository bookRepository;

    public void setBookRepository(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}
  • application
public class Application {

    public static void main(String[] args) {
        //ApplicationConfig 를 빈 설정으로 사용하겠다는 설정
        ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);

        // 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);
    }

}

ComponentScan

Application.class 가 있는 곳에서 ComponentScan하여 빈으로 등록

@Configuration
@ComponentScan(basePackageClasses = Application.class)
public class ApplicationConfig {

}

현재의 방식

스프링 부트에서 사용하는 방식 @ComponentScan과 다수의 설정이 포함되어 있음

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
    }

}

스프링 IoC 컨테이너의 역할

  • 빈 인스턴스 생성
  • 의존 관계 설정
  • 빈 제공

AppcliationContext

  • ClassPathXmlApplicationContext (XML)
  • AnnotationConfigApplicationContext (Java)

빈 설정

  • 빈 명세서
  • 빈에 대한 정의를 담고 있다
    • 이름
    • 클래스
    • 스코프
    • 생성자 아규먼트 (constructor)
    • 프로퍼트 (setter)
    • ..

컴포넌트 스캔

  • 설정방법
    • XML 설정에서는 context:component-scan
    • 자바 설정에서 @ComponentScan
  • 특정 패키지 이하의 모든 클래스 중에 @Component 애노테이션을 사용한 클래스를 빈 으로 자동으로 등록 해 줌
728x90

댓글

💲 추천 글