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

[Spring] IOC 컨테이너 설정(3) - xml, @(Annotation) 혼용

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

이 포스팅에서는 IOC 컨테이너 설정 (1), (2) 포스팅들을 기반으로 설명한다.

IOC 컨테이너 설정 (1) - 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)

kimcoder.tistory.com/226

 

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

이전 포스팅 참고) IOC 컨테이너 설정 - 첫 번째 방법 "xml" kimcoder.tistory.com/225 [Spring] DI와 IOC 컨테이너 / IOC 컨테이너 설정(1) - xml 1. DI와 IOC 컨테이너 Dependency Injection, 종속성 주입. 간단..

kimcoder.tistory.com

 

어떤 Bean 객체는 JAVA 코드로 생성하고, 어떤 Bean 객체는 xml 설정 파일에서 생성하여 같이 쓰는 방법도 있다.

 

먼저, JAVA 코드 내에서 xml을 사용하는 경우부터 소개할 것이다.

예제는 "IOC 컨테이너 설정 (2) - @(Annotation)" 포스팅에서 했던 소스를 기반으로 작성했다.

 

1. JAVA 내에 XML 포함

<ApplicationConfig.java>

"IOC 컨테이너 설정 (2) - @(Annotation)" 에서 다뤘던 ApplicationConfig.java 소스 코드랑 달라진 곳은

@ImportResource("classpath:application.xml") 어노테이션문 단 한줄이다.

xml 설정 파일의 bean 객체도 포함할 것을 명시한다.

package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

//스프링 설정용 클래스임을 명시하는 어노테이션
@Configuration
@ImportResource("classpath:application.xml")
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>

이전 포스팅과 달라진 부분이 없다.

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

 

<application.xml>

xml 설정 파일에서 id가 programmers3인 Programmer bean 객체를 만들어주었다.

programmer1, programmer2 bean 객체는 ApplicationConfig.java 에서 이미 만들었으니 이 xml 설정 파일을 추가함으로써 프로그래머 객체가 하나 추가된 것이다.

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="programmer3" class="com.example.demo.Programmer" p:name="HONG GILDONG" p:age="30" p:codeLevel="6"/>
</beans>

 

 

<DemoApplication.java>

이전 포스팅의 소스 코드와는 값이 2였던 pgnum을 3으로 올려준 차이이다.

이로써 programmers1, programmers2, programmers3 bean 객체가 모두 반영되었다.

package com.example.demo;

import java.util.ArrayList;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

@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 = 3;
		for(int i=0;i<pgnum;i++) {
			pgstring = "programmer"+(i+1);
			Programmer programmer = ctx.getBean(pgstring, Programmer.class);
			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
3. Name : HONG GILDONG, Age : 30, CodeLevel : 6

 

 

 

2. XML 내에 JAVA 포함

<ApplicationConfig.java>

이전 포스팅과 달라진 부분이 없다.

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>

이전 포스팅과 달라진 부분이 없다.

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

 

<application.xml>

xml 설정 파일에서 id가 programmers3인 Programmer bean 객체를 만들어주었다.

context 네임스페이스를 사용하기 위해 beans의 네임스페이스에서 context 내용을 3줄 추가했고,

스프링 설정용 클래스 "ApplicationConfig.java" 에 있는 programmer1, programmer2 bean 객체를 추가하기 위해 아래 2줄을 추가했다.

<context:annotation-config/>
<bean class="com.example.demo.ApplicationConfig"/>

※ <context:annotation-config/> : 이미 등록된 bean에 프로퍼티 설정을 추가해주는 bean 후처리기(BeanPostProcessor)와 스캔된 bean을 모두 등록해주는 bean 팩토리 후처리기(BeanFactoryPostProcessor)를 등록해주는 전용 태그이다. <context:component-scan> 태그로 대체해도 된다.

xml 설정 파일상의 programmer3 bean 객체에 "ApplicationConfig.java"의 programmer1, programmer2 bean 객체가 추가된 것이다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.1.xsd">
    
    <context:annotation-config/>
    <bean class="com.example.demo.ApplicationConfig"/>
    <bean id="programmer3" class="com.example.demo.Programmer" p:name="HONG GILDONG" p:age="30" p:codeLevel="6"/>
</beans>

 

<DemoApplication.java>

이전 포스팅과 달라진 점은 값이 2였던 pgnum을 3으로 올려줘서 programmers1, programmers2, programmers3 bean 객체를 모두 반영시킨 점과, xml 설정 파일을 기반으로 bean 객체를 가져와야 하기 때문에 AbstractApplicationContext, GenericXmlApplicationContext 클래스를 사용했다는 점이다.

package com.example.demo;

import java.util.ArrayList;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		
		String configLocation = "classpath:application.xml";
		AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);		
		ArrayList<Programmer> programmers = new ArrayList<Programmer>();
		
		String pgstring;
		int pgnum = 3;
		for(int i=0;i<pgnum;i++) {
			pgstring = "programmer"+(i+1);
			Programmer programmer = ctx.getBean(pgstring, Programmer.class);
			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
3. Name : HONG GILDONG, Age : 30, CodeLevel : 6
반응형

댓글