본문 바로가기

Spring/Dependency Injection

[Spring Framework] Spring Bean Configuration (DI 지시서) 작성법 (2)

728x90
반응형

'뉴렉처' 님의 채널(www.youtube.com/user/newlec1)을 바탕으로 제작한 블로그 글입니다:)

 

 

 

이번 시간에는 생성자와 관련된 Spring DI 지시서(Spring Bean Configuration) 작성법을 알아보겠습니다.

 

작성법(1) 에서 짧게 생성자에 인자가 있을 때 어떻게 DI를 작성해야 하는지에 대해서 다뤄보았습니다.

이번에는 (1)에서의 방법을 포함해서 인자가 있는 생성자를 DI로 작성하는 다른 방법과 접두사 p를 사용하는 방법에 대해서도 배워보겠습니다!

 

 

 

지난번에 사용한 코드는 아래와 같습니다!

 

Animal animal = new Animal("BINGO", 5);

=>

<bean id = "animal" class = "spring.entity.Animal">

          <constructor-arg type="java.lang.String" value="BINGO"/>
          <constructor-arg type="int" value="5"/>

</bean>

 

 

 

이 때, 태그에서 type은 생략 할 수 있지만 함수 이름이 같고 인자의 형이 다른 경우(오버로딩)를 고려하여 생략하지 않는 것이 좋습니다!

 

더보기

위에서 언급한 오버로딩의 예제로는 다음과 같은 경우가 있습니다.

// int 형 두개를 더하는 함수

Sum(int a, int b){

...

}

 

// float 형 두개를 더하는 함수

Sum(float a, float b){

...

}

 

 

 

위에서 확인할 수 있듯이, contructor-arg를 이용하여 생성자에 인자를 넣는 방법을 사용하였습니다.

이 외에도 아래와 같은 방식 index의 위치를 함께 적어 DI를 작성할 수 있습니다.

 

 

<bean id = "animal" class = "spring.entity.Animal">

          <constructor-arg index="0" type="java.lang.String" value="BINGO"/>
          <constructor-arg index="1" type="int" value="5"/>

</bean>

 

 

위와 같이 index의 위치를 알려주면, 그냥 인자만 넣어주는 것보다 덜 헷갈리겠죠?

 

 

하지만 제일 확실한 방법은 역시 인자의 이름을 직접 써서 넣어주는 것일텐데요,

아래와 같이 인자의 이름을 넣어서 작성해 줄 수도 있습니다.

 

 

<bean id = "animal" class = "spring.entity.Animal">

          <constructor-arg name="name" type="java.lang.String" value="BINGO"/>
          <constructor-arg name="age" type="int" value="5"/>

</bean>

 

 

위처럼 인자를 넣어주는 방법을 더 간단하게 적어줄 수 있는 방법이 있는데,

바로 접두사 p를 적어준 다음에 속성을 지정해주는 것인데요.

이러한 방법을 사용하면 태그를 여러개 사용하지 않고 단일 태그로도 지시서를 작성할 수 있습니다.

 

 

다만, 이 방법은 처리기가 추가적으로 일을 해 줘야 가능하기 때문에 우선 아래와 같은 셋팅이 필요합니다.

 

 

setting.xml에서 상단 부분에 아래와 같이 xmlns:p 부분을 추가해주세요.

<?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">

 

 

위의 xmlns:p 는, p(www.springframework.org/schema/p" 의 약어)라는 namespace가 추가 된 것을 의미합니다.

 

더보기

namespace의 역할은?

모듈화 된 프로그램이 혹여나 서로 구분이 어려워 충돌이 나는 상황을 방지하기 위해서, 서로 식별 할 수 있도록 합니다.

따라서 DI 지시서에서는, 특정한 태그를 그에 해당하는 처리기가 처리할 수 있도록 함과 동시에 태그의 이름을 식별하기 위해서 사용되었습니다.

 

 

이제 아래와 같이 태그의 폼을 변경할 수 있습니다.

아래의 p:name과 p:age는 앞에 접두사인 p 를 달아줌으로써, p에 해당하는 처리기가 이 부분을 처리해라! 라는 뜻을 의미를 가지게 됩니다. 따라서 p:name과 p:age는 bean의 속성이 아니게 됩니다.

 

 

<bean id = "animal" class = "spring.entity.Animal"  p:name="BINGO" p:age="10"/>

 

 

만약 Animal Class 안에 setName과 setAge, 인자가 없는 기본 생성자가 나면 에러가 나게 됩니다.

그 이유는, 이전처럼 생성자의 인자에 값을 넣음으로써 인스턴스를 생성하는 것이 아니라,

Class 내부의 setName과 setAge라는 메소드를 이용하여 값을 넣어주기 때문입니다.

 

 

- Animal.java

public class Animal {
	private String name;
	private int age;
	
	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}
	
	
	public void setName(String name) {
		this.name = name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Animal() {
		
	}

	public Animal(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
}

 

 

 

이로써 생성자 DI를 작성하는 방법과 함께 namespace를 이용하여 단일 태그로 인스턴스를 생성하는 방법에 대해서 알아보았습니다.

728x90
반응형