2. 제13회 한국자바개발자 컨퍼런스
1. 네이버 메인의 NGiNX 테스트 사례!
송형근 - hyunkeun.song@nhn.com
자칭 훈남 개발자
NHN, 메인 서비스 개발
손노리, 게임 클라이언트 개발
2. nGrinder 로 성능테스트 끝장내보자!
윤준호 - junoyoon@nhn.com
자칭 슈퍼 개발자
NHN, SW 테스트 / 검증 자동화
nGrinder 프로젝트 Lead
2
15. 제13회 한국자바개발자 컨퍼런스
웹서버 모듈을 이용한 동적 컨텐츠 생성
컨텐츠
데이터
index.html
Web Server
사용자
데이터
웹 서버 모듈
15
16. 제13회 한국자바개발자 컨퍼런스
웹서버 모듈의 다른 기능은?
- 로그인 인증 처리
캐쉬
- 컨텐츠 캐싱
랜덤
- 백엔드 시스템 연동
연동
- 쿠키, 헤더 처리
- 랜덤 노출 처리 웹서버
- ...
웹 서버 모듈은 네이버 메인의 핵심!!
17. 제13회 한국자바개발자 컨퍼런스
웹 서버 모듈
• 웹 서버에서 제공하지 않는, 특정 기능 추가
httpd.conf
LoadModule proxy_module mod_proxy.so
Q : 보통은 WAS 를 많이 사용하지 않나?
A : WAS 로도, 동일 기능 구현 가능 (단지, 구성 방식의 차이일 뿐..)
고성능? WAS(X), 웹 서버 모듈(O)
17
18. 제13회 한국자바개발자 컨퍼런스
웹 서버 검증 대상?
• 기본적으로 NGINX 웹서버 자체의 기능 신뢰.
• 네이버 메인에서는, 웹 서버 모듈(15개)을 개발하여 사용
• 검증 대상은 우리가 직접 만든 모듈의 안정성
NGiNX 모듈, 주요 검증 대상
18
20. 제13회 한국자바개발자 컨퍼런스
기존 테스트 방법? 내부 리소스 활용 모듈
확장모듈
WGET
정상적인
응답만을 제공
클라이언트 웹 서버
20
21. 제13회 한국자바개발자 컨퍼런스
기존 테스트 방법? 외부 리소스 활용 모듈
정상응답만을
제공
확장모듈
WGET
TCP, UDP, HTTP
클라이언트 웹 서버 백엔드 서버
21
22. 제13회 한국자바개발자 컨퍼런스
[이슈1] 내부 시스템 예외 상황
• Segmentation Fault ?
• 잘못된 메모리 주소 접근으로 인한 오류 : 비정상 종료
NULL 로 설정된 영역을 접근
할당 받은 메모리 공간을 넘어서는 영역에 접근했을 경우
22
23. 제13회 한국자바개발자 컨퍼런스
발생 가능한 케이스는? 파라미터, 리소스 오류
2012-13월의 13
계좌 조회? 월??
데이터 파일 요청
23
24. 제13회 한국자바개발자 컨퍼런스
NGiNX 모듈 테스트 Flow
1. 최신 NGiNX 모듈 소스 빌드
수작업 NO !!!!
2. NGiNX 서버 실행
3. HTTP 호출(WGET 등)
4. 결과 검증
근데 NGiNX 는 C 언어 아닌가요? 갑자기 JUnit은?
어짜피 HTTP (윈도우에서 테스트할래, 리눅스에서 할래?)
24
25. 제13회 한국자바개발자 컨퍼런스
테스트 코드 예제
public void 정상_응답_테스트(){
// Client 측 요청 (HTTP)
Map<String,Object> headers = new HashMap();
headers.put( “cookie”, “…” );
page = new WebClient().getPage("http://localhost/deposit?mon=13", headers );
// 검증단계 : 기대했던 결과값이 들어왔는지 검증
assertThat( page.getStatusCode(), is(200) );
assertThat( page.getContent().containts(expectedContent ), is(true));
}
25
26. 제13회 한국자바개발자 컨퍼런스
[이슈2] 백엔드 시스템 예외 상황
백엔드 시스템이 다운 되어도,
우리는 정상적으로 서비스 가능해?
테스트 해볼 수 있어?
높으신분 왈
26
28. 제13회 한국자바개발자 컨퍼런스
발생 가능한 케이스는? 네트워크 관련 오류
요청 : 계좌 이체 내용 조회, 기대 응답 : { 날짜, 금액, 계좌번호, 잔액 }
1월 계좌이체 조회
계좌조회 잘못된 데이터
궁금하면 500원 시스템
1월 계좌이체 조회 응답 없음
1월 계좌이체 조회 전체 응답
01/23, 500원 받지 못함
28
32. 제13회 한국자바개발자 컨퍼런스
백엔드 서비스의 테스트 환경 구성
우리 시스템은 절대로 다운 시킬
수 없습니다. 시키기만 해봐?!!
테스트를 위한 NGiNX 모듈
수정은 못합니다.
환경적으로 제어할 수 있는 방법 고민?
결론은 MOCKING !!
Mocking : mock objects are simulated objects that mimic the behavior of real objects in controlled
ways, wikipedia 32
33. 제13회 한국자바개발자 컨퍼런스
백엔드 시스템 Mocking 테스트 환경 구성
Localhost
1 2
X
NGiNX
클라이언트 백엔드 시스템
Request 검증
Response 생성 Redirectio
n
Mock 서비스
Redirection, Mock : 외부의 환경 변화 없이, 원하는 테스트 가능
33
34. 제13회 한국자바개발자 컨퍼런스
Redirection
1. 도메인으로 접속 시 : hosts 설정
외부서비스 Host IP 도메인주소
서비스 #1 127.0.0.1 www.xxx.com
2. IP 로 접속 시 : iptables 설정 (리눅스 환경)
외부서비스 iptables 를 사용한 IP 포워딩 이용
iptables -t nat -A OUTPUT -p tcp -d 서버주소 -j DNAT --to-destination
서비스 #2
127.0.0.1:10000
34
35. 제13회 한국자바개발자 컨퍼런스
백엔드 시스템 Mocking 테스트 Flow
HTTP 요청 Redirection
(N)
클라이언트(C) Mock 서비스(M)
35
36. 제13회 한국자바개발자 컨퍼런스
정상 테스트 코드 예제 (HTTP)
public void before(){
createServer( HTTP_PROTOCOL, PORT );
startServer();
// Server 측 결과 생성
server.setHandler( new AbstractHandler(){
public void handle( HttpServletRequest req, HttpServletResponse resp ){
... // NGiNX Request 메시지 검증 + Response 메시지 전송
});
}
public void 정상_응답_테스트(){ N
page = new WebClient().getPage("http://localhost/” );
} C M
36
37. 제13회 한국자바개발자 컨퍼런스
비정상 예외 테스트 코드 예제 (HTTP)
public void before() throws Exception {
1 createServer( HTTP_PROTOCOL, PORT );
startServer();
2 // Server 측 결과 생성
server.setHandler( new AbstractHandler(){
public void handle( HttpServletRequest req, HttpServletResponse resp ){
resp.write( “잘못된 데이터지롱” );
stopServer();
}
});
}
37
38. 제13회 한국자바개발자 컨퍼런스
테스트 코드 예제 (TCP, UDP)
// TCP, IoAcceptor 객체 이용
server.setHandler(new IoHandlerAdapter() {
public void processStreamIo(IoSession session, InputStream in, OutputStream out) {
out.print ( responseMsg );
}
});
// UDP
server.setHandler(new StreamIoHandler() {
public void messageReceived(IoSession ssn, Object msg){
ssn.write( … );
}
});