반응형
스프링에서의 요청 파라미터 처리 과정에 대해서 정리해보았다.
- 파라미터 추출: 스프링은 HTTP 요청에서 동일한 이름을 가진 파라미터들을 모두 추출한다.
예시: ?ids=1&ids=2&ids=3이라는 요청이 있다면, ids라는 이름의 파라미터 값은 ["1", "2", "3"] - 타입 변환: 추출한 파라미터 값들을 메서드 파라미터의 제네릭 타입에 맞게 변환한다.
이때 스프링의 ConversionService가 사용되어 문자열을 Integer, Long, String 등으로 변환 - 컬렉션 생성: 변환된 값들을 담을 컬렉션 객체를 생성한다.
스프링은 기본적으로 ArrayList를 사용하여 컬렉션을 만듦
리사이징 발생 여부
- 내부적으로 리사이징이 발생할 수 있다.
- ArrayList는 초기 용량(capacity)을 가지고 있으며, 요소가 추가되면서 용량이 부족하면 내부 배열을 재할당하여 크기를 늘린다.
- 따라서 요청 파라미터의 개수가 초기 용량을 초과하면 리사이징이 발생한다.
- 리사이징의 영향:
일반적인 웹 애플리케이션에서는 요청 파라미터의 수가 많지 않기 때문에 리사이징으로 인한 성능 저하는 미미
그러나 매우 큰 규모의 리스트를 처리해야 하는 경우라면, 리사이징으로 인한 오버헤드를 고려해야 할 수 있음
스프링의 HTTP 요청 처리 메커니즘
- HandlerMethodArgumentResolver:
@RequestParam이 붙은 메서드 파라미터는 RequestParamMethodArgumentResolver에 의해 처리
이 클래스는 요청에서 파라미터 값을 추출하고, 필요한 경우 타입 변환을 수행 - ConversionService:
문자열로 전달된 파라미터 값을 지정된 타입으로 변환하는 역할
기본 타입 외에도 커스텀 컨버터를 등록하여 복잡한 객체로의 변환도 가능
추가 정보
- 초기 용량 설정:
만약 리사이징을 최소화하고 싶다면, 커스텀한 컬렉션 타입이나 초기 용량을 지정할 수 있는 방법을 고려해볼 수 있음
그러나 스프링 MVC에서는 메서드 파라미터에 직접적인 초기 용량 설정을 지원하지 않음 - 대안 방법:
매우 큰 리스트를 처리해야 한다면, 스트림이나 다른 방식으로 데이터를 처리하는 것을 고려해볼 수 있다.
예를 들어, @RequestBody를 사용하여 JSON 배열을 직접 매핑하는 방법이 있다.
요약
- 리사이징은 발생할 수 있지만, 일반적으로 큰 문제가 되지 않음
- 스프링은 요청 파라미터를 처리할 때 ArrayList를 사용하여 컬렉션을 생성하고, 필요한 경우 내부적으로 용량을 늘림
- HTTP 요청 처리 과정에서 스프링은 파라미터 추출, 타입 변환, 컬렉션 생성을 순차적으로 수행
반응형
'IT > Java' 카테고리의 다른 글
[Error] Deprecated unwrapped fragment expression "~/~" found in template ~/~ (13) | 2024.10.11 |
---|---|
Spring Banner 만들기 (14) | 2024.10.09 |
[Error] Invalid character found in method name / HTTP method names must be tokens (12) | 2024.10.05 |
ApiGateway 예제 (17) | 2024.09.28 |
Char To Int (The method parseInt(String) in the type Integer is not applicable for the arguments (char))(getNumericValue) (8) | 2024.09.16 |
댓글