Springframework(스프링) p & c schema 사용하기

2018. 7. 10. 20:13Web/Spring

스프링프레임워크 p & c schema


servlet context & servlet xml 설정파일에서 <property>,<constructor-arg> 로 속성을 정의하지 않고 간결한 표현을 제공하는 것이 p와 c schema이다.

말로 설명하는 것보다는 간단한 예제를 통해서 보는 것이 이해가 빠르다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package sample.spring.chapter03.beans;
 
import java.util.Currency;
import java.util.Date;
 
public class BankDetails {
    private String bankName;
    private byte[] bankPrimaryBusiness;
    private char[] headOfficeAddress;
    private char privateBank;
    private Currency primaryCurrency;
    private Date dateOfInception;
    private Address branchAddresses;
 
    public String getBankName() {
        return bankName;
    }
 
    public void setBankName(String bankName) {
        this.bankName = bankName;
    }
 
    public byte[] getBankPrimaryBusiness() {
        return bankPrimaryBusiness;
    }
 
    public void setBankPrimaryBusiness(byte[] bankPrimaryBusiness) {
        this.bankPrimaryBusiness = bankPrimaryBusiness;
    }
 
    public char[] getHeadOfficeAddress() {
        return headOfficeAddress;
    }
 
    public void setHeadOfficeAddress(char[] headOfficeAddress) {
        this.headOfficeAddress = headOfficeAddress;
    }
 
    public Currency getPrimaryCurrency() {
        return primaryCurrency;
    }
 
    public void setPrimaryCurrency(Currency primaryCurrency) {
        this.primaryCurrency = primaryCurrency;
    }
 
    public Date getDateOfInception() {
        return dateOfInception;
    }
 
    public void setDateOfInception(Date dateOfInception) {
        this.dateOfInception = dateOfInception;
    }
 
    public char getPrivateBank() {
        return privateBank;
    }
 
    public void setPrivateBank(char privateBank) {
        this.privateBank = privateBank;
    }
 
    public Address getBranchAddresses() {
        return branchAddresses;
    }
 
    public void setBranchAddresses(Address branchAddresses) {
        this.branchAddresses = branchAddresses;
    }
 
    @Override
    public String toString() {
        return "BankDetails [bankName=" + bankName + ", bankPrimaryBusiness="
                + new String(bankPrimaryBusiness) + ", headOfficeAddress="
                + new String(headOfficeAddress) + ", primaryCurrency="
                + primaryCurrency + ", dateOfInception=" + dateOfInception
                + ", privateBank=" + privateBank + ", branchAddresses="
                + branchAddresses + "]";
    }
}
 
cs


setter를 이용해 빈주입을 하는 예제이다. xml 파일에서는 원래라면 <property> tag를 이용하여 빈의 속성을 주입해줄 것이다.

하지만 p schema를 이용하면 훨씬 간결한 표현이 된다.



1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
 
    <bean id="bankDetails" class="sample.spring.chapter03.beans.BankDetails"
        p:bankName="My Personal Bank" p:bankPrimaryBusiness="Retail banking"
        p:headOfficeAddress="Address of head office" p:privateBank="Y"
        p:primaryCurrency="INR" p:dateOfInception="30-01-2012"
        p:branchAddresses-ref="branchAddresses" />
</beans>
cs


여기서 p schema를 사용하기 위해 네임스페이스를 추가해주는 설정이 필요하다. 단순 값은 p:bankName="value" 형태이고, 다른 빈을 참조할 경우는 

p:branchAddress-ref="빈id"이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package sample.spring.chapter03.beans;
 
import java.beans.ConstructorProperties;
import java.util.Date;
 
public class BankStatement {
    private Date transactionDate;
    private double amount;
    private String transactionType;
    private String referenceNumber;
 
    @ConstructorProperties({ "transactionDate""amount""transactionType",
            "referenceNumber" })
    public BankStatement(Date transactionDate, double amount,
            String transactionType, String referenceNumber) {
        this.transactionDate = transactionDate;
        this.amount = amount;
        this.transactionType = transactionType;
        this.referenceNumber = referenceNumber;
    }
 
    @Override
    public String toString() {
        return "BankStatement [transactionDate=" + transactionDate
                + ", amount=" + amount + ", transactionType=" + transactionType
                + ", referenceNumber=" + referenceNumber + "]";
    }
}
cs

생성자로써 의존주입을 할때 예시이다.


1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
        
 
           <bean id="bankStatement" class="sample.spring.chapter03.beans.BankStatement"
        c:transactionDate="30-01-2012" c:amount="1000" c:transactionType="Credit"
        c:referenceNumber="1110202" />
</beans>
cs


p schema와 방법은 차이가 없다. 하지만 여기서는 constructor 매개변수들의 이름을 지정하였다.(@ConstructorProperties 어노테이션을 이용하여 디버그플러그를 비활성화 시켰을 때, 생성자의 매개변수 이름을 지정하여 참조할 수 있게 설정하였다.) 하지만 index로 참조하려고 할 경우도 있을 것이다. 그럴경우에는 c:_0-ref="bean id" 이런 식으로 작성하면 된다. _를 포함하는 인덱스넘버를 넣어줘야함에 유의하면 된다.