여행을 개발하다

의존성 주입3(Dependency Injection) - c namespace, p namespace 사용하기 본문

Spring/Spring

의존성 주입3(Dependency Injection) - c namespace, p namespace 사용하기

yhtragramming 2019. 5. 16. 10:34

안녕하세요!!

 

오늘 포스팅할 내용은 'c와 p namespace를 사용하여 bean을 초기화'하는 방법입니다.

 

지금까지 의존성 주입을 주제로 이야기를 해오고 있는데, 결국 방법의 차이일뿐 결과는 동일합니다.

결국 사용하기 가장 편하신 방법으로 코딩하시면 되겠습니다!


1. Namespaces 추가하기

c와 p namespace를 사용하기 위해서는 일련의 사전작업이 필요한데요.

factory 클래스로 지정한 xml 파일의 하단 부분을 보시면, 'Namespaces'라는 탭이 있습니다.

저희는 지금까지 Source 탭에서 작업을 해왔던거구요!

Namespaces를 탭을 클릭해서 들어가면, 다음과 같이 여러 종류의 namespace가 리스트업됩니다.

이중에서 c와 p에 체크해주시고, 'ctrl+s'를 눌러 저장해주세요!

이제 다시 Source 탭으로 돌아오시면 상단에 다음과 같이 import된 것을 확인하실 수가 있습니다.

 

2. c namespace, p namespace

그렇다면 c namespacep namespace가 무엇이냐고요?

c는 constructor-arg를, p는 property를 의미합니다.

 

즉, 생성자(constructor-arg) 를 이용해 bean을 초기화하느냐,

혹은 property 속성을 이용해 초기화하느냐의 차이입니다.

 

c와 p namespace는 bean태그 내에서 모두 명시할 수 있으므로, 코드가 획기적으로 줄어든다는 장점이 있습니다. 예제로, student Class의 bean을 하나 만들겠습니다.

 

그리고 멤버 변수를 하나 둘씩 초기화해보겠습니다. 다만 줄이 길어지므로 줄도 나눌께요.

 

여기서 생성자(constructor-arg)로 초기화하기 위한 접근은 'c:변수명="값"'으로 하며, property로 초기화하기 위한 접근은 'p:변수명="값"'으로 합니다.

 

다음은 property로 초기화를 한 예제입니다.

 

main 클래스에서 동일하게 실행해보면, 다음과 같이 결과가 출력됩니다.

 

하지만 c namespace, p namespace가 유용한만큼 단점도 존재하는데요.

하나의 변수에는 value를 하나 밖에 넣지 못한다는 점이에요.

 

즉, 생성자(c:)에 ArrayList가 포함될 경우 'ambiguity' 에러가 발생합니다.

그래서 Student라는 클래스에 또 다른 생성자를 추가해보았습니다.

 

이는 기존에 추가되어있던 ArrayList<String>의 hobby 변수를 제외한 생성자입니다.

 

혹시 몰라 name, age, hobby를 포함하고 있는 생성자로 초기화가 가능한지를 알아보기 위해 bean을 만들어 실행해보겠습니다.

 

그러나 매치되는 생성자가 없다는 오류가 뜹니다.

 

그래서 이번에는 'public Student(String name, int age)' 생성자로 접근해보겠습니다.

그 결과, 이상 없이 출력됩니다.

 


지금까지 c와 p namespace를 사용하여 bean을 초기화하는 방법에 대해 알아보았습니다.

 

감사합니다! : )

Comments