이전 포스팅 참고) IOC 컨테이너 설정 - 첫 번째 방법 "xml"
kimcoder.tistory.com/225
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 : 어노테이션 기반으로 코드를 자동 완성 해주는 라이브러리
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] properties 파일(2) (0) | 2020.12.23 |
---|---|
[Spring] Bean의 생명주기 / properties 파일 (0) | 2020.12.22 |
[Spring] IOC 컨테이너 설정(3) - xml, @(Annotation) 혼용 (0) | 2020.12.22 |
[Spring] DI와 IOC / IOC 컨테이너 설정(1) - xml (0) | 2020.12.18 |
[Spring] 스프링 설치 및 설정 (0) | 2020.12.17 |
댓글