본문 바로가기
IT/Java

Spring 내부에서 요청 파라미터 처리 과정

by 성준하이 2024. 10. 6.
반응형

스프링에서의 요청 파라미터 처리 과정에 대해서 정리해보았다.

  1. 파라미터 추출: 스프링은 HTTP 요청에서 동일한 이름을 가진 파라미터들을 모두 추출한다.
    예시: ?ids=1&ids=2&ids=3이라는 요청이 있다면, ids라는 이름의 파라미터 값은 ["1", "2", "3"]
  2. 타입 변환: 추출한 파라미터 값들을 메서드 파라미터의 제네릭 타입에 맞게 변환한다.
    이때 스프링의 ConversionService가 사용되어 문자열을 Integer, Long, String 등으로 변환
  3. 컬렉션 생성: 변환된 값들을 담을 컬렉션 객체를 생성한다.
    스프링은 기본적으로 ArrayList를 사용하여 컬렉션을 만듦
리사이징 발생 여부
  • 내부적으로 리사이징이 발생할 수 있다.
  • ArrayList는 초기 용량(capacity)을 가지고 있으며, 요소가 추가되면서 용량이 부족하면 내부 배열을 재할당하여 크기를 늘린다.
  • 따라서 요청 파라미터의 개수가 초기 용량을 초과하면 리사이징이 발생한다.
  • 리사이징의 영향:
    일반적인 웹 애플리케이션에서는 요청 파라미터의 수가 많지 않기 때문에 리사이징으로 인한 성능 저하는 미미
    그러나 매우 큰 규모의 리스트를 처리해야 하는 경우라면, 리사이징으로 인한 오버헤드를 고려해야 할 수 있음
스프링의 HTTP 요청 처리 메커니즘
  • HandlerMethodArgumentResolver:
    @RequestParam이 붙은 메서드 파라미터는 RequestParamMethodArgumentResolver에 의해 처리
    이 클래스는 요청에서 파라미터 값을 추출하고, 필요한 경우 타입 변환을 수행
  • ConversionService:
    문자열로 전달된 파라미터 값을 지정된 타입으로 변환하는 역할
    기본 타입 외에도 커스텀 컨버터를 등록하여 복잡한 객체로의 변환도 가능
추가 정보
  • 초기 용량 설정:
    만약 리사이징을 최소화하고 싶다면, 커스텀한 컬렉션 타입이나 초기 용량을 지정할 수 있는 방법을 고려해볼 수 있음
    그러나 스프링 MVC에서는 메서드 파라미터에 직접적인 초기 용량 설정을 지원하지 않음
  • 대안 방법:
    매우 큰 리스트를 처리해야 한다면, 스트림이나 다른 방식으로 데이터를 처리하는 것을 고려해볼 수 있다.
    예를 들어, @RequestBody를 사용하여 JSON 배열을 직접 매핑하는 방법이 있다.
요약
  • 리사이징은 발생할 수 있지만, 일반적으로 큰 문제가 되지 않음
  • 스프링은 요청 파라미터를 처리할 때 ArrayList를 사용하여 컬렉션을 생성하고, 필요한 경우 내부적으로 용량을 늘림
  • HTTP 요청 처리 과정에서 스프링은 파라미터 추출, 타입 변환, 컬렉션 생성을 순차적으로 수행
반응형

댓글