스프링 설정 파일

2017. 1. 25. 18:27Dev/Spring

반응형



스프링 설정 파일은 XML혹은 자바로 구성할 수 있다.

JavaConfig는 매우 강력하고, 타입세이프하며, 리팩토링이 친화적이므로 명시적인 설정을 위해 선호하는 옵션이다. 이는 애플리케이션의 다른 코드처럼 바로 자바 코드이기 때문이다.


동시에 JavaConfig 콛가 다른 자바 코드와 완전히 동일하지 않다는 것을 인식해야 한다. 애플리케이션에서 비즈니스 로직과 도메인 코드는 개념적으로 분리되어 있다. 컴포넌트와 동일한 언어로 만들었음에도 불구하고, JavaConfig는 설정용 코드다. 어떤한 비즈니스 로직도 포함하지 않고, 비즈니스 로직이 있는 코드에 영향을 주지도 않는다.



설정 클래스 만들기



JavaConfig로 빈 생성하기


@Configuration
@ComponentScan
public class CDPlayerConfig {
}

위와 같은 코드가 JavaConfig다. @Configuration로 설정 클래스임을 명시해주며 @ComponentScan으로 자신이 위치한 패키지 및 하위 패키지를 컴포넌트스캔하여 자동으로 스프링 컨텍스트에 빈으로 등록시킨다.


@ComponentScan을 사용하지 않고 명시적으로 빈을 등록하는 방법은 아래와 같다.

@Configuration
public class CDPlayerConfig {
	@Bean
	public CompactDisc sgtPeppers(){
		return new SgtPeppers();
	}
}

명시적 빈 등록일 경우 빈 id는 메소드명으로 설정된다.

만약 빈 id를 별도로 설정하고 싶다면 name 속성에 명시해주면 된다.

@Configuration
public class CDPlayerConfig {

	@Bean(name="lonelyHeartsClubBand")
	public CompactDisc sgtPeppers(){
		return new SgtPeppers();
	}

}


의존성 가진 빈 생성하기


@Configuration
public class CDPlayerConfig {

	@Bean
	public CompactDisc sgtPeppers(){
		return new SgtPeppers();
	}

	// 다른 빈 생성 메소드를 활용
	@Bean
	public CDPlayer cdPlayer(){
		return new CDPlayer(sgtPeppers());
	}

	// CompactDisc을 스프링이 자동 와이어링 해준다. 
	// 동일 설정 클래스에서 만들어진 빈 메소드에 의존하지 않고 사용점이 이점이다.
	@Bean
	public CDPlayer cdPlayer(CompactDisc compactDisc){
		return new CDPlayer(compactDisc);
	}

	// 위와 동일 하지만 setter메소드를 이용한 처리방법으로 응용했다.
	@Bean
	public CDPlayer cdPlayer(CompactDisc compactDisc){
		CDPlayer cdPlayer = new CDPlayer();
		cdPlayer.setCompactDisc(compactDisc);
		return new CDPlayer(compactDisc);
	}
}

위와 같이 의존성 있는 빈을 생성할 수 있다. 인자가 없는 cdPlayer() 메소드는 얼핏보면 sgtPeppers()를 호출해서 생성되는 것처럼 보이지만 sgtPeppers() 메소드는 @Bean으로 애너테이트되므로 스프링은 콜을 중간에 인터셉트하고, 메소드에 의해 만들어진 빈은 다시 만들어지지 않고 이미 만들어진 것을 리턴해 주는 것을 보장한다.



XML로 빈 생성 


가장 간단 스프링 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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context">


</beans>

빈 선언은 다음과 같다.

<bean class="soundsystem.SgtPeppers"/>

페키지 이름을 포함한 완전한 클래스 명으로 표현한다. id 속성이 따로 주어지지 않았으므로 빈은 주어진 클래스 명에 따라서 이름을 가진다. 스프링이 만들어준 위 빈의 id는 다음과 같다. 

soundsystem.SgtPeppers#0

#0은 이 빈을 동일한 타입의 다른 빈과 차별화하기 위해서 사용되는 목록 열거값이다. 다른 SgtPeppers 빈을 명시적인 구별없이 선언한다면 자동으로 soundsysstem.SgtPeppers#1 id가 부여된다.

별도의 id를 정해주려면 다음과 같이 작성한다.

<bean id="compactDisc" class="soundsystem.SgtPeppers"/>



설정 XML 만들기


XML로 의존성 가진 빈 생성 


XML로 DI를 선언할 때, 여러가지 옵션과 스타일이 있다. 

특정 생성자 주입과 관련하여, 다음과 같이 선택할 수 있는 두 개의 기본 옵션이 있다.

  • <constructor-arg> 요소
  • 스프링 3.0에서 도입된 c-네임스페이스

빈 레퍼런스를 사용한 생성자 주입

<bean id="compactDisc" class="soundsystem.ShtPeppers">
	<constructor-arg ref="compactDisc"/>
</bean>

빈 레퍼런스를 사용한 생성자 주입

<bean id="compactDisc" class="soundsystem.SgtPeppers" c:cd-ref="compactDisc"/>
c : c-네임스페이스 접두어
cd : 생성자 인자명(public SgtPeppers(CompactDisc cd){...} 에서 cd를 가리킴)
-ref : bean 레퍼런스 주입
문자열 : 주입용 bean id


생성자 인자명을 직접 사용했을 때 한 가지 괴로운 점이 있다. 파라미터 명을 사용하는 것은 신뢰하기 어려운 부분이 있다. 

대신에 파라미터 리스트에서 파라미터 위치를 가리킬 수 있다. 다음과 같다.

<bean id="compactDisc" class="soundsystem.ShtPeppers" c:_0-ref="compactDisc"/>

_0

이 부분이 리스트에서 파라미터 위치를 가리키는 코드인데 파라미터명의 첫번째 문자로 숫자를 허락하지 않으므로 '_'언더바 문자를 붙이는 특이한 방법으로 사용한다. 만약 생성자에 하나의 인자만을 가지고 있다면 굳이 구별하지 않아도 되므로 다음과 같이 사용한다.

<bean id="compactDisc" class="soundsystem.ShtPeppers" c:ref="compactDisc"/>

리터럴 값을 생성자에 주입하기


<constructor-arg> 태그를 이용하여 생성자 주입

public class CDPlayer implements CompactDisc{
	
	private String title;
	private String artist;
	
	@Autowired 
	public CDPlayer(String title, String artist) {
		this.title = title;
		this.artist = artist;
	}
	
	public void play(){
		
	}
}
<bean id="compacDisc" class="package.BlankDisc">
	<constructor-arg value="가나다"/>
	<constructor-arg value="abc"/>
</bean>


c-네임 스페이스를 이용하여 생성자 주입

<bean id="cdPlayer" class="demo.CDPlayer" 
		c:title="compactDisc" c:artist="compactDisc2"/>

순서를 이용한 주입

<bean id="cdPlayer" class="demo.CDPlayer" 
		c:_0="compactDisc" c:_1="compactDisc2"/>

와이어링 컬렉션


list 와 set을 이용한 주입

public class CDPlayer implements CompactDisc{
	
	private String title;
	private String artist;
	private List<String> tracks;
	
	@Autowired 
	public CDPlayer(String title, String artist, List<String> tracks) {
		this.title = title;
		this.artist = artist;
		this.tracks = tracks;
	}
	
	public void play(){
		...
	}
}
<bean id="cdPlayer" class="demo.CDPlayer">
	<constructor-arg value="가나다"/>
	<constructor-arg value="라마바"/>
	<constructor-arg>
		<list>
			<value>aa</value>
			<value>bb</value>
		</list>
	</constructor-arg>
</bean>


레퍼런스 LIst를 이용한 주입

public Discography(String artist, List<compactDisc> cds) {...}
<bean id="cdPlayer" class="demo.CDPlayer">
	<constructor-arg value="가나다"/>
	<constructor-arg value="라마바"/>
	<constructor-arg>
		<list>
			<ref bean="sgtPeppers"/>
			<ref bean="twoAlbum"/>
		</list>
	</constructor-arg>
</bean>


프로퍼티를 사용하여 주입


생성자를 이용한 주입과 프로퍼티를 사용한 주입 둘 다 결과는 똑같다. 

일반적으로, 어떤 종속성으로 인해 하드 의존성 및 프로퍼티 주입을 위한 생성자 주입이 선호된다.

public class CDPlayer implements CompactDisc{
	
	private CompactDisc compactDisc;
	
	@Autowired
	public void setCompactDisc(CompactDisc compactDisc){
		this.compactDisc = compactDisc;
	}
	
	public CompactDisc getCompactDisc() {
		return compactDisc;
	}
	
	public void play(){
		
	}
}
<bean id="cdPlayer" class="demo.CDPlayer">
	<property name="compactDisc" ref="compactDisc"/>
</bean>

p 네임 스페이스를 이용한 설정

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd">

	
	
</beans>

p 네임 스페이스를 이용하면 다음과 같은 설정이 가능하다.

<bean id="cdPlayer" class="demo.CDPlayer" p:compactDisc-ref="compactDisc"/>

p : p-네임스페이스의 접두어

compactDisc : 프로퍼티명 

-ref : 빈 참조 주입

문자열 : 주입할 bean id



반응형

'Dev > Spring' 카테고리의 다른 글

스프링 설정 믹싱  (0) 2017.01.25
util 네임 스페이스  (0) 2017.01.25
@Autowired의 사용  (0) 2017.01.25
Spring - ajax return success on sevlet error  (0) 2016.12.16
스프링 컨트롤러 단위테스트 할 경우  (0) 2016.11.29