Top Banner
프로자바( http://www.pro-java.com) SCA(http://www.scakorea.org) Framework = Framework+Framework Framework = Framework+Framework 김태완 프로자바 운영자 / 대우정보시스템 [email protected] http://www.pro-java.com 2006년 4월 1일 프로자바 http://www.scakorea.org SCA(Software Community Alliance) 제1회 한국 소프트웨어 커뮤니티 연합 세미나
38

Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

Jul 12, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Framework = Framework+FrameworkFramework = Framework+Framework

김태완프로자바 운영자/ 대우정보시스템

[email protected]

http://www.pro-java.com

2006년 4월 1일

프로자바http://www.scakorea.org

SCA(Software Community Alliance)

제1회 한국 소프트웨어 커뮤니티 연합 세미나

Page 2: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

The Unusual Suspects

Page 3: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

프레임워크란?• Framework은 일종의 클래스들의

집합 혹은 협력으로서 정의 될 수있으며, 관계된 문제들의 집합을해결하기 위한 추상화 된 Design 이다. Framework은 반드시 확장이가능하거나 적용이 가능한 메커니즘과 서브 시스템이 포함 되어야한다. Application Framework은이러한 문제 들을 해결하기 위한추상화 된 클래스와 패턴의 협력으로 나타낼 수 있으며 Application domain을 위한 generic software system이다 (R. Johnson).

Page 4: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Framework (?)Framework

– 특정 상황의 해법을 추상화

– 해결 방법보다는 문제 해결에집중

– Framework:라이브러기 + 디자인 패턴+ 개발 기법

+ 개발 가이드

– 이슈를 정의

– 이슈를 해결하는 목표를 설정– 목표를 달성하기 위한 추상화,

일관성있는 방법 제시

Page 5: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

OpenSource + Framework

OSCacheStruts Menu

Page 6: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Famework = Framework + Framework

Front Controller

Front Controller

ViewView

ServiceComponent

ServiceComponent

HTML/images

HTML/images

ApacheWeb Server

Tomcat 5.0.28 (JBoss 4.0)

Servlet Container Spring Lightweight Container

ActionActionHTTP Request

HTTP Response

JSPs/Velocity/XML/Flex

POJO/ Session Bean

POJO

Presentation Tier Business Tier Integration Tier EIS Tier

XML Conf. XML Conf.

Servlets

TaglibsTaglibs

BusinessObject

BusinessObject

Data AccessObject

Data AccessObject

PersistenceEngine

PersistenceEngine

O/R Mapping

Struts /OSCache

Spring Framework

iBatisSQL Maps

CacheEngineCacheEngine

Front Controller

Front Controller

ViewView

ServiceComponent

ServiceComponent

HTML/images

HTML/images

ApacheWeb Server

Tomcat 5.0.28 (JBoss 4.0)

Servlet Container Spring Lightweight Container

ActionAction

MySQL 4.0

DBDBDBDB

HTTP Request

HTTP Response

JSPs/Velocity/XML/Flex

POJO/ Session Bean

POJO

Presentation Tier Business Tier Integration Tier EIS Tier

XML Conf. XML Conf.

Servlets

TaglibsTaglibs

BusinessObject

BusinessObject

Data AccessObject

Data AccessObject

PersistenceEngine

PersistenceEngine

O/R Mapping

Struts /OSCache

Spring Framework

iBatisSQL Maps

CacheEngineCacheEngine

Oracle 8i

DBDBDBDB

Page 7: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Struts• strut

– n. 지주(支柱), 버팀목, 받침대(prop)

• Struts– 가장 대중적으로 성공한 Framework

– 명확함, 명확한 상속관계와 구조

– Control에 집중한 웹 프레임웍

Page 8: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Struts Sequence Diagram

Page 9: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Struts Flow Diagram

ActionServlet

Config XML File

Form

Custom TagLibraries

JSP

Action

forward

<<uses>>

<<instantiates>>

<<uses>>

ServiceBusiness Tier

Presentation Tier

DAOImplDAO

<<uses>>

DataBase

HTTPrequest

⑧↑

read②

↓⑤

HTTPresponse

⑩transfer

Persistence EngineiBatis, Hibernate

Page 10: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Flow Control- struts-config.xml<form-beans>

<form-bean type="jcf.board.web.form.BoardForm" name="boardForm"/>

</form-beans>

<action path="/board/ saveBoard“input="/board/editBoard.jsp" attribute="boardForm" name="boardForm" parameter="saveBoard" type="jcf.board.web.action.BoardAction" validate="true" scope="request"><forward name="viewBoardList" path="/board/viewBoardList.do"

redirect="false" /><forward name="viewBoard" path="/board/viewBoard.do" /><forward name="fail" path="/board/ editBoard.do" />

</action>

Page 11: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

스트럿츠의 양날의 검• Flow의 선언적 제어 : struts-config.xml

• 명확한 구조: Form, Action 클래스의 상속

• Form 클래스와 <http:form> tag lib의mapping

• 개발의 편의성 vs Learning Curve

• 유지보수성 향상 vs IDE의 존재감

• Struts 지원 툴 vs 복잡도

Page 12: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

IoC/ Dependency Injection• Non Dependency Injection

• Dependency Injection

Object B

Object C

Object A

Object B

Object C

Object A

create

create

setB(IB)

setC(IC)

Page 13: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Non IoC vs IoCpublic class Developer implements Servicable {

Programming prog;public Developer (){ prog = new StrutsProgramming();}public void createModule() { prog.createModule();}

}

public class Developer implements Servicable {Programming prog;public Developer (){}public void setProg(Programming prog){

this.prog = prog}public void createModule() { prog.createModule();}

}

<beans><bean id=“struts" class=“StrutsPrograming"/><bean id=“developer“ class=“Developer">

<property name=“prog"><ref bean=“struts"/></property></bean>

</beans>

Non IoC

IoC

Page 14: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

DI vs Lightweight Container• Dependency Injection Type

– Setter Injection

– Constructor Injection

– Method Injection

• Lightweight Container

Page 15: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Springframework Bean Factory

beanOne

yetAnotherBean

anotherExampleBean<bean id="anotherExampleBean" class="examples.AnotherBean"/>

<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>

<bean id="exampleBean" class="examples.ExampleBean">

<property name="beanOne"><ref bean="anotherExampleBean"/>

</property><property name="beanTwo">

<ref bean="yetAnotherBean"/></property>

<property name="integerProperty"><value>1</value>

</property></bean>

beanTwo

ingegerProperty

setIngegerProperty

setBeanOne

setBeanTwo

Spring Context

exampleBean

1

2

2

3

3

4

45 6

5

6

Page 16: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Spring MVC

Page 17: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Spring MVC 설정<context-param>

<param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext*.xml</param-value>

</context-param><listener>

<listener-class>org.springframework.web.context.ContextLoaderListener

</listener-class></listener><servlet>

<servlet-name>action</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup>

</servlet><servlet-mapping>

<servlet-name>action</servlet-name><url-pattern>*.do</url-pattern>

</servlet-mapping>

Page 18: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Spring MVC – Handling mapper<bean id="urlMapping"

class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props>

<prop key="**/*.html">staticViewController</prop><prop key="/user/ login.do">loginFormController</prop><prop key="/user/ listUser.do">userController</prop><prop key="/user/viewUser.do">userController</prop><prop key="/user/editUser.do">userFormController</prop>

</props></property>

</bean>

Page 19: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Spring MVC – Handling mapper<bean id="userController" class=“jcf.springmvc.user.web.UserController">

<property name="methodNameResolver"><ref local="userControllerMethodNameResolver" />

</property><property name="userService" ref="userService" />

</bean><bean id="userControllerMethodNameResolver"

class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"><property name="mappings">

<props><prop key="/user/ listUser.do">list</prop><prop key="/user/ viewUser.do">view</prop>

</props></property>

</bean>

Page 20: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Spring MVC - Controllerpublic ModelAndView view(HttpServletRequest request,

HttpServletResponse response) throws Exception {String userId =

RequestUtils.getRequiredStringParameter(request ,"userId");

return new ModelAndView(" user/view", "user", userService.findUser(userId));

}public ModelAndView list(HttpServletRequest request,

HttpServletResponse response) throws Exception {return new ModelAndView(" user/list", "userList", userService

.findUserList());}

Page 21: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Spring MVC – ViewResolver<bean id="viewResolver"

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/WEB-

INF/jsp/spring/"/><property name="suffix" value=".jsp"/>

</bean>

Page 22: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Request Parameter Bindingpublic ModelAndView add(HttpServletRequestrequest,

HttpServletResponse response) throws Exception {

User command = new User();bind(request, command);

userService.addUser(command);

return dispatchView(request, response);}

Page 23: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

view – HTML Rendering<form name="userForm" method="post"

action="${pageContext.request.contextPath}/user/editUser.do">

<tr><td>사용자 아이디</td>

<td>

<spring:bind path="user.userId"><input type="text" name="userId" value="${status.value}" />

<span class="fieldError">${status.errorMessage}</span></spring:bind>

</td>

</tr>

Page 24: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Spring MVC – Struts 비교

Spring taglibstruts taglib

viewforward

bean definitionsaction mappings

action-servlet.xmlstrits-config.xml

ControllerAction Class

Spring MVC Struts

Page 25: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

JavaServer Faces• 자바 기반 웹 애플리케이션을 위한 서버사이드 사

용자 인터페이스 컴포넌트 프레임웍• 비주얼 툴을 이용하여 개발 용이성 증대• 표준 스펙 – JCP-127 • Struts 의 계승자 (??)• Benefit

- 재사용성 가능한 UI 컴포넌트로 UI 작성의 편리성- UI와 애플리케이션 데이터간의 데이터 변환이 용이함- 서버 리퀘스트를 통해 UI 상태를 서버에서 관리- 클라이언트가 발생시킨 이벤트를 서버 애플리케이션 코드가 관리하

는 모델 제공- Custom UI 컴포넌트 개발의 용이성

Page 26: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

JSF 구성도

Page 27: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

JSF Life Cycle

Page 28: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

JSF의 주요 컨셉• JavaBeans 컨셉

– UIComponent hierarchy• >Properties

• >Methods

• >Events

• Event model– Listener classes

– Event objects

• RenderKit 컨셉

Page 29: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

JSF web.xml 설정<?xml version=’1.0’encoding=’UTF-8’?><!DOCTYPE web-app PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN” “http://java.sun.com/dtd/web-app_2_3.dtd”><web-app><context-param>

<param-name>javax.faces.STATE_SAVING_METHOD</param-name><param-value>client</param-value>

</context-param><context-param>

<param-name>javax.faces.application.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml</param-value>

</context-param><servlet>

<servlet-name>Faces Servlet</servlet-name><servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup>

</servlet><servlet-mapping>

<servlet-name>Faces Servlet</servlet-name><url-pattern>/faces/*</url-pattern>

</servlet-mapping></web-app>

Page 30: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

UI – Backing Bean

public class UserInfo{private UIInput name;private UIInput age;private UIOupput nameLabel;private UIOutput ageLabel;

//getter/setter}

Page 31: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

JSF Navigation<?xml version=’1.0’encoding=’UTF-8’?><faces-config><navigation-rule>

<from-view-id>/index.jsp</from-view-id><navigation-case>

<from-outcome>next</from-outcome><to-view-id>/response.jsp</to-view-id>

</navigation-case></navigation-rule>

<managed-bean><managed-bean-name>userInfo</managed-bean-name><managed-bean-class>sca.jsf.UserInfo</managed-bean-class><managed-bean-scope>session</managed-bean-scope></managed-bean>

</faces-config>

Page 32: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Index.jsp<%@ taglib uri=”http://java.sun.com/jsf/html” prefix=”h” %><%@ taglib uri=”http://java.sun.com/jsf/core” prefix=”f” %>

<f:view><f:loadBundle basename=”sca.jsf.Resource” var=”msg”/><title><h:outputText value=”#{msg.title}”/></title><h:form><h3><h:outputText value=”#{msg.heading}”/></h3><DIV><h:outputText value=”#{msg.command}”/></DIV><DIV><h:outputText value=”#{msg.name}”/><h:inputText value=”#{userInfo.name}”/></DIV><DIV><h:outputText value=”#{msg.age}”/><h:inputText value=”#{userInfo.age}”/></DIV><DIV><h:commandButton value=”#{msg.submit}” action=”next”/></DIV></h:form>

</f:view>

Page 33: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

response.jsp<%@ taglib uri=”http://java.sun.com/jsf/html” prefix=”h” %><%@ taglib uri=”http://java.sun.com/jsf/core” prefix=”f” %><f:view><f:loadBundle basename=”sca.jsf.Resource” var=”msg”/> <title><h:outputText value=”#{msg.response}”/></title><h:form><h3><h:outputText value=”#{userInfo.message}”/></h3><DIV><h:commandButton value=”#{msg.submit}”action=”next”/></DIV>

</h:form></f:view>

Page 34: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Custom Convertorfaces-config.xml custom Converter 등록<converter><converter-id>sca.ConvrterUser</converte><converter-class>sca.ConvrterUser</converter-class>

</converter>

* JSF 페이지 태그 사용법<h:inputText id=”name” value=”#{userInfo.name}” required=”true”/><h:converter converteId=”sca.ConvrterUser” />

</h:inputText><h:message for=”name” />

Page 35: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Validator표준 Validator 사용 예제

<h:inputText id="name" value="#{userInfo.name}" required="true"/><h:validateLength minimum="13" />

</h:inputText><h:message for="name" />

사용자 지정 Validatorfaces-config.xml 등록

<validator><validator-id>sca.UserId</validator><validator-class>sca.UserId</validator-class>

</validator>

JSF 페이지 태그 사용법<h:inputText id=”name” value=”#{userInfo.name}” required=”true”/>

<h:validator validatorId=”sca.UserId” /></h:inputText><h:message for=”name” />

Page 36: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

이벤트<h:commandButton type=”submit” value=”Login” actionListener=”#{loginForm.login}”/><h:inputText value=”#{userInfo.age}”

valueChangedListener =”#{loginForm.changedValue}” />

<h:commandButton type=”submit” value=”Login”><f:actionListener type=”sca.LoginActionListener” />

</h:commandButton><h:inputText value=”#{userInfo.age}”>

<f:valueChangedListener type=”sca.LoginValueChangedListener” /></h:inputText>

<faces-config><lifecycle>

<phase-listener>sca.PhaseListener</phase-listener></lifecycle>

</faces-config>

Page 37: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

Framework Lock-In

Page 38: Framework = Framework+Framework · 프로자바() SCA() Struts Flow Diagram Action Servlet Config XML File Form Custom Tag Libraries JSP Action

프로자바(http://www.pro-java.com) SCA(http://www.scakorea.org)

QnA