- sw_desing study group -

25
- SW_Desing Study Group - 2009 년 1 년 18 년 년년년 2. 프프프프프프 프프프프 프프프 프프프프프 프프프프

Upload: anoki

Post on 23-Feb-2016

108 views

Category:

Documents


0 download

DESCRIPTION

2. 프레젠테이션 티어에서 디자인 고려사항과 위험사례. - SW_Desing Study Group -. 200 9 년 1 월 18 일 이진서. 1. 코어 J2EE 패턴을 접하면서. 프로젝트 개요. 기술을 학습하는 것과 설계를 학습하는 것은 다릅니다 . 기존의 많은 책들이 API 명세서와 같이 세부 기술을 설명하는데 있어서는 매우 훌륭했지만 , " 그 기술을 적용하는 통찰 " 을 주지는 못했습니다 . 디자인을 배우는 것은 경험에서 부터 나오며 , - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: -  SW_Desing Study Group -

- SW_Desing Study Group -

2009 년 1 월 18 일이진서

2. 프레젠테이션 티어에서 디자인 고려사항과 위험사례

Page 2: -  SW_Desing Study Group -

2 2

I. 프로젝트 개요1. 코어 J2EE 패턴을 접하면서

기술을 학습하는 것과 설계를 학습하는 것은 다릅니다 . 기존의 많은 책들이 API 명세서와 같이 세부 기술을 설명하는데 있어서는

매우 훌륭했지만 , " 그 기술을 적용하는 통찰 " 을 주지는 못했습니다 . 디자인을 배우는 것은 경험에서 부터 나오며 ,

추천 지침 (Best Practice) 및 위험 사례 (Bad Practice) 에 대한 지식을 공유하는 데에서 나옵니다… .

애플리케이션 분할 , 재사용성 , 유지보수성을 향상시킨다 .

Page 3: -  SW_Desing Study Group -

3

Table of Contents

I. 프리젠테이션 티어에서 디자인 고려사항II. 프리젠테이션 티어에서 위험 사례III. Q&A

Page 4: -  SW_Desing Study Group -

4 4

I. 프로젝트 개요2.1 Presentation Pattern 을 적용할 경우 설계시 고려할 문제

보안 (Security) 데이터 무결성 (data integrity) 관리 용이성 (manageability) 확장성 (scalability)

Model-View-Controller 개별 부분을 쉽게 수정할 수 있도록 웹 응용 프로그램의 사용자 인터페이스 기능을 어떻게 모듈화할 수 있습니까 ?

Page controller 중복을 피하면서 재사용성 및 유연성을 얻을 수 있도록 적정 수준으로 복잡한 웹 응용 프로그램에 대한 컨트롤러를 어떻게 가장 잘

구성할 수 있습니까 ? Front controller

코드 중복을 피하면서 재사용성 및 유연성을 얻을 수 있도록 매우 복잡한 웹 응용 프로그램에 대한 컨트롤러를 어떻게 가장 잘 구성할 수 있습니까 ?

Intercepter filter 웹 페이지 요청 전후에 일반적인 사전 및 사후 처리 단계를 어떻게 구현할 수 있습니까 ?

* 반드시 고려해야 하는 4 가지 요소

Page 5: -  SW_Desing Study Group -

5 5

I. 프로젝트 개요1-1 세션 관리

User session 이란 ? Client 와 Server 사이에 여러 Request 들이 오가는 지속적인 대화

Page 6: -  SW_Desing Study Group -

6 6

I. 프로젝트 개요1-1 세션 관리

Client 에 저장되는 세션 상대적으로 구현 쉽다 저장할 정보가 작은 경우 ( 크면 성능저하 )

HTTP 쿠키 POST 방식 (HTML hidden field) – HTML 안에 text 로 노출 GET 방식 (URL 에 직접포함 ) – URL 노출

Client 에 session 상태가 노출되는 보안문제 – 암호화 필요성

Server 에 저장되는 세션 세션상태를 서버에 저장 요청시 특정 사용자를 동일서버로 보내도록 처리 (Resonate – traffic man-

agement) 세션상태를 Bussiness Tier 에 저장 - EJB 세션상태를 Resource Tier 에 저장 – RDBMS( 관계형데이터베이스 ) Session ID 를 이용하여 세션 상태 저장

Session Timeout 초과 Invalidate( 무효화 ) 해당 Session 삭제

Page 7: -  SW_Desing Study Group -

7 7

특정 클라이언트가 app 리소스에 접근하지 못하게 통제하는 이유 ?

I. 프로젝트 개요1-2 클라이언트 접근 제어

첫번째는 클라이언트 접근을 제한하거나 통제하는 시나리오 Delegation point – All-or-nothing 특정부분 숨기기 설정에 의한 감시 단순하며 일반적인 설정을 사용한 리소스 감시

두번째는 사용자의 진행을 제어하는 시나리오 Synchroniser token

Page 8: -  SW_Desing Study Group -

Client 에서 유효성 검사 JavaScript 와 같은 내장 스크립트

Server 에서 유효성 검사 폼 중심의 유효성검사 (form-centric validation)

추상 타입 기반 유효성검사 (validation based on abstract types) 장점 : 유연성 , 재사용성 , 유지보수용이성 단점 : 일반화로 인해 효율성과 성능이 저하 ( 이해하기 어려워 유지보수

힘들어짐 )

8 8

Client 와 Server 양쪽에서 모두 수행하는 것이 바람직합니다 .필수적으로 재사용성 (reuse) 와 모듈화 (modularity) 라는 문제를 반드시 고민

I. 프로젝트 개요1-3 유효성 검사

Validator.getInstance().validate(firstNameString, formFieldName)

Public Vector validate(){Vector errorCollection = new Vector(); If(firstname == null) || (firstname.trim().length() < 1) errorCollection.addElement(“error!”);}

function validate(){ var thisYear = document.myform.thisYear.value; if (CheckStr(thisYear, " ", "")==0 || CheckStr(thisYear, "&nbsp;", "")==0) { alert(" 연도를 입력해 주세요 "); return false; }

Page 9: -  SW_Desing Study Group -

9 9

I. 프로젝트 개요1-4 헬퍼 프로퍼티 – 무결성 및 일관성

자바빈 헬퍼 클래스는 클라이언트 요청과 함께 넘길때 중간에서 상태를 저장하는 역활

Page 10: -  SW_Desing Study Group -

10

Table of Contents

I. 프리젠테이션 티어에서 디자인 고려사항II. 프리젠테이션 티어에서 위험 사례III. Q&A

Page 11: -  SW_Desing Study Group -

11 11

I. 프로젝트 개요2-1 제어 코드가 여러 뷰에 존재하는 사례

문제 개요 페이지 접근권한 로직을 수정하라 . 1000… 개의 JSP 안에 접근제어 로직이 포함되어있음 .

언제 다바꾸지 ? ㅜㅜ

JSP 페이지

접근제어로직

JSP 페이지

접근제어로직

JSP 페이지

접근제어로직

JSP 페이지

접근제어로직

JSP 페이지

접근제어로직

JSP 페이지

접근제어로직

JSP 페이지

접근제어로직

Page 12: -  SW_Desing Study Group -

12 12

I. 프로젝트 개요2-1 제어 코드가 여러 뷰에 존재하는 사례

해법 참고 컨트롤러 도입 각기 다른 로직을 지역화하기 Front Controller 패턴에서 Command and Controller 전략 View Helper 패턴 뷰감시

JSP 페이지

JSP 페이지

Controller컨트롤 Logic

포멧 Logic

포멧 Logic

컨트롤 Logic

Helper Controller

컨트롤 Logic

포멧 Logic

JSP 페이지

1. 컨트롤에서 판단해서 JSP 로 forward2. Fat Controller 위험

1.Helper 클래스에 위임하기

Page 13: -  SW_Desing Study Group -

13 13

I. 프로젝트 개요2-1 제어 코드가 여러 뷰에 존재하는 사례

해법 참고 컨트롤러 도입 각기 다른 로직을 지역화하기 Front Controller 패턴에서 Command and Controller 전략 View Helper 패턴 뷰감시

JSP 페이지

Helper AClass

jsp비즈니스로직 A

1. 로직을 뒤로보내기 (Factor Back): Helper 로 작업위임하기

비즈니스로직 B비즈니스로직 C

비즈니스

로직Helper BClass

Helper CClass

Page 14: -  SW_Desing Study Group -

14 14

I. 프로젝트 개요2-1 제어 코드가 여러 뷰에 존재하는 사례

해법 참고 컨트롤러 도입 각기 다른 로직을 지역화하기 Front Controller 패턴에서 Command and Controller 전략 View Helper 패턴 뷰감시

JSP 페이지

비즈니스로직 A Controller

컨트롤 Logic비즈니스로직 B

비즈니스로직 C

1. 로직을 앞으로보내기 (Factor Forward): 컨트롤러 도입

비즈니스

로직

jsp

Helper AClass

Helper BClass

Helper CClass

Page 15: -  SW_Desing Study Group -

15 15

I. 프로젝트 개요2-1 제어 코드가 여러 뷰에 존재하는 사례

해법 참고 컨트롤러 도입 각기 다른 로직을 지역화하기 Front Controller 패턴에서 Command and Controller 전략 View Helper 패턴 뷰감시

controller

Request Data access

Page dispatch

2 단계 . View 생성 : 해당뷰에 필요한 데이터로 화면구성을 함

jsp

1 단계 .View 준비 : 요청이 오면 로직처리 , 데어터획득후 뷰로 dispatch 과정

JavaBeanHelper

Custom TagHelper

JSTL Tag FileHelper

최종 화면구성

jsp

Page 16: -  SW_Desing Study Group -

16 16

I. 프로젝트 개요2-1 제어 코드가 여러 뷰에 존재하는 사례

해법 참고 컨트롤러 도입 각기 다른 로직을 지역화하기 Front Controller 패턴에서 Command and Controller 전략 View Helper 패턴 뷰감시

<%@ tablib uri=“WEB-INF/corj2eetaglibrary.tld” prefix=“corePatterns’ %>

<corePatterns:guard/><HTML>…</HTML>

jsp

2. 사용자의 역할에 따라 뷰의 특정부분 숨기기1. 뷰에 all-or-nothing 감시자 넣기

<%@ tablib uri=“WEB-INF/corj2eetaglibrary.tld” prefix=“corePatterns’ %>

<HTML>…<corePatterns:guard role=‘manager’><b> 매지저만 볼수있어요 </b></corePatterns:guard>

…</HTML>

jsp

Page 17: -  SW_Desing Study Group -

17 17

I. 프로젝트 개요2-2 프리젠테이션 티어 데이터 구조가 비즈니스 티어에 노출되는 사례

문제개요 프리젠테이션 티어 데이터 구조를 비즈니스 티어 혹은 그밖에 다른 티어와 공유하면 ,

티어 사이에 결합도를 심화시킬 뿐만 아니라 해당 서비스의 재사용성을 심각하게 감소시킵니다 .

Public Customer(){Public start(String a,String b){ // 로직수행

}}

프리젠테이션컴포넌트

2. 노출을 막고 숨기기1. 노출된 사례

비즈니스 컴포넌트

<HTML><%Customer c = new Customer();c.start(id , pw);%></HTML>

- Tight coupling

- 유지보수 저하

Start() 에

인자 추가시 !

Public Customer(){Public start( User a){ // 로직수행

}}

프리젠테이션컴포넌트

비즈니스 컴포넌트

<HTML><%Customer c = new Customer();User u = new User();u.setId(“aa”); u.setPw(“bb”);c.start(u);%></HTML>

- 일반적 데이터 구조로 복사후 사용

- 결합도 낮춤

Page 18: -  SW_Desing Study Group -

18 18

I. 프로젝트 개요2-3 프리젠테이션 티어 데이터 구조가 도메인 객체에 노출되는 사례

문제개요 Request 핸들링 데이터 구조를 도메인 객체와 공유하면 , 애플리케이션의 각기

다른 두 측면 사이의 결합도를 불필요하게 증가시킨다 . 해법참고

매개 변수를 넘기듯이 httpservletrequest 객체를 바로 넘기지 말고 , request객체로부터 필요 정보를 좀더 일반화된 데이터 구조로 만들어 복사

Public class Customer{ String a; String b; public Customer(HttpServletRequest request){ a = request.getParameter(“id”); b = request.getParameter(“pw”); }}

Domain Object 와 httpservletrequest 간의 강한 결합도

Domain Object 와 httpservletrequest객체 사이의 분리

Public class Customer{ String a; String b; public Customer(String id,String pw){ a = id; b = pw; }}

결합도 증가

재사용성 저하

Page 19: -  SW_Desing Study Group -

19 19

I. 프로젝트 개요2-4 같은 폼을 중복해서 전송하는 사례

문제개요 reSubmit( 중복전송 ): 폼의 재전송하는 상황 발생 (쇼핑몰 결제후 중복전송 오류 )

해법참고 동기화 토큰 도입 클라이언트 접근 제어 데자뷰 토큰 Controller

0. Token 생성1.Session 에

Key 저장

3.Submit

JSP 페이지

2.Hidden filed 에 token key값 저장

4.Token 비교

동일하면 로직수행

5. 비즈니스

로직수행 Token 이

다르면 에러발생

Page 20: -  SW_Desing Study Group -

20 20

I. 프로젝트 개요2-6 <jsp:setProperty> 가 자바빈 프로퍼티를 재설정할 것으로 잘못 추정하는 사례

문제개요 요청 매개변수의 값이 비었을때 , setProperty 스펙에 아무 동작 안하도록

되어있음 .

해법참고 여러 요청에 의해 재사용되기 때문에 , 자바빈 프로퍼티를 사용하기 전에 항상

초기화해야 합니다 .

request1

First=DanLast=Mark

Hepler Bean

First=DanLast=Mark

request2

First=Last=Bill

Hepler Bean

First=DanLast=Bill

값이 안 변함

Page 21: -  SW_Desing Study Group -

21 21

I. 프로젝트 개요2-7 팻 컨트롤러를 구현하는 사례

문제개요 하나의 컨트롤러에 너무 많은 제어코드를 추가하게 되면 , 나중에는 컨트롤러가 너무

무거워져 해당 컨트롤러를 유지보수 , 테스트 , 디버깅하기가 매우 까다로운 상태가 됩니다 .

해법참고 다른 컨트롤 클래스에 작업을 위임하는 지점이기도 합니다 . 컨트롤러는 com-

mand객체를 사용하여 제어 코드를 캡슐화합니다 . 단위 테스트보다 훨씬 용이합니다 .

Try{제어코드로직 A……제어코드로직 B……제어코드로직 C……제어코드로직 D……제어코드로직 E……

제어코드 로직으로 너무 많이 추가되어 어려워짐

Command 객체에 헬퍼에 요청을 위임한다 .

Try{

RequestHelper helper = new RequestHelper(request); Command command = helper.getCommand(); resultPage = command.execute(request, response);

}catch(Exception e){}

너무 많은

제어코드 추가

Page 22: -  SW_Desing Study Group -

22 22

I. 프로젝트 개요2-9 헬퍼를 스크립틀릿처럼 작성하는 사례

문제개요 헬퍼를 사용하면 뷰안에 넣은 자바 스크립트 코드의 양을 줄일수 있습니다 . 자바코드와 동일한 추상화 수준으로 작성한다면 , 헬퍼의 원래 목적과 는 달리

스크립트릿을 구현하는 것이나 다름없게 된다 .

해법참고 Custom tag 를 사용 ( 가독성 , 추상화 수준을 제공 ) Jsp2.0 이상 태그파일 헬퍼 사용 (JSTL 같이 사용가능 )

* Java 스크립틀릿으로 작성한 코드

요구사항 : 신용 불량 위험 고객을 리스트 하라…

Page 23: -  SW_Desing Study Group -

23 23

I. 프로젝트 개요2-9 헬퍼를 스크립틀릿처럼 작성하는 사례

• JSTL 로 작성한 코드• 장점 :• 단점 :

• 커스텀 태그로 작성한 코드• 장점 : 간소화 , 재사용• 단점 : 코드이해필요

• 태그파일 헬퍼로 작성한 코드• 장점 : 간소화 , 재사용• 단점 : 코드이해필요 ,JSP2.0 이상

이렇게사용하지마라 !

Page 24: -  SW_Desing Study Group -

24

Q&A

Page 25: -  SW_Desing Study Group -

25 25

I. 프로젝트 개요굿바이 , 게으름

게으름에서 벗어나 나를 찾는 10 가지 열쇠

1.‘하면된다’가 아니라 ‘왜 해야 하는가’를 발견하라 .2. 마음의 상태를 파악하는 또 하나의 마음을 키워라 .3.자신 안에 더 큰 존재가 있음을 믿어라 .4.긍정적이고 구체적인 질문을 하라 .5.자신의 강점과 재능에 기초하여 큰그림을 그려라 .6.운동과 휴식은 천연의 보약임을 명심하라 . 7.매일 마음을 모을 수 있는 자기 의식을 행하라 . 8.중요한 일을 우선적으로 하라 . 9.계획과 일을 소화 능력에 맞게 나눠라 . 10.매일 할가지씩 능동적 선택을 하라 .