Spring IoC

2,225 views

Published on

아꿈사 오전반
Spring Io C 설명

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,225
On SlideShare
0
From Embeds
0
Number of Embeds
49
Actions
Shares
0
Downloads
26
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Spring IoC

  1. 1. IOC & Spring Framework <br />이수안(inch772@naver.com)<br />아꿈사(http://cafe.naver.com/architect1.cafe)<br />
  2. 2.
  3. 3.
  4. 4.
  5. 5.
  6. 6.
  7. 7. Inversion of Control<br />객체들이 다른 객체를 invoke하는 구조가 아닌 의존되는 객체가 외부 엔터티나 컨테이너에 의해 삽입되는 구조<br />헐리우트 원칙 “don’t call me I will call you”<br />Dependency injection<br />Runtime 시점에 컨테이너에 의해 의존성들이 ‘삽입’ 된다.<br />Bean 생성시 생성자파라메터나프로퍼티를 통해 의존성이 연결된다.<br />객체나 서비스 Lookup이나 객체 생성등의 하드코팅을 예방한다.<br />의존성을 약하게 한다.<br />Unit Test를 효과적으로 작성하게 해준다.<br />
  8. 8. Non-IoC / Dependency Injection<br />Source: Spring Documentation<br />
  9. 9. publicclassCampaignServiceImplimplementsCampaignService{<br />public Campaign updateCampaign(Campaign campaign) throws CampaignException{<br /> try{ <br />CampaignDAO campaign = new CampaignDAOImpl();<br />..<br />OpportunityDAOoppDAO= new OpportunityDAOImpl();<br />// Alternatively, initialize thru factory<br />// OpportunityDAOoppDAO = OppFactory.getOpp();<br />oppDAO.save(campaign);<br />..<br /> }catch(Exception e){<br />}<br />}<br />Non-IoC Service Object<br />
  10. 10. IoC / Dependency Injection<br />Source: Spring Documentation<br />
  11. 11. publicclassCampaignServiceImplimplementsCampaignService{<br />public Campaign updateCampaign(Campaign campaign) throws CampaignException{<br /> try{ <br />oppDAO.save(campaign);<br /> }catch(Exception e){<br />}<br />}<br />// Spring sets the value thru runtime injection!<br />private setOpportunityDAO(OpportunityDAOoppDao){<br />this.oppDAO = oppDao;<br />}<br />IoC Service Object<br />
  12. 12. 객체의 생성, 생성 후 초기화, 서비스 실행, 소멸에 관한 모든 권한을 가지면서 생명주기를 관리한다.<br />예: Servlet Container, EJB Container<br />컨테이너?<br />Service<br />Init<br />Create<br />Destory<br />Container<br />객체A<br />객체 B<br />객체C<br />객체 D<br />
  13. 13. POJO(Plain old Java Object)<br />Servlet과 EJB와 같이 특정 API에 종속적이지 않은 모든 자바 클래스.<br />일반적으로 우리들이 흔히 이야기하는 자바빈은 모두 POJO라고 이야기할 수 있다.<br />Spring & POJO<br />Spring의 기본 객체 관리 단위는 POJO 임<br />Spring은 POJO의 객체의 Life Cycle을 관리하는 IoC컨테이너 역할을 제공한다.<br />POJO?<br />
  14. 14. IoC(또는 DI) Container<br />POJO의 생성, 초기화, 서비스 소멸에 관한 모든 권한을 가지면서 POJO의 생명주기를 관리한다.<br />개발자들이 직접 POJO를 생성할 수도 있지만, 모든 권한을 Container에게 맡긴다.<br />Transaction, Security 추가적인 기능을 제공한다. AOP 기능을 이용하여 새로운 Container 기능을 추가하는 것이 가능하다<br />IoC Container<br />Service<br />Init<br />Create<br />Destory<br />IoC(또는 DI) Container<br />POJO A<br />POJO B<br />POJO C<br />POJO D<br />
  15. 15. IoC컨테이너의 분류<br />IoC : Inversion of Control<br />DI : Dependency Injection<br />DP : Dependency Pull<br /><ul><li> EJB
  16. 16. Spring</li></ul>DP<br />IoC<br />Setter Inj<br />DI<br />Constructor Inj<br /><ul><li> Spring
  17. 17. PicoContainer</li></ul>Method Inj<br />
  18. 18. A lightweight non-intrusive framework which addresses various tiers in a J2EE application.<br />What is Spring Framework?<br />
  19. 19. Not a J2EE container. Doesn’t compete with J2EE app servers. Simply provides alternatives.<br />POJO-based, non-invasive framework which allows a la carte usage of its components. <br />Promotes decoupling and reusability <br />Reduces coding effort and enforces design discipline by providing out-of-box implicit pattern implementations such as singleton, factory, service locator etc.<br />Removes common code issues like leaking connections and more<br />Support for declarative transaction management<br />Easy integration with third party tools and technologies.<br />Spring Benefits<br />
  20. 20. IoC객체를 직접 생성하지 않고 외부에서 전달 받는 구조<br />IoC컨테이너는 POJO의 생명 주기를 관할한다.<br />대표적인 POJO 기반 IoC컨테이너는 Spring Framework<br />Spring FrameWorkPOJO-based, non-invasive framework<br />IoC와 Spring Framework 정리<br />
  21. 21. Spring IOC 예제<br />
  22. 22. publicclassCreateCreditCardAccountimplementsCreateCreditCardAccountInterface {<br /> privateCreditLinkingInterfacecreditLinkingInterface;<br /> publicvoidsetCreditLinkingInterface(<br />CreditLinkingInterfacecreditLinkingInterface) {<br />this.creditLinkingInterface = creditLinkingInterface;<br /> }<br /> publicCreditRatingInterfacegetCreditRatingInterface() {<br /> returncreditRatingInterface;<br /> }<br /> publicvoidcreateCreditCardAccount(ICustomericustomer) throws Exception{<br />booleancrediRating = getCreditRatingInterface().getUserCreditHistoryInformation(icustomer);<br />icustomer.setCreditRating(crediRating);<br /> //Good Rating<br /> if(crediRating){<br />getCreditLinkingInterface().linkCreditBankAccount(icustomer);<br /> }<br />getEmailInterface().sendEmail(icustomer);<br />}<br />Step1. DI 고려하여 객체 작성<br />
  23. 23. <beans><br /><bean id="createCreditCard" class="springexample.creditcardaccount.CreateCreditCardAccount"><br /><property name="creditRatingInterface" ref="creditRating" /><br /><property name="creditLinkingInterface" ref="creditLinking"/><br /><property name="emailInterface" ref="email"/><br /></bean><br /><bean id="creditLinking" class="springexample.creditlinking.CreditLinking"><br /><property name="url"><br /><value>http://localhost/creditLinkService</value><br /></property><br /></bean><br />Step2. 의존성 정의<br />
  24. 24. ClassPathXmlApplicationContextappContext = newClassPathXmlApplicationContext(new String[] { "classpath:spring/springexample-creditaccount.xml”});<br />CreateCreditCardAccountInterfacecreditCardAccount = (CreateCreditCardAccountInterface)<br />appContext.getBean("createCreditCard");<br />creditCardAccount.createCreditCardAccount(icustomer);<br />Step3. Factory에서 받아오기<br />
  25. 25. @RunWith(MockitoJUnitRunner.class)<br />publicclassCreateCreditCardAccountTest {<br />CreateCreditCardAccountcreateCreditCardAccount;<br />@Mock<br />CreditLinkingInterfacecreditLinkingInterface;<br />@Mock<br />CreditRatingInterfacecreditRatingInterface;<br />@Mock<br />EmailInterfaceemailInterface;<br />@Before<br />publicvoid setup(){<br />createCreditCardAccount = newCreateCreditCardAccount();<br />createCreditCardAccount.setCreditLinkingInterface(creditLinkingInterface);<br />createCreditCardAccount.setCreditRatingInterface(creditRatingInterface);<br />createCreditCardAccount.setEmailInterface(emailInterface);<br />}<br />@Test<br />publicvoidtestCreateCreditCardAccount() throws Exception {<br />ICustomercusomer = mock(ICustomer.class);<br />when(creditRatingInterface.getUserCreditHistoryInformation(cusomer)).thenReturn(true);<br />createCreditCardAccount.createCreditCardAccount(cusomer);<br />verify(creditLinkingInterface,times(1)).linkCreditBankAccount(cusomer);<br />}<br />}<br />Step4. TestCase작성<br />
  26. 26. 구현은 Setter를 통해 의존성을 전달받음 <br />이때 의존성은 모두 Concrete Class가 아닌 Interface 기반임<br />외부 XML파일로 의존성 정의<br />Spring Bean Factory는 설정을 읽어 객체를 생성함<br />테스트 케이스 작성시 관심 없는 부분은 Mock처리하여 쉽게 작성할 수 있음<br />DI 예제 정리<br />
  27. 27. http://openframework.or.kr/Wiki.jsp?page=IntroducingtheSpringFramework12<br />http://www.javajigi.net/pages/viewpage.action?pageId=3664<br />http://www.ibm.com/developerworks/web/library/wa-spring1/<br />참고<br />

×