ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Spring] Spring(스프링) DI 설정 - Java코드를 이용한 DI 설정
    Spring/개념 정리 2020. 4. 21. 22:48

     

    2020/04/21 - [Spring] - [Camel][Spring] Spring(스프링) DI 설정 - XML을 이용한 DI 설정

     

    [Camel][Spring] Spring(스프링) DI 설정 - XML을 이용한 DI 설정

    스프링을 사용하기 위해서는 기본적인 DI 설정을 이해해야할 필요가 있으며, 스프링의 DI 설정 방법으로는 XML, Java, 그루비 코드 총 3가지의 방법이 있습니다. 이번 포스팅은 그 중 XML을 사용한 DI 설정에 대한..

    cameldev.tistory.com

    이전 포스팅에서 XML을 이용한 DI 설정에 이어서, 이번 포스팅에서는 Java 코드를 이용한 DI 설정에 대해 포스팅하겠습니다.

     

     

    1. Java 코드를 이용한 DI 설정

     Java 코드를 이용한 DI 설정은 일반적으로 XML을 이용한 DI 설정보다 직관적이라는 평가가 많습니다. Java 코드로 DI 설정을 하기 위해서는 @Configuration 어노테이션과 @Bean 어노테이션을 사용합니다.

    1-1.  @Configuration, @Bean 어노테이션

    @Configuration 어노테이션은 클래스를 스프링 설정으로 사용함을 의미합니다. 스프링에서는 @Configuration 어노테이션으로 정의된 클래스를 설정 정보로 사용하게됩니다.

     

    @Bean 어노테이션은 스프링이 제공할 빈 객체를 지정할 때 사용합니다. 이 어노테이션은 빈 객체를 생성하는 메소드에 적용되며, 스프링은 @Bean 어노테이션이 적용된 메소드가 생성하는 객체를 빈 객체로 사용합니다. 그리고 메소드 명은 빈 객체의 이름을 사용합니다.

     

    @Configuration 어노테이션과 @Bean 어노테이션의 사용방법은 아래와 같습니다. 

    @Configuration
    public class Config {
    
    	@Bean
        	public Animal animal() {
        		return new Animal("Camel");
        	}
        
        	...
        
        	...
        
    }

    위와 같은 @Configuration 설정 클래스를 이용해서 스프링 컨테이너를 생성할 때에는 AnnotationConfigApplicationContext 클래스를 사용합니다. AnnotationConfigApplicationContext 의 사용방법은 아래와 같습니다. 

    public class MainClass {
    	
        public static void main (String[] args) {
        	AnnotationConfigApplicationContext ctx = 
            	new AnnotationConfigApplicationContext(Config.class);
                
            Animal animal = ctx.getBean("animal", Animal.class);
            
            ...
        }
    
    }

    AnnotationConfigApplicationContext 객체를 생성할 때 생성자에 설정 정보로 사용할 클래스를 파라미터로 전달합니다. 이후 @Bean 어노테이션을 사용해 생성한 빈 객체를 호출하기위해서 getBean의 첫번째 파라미터에 @Bean 어노테이션이 적용된 메소드의 이름인 animal을 전달함으로써 빈의 식별 값으로 사용합니다. 

     

     만약 빈의 식별 값으로 메소드의 이름을 사용하고 싶지 않다면 아래와 같은 방법을 사용할 수 도 있습니다. 

    @Configuration
    public class Config {
    
    	@Bean(name="animalTwo") // name 속성 값을 추가함으로써 개발자가 원하는 이름을 사용할 수 있다.
        	public Animal animal() {
        		return new Animal("Camel");
        	}
        
        	...
        
        	...
        
    }

     

    1-2. Dependency 설정

     Java 코드를 사용해 DI 설정을 할 때는 생성자나 프로퍼티에 값을 코드에서 직접 설정해줍니다. 또한 다른 빈 객체를 참조하고 싶을 때에는 참조할 빈 객체를 생성하는 메소드를 호출하는 방법을 사용해서 빈 객체를 구합니다. 사용 예시는 아래의 코드를 통해 확인하겠습니다.

    @Configuration
    public class Config {
    
    	@Bean 
        	public Animal animal() {
        		return new Animal("Camel");
        	}
            
            @Bean(name="animalTwo") // name 속성 값을 추가함으로써 개발자가 원하는 이름을 사용할 수 있다.
        	public Animal animal2() {
        		return new Animal("Pig");
        	}
            
            @Bean 
        	public AnimalRepository animalRepository() {
        		AnimalRepository aRepo = new AnimalRepository();
                aRepo.setName(Arrays.asList(animal(),animal2()));
                return aRepo;
        	}
            
            
    }

     위의 Java 코드를 사용한 DI 설정은 아주 간단하게 작성한 예시입니다. 그러나 만약 더 많은 빈 객체를 생성이 필요하다면, 그 과정에서 특정 빈 객체를 참조하기 위한 메소드의 호출이 여러번 발생하게됩니다. 이때 메소드는 매번 새로운 객체를 생성해서 반환하기 때문에 일반적으로는 서로 다른 객체를 생성한다고 생각할 수 있습니다. 하지만 스프링에 의해서 메소드가 반환하는 객체로 항상 동일한 객체를 반환하게됩니다. 이러한 특징은 @Configuration 클래스를 상속 받은 새로운 클래스를 만들어내기 때문이라고 합니다.

     

    1-3. Java 코드를 이용한 DI 설정정보의 사용

     앞서 간략하게 설명했듯이 Java 코드를 이용해 DI 설정을 했다면, 우리는 AnnotationConfigApplicationContext 클래스를 스프링 컨테이너 구현체로 사용합니다. 다시한번 설명해보면, 설정정보를 가지고 있는 클래스를 AnnotationConfigApplicationContext클래스의 생성자에 파라미터로 전달하는 방식입니다. 

     

     만약 다수의 Java 클래스를 설정 정보로 사용하고 싶다면, 아래와 같이 각 클래스를 파라미터로 전달하는 방법을 사용할 수 있습니다. 

    public class MainClass {
    	
        public static void main (String[] args) {
        	AnnotationConfigApplicationContext ctx = 
            	new AnnotationConfigApplicationContext(Config.class, ConfigTwo.class);
                
            ...
        }
    
    }

     

    1-4. @Import 어노테이션

    Java를 이용한 DI 설정에서 @Import 어노테이션을 사용하면 설정을 조합할 수 있습니다. @Import 어노테이션을 사용해 설정을 조합하면 다른 클래스도 설정 클래스로 사용할 수 있게됩니다. 

    @Configuration
    @Import(ConfigTwo.class) // ConfigTwo 클래스도 설정 클래스로 사용한다.
    public class Config {
    
    	@Bean 
        	public Animal animal() {
        		return new Animal("Camel");
        	}       
            
    }

     

    댓글

Camel`s Tistory.