본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] IOC 컨테이너 설정(2) - @(Annotation)

by 김코더 김주역 2020. 12. 21.
반응형


이전 포스팅 참고) IOC 컨테이너 설정 - 첫 번째 방법 "xml"
kimcoder.tistory.com/225

 

[Spring] DI와 IOC 컨테이너 / IOC 컨테이너 설정(1) - xml

1. DI와 IOC 컨테이너 Dependency Injection, 종속성 주입. 간단하게 부품화라고 이해하면 편하다. A객체가 B객체에 의존해야 한다고 했을 때(A가 더 큰 개념) 의존 시키는 2가지 방법이 있는데 첫 번째 방

kimcoder.tistory.com


IOC 컨테이너를 설정하는 2번째 기법 "Annotation" 을 소개한다.
이 방법을 간단하게 소개하자면 @Configuration, @Component, @Bean 등의 어노테이션을 이용하여 Java 코드에서 DI를 해주는 방식이다. xml 방식에 비해 상세한 bean 메타정보 설정을 할 수 없고, 클래스당 2개 이상의 bean을 등록할 수 없다는 제한이 있지만, 대부분의 bean은 기본값 메타정보 항목이면 충분하기 때문에 크게 문제되지는 않는다.

 

먼저, @Configuration은 Application Context가 활용하는 설정 정보임을 나타내며, 스프링 설정 클래스 위에 작성한다.

※ 정확하게는 내부에 @Component 어노테이션을 가졌기 때문에 bean으로 등록할 수 있게 되는 것이다.

그리고 @Bean은 주로 스프링 설정 클래스 내에서 오브젝트 생성을 담당하는 메소드 위에 작성하는 것이다.

 

예전에는 IOC 컨테이너를 설정할 때 xml을 많이 이용했었는데, 최근에는 어노테이션을 많이 이용한다고 한다.
이 방법 역시 예제를 통해 소개할 것이다. 프로그래머들의 정보를 Bean 객체로 다뤄보자.

 

예제

<ApplicationConfig.java>

이 포스팅에서 가장 중요한 스프링 설정용 java 파일이다.
Bean 객체를 java 코드에서 어노테이션과 함께 작성해준 모습이다.
Bean의 변수로는 프로그래머의 이름, 나이, 코드레벨 이 3가지가 있다.
2명의 프로그래머 객체를 각각 programmer1, programmer2 라고 했다.

package com.example.demo; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; //스프링 설정용 클래스임을 명시하는 어노테이션

@Configuration public class ApplicationConfig {

    //Bean 객체임을 명시하는 어노테이션
    @Bean public Programmer programmer1(){ 
      Programmer pg = new Programmer(); 
      pg.setName("KIM JOOYEOK"); 
      pg.setAge(23); 
      pg.setCodeLevel(8);
      return pg; 
    }
    
    @Bean public Programmer programmer2(){ 
      Programmer pg = new Programmer(); 
      pg.setName("KIM LAMB"); 
      pg.setAge(16); 
      pg.setCodeLevel(7); 
      return pg; 
    } 
}

 

<Programmer.java>

java bean에 해당하는 클래스이다. setter/getter 메소드도 작성했다.

package com.example.demo; 
public class Programmer { 
    private String name; 
    private int age; 
    private int codeLevel; 
    
    public String getName() { 
    	return name; 
    } 
    
    public void setName(String name) { 
      this.name = name; 
    } 
    
    public int getAge() { 
      return age; 
    } 
    
    public void setAge(int age) { 
      this.age = age; 
    }
    
    public int getCodeLevel() { 
    	return codeLevel; 
    } 
    
    public void setCodeLevel(int codeLevel) {
    	this.codeLevel = codeLevel; 
    } 
}

 

<DemoApplication.java>

- AnnotationConfigApplicationContext 클래스는 어노테이션 기법을 이용하여, java bean 클래스를 인자로 받아 bean을 application context에 등록한다.
- getBean() 메소드를 통해 ApplicationConfig.java의 Programmer bean을 모두 받아와 ArrayList에 저장하고 확인까지 하는 소스코드이다.

package com.example.demo; 

import java.util.ArrayList; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.GenericApplicationContext; 
import org.springframework.context.support.GenericXmlApplicationContext; 

@SpringBootApplication public class DemoApplication { 
	public static void main(String[] args) { 
    	AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class); 
        ArrayList<Programmer> programmers = new ArrayList<Programmer>(); 
        
        String pgstring; 
        int pgnum = 2; 
        
        for(int i=0;i<pgnum;i++) { 
        	pgstring = "programmer"+(i+1); 
        	Programmer programmer = ctx.getBean(pgstring, Programmer.class); // 파라미터 : Bean의 이름, 타입
        	programmers.add(programmer); 
        } 
        
        for(int i=0;i<pgnum;i++) { 
        	System.out.println(i+1+". Name : "+programmers.get(i).getName()+", Age : "+programmers.get(i).getAge()+", CodeLevel : "+programmers.get(i).getCodeLevel()); 
        } 
        
        ctx.close(); 
    } 
}



실행 결과

1. Name : KIM JOOYEOK, Age : 23, CodeLevel : 8 2. Name : KIM LAMB, Age : 16, CodeLevel : 7




+추가) Lombok의 @Getter, @Setter을 이용하면 getter, setter 메소드의 작성을 생략할 수 있음
Lombok : 어노테이션 기반으로 코드를 자동 완성 해주는 라이브러리

반응형

댓글