1. 최초 요청 시 HTTP Request와 Response

Client's request

Client  ------------------------------> Server

Request URL: http://i1.daumcdn.net/cfs.tistory/static/images/logo.gif


Server's response

Client <------------------------------ Server

Header에 "Last-Modified"를 설정하여 응답한다. (아래의 그림 참조)




2. 재 요청 시 HTTP Request Response

Client's request

Client  ------------------------------> Server

Request URL: http://i1.daumcdn.net/cfs.tistory/static/images/logo.gif

최초 응답 시 받은 "Last-Modified"를 참조하여 Header에 "If-Modified-Since"를 설정하여 요청한다.
(Browser가 알아서 설정)

Server's response

Client <------------------------------ Server

Server는 "If-Modified-Since" 값과 비교하여 변경 사항이 없으면 HTTP Status Code 304로  응답한다.

(아래의 그림 참조)



3. Code Snipet


public void downloadResource(@PathVariable String resourceName,
						       HttpServletRequest request,
						      HttpServletResponse response) {
																				
		WebResource webResource = ResourceService.getResource(resourceName);
		long lastModified = webResource.getLastModified();
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(lastModified);
		calendar.set(Calendar.MILLISECOND, 0);
		lastModified = calendar.getTimeInMillis();
		
		long ifModifiedSince = request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
		if (ifModifiedSince != -1 && ifModifiedSince >= lastModified) {
			response.setStatus(HttpStatus.SC_NOT_MODIFIED);
			return;
		}
		
		response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModified);
		...
	}

- 출처: http://irooti.tistory.com/8

소스코드 문서화

 

개발자들은 개발 문서작업을 진행하는 데 많은 노력과 시간을 투자한다.

직접 모든 비즈니스 로직이나 모듈을 문서로 작성하기란 만만치 않은 작업이다.

MSDN형태의 도움말을 구독성이 뛰어나고 쉽게 구현하는 방법이 있어 이를 소개하고자 한다.

 

우선 소스코드 문서를 XML 파일로 바꿔주는 C#컴파일러의 기능에 대해 알아보자.

C# 컴파일러가 코드 주석을 XML로 변경하는 과정을 담당한다.

소스코드 주석 : /// , /** */

 

 XML 주석에서 사용하는 엘리먼트 정보들은 아래와 같다.

 

Element

정의

<c>

설명에 있는 텍스트를 코드로 표시하는 데 사용

<code>

여러 줄을 코드로 표시하는 데 사용

<example>

설명하고 있는 항목에 대한 코드 예제를 나타냄

<param>

파라미터를 설명한다

<remarks>

해당 멤버에 대한 설명을 작성하는 데 사용된다.

<returns>

멤버의 반환 값을 문서화한다.

<see>

관련된 항목들을 링크하는 데 사용한다.

<summary>

해당 항목에 대한 요약을 문서화 하는 데 사용한다.

<value>

해당 속성을 문서화하는데 사용한다.

[ 1]XML 주석 Element 설명

VS.NET 툴에서 기본적으로 IDE 기능들을 제공한다.

 

[
그림 1]VS.NET에서의 XML 주석

 

[그림 1]처럼 메소드 앞에 /// 3번 누르면 자동적으로 클래스나 메소드 및 필드에 맞는 element들이 생성되는 것을 볼 수 있다.

 

[
그림 2] VS.NET에서의 XML 주석


이것 외에 부연 설명이나 예제코드참고자료 등을 작성하고 싶을 경우에는 [그림 2]처럼 element를 추가하여 작성할 수 있다.

 

소스 코드에 네임스페이스클래스메소드나 멤버 변수에 XML 주석을 작성을 다 했으면 컴파일 시 /doc 옵션을 이용해 XML 문서를 추출해야 한다.

 

VS.NET 에서 프로젝트명 – 속성 – 빌드 탭에 XML문서 파일 설정을 체크하고 저장한다.

[
그림 3] VS.NET을 이용하여 XML 문서 출력

 

[그림 3]와 같이 설정한 후 컴파일을 하게 되면  bin\Debug\ePlayon.Batoo.BLL.XML 파일에 주석 문서가 생성된다.

아래 그림은 문서의 내용을 일부 발췌하였다.

 

[
그림 4] XML 문서 형식

 

파란색으로 표시된 내용을 보면 M:, T:와 같은 포맷 문자가 있다.

아래 [ 2]는 포맷 문자를 정리한 것이다.

 

Element

정의

N

네임스페이스

T

형식(클래스인터페이스구조체열거형델리게이트)

F

필드

P

형식 속성

M

메소드(생성자와 오버로드된 연산자 포함)

E

이벤트

!

에러에 대한 정보를 나타내는 에러 문자열

[표 2]XML 주석 포맷 문자

C# 컴파일러를 통해 생성된 이 xml 파일은 사용자 도움말 형태로 변환하기 위한 xml 정의 파일이라 할 수 있다.

그럼 사용자 도움말 형태로 만들기 위해 마이크로소프트에서 프리웨어로 제공하는 sandcastle 이라는 프로그램을 사용하여 작업을 진행해 보자.

Microsoft의 개발자들이 자신들이 도움말을 만들 때 사용하는 툴을 공개하였는데 그것이 바로 Sandcastle 이다.

Sandcastle 을 설치하기에 앞서 도움말 형태의 뷰어를 설치해야 한다.

아래 링크에서 HTML Help workshop  sandcastle, 그리고 sandcastle UI 프로그램을 다운받아 차례로 설치하자.

 

Microsoft HTML Help Downloads :

http://go.microsoft.com/fwlink/?linkid=14188

 

sandcastle Downloads:

http://www.codeplex.com/Sandcastle/Release/ProjectReleases.aspx?ReleaseId=9921

 

sandcastle help file builder Downloads :

http://www.codeplex.com/SHFB/Release/ProjectReleases.aspx?ReleaseId=9848

 

Sandcastle 원리

 

[
그림 5] Sandcastle 처리 원리

 

[그림 5] sandcastle이 내부적으로 소스코드를 문서화 해주는 과정을 나타내고 있다.

우선 VS.NET 툴에서 컴파일 시 XML 문서 파일을 출력하도록 하는 명령이 csc /doc 임을 알 수 있다컴파일이 성공하면 바이너리 폴더에 dll 파일과 xml 파일이 생성된다.

이때 SandCastle  BuildAssembler 에서 xml 파일과 dll 파일을 분석하여 필요한 정보들을 생성한 후 이 결과를 HTML Help Compiler에서 컴파일하여 도움말 형태로 출력시킨다.

 

그럼 sandcastle 툴을 사용하여 직접 소스 코드 도움말을 생성해보자.

앞서 봤듯이 dll 파일과 xml 파일은 있다는 가정 하에 테스트를 진행해 보겠다.

Sandcastle Help File Builder에서 “Sandcastle Help File Builder GUI” 를 실행시킨다.

 

[
그림 6] Sandcastle Help File Builder 메인 화면

 

[그림 6]은 Sandcastle의 기본 UI 이다. Add 버튼을 이용하여 바이너리(dll) 파일을 등록할 수 있다.

하지만 테스트할 바이너리는 웹 사이트의 모든 참조 라이브러리 프로젝트를 생성해야 하므로 수동으로 직접 입력하는 방법보다 솔루션 파일을 이용해 도움말을 생성해 보도록 하겠다.

 

[
그림 7] 솔루션 파일로 어셈블리 참조

 

[그림 7]에서 보듯이 Project 메뉴에 New Project from Visual Studio Project… 를 실행하여

솔루션 파일을 바인딩 시켜보자.

 

[
그림 8] 솔루션 파일로 바인딩 시 선택화면

 

솔루션 파일을 등록하게 되면 [그림 8]과 같이 나오면 Select 를 클릭한다.

 

[
그림 9] 솔루션 파일로 바인딩 시 UI

 

[그림 9]에서 보듯이 관련 참조된 어셈블리와 XML파일들이 바인딩 되는 것을 볼 수 있다.

이제 모든 준비가 끝이 났다.

 

우선 현재 sandcastle 프로그램을 저장하여 파일명.shfb파일을 도움말을 설치할 폴더에 저장한 후

Documentation 메뉴에 Build Project를 실행시켜보자.

 

[
그림 10] 도움말 생성 컴파일

 

[그림 10]의 아래 Output에서 보듯이 성공적으로 컴파일을 완료하였다.

저장한 폴더의 Help 폴더에 보면 Documentation.chm 파일이 생성된 것을 확인할 수 있다.

 

[그림 11] 도움말 생성 UI

 

[그림 11]에서 보듯이 성공적으로 도움말이 생성된 것을 확인하였다.


객체의 구조와 각 네임스페이스클래스메소드필드속성별로 설명이 되어 있다.


-출처 : http://tit99hds.egloos.com/1590155

'Programming > C#, ASP' 카테고리의 다른 글

Mono project  (0) 2015.04.22
Deployment Dependency Problems  (0) 2015.02.06
C# XML/XmlReader  (0) 2015.01.20
Troubleshooting Common Problems with the XmlSerializer  (0) 2015.01.20
ASP.NET Web API 도움말 페이지 작성하기  (0) 2015.01.15
"올바른 성장과 따뜻한 나눔"이 있는 넥스트리

HTTP 는 대형 네트워크 시스템 아키텍처를 염두한 프로토콜이기에 단순하면서도 다양한 스펙들이 존재합니다. 대형 네트워크 시스템이다 보니 서로 주고 받는 정보가 많을 것이고 이에 네트워크 부하나 서버 부하가 발생할 소지가 매우 큽니다. 그런 상황을 위해 HTTP에는 단순하면서도 강력한 캐싱 메커니즘을 제공하고 있습니다.



브라우저와 웹서버와의 대화

브라우저는 웹서버에게 이미지, CSS 그리고 동적생성 정보(HTML, XML, JSON... 등 많은 컨텐츠를 요청합니다. 그런데 동일한 리소스(이하 컨텐츠)를 여러번 요청하는 경우가 굉장히 많습니다. 전형적인 예가 이미지나 CSS 같은 정적 컨텐츠인데 이런 것을 요청할 때 브라우저와 웹서버가 어떻게 대화하는지 아래 그림으로 살펴보겠습니다.

  • 1: /AAA 컨텐츠를 주세요
  • 2: OK 주었습니다. 이 컨텐츠의 마지막 갱신일은 2009년 9월 7일... 입니다. (컨텐츠 전송)
  • 잠시 후...
  • 3: /AAA 컨텐츠를 주세요. 아. 제가 캐시에 가지고 있는 건 마지막 갱신일이 2009년 9월 7일 ... 이네요
  • 4: 변경사항 없습니다. 그냥 캐시에 있는 것 쓰세요. (아무것도 전송 안함)
브라우저 기본설정이라면 캐시에 있을 경우 브라우저가 시작하고 한 번 확인하고 두 번 다시는 GET 확인 요청을 하지 않습니다. 그냥 캐시에 있는 걸 씁니다. 브라우저를 다시 시작할 경우만 확인 요청을 합니다. 서버에 아예 요청도 안 가니 네트워크나 서버 부하는 무지 감소합니다. (IE 인터넷 옵션 설정에서 "페이지를 열 때마다"로 설정된 경우는 매번 확인 요청을 합니다.)


동적 컨텐츠와 304

서블릿이나 JSP 등으로 생성하는 동적 컨텐츠는 매번 정보가 갱신되어야 하기에 이런 메커니즘을 사용하지 않습니다. 그런데 간혹 서버 컨텐츠 마지막 갱신일을 알고 매우 요청이 많은 페이지 일 경우 위 메커니즘을 이용하는 것도 좋은 방법이겠네요. 다음 예는 JSP로 구현한 소스 예입니다.

01<%
02  // 서버 컨텐츠의 마지막 갱신을 얻어온다.
03  java.util.Date date = getLastModified();
04  long clientDate = request.getDateHeader("If-Modified-Since");
05  long serverDate = date.getTime();
06  if (clientDate != -1 && clientDate >= serverDate) {
07      response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
08      return;
09  }
10  response.setDateHeader("Last-Modified", serverDate);
11%>

비즈니스 로직이 실행되기 전 해당 정보 갱신일을 살펴보고 다시 줄 것인지 304를 던질 것인지 판단하는게 좋겠습니다. 그래야 필요없는 서버 로직이 수행되지 않습니다.


웹 애플리케이션 성능 향상

기본에 충실하는게 좋습니다. 우선은 문제가 되는 비즈니스 로직을 충분히 튜닝하십시오. 그런 후 특별한 캐싱 장치를 사용하거나 가능하면 위의 경우처럼 표준 캐싱 메키니즘을 충분히 활용하십시오.

그리고 비즈니스 로직의 성능을 높이기 위해 특정 비즈니스 로직을 열심히 튜닝하기 전에 우선 Fiddler 같은 도구로 브라우저와 서버가 무슨 통신을 하는지 살펴보는게 좋습니다. 생각보다 필요없는 요청이 많이 발생할 수도 있습니다.

--

웹사이트를 빠르게 하는 다른 관점의 방법들도 있네요.


 - 출처 : http://greatkim91.tistory.com/118

+ Recent posts