Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)

JMeter로 XML 웹 서비스 호출에 대한 부하 테스트 방법

클라이언트가 실버라이트로 된 웹 사이트에 대한 부하 테스트는 어떻게 해야 할까요? 사실, 부하 테스트를 클라이언트 프로그램에 하는 것은 어울리지 않지요. 결국 실버라이트가 호출하는 서버 측 서비스에 대한 부하 테스트에 초점을 맞추는 것이 올바른 선택입니다.

일반적으로 실버라이트는 서비스와의 통신을 한다면 대부분 WCF로 연동을 합니다. 물론, 다른 방법도 가능하지만... WCF만큼 쉽지는 않지요. ^^ 이렇게 WCF로 만들어진 서비스를 테스트 하는 가장 쉬운 방법은 서버 측에서 노출하는 WSDL에 따라 자바나 닷넷으로 프록시 클래스를 자동 생성해 별도로 부하를 주는 모듈을 빌드해 사용하는 것이 있습니다.

하지만, 관리자 입장에서 JMeter와 같은 도구를 이용해 부하 테스트를 하기에는 위의 방법이 적절하지 않습니다. 프로그래밍이 들어가는 것은 아무래도 부담스러울 수밖에 없지요. ^^

이 글에서는 프로그램 없이, 실버라이트에서 호출된 웹 서비스를 부하 테스트할 수 있는 방법을 설명합니다.




JMeter에서 실버라이트 호출을 재현하려면, 간단하게는 패킷을 캡쳐해서 POST 데이터로 지정할 수 있습니다. 다행히, 실버라이트는 Internet Explorer에서 실행되고, 내장된 "Developer Tools"를 이용하면 패킷 캡쳐가 가능합니다. 아래는 실버라이트에서 실행되는 간단한 asmx 웹 서비스 호출에 대한 패킷을 "Network" 탭에서 "Start capturing"으로 가로챈 것을 보여줍니다.

jmeter_load_1.png

위의 화면에서 URL 항목을 두 번 누르면 요청 및 반환된 패킷에 대한 상세한 데이터를 얻을 수 있습니다. 여기서 중요한 것은 "Request headers"와 "Request Body"입니다.

jmeter_load_2.png

jmeter_load_3.png

웹 서비스 호출 하나당, Request Header의 "SOAPAction", "Content-Type" 값과 "Request Body"의 POST 내용을 기록해 둬야 합니다. (이 중에서 Content-Type은 XML 웹 서비스의 경우 "text/xml"이 됩니다.)

자, 이제 JMeter를 다운로드 받고.

Download Apache JMeter 
; http://jmeter.apache.org/download_jmeter.cgi

단순히 압축만 풀면 /bin/jmeter.bat 파일을 실행하는 것으로 JMeter 프로그램이 뜹니다.

jmeter_load_4.png

간단하게 "Test Plan"의 컨텍스트 메뉴에서 "Add" / "Threads (Users)" / "Thread Group" 메뉴로 새로운 스레드 그룹을 생성합니다.

jmeter_load_5.png

사용자 수에 대한 시뮬레이션 값을 "Number of Threads (users)"에 지정하고, "Ramp-Up Period (in seconds)"에는 웹 애플리케이션이 JIT 컴파일 등으로 인해 초기 구동시간이 필요한 경우 입력해 줍니다. 테스트 기간은 Loop Count나 스케쥴러를 이용해서 등록할 수 있습니다. 제 경우에는 그냥 테스트기 때문에 다음과 같이 간단하게 설정했습니다.

jmeter_load_6.png

그다음, 다시 트리에 있는 "Thread Group"의 컨텍스트 메뉴에서 "Add" / "Sampler" / "HTTP Request" 를 선택해서 요청을 설정할 수 있는 노드를 추가합니다. 테스트할 웹 서비스 메서드 하나당 "HTTP Request"를 하나 생성해야 합니다. IE의 "Developer Tools"에서 캡쳐한 Post Data를 아래의 화면에 보는 것처럼 "Post Body"에 넣어줍니다.

jmeter_load_7.png

그리고 SOAPAction 값은 HTTP Header에 입력해야 하는데요. 이를 위해 "HTTP Request" 노드의 컨텍스트 메뉴에서 "Add" / "Config Element" / "HTTP Header Manager"를 선택합니다. 그 화면에서 2개의 HTTP Header를 넣어주면 됩니다.

jmeter_load_8.png

부하 테스트를 위한 준비는 사실상 이것으로 끝입니다. 이 상태에서 바로 "Run"을 하면 설정된 대로 요청이 발생합니다.




그런데, 요청이 잘 되고 있는지 리포팅 결과를 얻고 싶을 텐데요. JMeter에서는 이를 "Listener"라는 메뉴에서 제공합니다. 이를 "Thread Group" 수준에서 추가해도 되고, 개별 "HTTP Request" 수준에서 추가해도 됩니다. 여기서는 "Thread Group"에 추가해 볼 텐데요. "Thread Group" 노드의 컨텍스트 메뉴에서 "Add" / "Listener" 하위의 아무거나 선택해 봅니다. 여기서는 "Graph Results"를 추가할 텐데요. 여러 개 추가해도 무방하니 자유롭게 테스트 해보면 됩니다. ("View Results Tree"나 "View Results in Table" 같은 거를 선택해서 리포팅 결과가 어떻게 다른지 보는 것도 좋겠지요.)

다음은 "Thread Group"을 실행한 후 "Graph Results" 노드의 상태를 본 것입니다. XML 웹 서비스에 대한 호출이 정상적으로 잘 되었군요. ^^

jmeter_load_9.png

사실, 간단한 부하 테스트는 이렇게 하고 주요 목적은 서버 측에 설치된 제니퍼 닷넷으로 웹 애플리케이션의 문제점을 진단하는 것이 주요 과제였습니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/27/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 46  [47]  48  49  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12765정성태8/9/202114101Java: 31. Cannot load JDBC driver class 'org.mysql.jdbc.Driver'
12764정성태8/9/202152349Java: 30. XML document from ServletContext resource [/WEB-INF/applicationContext.xml] is invalid
12763정성태8/9/202116141Java: 29. java.lang.NullPointerException - com.mysql.jdbc.ConnectionImpl.getServerCharset
12762정성태8/8/202119422Java: 28. IntelliJ - Unable to open debugger port 오류
12761정성태8/8/202116093Java: 27. IntelliJ - java: package javax.inject does not exist [2]
12760정성태8/8/202112897개발 환경 구성: 594. 전용 "Command Prompt for ..." 단축 아이콘 만들기
12759정성태8/8/202117518Java: 26. IntelliJ + Spring Framework + 새로운 Controller 추가 [2]파일 다운로드1
12758정성태8/7/202116904오류 유형: 751. Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
12757정성태8/7/202117538Java: 25. IntelliJ + Spring Framework 프로젝트 생성
12756정성태8/6/202115787.NET Framework: 1084. C# - .NET Core Web API 단위 테스트 방법 [1]파일 다운로드1
12755정성태8/5/202115865개발 환경 구성: 593. MSTest - 단위 테스트에 static/instance 유형의 private 멤버 접근 방법파일 다운로드1
12754정성태8/5/202116267오류 유형: 750. manage.py - Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
12753정성태8/5/202117169오류 유형: 749. PyCharm - Error: Django is not importable in this environment
12752정성태8/4/202114006개발 환경 구성: 592. JetBrains의 IDE(예를 들어, PyCharm)에서 Visual Studio 키보드 매핑 적용
12751정성태8/4/202116922개발 환경 구성: 591. Windows 10 WSL2 환경에서 docker-compose 빌드하는 방법
12750정성태8/3/202113967디버깅 기술: 181. windbg - 콜 스택의 "Call Site" 오프셋 값이 가리키는 위치
12749정성태8/2/202113434개발 환경 구성: 590. Visual Studio 2017부터 단위 테스트에 DataRow 특성 지원
12748정성태8/2/202114443개발 환경 구성: 589. Azure Active Directory - tenant의 관리자(admin) 계정 로그인 방법
12747정성태8/1/202114727오류 유형: 748. 오류 기록 - MICROSOFT GRAPH – HOW TO IMPLEMENT IAUTHENTICATIONPROVIDER파일 다운로드1
12746정성태7/31/202119274개발 환경 구성: 588. 네트워크 장비 환경을 시뮬레이션하는 Packet Tracer 프로그램 소개
12745정성태7/31/202115004개발 환경 구성: 587. Azure Active Directory - tenant의 관리자 계정 로그인 방법
12744정성태7/30/202115363개발 환경 구성: 586. Azure Active Directory에 연결된 App 목록을 확인하는 방법?
12743정성태7/30/202116596.NET Framework: 1083. Azure Active Directory - 외부 Token Cache 저장소를 사용하는 방법파일 다운로드1
12742정성태7/30/202114602개발 환경 구성: 585. Azure AD 인증을 위한 사용자 인증 유형
12741정성태7/29/202116121.NET Framework: 1082. Azure Active Directory - Microsoft Graph API 호출 방법파일 다운로드1
12740정성태7/29/202114656오류 유형: 747. SharePoint - InvalidOperationException 0x80131509
... 46  [47]  48  49  50  51  52  53  54  55  56  57  58  59  60  ...