ASP.NET 웹 API는 훌륭한 기술입니다. 웹 API를 작성하는 것은 너무 쉬워서 많은 개발자들이 좋은 실행 성능을 위해 애플리케이션을 구조화하는 데 시간을 들이지 않습니다. 이 글에서는 ASP.NET 웹 API의 성능을 향상시키기 위한 8가지 기법을 다룰 것입니다. 1) 가장 빠른 JSON 직렬화 도구 사용 JSON의 직렬화는 전체 ASP.NET 웹 API 성능에 중요한 영향을 미칩니다. 제 프로젝트 중 하나에서는 JSON.NET 시리얼라이저에서 ServiceStack.Text로 1년 반 동안 전환했습니다. 웹 API의 성능이 약 20% 향상된 것으로 측정했습니다. 이 직렬화 도구를 꼭 사용해 보시길 강력히 추천합니다. 다음은 인기 있는 직렬화 도구들의 성능에 대한 최근 비교 데이터입니다.
SerializerPerformanceGraf 출처: theburningmonk 업데이트: StackOverflow가 지금까지 주장하는 JSON 직렬화 도구를 사용하는 것으로 보입니다. 테스트 데이터는 그들의 GitHub 페이지인 Jil serializer에서 확인할 수 있습니다. 2) DataReader에서 JSON을 수동으로 직렬화하기 저는 이 방식을 제 프로젝트에서 사용해 왔고 성능 향상을 받았습니다. DataReader에서 JSON 문자열을 수동으로 생성할 수 있어 불필요한 객체 생성을 피할 수 있어, DataReader에서 값을 가져와 객체에 쓰고, 그 객체에서 값을 가져와 JSON Serializer를 사용해 JSON을 생성할 필요가 없습니다. StringBuilder를 사용해 JSON을 생성하고, WebAPI에서 응답 내용으로 StringContent를 반환하세요.
- var response = Request.CreateResponse(HttpStatusCode.OK);
- response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json");
- return response;
코드 복사 이 작업을 하는 더 많은 방법은 릭 스트랄의 블로그에서 확인할 수 있습니다 3) 가능한 한 다른 프로토콜 형식(프로토콜 버퍼, 메시지 팩)을 사용하세요 프로젝트 내에서 JSON 대신 프로토콜 버퍼(Protocol Buffers)나 메시지팩(MessagePacks) 같은 다른 메시지 형식을 사용할 수 있다면, 프로토콜 버퍼가 직렬화가 매우 빠르기 때문만이 아니라, 반환되는 결과에서 JSON보다 빠르게 포맷되기 때문에 엄청난 성능 이점을 얻을 수 있습니다. 4) 압축 구현 ASP.NET 웹 API에서 GZIP이나 Deflate를 사용하세요. 압축은 응답 패킷의 크기와 반응성을 줄이는 간단하고 효과적인 방법입니다. 이 기능은 매우 필수적이며, 제 ASP.NET 블로그 'GZip 압축 ActionFilter' 8줄짜리 코드에서 더 많은 글을 참고하실 수 있습니다. 5) 캐싱 사용 웹 API 메서드에서 출력 캐싱을 사용하는 것은 매우 중요합니다. 예를 들어, 많은 사용자가 하루에 한 번만 변경되는 응답 콘텐츠에 접속한다면, 사용자 비밀번호를 메모리에 캐싱하는 등 수동 캐싱을 구현하고 싶다면, 제 블로그 글 '웹 API에서 캐싱을 구현하는 간단한 방법'ASP.NET 참고하세요. 6) 가능한 한 일반적인 ADO.NET 을 사용하세요 수동으로 작성한 ADO.NET 이 여전히 데이터베이스에서 값을 빠르게 얻는 가장 빠른 방법입니다. 웹 API의 성능이 정말 중요하다면 ORM을 사용하지 마세요. 가장 인기 있는 ORM 간의 성능 비교를 확인할 수 있습니다. ORMMapper
세련되고 손으로 작성한 페치 코드는 빠르고, 모든 ORM이 세 가지 것보다 느립니다. 결과셋 캐시가 있는 LLBLGen은 빠르지만, 결과 집합을 다시 반복하고 객체를 메모리에 인스턴스화해야 합니다. 7) 웹 API에서 비동기식 접근법을 구현하기 비동기식 웹 API 서비스를 사용하면 웹 API가 처리하는 HTTP 요청 수가 크게 증가합니다. 구현은 간단합니다. 비동기 키워드를 사용하고 메서드의 반환 값을 Task로 바꾸면 됩니다.
- [HttpGet]
- public async Task OperationAsync()
- {
- await Task.Delay(2000);
- }
코드 복사 8) 여러 결과 집합과 집합 조합을 반환합니다 전송 횟수를 줄이는 것은 여러 데이터베이스뿐만 아니라 결과 집합의 힘을 활용할 수 있는 웹 API에도 유리합니다. 즉, DataReader에서 여러 결과 세트를 추출할 수 있으며, 다음 데모 코드를 참고하세요:
- // read the first resultset
- var reader = command.ExecuteReader();
- // read the data from that resultset
- while (reader.Read())
- {
- suppliers.Add(PopulateSupplierFromIDataReader( reader ));
- }
- // read the next resultset
- reader.NextResult();
- // read the data from that second resultset
- while (reader.Read())
- {
- products.Add(PopulateProductFromIDataReader( reader ));
- }
코드 복사 웹 API에서 한 번의 응답으로 여러 객체를 반환할 수 있습니다. 반환된 객체들을 합쳐서 다음 객체들을 반환해 보세요:
- public class AggregateResult
- {
- public long MaxId { get; set; }
- public List<Folder> Folders{ get; set; }
- public List<User> Users{ get; set; }
- }
코드 복사 이렇게 하면 WEB API로 보내는 HTTP 요청을 줄일 수 있습니다. 이 글을 읽어주셔서 감사합니다.
|