ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [02] ApplicationContext - 다양한 Bean 설정 방법
    Spring/Spring 핵심 기술 2020. 4. 12. 11:18
    반응형

    Inversion of Control Container의 역할은 다음과 같습니다.

    • Bean 생성
    • Bean과 Bean 사이의 의존관계 설정
    • 사용자가 요청할 시 Bean을 제공

     

     

    Inversion of Control Container를 만들기 위해서는 Bean 설정 file이 필요합니다. Bean 설정 file에는 XML 설정 file과 JAVA 설정 file이 있는데 최근에는 JAVA 설정 file을 사용하는 것이 추세입니다. Spring에서 Inversion of Control Container 기능은  ApplicationContext가 담당하고 있으며 XML, JAVA 각각의 Bean 설정 file에 따른 ApplicationContext 구현체는 다음과 같습니다.

    • XML : ClassPathXmlApplicationContext
    • JAVA : AnnotationConfigApplicationContext

     

     

    초창기 Spring에서는 Bean을 등록하기 위해서는 각각의 Bean들에 대해 의존관계를 지정하여 XML file에 하나씩 등록해야 하는 번거로움이 있었습니다. 이를 해결하기 위해 Component를 Scanning 하여 자동으로 Bean을 생성하여 Container에 등록하도록 하는 Component Scan을 도입했습니다. Bean 등록하기 원하는 class에 @Component 어노테이션을 또는 이를 확장한 어노테이션을 붙여서 Component Scan 대상으로 지정합니다. Component 어노테이션은 다음과 같습니다.

     

        @Component

            -@Controller

            -@Service

            -@Repository

            -@Configuration

     

    Inversion of Control Container에 등록된 Bean을 다른 Bean에 injection하는 방법은 다음과 같습니다.

    • @Autowired(주로 사용 됨) 어노테이션을 사용 (추천)
    • @Inject 어노테이션을 사용
    • ApplicationContext의 getBean() 메서드를 사용

     

     

     

     

    [JAVA 설정 file의 예]

    1. JAVA 설정 file로 사용할 class file을 만들고 class 선언 앞에 @Configuration을 붙여줍니다.

    @Configuration
    public class ApplicationConfig {
    
    }

     

    2. JAVA 설정 file class 내부에 Bean을 생성하는 method를 작성하고 각각의 method 앞에 @Bean을 붙여 생성되는 객체를 Bean으로써 Inversion of Control Container에 등록합니다.

    @Cofiguration
    public class ApplicationConfig {
    	@Bean
        public PetRepository petRepository() {
        	return PetRepository();
        }
        
        @Bean
        public PetService petService() {
        	PetService petService = new PetService();
            
            //PetService Bean 생성 시 PetRepository Bean을 주입받는다.
            petService.setPetRepository(petRepository());
            return petService();
        }

     

    3. 현재 JAVA 설정 file로 ApplicationContext를 생성하고자 하므로 위에서 생성한 JAVA Bean 설정 file을 매개변수로 하여 AnnotationConfigApplicationContext() 호출을 통해 ApplicaionContext를 생성합니다.

    public class MyApplication {
    	public static void main(String[] args) {
        
        /*
        AnnotationConfigApplicationContext()로 Bean 설정 file을 읽어들여
        ApplicationContext를 생성하고 Bean들을 등록한다.
        */
        ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        
        //ApplicationContext에서 Bean들의 이름을 받아와 출력해본다.
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        System.out.println(Arrays.toString(beanDefinitionNames));
        
        //petService Bean을 getBean()으로 꺼내온다. 매개값으로 전달되는 BeanId는 small case로 시작하는 class명이다.
        PetService petService = (PetService) context.getBean("petService");
        
        //PetRepository Bean이 PetService Bean 생성 시에 정상적으로 주입되었는지 확인
        if(petService.petRepository != null) {
        	System.out.println("The injection was succeeded.");
        } else {
        	System.out.println("The injection was failed.");
        }

    *위의 2번 항목에서 PetService Bean에 PetRepository를 주입했는데, 설정 file에서 생성자를 통한 Dependency Injection이 아닌경우 사용자 code에서 @Autowired 어노테이션을 사용하여 주입할 수 있습니다. 예를 들어 다음과 같이 JAVA 설정 file의 내용을 변경하고

    @Configuration
    public class ApplicationConfig {
    	@Bean
        public PetRepository petRepository() {
        	return new PetRepository();
        }
        
        @Bean
        public PetService petService() {
        	return new PetService();
        }
    }

    다음과 같이 @Autowired를 사용하여 PetService Bean에 PetRepository Bean을 주입할 수 있습니다.

    public class PetService {
    	
        public PetRepository petRepository;
        
        @Autowired
        public void setPetRepository(PetRepository petRepository) {
        	this.petRepository = petRepository;
        }
    }

     

     

    위의 JAVA 설정 file에서 각각의 Bean을 따로 등록했지만 Component Scanning도 사용할 수 있습니다. 다음과 같이 JAVA 설정 file을 변경해봅니다.

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

    @ComponentScan을 붙여 basePackageClasses에 지정된 class가 속한 Package부터 하위의 모든 코드들에 대해 Component Scanning을 진행합니다. Component Scanning을 통해 Bean으로 등록되는 대상 class는 @Component, @Controller, @Service, @Repository, @Configuration 이 붙은 class들입니다.

     

     

    Application Entry class에 @SprinBootApplication을 붙여주는 것으로 ApplicationContext의 생성, Bean의 생성과 등록 작업을 SpringBoot가 자동으로 처리해줍니다. 즉, 다음의 code가 JAVA 설정 file이 되는 셈입니다.

    @SpringBootApplication
    public class MyApplication {
    	public static void main(String[] args) {
        	
        }
    }

    댓글

Designed by Tistory.