'뉴렉처' 님의 채널(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를 이용하여 단일 태그로 인스턴스를 생성하는 방법에 대해서 알아보았습니다.
'Spring > Dependency Injection' 카테고리의 다른 글
[Spring Framework] 어노테이션과 @Autowired 사용하기 (0) | 2021.01.15 |
---|---|
[Spring Framework] collection 타입의 bean 생성 (0) | 2021.01.11 |
[Spring Framework] 이클립스에서 Spring Library 가져오기 (0) | 2021.01.06 |
[Spring Framework] Application Context 사용하기 (0) | 2021.01.05 |
[Spring Framework] Spring Bean Configuration (DI 지시서) 작성법 (1) (0) | 2021.01.02 |