1 / 25

- SW_Desing Study Group -

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

anoki
Download Presentation

- SW_Desing Study Group -

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 2. 프레젠테이션 티어에서 디자인 고려사항과 위험사례 - SW_Desing Study Group - 2009년 1월 18일 이진서

  2. 1. 코어 J2EE 패턴을 접하면서 • 프로젝트 개요 기술을 학습하는 것과 설계를 학습하는 것은 다릅니다. 기존의 많은 책들이 API 명세서와 같이 세부 기술을 설명하는데 있어서는 매우 훌륭했지만, "그 기술을 적용하는 통찰"을 주지는 못했습니다. 디자인을 배우는 것은 경험에서 부터 나오며, 추천 지침(Best Practice) 및 위험 사례(Bad Practice)에 대한 지식을 공유하는 데에서 나옵니다…. 애플리케이션 분할, 재사용성, 유지보수성을 향상시킨다. 2 2

  3. Table of Contents • 프리젠테이션 티어에서 디자인 고려사항 • 프리젠테이션 티어에서 위험 사례 • Q&A

  4. 2.1 Presentation Pattern을 적용할 경우 설계시 고려할 문제 • 프로젝트 개요 • Model-View-Controller • 개별 부분을 쉽게 수정할 수 있도록 웹 응용 프로그램의 사용자 인터페이스 기능을 어떻게 모듈화할 수 있습니까? • Page controller • 중복을 피하면서 재사용성 및 유연성을 얻을 수 있도록 적정 수준으로 복잡한 웹 응용 프로그램에 대한 컨트롤러를 어떻게 가장 잘 구성할 수 있습니까? • Front controller • 코드 중복을 피하면서 재사용성 및 유연성을 얻을 수 있도록 매우 복잡한 웹 응용 프로그램에 대한 컨트롤러를 어떻게 가장 잘 구성할 수 있습니까? • Intercepter filter • 웹 페이지 요청 전후에 일반적인 사전 및 사후 처리 단계를 어떻게 구현할 수 있습니까? * 반드시 고려해야 하는 4가지 요소 • 보안 (Security) • 데이터 무결성(data integrity) • 관리 용이성(manageability) • 확장성(scalability) 4

  5. 1-1 세션 관리 • 프로젝트 개요 • User session이란? • Client와 Server 사이에 여러 Request들이 오가는 지속적인 대화 5 5

  6. 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

  7. 1-2 클라이언트 접근 제어 • 프로젝트 개요 특정 클라이언트가 app 리소스에 접근하지 못하게 통제하는 이유? • 첫번째는 클라이언트 접근을 제한하거나 통제하는 시나리오 • Delegation point – • All-or-nothing • 특정부분 숨기기 • 설정에 의한 감시 • 단순하며 일반적인 설정을 사용한 리소스 감시 • 두번째는 사용자의 진행을 제어하는 시나리오 • Synchronisertoken 7 7

  8. 1-3 유효성 검사 • 프로젝트 개요 Client와 Server 양쪽에서 모두 수행하는 것이 바람직합니다. 필수적으로 재사용성(reuse) 와 모듈화(modularity)라는 문제를 반드시 고민 • Client에서 유효성 검사 • JavaScript와 같은 내장 스크립트 • Server에서 유효성 검사 • 폼 중심의 유효성검사(form-centric validation) • 추상 타입 기반 유효성검사(validation based on abstract types) • 장점:유연성,재사용성,유지보수용이성 • 단점:일반화로 인해 효율성과 성능이 저하 (이해하기 어려워 유지보수 힘들어짐) function validate(){ var thisYear = document.myform.thisYear.value; if (CheckStr(thisYear, " ", "")==0 || CheckStr(thisYear, "&nbsp;", "")==0) { alert("연도를 입력해 주세요"); return false; } Public Vector validate(){ Vector errorCollection = new Vector(); If(firstname == null) || (firstname.trim().length() < 1) errorCollection.addElement(“error!”); } Validator.getInstance().validate(firstNameString, formFieldName) 8 8

  9. 1-4 헬퍼 프로퍼티 – 무결성 및 일관성 • 프로젝트 개요 • 자바빈 헬퍼 클래스는 클라이언트 요청과 함께 넘길때 중간에서 상태를 저장하는 역활 9 9

  10. Table of Contents • 프리젠테이션 티어에서 디자인 고려사항 • 프리젠테이션 티어에서 위험 사례 • Q&A

  11. JSP페이지 JSP페이지 JSP페이지 JSP페이지 JSP페이지 JSP페이지 JSP페이지 접근제어로직 접근제어로직 접근제어로직 접근제어로직 접근제어로직 접근제어로직 접근제어로직 2-1 제어 코드가 여러 뷰에 존재하는 사례 • 프로젝트 개요 • 문제 개요 • 페이지 접근권한 로직을 수정하라. • 1000…개의 JSP 안에 접근제어 로직이 포함되어있음. 언제 다바꾸지? ㅜㅜ 11 11

  12. 2-1 제어 코드가 여러 뷰에 존재하는 사례 • 프로젝트 개요 • 해법 참고 • 컨트롤러 도입 • 각기 다른 로직을 지역화하기 • Front Controller패턴에서 Command and Controller전략 • View Helper패턴 • 뷰감시 • 컨트롤에서 판단해서 JSP로 forward • Fat Controller 위험 JSP페이지 Controller 컨트롤Logic 컨트롤 Logic 포멧Logic 1.Helper 클래스에 위임하기 Helper Controller JSP페이지 포멧 Logic 컨트롤Logic JSP페이지 포멧 Logic 12 12

  13. 2-1 제어 코드가 여러 뷰에 존재하는 사례 • 프로젝트 개요 • 해법 참고 • 컨트롤러 도입 • 각기 다른 로직을 지역화하기 • Front Controller패턴에서 Command and Controller전략 • View Helper패턴 • 뷰감시 JSP페이지 1.로직을 뒤로보내기(Factor Back): Helper로 작업위임하기 Helper AClass jsp 비즈니스로직A 비즈니스 로직 Helper BClass 비즈니스로직B 비즈니스로직C Helper CClass 13 13

  14. 2-1 제어 코드가 여러 뷰에 존재하는 사례 • 프로젝트 개요 • 해법 참고 • 컨트롤러 도입 • 각기 다른 로직을 지역화하기 • Front Controller패턴에서 Command and Controller전략 • View Helper패턴 • 뷰감시 JSP페이지 1.로직을 앞으로보내기(Factor Forward): 컨트롤러 도입 Helper AClass Controller Helper BClass 비즈니스 로직 비즈니스로직A 비즈니스로직B Helper CClass 컨트롤Logic 비즈니스로직C jsp 14 14

  15. 2-1 제어 코드가 여러 뷰에 존재하는 사례 • 프로젝트 개요 • 해법 참고 • 컨트롤러 도입 • 각기 다른 로직을 지역화하기 • Front Controller패턴에서 Command and Controller전략 • View Helper패턴 • 뷰감시 1단계.View 준비 :요청이 오면 로직처리,데어터획득후 뷰로 dispatch 과정 2단계. View 생성 : 해당뷰에 필요한 데이터로 화면구성을 함 JavaBean Helper controller jsp 최종 화면구성 jsp Request Data access Page dispatch Custom Tag Helper JSTL Tag File Helper 15 15

  16. 2-1 제어 코드가 여러 뷰에 존재하는 사례 • 프로젝트 개요 • 해법 참고 • 컨트롤러 도입 • 각기 다른 로직을 지역화하기 • Front Controller패턴에서 Command and Controller전략 • View Helper패턴 • 뷰감시 1.뷰에 all-or-nothing 감시자 넣기 2. 사용자의 역할에 따라 뷰의 특정부분 숨기기 jsp jsp <%@ tablib uri=“WEB-INF/corj2eetaglibrary.tld” prefix=“corePatterns’ %> <HTML> … <corePatterns:guard role=‘manager’> <b> 매지저만 볼수있어요</b> </corePatterns:guard> … </HTML> <%@ tablib uri=“WEB-INF/corj2eetaglibrary.tld” prefix=“corePatterns’ %> <corePatterns:guard/> <HTML> … </HTML> 16 16

  17. 2-2 프리젠테이션 티어 데이터 구조가 비즈니스 티어에 노출되는 사례 • 프로젝트 개요 • 문제개요 • 프리젠테이션 티어 데이터 구조를 비즈니스 티어 혹은 그밖에 다른 티어와 공유하면, 티어 사이에 결합도를 심화시킬 뿐만 아니라 해당 서비스의 재사용성을 심각하게 감소시킵니다. 1.노출된 사례 2.노출을 막고 숨기기 Start()에 인자 추가시! 프리젠테이션컴포넌트 프리젠테이션컴포넌트 <HTML> <% Customer c = new Customer(); User u = new User(); u.setId(“aa”); u.setPw(“bb”); c.start(u); %> </HTML> <HTML> <% Customer c = new Customer(); c.start(id , pw); %> </HTML> • 일반적 데이터 구조로 복사후 사용 • 결합도 낮춤 • Tight coupling • 유지보수 저하 비즈니스 컴포넌트 비즈니스 컴포넌트 • Public Customer(){ • Public start(String a,String b){ • // 로직수행 • } • } • Public Customer(){ • Public start( User a){ • // 로직수행 • } • } 17 17

  18. 2-3 프리젠테이션 티어 데이터 구조가 도메인 객체에 노출되는 사례 • 프로젝트 개요 • 문제개요 • Request 핸들링 데이터 구조를 도메인 객체와 공유하면, 애플리케이션의 각기 다른 두 측면 사이의 결합도를 불필요하게 증가시킨다. • 해법참고 • 매개 변수를 넘기듯이 httpservletrequest 객체를 바로 넘기지 말고, request객체로부터 필요 정보를 좀더 일반화된 데이터 구조로 만들어 복사 Domain Object와 httpservletrequest간의 강한 결합도 Domain Object와 httpservletrequest객체 사이의 분리 결합도 증가 재사용성 저하 Public class Customer{ String a; String b; public Customer(HttpServletRequest request){ a = request.getParameter(“id”); b = request.getParameter(“pw”); } } Public class Customer{ String a; String b; public Customer(String id,String pw){ a = id; b = pw; } } 18 18

  19. 2-4 같은 폼을 중복해서 전송하는 사례 • 프로젝트 개요 • 문제개요 • reSubmit(중복전송): 폼의 재전송하는 상황 발생 (쇼핑몰 결제후 중복전송 오류) • 해법참고 • 동기화 토큰 도입 • 클라이언트 접근 제어 • 데자뷰 토큰 JSP페이지 Controller 0. Token 생성 1.Session에 Key 저장 2.Hidden filed에 token key값 저장 4.Token비교 동일하면 로직수행 3.Submit 5.비즈니스 로직수행 Token이 다르면 에러발생 19 19

  20. 2-6 <jsp:setProperty>가 자바빈 프로퍼티를 재설정할 것으로 잘못 추정하는 사례 • 프로젝트 개요 • 문제개요 • 요청 매개변수의 값이 비었을때, setProperty 스펙에 아무 동작 안하도록 되어있음. • 해법참고 • 여러 요청에 의해 재사용되기 때문에,자바빈 프로퍼티를 사용하기 전에 항상 초기화해야 합니다. Hepler Bean request1 First=Dan Last=Mark First=Dan Last=Mark Hepler Bean request2 값이 안 변함 First=Dan Last=Bill First= Last=Bill 20 20

  21. 2-7 팻 컨트롤러를 구현하는 사례 • 프로젝트 개요 • 문제개요 • 하나의 컨트롤러에 너무 많은 제어코드를 추가하게 되면, 나중에는 컨트롤러가 너무 무거워져 해당 컨트롤러를 유지보수,테스트,디버깅하기가 매우 까다로운 상태가 됩니다. • 해법참고 • 다른 컨트롤 클래스에 작업을 위임하는 지점이기도 합니다. 컨트롤러는 command객체를 사용하여 제어 코드를 캡슐화합니다. 단위 테스트보다 훨씬 용이합니다. Command 객체에 헬퍼에 요청을 위임한다. 제어코드 로직으로 너무 많이 추가되어 어려워짐 Try{ RequestHelper helper = new RequestHelper(request); Command command = helper.getCommand(); resultPage = command.execute(request, response); }catch(Exception e){ } Try{ 제어코드로직A …… 제어코드로직B …… 제어코드로직C …… 제어코드로직D …… 제어코드로직E …… 너무 많은 제어코드 추가 21 21

  22. 2-9 헬퍼를 스크립틀릿처럼 작성하는 사례 • 프로젝트 개요 • 문제개요 • 헬퍼를 사용하면 뷰안에 넣은 자바 스크립트 코드의 양을 줄일수 있습니다. • 자바코드와 동일한 추상화 수준으로 작성한다면, 헬퍼의 원래 목적과 는 달리 스크립트릿을 구현하는 것이나 다름없게 된다. • 해법참고 • Custom tag를 사용 (가독성, 추상화 수준을 제공) • Jsp2.0이상 태그파일 헬퍼 사용(JSTL 같이 사용가능) 요구사항: 신용 불량 위험 고객을 리스트 하라… * Java 스크립틀릿으로 작성한 코드 22 22

  23. 2-9 헬퍼를 스크립틀릿처럼 작성하는 사례 • 프로젝트 개요 • JSTL로 작성한 코드 • 장점: • 단점: 이렇게사용하지마라! • 커스텀 태그로 작성한 코드 • 장점: 간소화,재사용 • 단점: 코드이해필요 • 태그파일 헬퍼로 작성한 코드 • 장점:간소화,재사용 • 단점:코드이해필요,JSP2.0이상 23 23

  24. Q&A

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

More Related