Spring〃스프링 장점 (1) DI <property/constructor> 정리

반응형


저번글에서 스프링 프레임워크의 MVC 모델을 그림으로 정리해보면서 왜 사용하는지 필요성을 느끼게 됬는데요. 이번 포스팅에서 스프링의 장점을 알아보려 했다가 방대한 양을 느끼고, 전부 정리할 시간적 여유가 없어 게시판 만들기 프로젝트에 필요한 DI 와 AOP에 대해서만 살펴보도록 하겠습니다. 


스프링을 공부하면서 알게된 DI가 도대체 무엇인지.. Dependency Injection의 약자라고 하지만, 한글로 번역한 의존성 주입이라는 말만 들어도 이해하기 정말 어렵네요. 평소에 거의 듣지 못하는 단어라 생소하기만 합니다.


그래서 글의 순서를 (1) 프로그래밍에서 의존성이 무엇인지 알아보고, (2) 스프링에서 DI 기능, (3) DI 설정방법에 대해 정리하도록 방향을 잡았습니다.




프로그래밍에서 의존성??



의존성의 사전적 의미를 보면 다른것에 의지하여 존재한다라는 뜻을 가지고 있는데요. 그것과 비슷하게 프로그래밍에서 의존성은 객체와 객체간의 의존을 의미 합니다. 다른 말로 풀어 쓰면 A라는 클래스에서 B라는 클래스의 메소드를 불러와 실행하게 될때 그것을 의존한다라고 생각하면 되겠습니다. 


그런데 B클래스의 메소드 이름이 바뀌어 버리면 어떻게 될까요?? A에서는 그 메소드를 찾을 수 없기 때문에 똑같이 변경해줘야 하는거죠. 1~2개의 클래스로 구성된 의존 메소드가 바뀌면 직접 변경해 줄텐데 그 이상을 사용했다면 변경하기 정말 불편할것 같습니다.




 Spring Framwork에서 DI는..


위에서 언급했듯이 기본 방식으로 메소드를 다른 클래스에서 같이 사용하면 직접적으로 연결되어 있어 유지보수의 어려움을 가지고 있습니다. 그래서 스프링 프레임워크에서 제공하는 DI를 이용하게 된 것인데, DI 역활은 기본 방식의 의존성을 제거하고 별도로 3자가 만들어주는 의존객체를 각 클래스에 뿌려주는 기능으로 변경의 유연성을 제공합니다. 악단으로 예로 들면 지휘자에 해당하는 셈입니다.




그림으로 표현하면 이런거죠. Service역활을 하는 설정파일을 만들어 각 클래스에서 의존객체들을 주입받습니다. 이 설정파일은 XML파일로 작성하고 <beans>태그안에 객체를 관리하는 컨테이너에 대해 설정합니다. 


그리고 Bean을 저장하기 위한 클래스파일에서 객체를 생성하는 방법도 달라지는데요. 기존 객체 생성방법이였던 new 연산자를 쓰지 않고, ServiceDao 객체를 생성하여 주입받습니다. 




 DI 설정하는 방법


- applicationContext.xml파일 초기설정 - 

XML초기설정 (Hun IT Blog).txt



DI를 설정하여 의존객체를 주입하는 방법은 생성자 방식(Constructor)과 메소드 방식(property)두가지가 있습니다. 개인적으로 프로젝트를 만들때는 메소드 방식을 이용할 예정이지만 각각 살펴보시고 둘중에 편한걸로 사용하시면 되겠습니다.


그리고 xml파일은 기본적으로 위 사진과 같이 초기 설정을 해주고 </beans> 위에 명령어를 넣습니다. 간단한 코드는 같이 포함시킬 예정이지만 코드가 보기 불편할때는 가독성 때문에 생략하더라도 이해해주세요.



 생성자 방식 ( Constructor )


-  주입받을 객체가 들어있는 BoardDao.java 파일  -


-  주입을 설정하는 applicationContext.xml 파일  -


간단하게 정리해볼게요. 주입 받는 객체가 있으려면 클래스 파일을 만들어 줘야겠죠? ①번 파일명을 BoardDao로 만들어 name, list, regdate 객체를 생성했습니다. 


다음 applicationContext.xml 파일에 위와 같은 코드를 넣어주면 생성자를 통한 객체주입 설정이 완료 됩니다. <constructor-arg>는 <bean>태그 안에 객체 및 생성자를 주입하도록 설정하는 태그로 ref= " bean이름 " / value="변수값" 을 넣어 사용합니다.


그럼 다음 예제로 프로젝트에 사용할 DAO(Data Access Object)에 객체를 주입해보겠습니다. 





 입받을 boardDao객체가 들어있는 BoardDao.java 파일

② boardDao를 설정하는 applicationContext.xml 파일


이렇게 만들어 놓으니 BoardDao와 boardDao로만 구성해서 그런지 대문자 소문자 구별이 잘 안되면 보기 힘들겠네요. 그냥 여기서 보셔야 될건 ①번 BoardDao파일에서 boardDao라는 객체를 생성해줍니다. 

다음 boardDao 객체를 ②번 어플리케이션 파일에서 <constructor-arg ref="">태그 안에 넣어 의존객체로 설정해주는거죠. 




 메소드 방식 ( Property )


 입받을 boardDao객체가 들어있는 BoardDao.java 파일

② boardDao를 설정하는 applicationContext.xml 파일


휴.. 이번엔 DI 설정 두번째인 setter 메소드를 이용한 Property 설정방법입니다. 예제는 constructor와 비슷하니 DAO 예제만 살펴보도록 할게요. ①번 파일은 건드린게 없고, ②번파일에서 <propery>태그만 사용해준 모습입니다.


생성자 방식인 <constructor-arg>에서는 ref에 "boardDao"를 넣었지만, 메소드 방식인<property>에서는 name에 "boardDao"를 넣는게 다르죠?? <property>에서 ref와 value는 데이타 값을 넣어줍니다.


추가로 응용해보고자 name값에 "order"를 넣고 value값에 숫자를 넣었는데요. 이게 메소드 동작 순서를 정하는 방법입니다. ②번 파일은 serviceDao부터 처리하고 boardDao를 처리하게 된답니다.




 Property 태그 중 하나인 <props>



마무리를 짓기전에 제가 <property>방식을 프로젝트에 사용하게 된 이유는 마지막 예제와 관련있는데요. <props> 태그는 String 타입의 key값을 value값 내에 있는 목록으로 전달하는 역활을 가지고 있어 위 사진과 같이 핸들러 매핑을 사용하기에 안성맞춤입니다.


의존객체가 <prop>의 key값인 boardList.action을 만나면 <prop> value값 </prop>인 listController로 전달 됩니다. 제가 만들 게시판프로젝트에 아주 유용하게 쓰일 태그로 나중에 이글이 링크로 타지겠네요. 이만 길었던 DI기능을 여기서 마치겠습니다.

반응형