8월 30, 2023

[Spring] p 네임스페이스, c 네임스페이스란? + ref 사용법

Spring에서는 beans의 네임스페이스 기능을 사용하여 다른 형태의 속성 값 정의, beans 초기화 등을 가능하게 해주는데 오늘은 그것을 가능하게 해주는 기능 p 네임스페이스와 c 네임스페이스를 알아보도록 하겠다.

 

간단히 말해서 p 네임스페이스는 property, c 네임스페이스는 constructor-arg의 약자라고 할 수 있다. p 네임스페이스와 c 네임스페이스는 beans 네임스페이스와 달리, 모두 XSD 상에 정의되지 않았고, spring에서 제공하는 기능으로 구현된다. p 네임스페이스와 c 네임스페이스에 대해 각각 알아보도록 하자. 


1. p 네임스페이스

 

p 네임스페이스는 spring에서 다른 형태의 속성 값 정의를 가능하게 해준다. 

 

간단하게 p 네임스페이스는 아래와 같이 사용한다.

p:[속성이름]="value"

 

우리는 지난 포스팅에서 

 

[Spring] PropertyPlaceHolderConfigurer 사용 - 속성 외부 분리

 

dataSource의 properties 파일을 따로 만들어서 속성을 외부로 분리하는 방법에 대하여 알아보았다.

오늘은 p 네임스페이스를 사용하여 dataSource bean 속성을 정리해보자.

 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${dataSource.driverClassName}"
p:url="${dataSource.url}"
p:username="${dataSource.username}"
p:password="${dataSource.password}"/>

2. c 네임스페이스

 

p 네임스페이스와 달리 c 네임스페이스는 생성자 (costructor-arg)를 통해 bean을 초기화할 수 있는 방법을 제시한다. 

 

c 네임스페이스를 사용할 수 있는 방법은 p 네임스페이스와 마찬가지로 

c:[변수이름]="value"

이다. 

 

만약 

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

를 생성자로 가지는 class Person이 있다면 우리는 c 네임스페이스를 사용하여 아래와 같이 생성자 매개 변수를 결정해줄 수 있다.

 

<bean id="Person" class="Person"
 c:name="John"
 c:age="20"/>

 

즉 name이라는 변수에 "John"이라는 값을 넣어주고 age라는 변수에 "20"이라는 값을 넣어주겠다는 것이다. 

 

만약 3rd party library를 사용하고 있어 매개 변수의 이름 variable name을 알 수 없다면 

c:_[변수Index]="value"

와 같은 식으로 적어주면 된다. 즉 아래와 같이 bean 정의가 가능한 것이다. 

<bean id="Person" class="Person"
 c:_0="John"
 c:_1="20"/>

c 네임스페이스와 p 네임스페이스는 모두 

-ref

접미사를 붙이게 되면 다른 Bean을 주입할 수 있다. 

 

 즉 만약

<bean id ="id..."
 class="bean class path...">
 <property name ="dataSource" ref="dataSource"/>
</bean>

라는 bean이 있었다면 

p:dataSource-ref="dataSource"

와 같이 적어줄 수 있다는 뜻이다.