월요일, 12월 23
Shadow

미분류

#044 패턴과 스트럿츠

미분류
엔트프아이즈 디자인 패턴 성능과 다수의 "~성" 가장 중요한 3가지 비기능적인 요구사항 입니다. 1. 성능 2. 모듈화 3. 유연성, 유지보수성, 확장성 우선 용어부터 정의하죠 ㅇ 인터페이스를 사용하라 인터페이스란 두 객체간의 일종의 계약이라고 말할수 있습니다. 하나의 ㅋ르래스가 어떤 인터페이스를 구현했다면 다음과 같은 의미가 있죠 내가 만든 객체는 당신이 하는 얘기를 이해할수 있어요. 인터페이스가 가지는 또 하나 장점으로 다형성을 들수 있습니다. 다수의 클래스가 한개의 인터페이스를 동시에 구현한 경우 동일 인터페이스라면 어떤 클래스도 호출할수 있지요 예를들어 웹 컨테이너는 Servlet 인터페이스를 구현한 어떤 컴포넌트도 사용할수 있는 것처럼요 ㅇ관심영역의 분리 및 응집성 소프트웨어의 특정 기능만 특화시켜 컴포넌트화 하면 개발하기도 쉽고 유지보수 하기 편하며, 재사용성도 높일수 있지요 고나심 영역을 분리하게 되면 자연스럽게 응집도는 높아지기 마련이죠 응집도란 하나의 클래스가 하나의 단위 작업 목적에 얼마나 충실한가 하는정도를 나타냅니다. ㅇ복잡성을 숨겨라 복잡성을 숨긴다는것 관심 영역의 분리는 사실 같은 문제기도 합니다. 예를 들어 시스템이 검색 서비스를 사용해야 하는 경우, 실제 구현 부분을 하나의 컴포넌트로 구현하여 다른 모든 컴포넌트들이 이를 사용하게 하는 방식이 최선일겁니다. 디자인 원식, 이어서 느슨한 결합도 객체지향 시스템은 그 본성상 객체 간 대화로 이루어져 있습니다. 이 대화에 인터페이스를 이요하면 두개의 클래스가 서로 대화하기 위하여 서로간의 알아...

#043 필터와 랩퍼

미분류
막강 필터 전체 웹 애플리케이션 기능을 확장해보자 다양한 유스케이스가 산재한 시스템에서 그 기능을 확장해야 하는 경우가 더러있죠 필터를 한번 써보는 건 어떨까? 필터는 그냥 자바 컴포넌트 입니다. 서블릿과 비슷하죠 필터로 처리하면 좋은것들 Request 필터 : ㅇ 보안 관련 내용을 체크합니다. ㅇ 요청헤더와 바디 포맷팅을 수정합니다. ㅇ 요청을 감시하건 기록으로 남깁니다. Response 필터 : ㅇ 응답 스트림을 압축합니다. ㅇ 응답 스트림에 내용을 추가하거나 수정합니다. ㅇ 완전히 다른 새로운 응답을 만듭니다. 필터는 모듈식으로 DD에 설정합니다. 필터는 체인속으로 이것 다음에 저것을 실행하세요 같이 연결해서 사용할수 있습니다. 필터는 그 자체로 하나의 오나전한 컴포넌트 입니다. DD 설정 1 DD를 사용해서 다음과 같이 컨테이너한테 지시 할수 있죠. 이 URL에 대한 요청이 들어오면 필터1, 필터7, 필터3을 차례대로 실해아고 마지막으로 요청한 서블릿을 실행하세요 DD 설정 2 DD 서정을 조금만 바꾸면, 순서를 바꾼다든지, 필요없는 필터를 제거한다든지 하는 적업을 쉽게 할수 있죠. 이 URL에 대한 요청이 들어오면 필터3, 필터 7을 실행하고 곧바로 요청한 서블릿을 실행하도록 필터가 서블릿하고 비슷한 3가지 이유 1. 컨테이너가 이들의 API를 알고 있습니다. 2. 컨테이너가 생명주기를 관리합니다. 3. DD에 설정합니다. 누가 요청을 날렸는지 기록하는 필터를 만들어 봅시다. package com.example.web; ...

#042 웹 애플리케이션 보안

미분류
비밀스럽게, 안전하게 콜치아픈 녀석들은 어디에도 있는법... 웹 애플리케이션 개발자라면 웹 사이트를 보호할 의무가 있습니다. 다음 세가지 유형의 해커들을 경계해야 합니다. 임퍼스네이터 : 마치 자신을 다른사람인양 속이는 녀석 업그레이더 : 자신의 등급을 속이는 녀석 이즈드롭퍼 : 중요한 정보를 몰래 훔쳐보는 녀석 서블릿 보안의 4요소 임퍼스네이터, 업그레이더, 이즈드롭퍼 녀석들 때문에 곤경에 처한 웹 사이트를 구할 방법은 서블릿 보안 밖엔 없습니다. 서블릿 스펙에서는 서블릿 보안을 다음의 4가지 개념으로 압축하여 다릅니다. : 인증, 인가, 비밃보장, 데이터 무결성 1. 인증 : 임퍼스네이터 계획을 차단하기 위하여 2. 인가 : 업그렝더 계획을 차단하기 위하여 3.비밀보장, 데이터 무결성 : 이즈드롭퍼 계획을 차단하기 위하여 HTTP환경에서 어떻게 인증하는가: 드랜잭션 보안 기초과정 HTTP관점에서 보면.. 1. 브라우저가 제일 먼저 update.jsp를 요청합니다. 2. update.jsp는 제약조건이 걸린 자원임을 알아차린 컨테이너는 3. HTTP 401(Unauthorized)응답을 보냅니다. 여기에는 www-인증헤더와 보안영역 정보가 들어있습니다. 4. 401 코드를 받아본 브라우저, 보안영역 정보에 기초하여 사용자 이름과 패스워드가 들어있지요. 5. 다시한번 update.jsp를 요청합니다. 하지만 이번 요청엔 보안 관련 HTTP 헤더에 사용자 이름과 패스워드가 들어있지요 6. 사용자 이름과 패스워드가 일치하는지 체크한다음, 맞다면 사용할수 있는 권한을 인가...

#041 웹 애플리케이션 배포

미분류
웹 애플리케이션을 배포해보자 배포는 즐거워라 1. 웹애플리케이션은 어디에 개발한 것을 저장하나요? 2. 컨테이너는 웹 애플리케이션 어디에서 어떤 자원을 찾을까요? 3. 웹 애플리케이션 컨텐츠를 어떻게 요청하면 되나요? 어떤 녀석이 어디에 있어야 하나요? 태그 파일은 /WEB-INF/tags 또는 그 하위 디렉토리에 JAR로 배포한 경우 /META-INF/tags 또는 그 하위 디렉토리에 배포 해야 한다등 여기 아닌 다른곳에 태그 파일을 배포하면, 컨테이너는 그냥 무시해버리거나, 정적인 컨텐츠로 서비스 해버리니 조심해야 합니다. WAR 파일 WAR 파일은 우베 애플리케이션 구조에 대한 이식성이 좋으며, 압축된 스냅샷이라고 보면 됩니다. 젠체 웹 애플리케이션 디렉토리를 jar로 압축하여 확장자를 .war로 바꾼 것입니다. 이렇게 했을 경우 한 가지 문제가 있는데, 컨테이너가 어떻게 웹 애플리케이션의 컨텍스트 즉 이름을 아냐는 거죠 이름을 추출하는 방법은 컨테이너에 따라 다릅니다.톰켓의 경우, WAR파일 이름이 웹 애플리케이션 이름이 됩니다. WAR파일의 경우 /META-INF?MANIFEST.MF 파일에 라이브러리 의존성을 작성두면, 배포시 컨테이너가 애플리케이션을 실행하기 위해 필요한 라이브러리가 있는지 사전 체크할수 있습니다. 따라서 웹 애플리케이션을 배포하고  난 다음 실행해보니 무슨 무슨 라이브러리가 없어 실행이 안되더라와 같이 늦게 후회하는 경우는 없죠 서블릿 매핑은 실제로는 존재하지 않는 지어낸 것입니다. 1. 정확히 읆까지 일치하는것 <url-pa...

#040 사용자 정의 태그 개발

미분류
JSTL 만으로 만족스럽지 않을때 <jsp:include>와 <c:import>로 코드가 엉망일수 있습니다. 태그파일:include 철머 행동하지만, 좀더 개선된 방식 1. 포함할 파일(Header.jsp)을 복사해서 확장자를 .tag로 바꿉니다. <img src="images/web-services.jpg"><br> 2. "WEB-INF" 밑에 tags 디렉토리를 새로 만들고 여기에 태그파일 (Header.tag)을 옮깁니다. 3. 태그 파일을 호출할 JSP를 만들고 taglib 지시자를 아래와 같이 작성합니다. <%@ taglib prefix="myTags" tagdi"/WEB-INF/tags" %> <html><body> <myTags:Header/> </body></html> 파라미터를 보낼 방법은 있습니까? <jsp:include>를 사용해서 파일을 포함할때 포함할 파일에 정보를 제공하기 위하여 <jsp:param 태그를 사용했었죠 복습삼아<jsp:incldue>가 어떻게작동하는지 다시 한번 짚어보도록 하죠 <strong>${param.subTitle}</strong> 이전방식 : <jsp:include>, <jsp:param>코드 <jsp:include apge="header.jsp"> <jsp:param name="subTitle" value=yes we can...

#029 JSTL 사용하기

미분류
막강 커스텀 태그 <c:forEach> JSTL의 <c:forEach> 태그를 사용하면 배열과 컬렉션 데이터를 루프로 돌리는 작업을 간단히 처리할수 있다. JSP 코드 <% taglib prefix="c" urihttp://java.sun.com/jsp/jstl/core %> <html> <body> <strong> movie list : </strong> <br> <table> <c:forEach var ="movie" items ="${movieList}"> <tr> <td> ${movie}</td> </tr> </c:forEach> </table> </body> </html> <c:forEach>태그 <c:forEach var ="movie" items="${movieList}"> ${movie} </c:forEach> //같은 의미 String[] items = (String[]) request.getAttribute("movieList"); for(int i = 0; i< items.length; i++){ String movie = items[i]; out.println(movie); } varStatus 속성으로 루핑횟수 알기 <table> <c:forEach var="movie"...

#028 스크립트가 없는 JSP

미분류
스크립트가 없는 페이지 속성이 string이 아니라 person 객체가 인스턴스라면? 서블릿 코드 foo.Person p = new foo.person(); p.setName("evam"); request.setAttribute("person", "p); JSP코드 : <html> <body> Person is : <%= request.getAttribute("person:) %> </body> </html> 표준 액션을 사용하려면 <html> <body> <jsp:useBean id ="person" scope ="request" /> Person created by servlet : <jsp:getProperty name ="person" property ="name" /> </body> </html> <jsp:useBean>은 객체를 생성하기까지 합니다. <jsp:useBean id ="person" scope="request" /> _jspService() 메소드 내에 다음과 같은 코드로 바뀝니다. foo.Person person = null; synchronied(request){ person=(foo.Person)_jspx_page_context.getAttribute("person", pageContext.REQUEST_SCOPE); if(person ==null){ person = n...

#027 JSP를 사용해 보자

미분류
1. JSP가 되어 보자 그리하여 JSP는 서블릿이 되었더라 컨테이너가 서블릿을 작성하는 과정은 먼저 여러분이 작성한 JSP파일을 서블릿 소스코드 파일로 바꾼뒤, 서블릿 클래스로 컴파일 합니다. 돌아왔든 바로왔든 결국은 서블릿이 됩니다. 스크립틀릿 코드 <% out.println(Counter.getCount()); %> 표현식 코드 <%= Conter.getCounter() %> 변수, 메소드 선언문 <%! int count=0; %> <%! int doubleCunt(); %> -> JSP 선언문에 기술하면 클래스 내부에 서비스 메소드나 여타 메소드의 바깥쪽에 위치하게 됩니다 여기에 간단한 정적인 변수나 메소드 아니면 인스턴스변수나 메소드를 만들수 있습니다. 컨테이너와 내장객체 비교 API -> 내장객체 JSPWriter -> out HttpServletRequest -> request HttpServletResponse -> response HttpSession -> session ServletContext -> application ServletConfig -> config JspException -> exception PageContext -> pageContext Object -> page 생성된 서블릿의 API 컨테이너는 JSP 파일을 HttpJspPage 인터페이스를 구현한 서블릿 클래스를 변환하여 생성합니다. 아래 나와있는 AP...

#026 세션관리

미분류
대화상태 유지하기 세션은 어떻게 작동하는가 1. 다이아나는 dark를 선택 한 다음 submit 버튼을 클릭합니다. 컨테이너는 BeerAPP서블릿의 새로운 스레드로 요청을 보냅니다. BeerApp스레드는 다이아나의 세션을 찾아서 세션의 속성에 그녀가 선택한 Dark를 저장합니다. 2. 서블릿은 비즈니스 로직을 실행하고 응답합니다. 여기서 질문을 하나 더 하죠 생각하는 가격대는 어떻게 됩니까? 3. 다이아나는 페이지에 뿌려진 새오운 질문을 보고는 생각합니다. 그리고는 비싸다는 Expenseive를 선택하고는 submit 버튼을 클릭합니다. 컨테이너는 beerApp서블릿의 새로운 스레드로 요청을 보냅니다. BeerApp스레드는 다이아나의 세션을 찾아서 세션의 속성으로 그녀가 선택한 expensive를 저장합니다 . 4. 서블릿은 비즈니스 로직을 실행하고 응답합니다. 이 경우는 앞서한 질문에 대한 응답이겠죠 5. 다이아나의 세션은 여전이 활성화 상태입니다. 테리가 pale를 선택하고 submit버튼을 클릭합니다. 컨테이너는 테리의 요청을 beerApp서블릿의 새로운 스레드로 보냅니다. BeeraApp서블릿의 스레드는 테리를 위한 새로운 새션을 만듭니다. 그리고 테리가 선택한 Pale을 저장하기 위하여 setAttribute()메소드를 호출합니다. 문제점 하나 - 컨테이너는 클라이언트를 어떻게 구분하는가? 클라이언트는 유일한 세션 ID가 필요하다. 클라이언트가 제일 처음 요청을 보낼때 컨테이너는 클라이언트의 유일한 세션ID를 생성하는거죠 그리고 이 값을 Response에 넣어 클라이언...

#025 속성과 리스너

미분류
01. 웹 애플리케이션이 되어 보자 도와주세요 ~ 초기화 파라미터 서블릿도 초기화 파라미터가 있습니다. DD파일에서.. <init-param> <param-name> adminEmail</param-name> <param-value>likewecare@wike.com</param-value> </init-param> 서블릿 코드에서 : out.println(getServletConfig().getInitParameter("adminEmail")); 서블릿 초기화가 된 다음에야 서브릿 초기화 파라미터를 사용할수 있습니다. 메소드가 리턴한 ServletConfig, 객체에 대한 참조를 가지고 ServletConfig의 메소드를 호출할수 잇습니다. GetInitParameter()메소드 같은것 말이죠 그러나 서블릿 생성자에서는 이 메소드를 호출할수 없습니다. 서블릿이 일생을 잘 훓어보면 너무 일찍 호출했다는 것을 알수 있을겁니다. 컨테이너가 서블릿의 init()을 호출하고 난 다음에야, 서블릿은 서블릿의 정체성을 갖기 때문입니다. *컨테이너가 서블릿을 초기화할때, 서블릿마다 하나식 ServletConfig를 생성합니다. 컨테이너는 DD에서 서블릿 초기화 파라미터를 읽어 이 정보를 ServletConfig로 넘겨줍니다. 그다음 ServletConfig를 서블릿 init() 메소드에 제공하지요 컨테이너가 서블릿을 초기화 할때 단 한번만 서블릿 초기화 파라미터를 읽습니다. 컨테이너가 서블릿을 만들때 DD를 읽어...