Spring DI 이해 및 활용.

Slides:



Advertisements
Similar presentations
Transaction ㅇ Transaction 을 직접 구현하려면, 까다로운 설계와 복잡한 코드를 필요로 하고 수정에 공수가 많이 들게 된다. ㅇ 스프링에서 제공하는 Transaction Manager 를 사용하여 쉽고 간편하게 어려운 트랜잭션을 해결할 수 있다. xml.
Advertisements

6.1 사용사례 6.2 객체 모델링 6.3 동적 모델링 6.4 시스템 설계 6.5 객체 설계 6.6 디자인 패턴
고급자바프로그래밍 (Advanced Java Programming)
11장. 프로토콜 핸들러 AI &HC I LAB 김 성 현.
Spring MVC ㅇ 스프링 MVC 구성요소 설명 DispatcherServlet 클라이언트의 요청을 컨트롤러에게 전달하고
Introduction to Servlets
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
백기선 Advanced bean wiring 백기선
최신 소프트웨어 공학 개요 11.1 컴포넌트 기반 소프트웨어 개발 11.2 웹 엔지니어링 11.3 정형적 명세 기법
Programming for the java Virtual machine
제14장 원격 메소드 호출 김 기 환. 조 명 휘.
12장. JSP에서 자바빈 활용 제12장.
Java로 배우는 디자인패턴 입문 Chapter 0. UML 과 Design Pattern
9 표준 액션.
TDD Junit TDD & Spring Framework 참고자료
7. JavaBeans 프로그래밍 JavaBeans JavaBeans 만들기 Bean을 이용한 회원가입 양식 작성하기
16강. 자바 빈 빈 이란? 빈 만들기 빈 관련 액션 태그(useBean, getProperty, setProperty)
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
명품 JAVA Programming.
메소드 호출과 힙 원격 메소드 호출 서블릿 엔터프라이즈 자바 빈즈
명품 JAVA Programming 제 4 장 클래스와 객체.
Power Java 제4장 자바 프로그래밍 기초.
객체 지향 원리 송치형.
1강 01장. 웹과 자바.
IOC, DI 2015 Web Service Computing.
객체지향 언어와 클래스, 객체 ㅎㅎ 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드 한빛미디어(주)
자바 5.0 프로그래밍.
화면(UI) 기반 도메인모델 작성 2014년 8월.
명품 JAVA Essential.
AOP 개념 및 Spring의 AOP 기능.
10장 다중 스레드 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
윤 홍 란 4 장 클래스 작성 윤 홍 란
JSP와 자바 빈즈 JSP 빈즈 구조를 이해하고 활용한다. useBean 액션 활용법을 익힌다.
This, static, final 지정 예약어 자바 4대 중첩 클래스
김 정 석 Web Programming 김 정 석
2 : 대칭암호화 소제목 : 기본적인 대칭암호화.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
AOP (Aspect Oriented Programing)
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
3. Spring 프레임워크의 IoC 컨테이너 개념
Chap10 다중 스레드 Section 1 : 스레드 개요 Section 2 : Thread 클래스와 스레드 생명주기
Spring 프레임워크의 이해 – day2 자바지기.
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
Spring 프레임워크의 이해 – day1 자바지기.
Spring 프레임워크의 이해 3. Spring IoC 이해 및 활용.
SpringFramework 중간고사 요약 REST by SpringFramework.
Chap. 14 성능향상시키기 PS Lab. 이지연.
[INA470] Java Programming Youn-Hee Han
Java Chapter 4 ~ 주차.
컴퓨터공학실습(I) 3주 인공지능연구실.
Java IT응용시스템공학과 김형진 교수 5장. 객체지향 개념 public class SumTest {
Chapter3 : 객체지향의 개념 3.1 객체지향(object-oriented)과
Chap02 객체 지향 개념 2.1 객체지향(object-oriented)과 절차지향(procedural-oriented)
JA A V W. 04.
Spring Framework 플랫폼개발실 김광욱
자바 5.0 프로그래밍.
JA V A W. 07 Sb.L.
Chapter 02. 소프트웨어와 자료구조.
Spring Security 2015 Web Service Computing.
5.2 트랜잭션 서비스 추상화.
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
JSP 빈즈 1.JSP 빈즈? JSP와 연동을 위해 만들어진 컴포넌트 클래스를 말한다. JSP 빈즈는 컨테이너에 위치하며, 데이터 처리와 공용화된 기능을 제공하기 때문에 빈즈를 잘 활용하면 프로그램의 중복을 줄이고 좀더 원할한 유지보수가 가능한다. 물론 , 모든 JSP를.
6장 클래스(상속).
Architecture.
안드로이드 앱 분석 팀 기반의 설계 프로젝트 박민재
김희정 Bridge Pattern.
Java 5장. 객체지향 개념 public class SumTest {
Java의 정석 제 7 장 객체지향개념 II-3 Java 정석 남궁성 강의
Presentation transcript:

Spring DI 이해 및 활용

Spring - DI Inversion of Control? Dependency Injection?

Spring - DI 요구사항 하나의 Interface 기반하에서 “Hello World!”와 “Hi World!” 메시지를 출력해야 한다. 출력하는 메시지를 생성하는 부분과 생성된 메시지를 Rendering하는 부분이 분리되어야 한다.

Spring - DI

Spring - DI

Spring - DI 요구사항 변경 “Hello World!”와 “Hi World!!” 메시지외에 “안녕 World!”를 출력해야 한다. 출력하는 메시지를 생성하는 부분과 생성된 메시지를 Rendering하는 부분이 분리되어야 한다. 생성된 메시지를 단순히 출력하는 기능과 인자로 전달된 “Name”을 더하여 가공한 메시지를 출력해야 한다.

Spring - DI ?

Spring - DI Factory Pattern

Spring - DI Factory Pattern

Spring - DI Spring

Spring - DI How?

(ApplicationContext) Spring - DI 클래스 의존관계에 대한 Metadata (XML 또는 Property) Spring Framework (ApplicationContext)

Spring 설정 파일 Spring - DI <beans ...> <bean id="renderer" class="net.javajigi.ioc.DefaultMessageRenderer"> <property name="messageProvider“ ref=“helloWorldMessageProvider”/> </bean> <bean id="hiWorldMessageProvider" class="net.javajigi.ioc.HiworldMessageProvider" /> <bean id="annyoungWorldMessageProvider" class="net.javajigi.ioc.AnnyoungWorldMessageProvider" /> <bean id="helloWorldMessageProvider" class="net.javajigi.ioc.HelloworldMessageProvider"/> </beans>

Spring 테스트 코드 Spring - DI public class DefaultMessageRendererTest extends TestCase { private MessageRenderer renderer; protected void setUp() throws Exception { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("net/javajigi/ioc/HelloWorld.xml"); renderer = (MessageRenderer) applicationContext.getBean("renderer"); } public void testRender() { assertNotNull(renderer); renderer.render();

Spring 테스트 코드 Spring - DI public class MessageRendererWithADITest extends AbstractDependencyInjectionSpringContextTests { private MessageRenderer messageRenderer; public void setMessageRenderer(MessageRenderer messageRenderer) { this.messageRenderer = messageRenderer; } protected String[] getConfigLocations() { return new String[] {"di.xml"}; public void testRenderer() throws Exception { messageRenderer.render();

Inversion of Control (IoC) Spring - DI Inversion of Control (IoC)

DP IoC Setter Inj DI Constructor Inj Method Inj Spring - DI IoC : Inversion of Control DI : Dependency Injection DP : Dependency Pull EJB Spring DP IoC Setter Inj DI Constructor Inj Spring PicoContainer Method Inj

Spring은 하나의 프레임워크이다. 그런데 왜 Spring 컨테이너, IoC 컨테이너라는 말을 사용할까? Spring - DI Spring은 하나의 프레임워크이다. 그런데 왜 Spring 컨테이너, IoC 컨테이너라는 말을 사용할까? 컨테이너란 무엇일까?

Servlet의 생성, 생성 후 초기화, 서비스 실행, 소멸에 관한 모든 권한을 가지면서 Servlet의 생명주기를 관리한다. Spring - DI Servlet Container Servlet의 생성, 생성 후 초기화, 서비스 실행, 소멸에 관한 모든 권한을 가지면서 Servlet의 생명주기를 관리한다. 개발자들이 직접 Servlet을 생성하고 서비스하지는 않는다. JSP/Servlet 접근 권한, 에러 처리에 대한 추가적인 기능도 지원한다. Service Init Create Destory Servlet Container Servlet A Servlet B Servlet C Servlet D

개발자들이 직접 EJB 생성하고 서비스할 수 없다. Spring - DI EJB Container EJB(세션빈, 엔티티빈, MDB)의 생성, 생성 후 초기화, 서비스 실행, 소멸에 관한 모든 권한을 가지면서 EJB의 생명주기를 관리한다. 개발자들이 직접 EJB 생성하고 서비스할 수 없다. Transaction, Security, EJB Pooling등의 추가적인 기능을 제공하고 있다. Service Init Create Destory EJB Container EJB A EJB B EJB C EJB D

POJO의 생성, 초기화, 서비스 소멸에 관한 모든 권한을 가지면서 POJO의 생명주기를 관리한다. Spring - DI IoC(또는 DI) Container POJO의 생성, 초기화, 서비스 소멸에 관한 모든 권한을 가지면서 POJO의 생명주기를 관리한다. 개발자들이 직접 POJO를 생성할 수도 있지만, 모든 권한을 Container에게 맡긴다. Transaction, Security 추가적인 기능을 제공한다. AOP 기능을 이용하여 새로운 Container 기능을 추가하는 것이 가능하다. Service Init Create Destory IoC(또는 DI) Container POJO A POJO B POJO C POJO D

POJO(Plain Old Java Object)란 무엇인가? Spring - DI POJO(Plain Old Java Object)란 무엇인가? Martin Fowler : http://www.martinfowler.com/bliki/POJO.html Servlet과 EJB와 같이 특정 Interface(Contracts)에 종속적이지 않은 모든 자바 클래스. 일반적으로 우리들이 흔히 이야기하는 자바빈은 모두 POJO라고 이야기할 수 있다.

Singleton?, Non Singleton? Spring - DI Singleton?, Non Singleton?

Singleton Pattern을 활용한 Singleton Spring - DI Singleton Pattern을 활용한 Singleton

지금까지의 Singleton 구현 방법 Spring - DI public class MessageService { private static MessageService instance; private MessageService() {} public static MessageService getInstance() { if(instance == null ) { instance = new MessageService(); } return instance;

MessageProviderFactory의 Singleton Spring - DI MessageProviderFactory의 Singleton public class MessageProviderFactory { public static final int HI_WORLD_PROVIDER = 0; public static final int HELLO_WORLD_PROVIDER = 1; public static final int ANNYOUNG_WORLD_PROVIDER = 2; private static final Map<Integer, MessageProvider> providers = new HashMap<Integer, MessageProvider>(); static { providers.put(HI_WORLD_PROVIDER, new HiworldMessageProvider()); providers.put(HELLO_WORLD_PROVIDER, new HelloworldMessageProvider()); providers.put(ANNYOUNG_WORLD_PROVIDER, new AnnyoungworldMessageProvider()); } public static MessageProvider getMessageProvider(int status) { return providers.get(status);

Spring - DI Spring 기반하의 Singleton

Spring 프레임워크의 Singleton 구현 방법 Spring - DI Spring 프레임워크의 Singleton 구현 방법 <bean id="annyoungWorldMessageProvider" class="net.javajigi.ioc.AnnyoungWorldMessageProvider" scope=“singleton” /> <bean id="helloWorldMessageProvider" class="net.javajigi.ioc.HelloworldMessageProvider"/>

Spring - DI <bean id="renderer" class="net.javajigi.ioc.DefaultMessageRenderer"> <property name="messageProvider"> <ref local=“hiWorldMessageProvider" /> </property> </bean> <bean id="hiWorldMessageProvider" class="net.javajigi.ioc.HiworldMessageProvider" /> ApplicationContext 키(key) 값(value) “renderer " DefaultMessageRenderer 인스턴스 " hiWorldMessageProvider” HiWorldMessageProvider 인스턴스

웹 애플리케이션 Spring - DI ServletContext(sigle instance) JVM 키(key) 값(value) “org.springframework.web.context. WebApplicationContext.ROOT" WebApplicationContext 인스턴스 JVM

Spring - DI

Spring 프레임워크의 Non Singleton 구현 방법 Spring - DI Spring 프레임워크의 Non Singleton 구현 방법 <bean id="annyoungWorldMessageProvider" class="net.javajigi.ioc.AnnyoungWorldMessageProvider" scope=“prototype” /> <bean id="helloWorldMessageProvider" class="net.javajigi.ioc.HelloworldMessageProvider“

Spring - DI Spring 2.0에서 지원하는 Scope

Singleton 인스턴스를 사용해야 할 때 Spring - DI Singleton 인스턴스를 사용해야 할 때

Singleton Instance Thread A Thread B Spring - DI Singleton Instance name = null public class Person { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; new Person(); Thread A new Person(); Thread B

person.setName(“예은”); Spring - DI Singleton Instance name = “예은” public class Person { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; person.setName(“예은”); Thread A

person.setName(“주한”); Spring - DI Singleton Instance name = “주한” public class Person { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; person.setName(“주한”); Thread B

person.getName(); => 주한 Spring - DI Singleton Instance name = “주한” public class Person { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; person.getName(); => 주한 Thread A

Static을 사용한 Singleton의 문제점 Spring - DI Static을 사용한 Singleton의 문제점 Dependency가 높아진다. Singleton 클래스마다 서로 다른 Configuration 가질 수 있다. interface-unfriendly => Test의 어려움. 상속하기 힘들다. Runtime시에 Singleton의 상태를 변경할 수 없다. OOP적으로 개발하는데 한계가 있다.

Spring 인스턴스 생성

인스턴스 생성 new  <bean id="messageProvider" class="net.javajigi.di.NewMessageProvider"/>

<bean id="messageProvider" 인스턴스 생성 Factory method <bean id="messageProvider" class="net.javajigi.di.SingletonMessageProvider" factory-method="getInstance" />

FactoryBean Interface 인스턴스 생성 FactoryBean Interface <bean id="messageProvider" class="net.javajigi.di.MessageProviderFactoryBean"> <property name="type"> <util:constant static-field="net.javajigi.di.MessageProviderFactoryBean.ANNYOUNG_WORLD_PROVIDER"/> </property> </bean>

<property name="userDAO"> <ref local="userDAO" /> 인스턴스 생성  <bean id="userService" class="net.javajigi.user.service.UserServiceImpl"> <property name="userDAO"> <ref local="userDAO" /> </property> </bean> ApplicationContext context = new ClassPathXmlApplicationContext(paths); UserService userService = context.getBean(“userService”);

인스턴스 생성 <bean id="userService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target"> <ref local="userServiceTarget" /> </property> <property name="interceptorNames"> <list> <value>loggingAdvice</value> <value>emailNotificationThrowsAdvice</value> </list> </bean> ApplicationContext context = new ClassPathXmlApplicationContext(paths); ProxyFactoryBean factoryBean = context.getBean(“userService”);

인스턴스 생성 <bean id="userService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target"> <ref local="userServiceTarget" /> </property> <property name="interceptorNames"> <list> <value>loggingAdvice</value> <value>emailNotificationThrowsAdvice</value> </list> </bean> ApplicationContext context = new ClassPathXmlApplicationContext(paths); UserService userService = context.getBean(“userService”);

인스턴스 생성 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/petclinic</value> </property> </bean> ApplicationContext context = new ClassPathXmlApplicationContext(paths); JndiObjectFactoryBean factoryBean = context.getBean(“dataSource”);

인스턴스 생성 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/petclinic</value> </property> </bean> ApplicationContext context = new ClassPathXmlApplicationContext(paths); DataSource dataSource = (DataSource)context.getBean(“dataSource”);

Template Method Pattern Spring - DI Spring Friends Singleton Pattern Factory Pattern Observer Pattern Strategy Pattern Template Method Pattern

JVM 메모리 사용 관련 참고문서 Spring - DI http://hjbang.snut.ac.kr/data/java2005/JAVA06.ppt http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=1&t=012143

Spring - DI 빈 설정 파일 정보 초기화 1. 디폴트 생성자 Invoke 2. 빈의 의존관계 여부 체크 3. setXXX() 메써드 호출 4. setBeanName() 메써드 호출 5. setBeanFactory() 메써드 호출 6. setApplicationContext() 메써드 호출 7. afterProperties() 메써드 호출 8. 빈 설정 파일의 init-method 호출 POJO 빈 초기화 상태 빈에 대한 초기화가 완료되고 서비스 가능한 준비상태 POJO 빈 준비 상태 POJO 빈 소멸 상태 9. destroy() 메써드 호출 10. 빈 설정 파일의 destory-method 호출

POJO 빈의 초기화와 소멸 Spring - DI <bean id="simpleBean1" class="net.javajigi.SimpleBean" init-method="init" destroy-method="destory"> InitializingBean, DisposableBean Spring 프레임워크 워크북 , 123 – 126 페이지 http://wiki.javajigi.net/pages/viewpage.action?pageId=1040

ApplicationContext 접근하기 Spring - DI ApplicationContext 접근하기 BeanNameAware, BeanFactoryAware, ApplicationContextAware http://wiki.javajigi.net/pages/viewpage.action?pageId=1101

Spring - DI 샘플 애플리케이션 개발 및 분석 (Spring 프레임워크 워크북 2장)

Spring - DI Why DI? Dependency Easy Test

과제 과제 웹 애플리케이션을 개발하다보면 Select Box, Check Box, Radio Button을 개발자마다 다른 방식으로 개발하는 것이 일반적이다. 특히 SI 프로젝트를 진행할 때 공통적으로 사용하는 부분이 많이 발생하게 된다. 이 같은 단점을 보완하기 위하여 일관된 Interface 하에서 이 같은 문제점을 해결할 수 있다. Select Box, Check Box, Radio Button에 대해서만 일관된 형태로 개발하고 관리할 수 있다면 웹 애플리케이션을 개발하는데 상당히 유용하게 사용될 수 있을 것이다. http://wiki.javajigi.net/pages/viewpage.action?pageId=7170 참고