본문 바로가기
Programming/C#

[ASP.NET MVC] AsyncController 테스트

by ★용호★ 2013. 4. 22.

 

 이 포스팅은 지극히 주관적인 생각을 정리한 것이므로 틀린 부분이 있을 수 있습니다.

 혹시나 잘못된 지식이나 틀린 부분이 있다면 지적해주세요. 정답이 아니니 참고만 하시고,

 더 많은 지식 공유 부탁드립니다.

 

 

2013년 4월 22일

 

지난 번에 Controller 테스트를 해보면서 비동기 컨트롤러에 대한 궁금증이 있었는데

자세히 알아 보기 위해서 AsyncController에 대해 공부해보게 되었다.

 

그냥 Controller도 요청 마다 인스턴스를 생성하기 때문에 요청에 따른 처리는 비동기인 것 같다는 생각이 들어서

비동기를 위한 컨트롤러와 그냥 컨트롤러의 차이가 무엇일까 혼동이 되었었다.

 

AsyncController는 사용 방식을 잘 몰라서 MSDN을 뒤져가며 찾아보았다.

 

먼저 AsyncController는 규칙이 존재한다. 함수명뒤에 Async, Completed, AsyncCancel, CancelAsync와 같이

미리 정의된 키워드들을 사용해야 한다. 처음엔 이것도 잘 몰라서 왜 안될까 헤맸었다.

 

비동기 컨트롤러로 사용하고자 하는 클래스를 AsyncController를 상속받아 생성 한 후에

라우팅 될 액션 메서드를 정의하는데 "메서드명Async", "메서드명Completed"와 같은 형태로 메서드를 정의해야 한다.

 

URL을 라우팅 할 때는 Async부분을 제외한 메서드명만으로 탐색이 이루어지고 컨트롤러가 메서드명을 이용하여 함수를 찾게 된다.

 

 

 

 

AsyncManager를 통해 작업 카운트를 증가시켜주고 작업이 완료 됐을때는 카운트 값을 감소시켜준다.

여기서 AsyncManager.Paramegers에 Completed 함수로 전달될 매개변수를 결정한다.

"AsyncManager.Parameters["response"]"에서 "response"가 매개변수 명!

 

소스 아래부분을 보면 DBSelectCompleted 함수 매개변수 명이 response인 것을 볼 수 있다.

 

하지만 위의 소스대로 한다면 작업 부분을 다 처리한 후에 파라미터부분에 값을 넘겨주니 구동은 되지만 사실 비동기라고 보기는 힘들다.

그래서 Task를 이용하여 비동기를 구현하였다.

 

 

 

BeginAsync 함수의 Action부분에 위의 소스의 작업 부분을 넘겨주면 작업 부분이 완료되지 않더라도 함수가 종료된다.

백그라운드에서 작업이 동작되다가 완료 되면 EndAsync함수를 호출하여 비동기 작업을 완료하고 Complete 이벤트가 발생한다.

이로써 AsyncController를 이용한 응답 시퀀스를 확인해 볼 수 있었다.

 

성능 테스트를 위해 처음에는 테이블에 하나의 데이터만 들어있고 바로 셀렉트할 수 있도록 하여

Controller와 AsyncController를 테스트 해봤다.

 

 

 

 

 

거의 오차 없이 비슷하다..; 뭥미!!

MSDN에서 간단한 작업일 경우 오히려 비동기가 부하를 일으킬 수 있다는 부분을 보고 혹시 너무 간단한 작업이라 그런가 해서

 

10만개의 데이터가 들어있는 DB 테이블에서 랜덤한 값을 Select하여 넘겨주는 작업으로 변경후 테스트를 해보았다.

 

 

이럴수가! 그래도 거의 똑같다.

 

생각해보니 Controller도 요청에 따라 인스턴스가 각각 생성되어 동작하고 이 것도 비동기적으로 처리가 되고 있으니

현재의 테스트로는 AsyncController와 별 차이가 없을 것 같다는 생각이 들었다.

한 스레드가 작업하는 부분에 대해서 비동기로 처리하기 위해 AsyncController를 사용한다고 생각하는데

요청마다 Controller 인스턴스가 생성이 되니 한 쓰레드에 여러개의 작업이 진행될 일이 없었던 것이다. 그러므로 내 생각엔 지금의 상황에서는 Controller나 AsyncController나 성능의 차이가 없을 것 같다. 만약 하나의 스레드에 여러개의 작업이 들어올 수 있는 상황이 있다면 분명 성능 향상에 도움이 될테지만 아직 그런 상황이 생길지 감이 안잡힌다. 조금 더 고민해봐야겠다.

 

<참고>

이벤트 기반 비동기 패턴 : http://msdn.microsoft.com/ko-kr/library/wewwczdw(v=vs.98).aspx

ASP.NET MVC 에서 비동기 컨트롤러 사용 : http://msdn.microsoft.com/ko-kr/library/ee728598(v=VS.98).aspx

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

[ASP.NET MVC] InputStream의 Position 값 문제..  (0) 2013.05.20
[ASP.NET MVC] Controller 테스트  (0) 2013.04.16
[C#] Attribute 활용  (0) 2013.04.15
[C#] 확장 메소드  (1) 2013.04.15

댓글