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

Download Report

Transcript 프로젝트 개요 2-1 제어 코드가 여러 뷰에 존재하는 사례 해법 참고

2. 프레젠테이션 티어에서 디자인 고려사항과 위험사례
- SW_Desing Study Group -
2009년 1월 18일
이진서
I. 프로젝트 개요
1. 코어 J2EE 패턴을 접하면서
기술을 학습하는 것과 설계를 학습하는 것은 다릅니다.
기존의 많은 책들이 API 명세서와 같이 세부 기술을 설명하는데 있어서는
매우 훌륭했지만, "그 기술을 적용하는 통찰"을 주지는 못했습니다.
디자인을 배우는 것은 경험에서 부터 나오며,
추천 지침(Best Practice) 및 위험 사례(Bad Practice)에 대한 지식을 공유하는 데에서
나옵니다….
애플리케이션 분할, 재사용성, 유지보수성을 향상시킨다.
2
2
Table of Contents
I.
프리젠테이션 티어에서 디자인 고려사항
II.
프리젠테이션 티어에서 위험 사례
III.
Q&A
3
2.1 Presentation Pattern을 적용할 경우 설계시 고려할 문제

Model-View-Controller


중복을 피하면서 재사용성 및 유연성을 얻을 수 있도록 적정 수준으로 복잡한 웹 응용 프로그램에 대한 컨트롤러를 어떻게 가장 잘 구성할
수 있습니까?
Front controller


개별 부분을 쉽게 수정할 수 있도록 웹 응용 프로그램의 사용자 인터페이스 기능을 어떻게 모듈화할 수 있습니까?
Page controller


I. 프로젝트 개요
코드 중복을 피하면서 재사용성 및 유연성을 얻을 수 있도록 매우 복잡한 웹 응용 프로그램에 대한 컨트롤러를 어떻게 가장 잘 구성할 수
있습니까?
Intercepter filter

웹 페이지 요청 전후에 일반적인 사전 및 사후 처리 단계를 어떻게 구현할 수 있습니까?
* 반드시 고려해야 하는 4가지 요소




보안 (Security)
데이터 무결성(data integrity)
관리 용이성(manageability)
확장성(scalability)
4
4
I. 프로젝트 개요
1-1 세션 관리

User session이란?

Client와 Server 사이에 여러 Request들이 오가는 지속적인 대화
5
5
I. 프로젝트 개요
1-1 세션 관리

Client에 저장되는 세션
 상대적으로 구현 쉽다
 저장할 정보가 작은 경우(크면 성능저하)
 HTTP 쿠키
 POST방식(HTML hidden field) – HTML안에 text로 노출
 GET방식(URL에 직접포함) – URL 노출
 Client에 session 상태가 노출되는 보안문제 – 암호화 필요성

Server에 저장되는 세션
 세션상태를 서버에 저장
 요청시 특정 사용자를 동일서버로 보내도록 처리(Resonate – traffic management)
 세션상태를 Bussiness Tier에 저장 - EJB
 세션상태를 Resource Tier에 저장 – RDBMS(관계형데이터베이스)
 Session ID를 이용하여 세션 상태 저장
 Session Timeout 초과
 Invalidate(무효화)
 해당 Session 삭제
6
6
I. 프로젝트 개요
1-2 클라이언트 접근 제어
특정 클라이언트가 app 리소스에 접근하지 못하게 통제하는 이유?

첫번째는 클라이언트 접근을 제한하거나 통제하는 시나리오
 Delegation point –
 All-or-nothing
 특정부분 숨기기
 설정에 의한 감시
 단순하며 일반적인 설정을 사용한 리소스 감시

두번째는 사용자의 진행을 제어하는 시나리오
 Synchroniser token
7
7
I. 프로젝트 개요
1-3 유효성 검사
Client와 Server 양쪽에서 모두 수행하는 것이 바람직합니다.
필수적으로 재사용성(reuse) 와 모듈화(modularity)라는 문제를 반드시 고민

Client에서 유효성 검사
 JavaScript와 같은 내장 스크립트
function validate(){
var thisYear = document.myform.thisYear.value;
if (CheckStr(thisYear, " ", "")==0 || CheckStr(thisYear, " ", "")==0) {
alert("연도를 입력해 주세요");
return false;
}

Server에서 유효성 검사
 폼 중심의 유효성검사(form-centric validation)
Public Vector validate(){
Vector errorCollection = new Vector();
If(firstname == null) || (firstname.trim().length() < 1) errorCollection.addElement(“error!”);
}

추상 타입 기반 유효성검사(validation based on abstract types)
 장점:유연성,재사용성,유지보수용이성
 단점:일반화로 인해 효율성과 성능이 저하 (이해하기 어려워 유지보수 힘들어짐)
Validator.getInstance().validate(firstNameString, formFieldName)
8
8
I. 프로젝트 개요
1-4 헬퍼 프로퍼티 – 무결성 및 일관성

자바빈 헬퍼 클래스는 클라이언트 요청과 함께 넘길때 중간에서 상태를 저장하는 역활
9
9
Table of Contents
I.
프리젠테이션 티어에서 디자인 고려사항
II.
프리젠테이션 티어에서 위험 사례
III.
Q&A
10
I. 프로젝트 개요
2-1 제어 코드가 여러 뷰에 존재하는 사례

문제 개요
 페이지 접근권한 로직을 수정하라.
 1000…개의 JSP 안에 접근제어 로직이 포함되어있음.
언제
다바꾸지?
ㅜㅜ
JSP페이지
JSP페이지
JSP페이지
접근제어로직
JSP페이지
접근제어로직
JSP페이지
접근제어로직
JSP페이지
접근제어로직
JSP페이지
접근제어로직
접근제어로직
접근제어로직
11
11
I. 프로젝트 개요
2-1 제어 코드가 여러 뷰에 존재하는 사례

해법 참고
 컨트롤러 도입
 각기 다른 로직을 지역화하기
 Front Controller패턴에서 Command and Controller전략
 View Helper패턴
 뷰감시
1. 컨트롤에서 판단해서 JSP로 forward
2. Fat Controller 위험
JSP페이지
Controller 컨트롤Logic
컨트롤 Logic
포멧Logic
1.Helper 클래스에 위임하기
Helper Controller
컨트롤Logic
JSP페이지
포멧 Logic
JSP페이지
포멧 Logic
12
12
I. 프로젝트 개요
2-1 제어 코드가 여러 뷰에 존재하는 사례

해법 참고
 컨트롤러 도입
 각기 다른 로직을 지역화하기
 Front Controller패턴에서 Command and Controller전략
 View Helper패턴
 뷰감시
JSP페이지
1.로직을 뒤로보내기(Factor Back): Helper로 작업위임하기
Helper AClass
비즈니스로직A
jsp
비즈니스로직B
Helper BClass
비즈니스
로직
비즈니스로직C
Helper CClass
13
13
I. 프로젝트 개요
2-1 제어 코드가 여러 뷰에 존재하는 사례

해법 참고
 컨트롤러 도입
 각기 다른 로직을 지역화하기
 Front Controller패턴에서 Command and Controller전략
 View Helper패턴
 뷰감시
JSP페이지
1.로직을 앞으로보내기(Factor Forward): 컨트롤러 도입
Helper AClass
Helper BClass
비즈니스로직A
Controller
비즈니스로직B
컨트롤Logic
비즈니스로직C
Helper CClass
비즈니스
로직
jsp
14
14
I. 프로젝트 개요
2-1 제어 코드가 여러 뷰에 존재하는 사례

해법 참고
 컨트롤러 도입
 각기 다른 로직을 지역화하기
 Front Controller패턴에서 Command and Controller전략
 View Helper패턴
 뷰감시
1단계.View 준비 :요청이 오면 로직처리,데어터획득후 뷰로 dispatch 과정
2단계. View 생성 : 해당뷰에 필요한 데이터로 화면구성을 함
JavaBean
controller
Helper
Request
jsp
Data access
Page dispatch
Custom Tag
최종 화면구성
Helper
jsp
JSTL Tag File
Helper
15
15
I. 프로젝트 개요
2-1 제어 코드가 여러 뷰에 존재하는 사례

해법 참고
 컨트롤러 도입
 각기 다른 로직을 지역화하기
 Front Controller패턴에서 Command and Controller전략
 View Helper패턴
 뷰감시
1.뷰에 all-or-nothing 감시자 넣기
2. 사용자의 역할에 따라 뷰의 특정부분 숨기기
jsp
jsp
<%@ tablib uri=“WEB-INF/corj2eetaglibrary.tld”
<%@ tablib uri=“WEB-INF/corj2eetaglibrary.tld”
prefix=“corePatterns’ %>
prefix=“corePatterns’ %>
<HTML>
…
<corePatterns:guard/>
<corePatterns:guard role=‘manager’>
<HTML>
<b> 매지저만 볼수있어요</b>
…
</corePatterns:guard>
</HTML>
…
</HTML>
16
16
I. 프로젝트 개요
2-2 프리젠테이션 티어 데이터 구조가 비즈니스 티어에 노출되는 사례

문제개요
 프리젠테이션 티어 데이터 구조를 비즈니스 티어 혹은 그밖에 다른 티어와 공유하면,
티어 사이에 결합도를 심화시킬 뿐만 아니라 해당 서비스의 재사용성을 심각하게 감
소시킵니다.
1.노출된 사례
2.노출을 막고 숨기기
프리젠테이션컴포넌트
프리젠테이션컴포넌트
Start()에
<HTML>
인자 추가시!
<%
<HTML>
Customer c = new Customer();
<%
Customer c = new Customer();
c.start(id , pw);
-Tight coupling
User u = new User();
-일반적 데이터
구조로 복사후 사용
-유지보수 저하
u.setId(“aa”); u.setPw(“bb”);
-결합도 낮춤
c.start(u);
%>
%>
</HTML>
</HTML>
비즈니스 컴포넌트
비즈니스 컴포넌트
Public Customer(){
Public Customer(){
Public start(String a,String b){
Public start( User a){
// 로직수행
// 로직수행
}
}
}
}
17
17
2-3 프리젠테이션 티어 데이터 구조가 도메인 객체에 노출되는 사례 I. 프로젝트 개요


문제개요
 Request 핸들링 데이터 구조를 도메인 객체와 공유하면, 애플리케이션의 각기 다른
두 측면 사이의 결합도를 불필요하게 증가시킨다.
해법참고
 매개 변수를 넘기듯이 httpservletrequest 객체를 바로 넘기지 말고, request객체로부
터 필요 정보를 좀더 일반화된 데이터 구조로 만들어 복사
Domain Object와 httpservletrequest간의 강한 결합도
Public class Customer{
String a;
Domain Object와 httpservletrequest객체 사이의 분리
결합도 증가
재사용성 저하
Public class Customer{
String a;
String b;
String b;
public Customer(HttpServletRequest request){
public Customer(String id,String pw){
a = request.getParameter(“id”);
a = id;
b = request.getParameter(“pw”);
b = pw;
}
}
}
}
18
18
I. 프로젝트 개요
2-4 같은 폼을 중복해서 전송하는 사례

문제개요
 reSubmit(중복전송): 폼의 재전송하는 상황 발생 (쇼핑몰 결제후 중복전송 오류)

해법참고
 동기화 토큰 도입
 클라이언트 접근 제어
 데자뷰 토큰
JSP페이지
Controller
1.Session에
Key 저장
0. Token 생성
2.Hidden filed에
token key값 저장
4.Token비교
동일하면
로직수행
3.Submit
5.비즈니스
로직수행
Token이
다르면 에러발생
19
19
I. 프로젝트
개요
2-6 <jsp:setProperty>가 자바빈 프로퍼티를 재설정할 것으로 잘못 추정하는
사례

문제개요
 요청 매개변수의 값이 비었을때, setProperty 스펙에 아무 동작 안하도록 되어있음.

해법참고
 여러 요청에 의해 재사용되기 때문에,자바빈 프로퍼티를 사용하기 전에 항상 초기화
해야 합니다.
Hepler Bean
request1
First=Dan
First=Dan
Last=Mark
Last=Mark
request2
Hepler Bean
First=
값이 안 변함
First=Dan
Last=Bill
Last=Bill
20
20
I. 프로젝트 개요
2-7 팻 컨트롤러를 구현하는 사례

문제개요
 하나의 컨트롤러에 너무 많은 제어코드를 추가하게 되면, 나중에는 컨트롤러가 너무
무거워져 해당 컨트롤러를 유지보수,테스트,디버깅하기가 매우 까다로운 상태가 됩
니다.

해법참고
 다른 컨트롤 클래스에 작업을 위임하는 지점이기도 합니다. 컨트롤러는 command객
체를 사용하여 제어 코드를 캡슐화합니다. 단위 테스트보다 훨씬 용이합니다.
Command 객체에 헬퍼에 요청을 위임한다.
제어코드 로직으로 너무 많이 추가되어 어려워짐
Try{
Try{
제어코드로직A
……
제어코드로직B
RequestHelper helper = new RequestHelper(request);
……
Command command = helper.getCommand();
제어코드로직C
resultPage = command.execute(request, response);
……
제어코드로직D
……
너무 많은
제어코드 추가
제어코드로직E
}catch(Exception e){
}
……
21
21
2-9 헬퍼를 스크립틀릿처럼 작성하는 사례
I. 프로젝트 개요

문제개요
 헬퍼를 사용하면 뷰안에 넣은 자바 스크립트 코드의 양을 줄일수 있습니다.
 자바코드와 동일한 추상화 수준으로 작성한다면, 헬퍼의 원래 목적과 는 달리 스크립
트릿을 구현하는 것이나 다름없게 된다.

해법참고
 Custom tag를 사용 (가독성, 추상화 수준을 제공)
 Jsp2.0이상 태그파일 헬퍼 사용(JSTL 같이 사용가능)
요구사항: 신용 불량 위험 고객을 리스트 하라…
* Java 스크립틀릿으로 작성한 코드
22
22
2-9 헬퍼를 스크립틀릿처럼 작성하는 사례
I. 프로젝트 개요
•JSTL로 작성한 코드
•장점:
•단점:
이렇게사용하지마라!
•커스텀 태그로 작성한 코드
•장점: 간소화,재사용
•단점: 코드이해필요
•태그파일 헬퍼로 작성한 코드
•장점:간소화,재사용
•단점:코드이해필요,JSP2.0이상
23
23
Q&A
24
I. 프로젝트 개요
굿바이, 게으름
게으름에서 벗어나 나를 찾는 10가지 열쇠
1.‘하면된다’가 아니라 ‘왜 해야 하는가’를 발견하라.
2. 마음의 상태를 파악하는 또 하나의 마음을 키워라.
3.자신 안에 더 큰 존재가 있음을 믿어라.
4.긍정적이고 구체적인 질문을 하라.
5.자신의 강점과 재능에 기초하여 큰그림을 그려라.
6.운동과 휴식은 천연의 보약임을 명심하라.
7.매일 마음을 모을 수 있는 자기 의식을 행하라.
8.중요한 일을 우선적으로 하라.
9.계획과 일을 소화 능력에 맞게 나눠라.
10.매일 할가지씩 능동적 선택을 하라.
25
25