10:00 ~ 11:00 Spring 심화 발제
16:00 ~ 17:00 성능 최적화 실습 ( 스탠다드반 )
1️⃣ HttpMethodConverter
✅ HttpMethodConverter
View를 응답하는 것이 아닌, Rest API(HTTP API)로 JSON, TEXT, XML 등의 데이터를 응답 Message Body에 직접 입력하는 경우 HttpMessageConverter를 사용
1. SSR → @Controller + View Template → 서버 측에서 화면을 동적으로 그린다.
2. CSR → @RestController + Data → 클라이언트 측에서 화면을 동적으로 그린다.
- HttpMessageConverter가 적용되는 경우
- HTTP 요청 : @RequestBody, HttpEntity<>, RequestEntity<>
- HTTP 응답 : @ResponseBody, HttpEntity<>, ResponseEntity<>
- HttpMessageConverter는 요청과 응답 모두 사용
HttpMessageConverter 내부구조
- candRead(), canWrite() 메소드로 Class, MediaType 지원 여부를 체크함.
- read(), write() 메서드로 HttpMessage 를 읽고 쓴다.
✅ 우선순위
대표적인 HttpMessageConverter
- ByteArrayHttpMessageConverter
- byte[] Data를 처리한다.
- 대상 : byte[]
- MediaType : */*
- 반환 : application/octet-stream
- StringHttpMessageConverter
- String Data를 처리한다.
- 대상 : String
- MediaType : */*
- 반환 : text/plain
- MappingJackson2HttpMessageConverter
- JSON Data를 처리한다.
- 대상 : Object, HashMap
- MediaType : application/json
- 반환 : application/json
✅ 동작 순서와 예시
1. 요청 데이터 읽기
- Controller에서 @RequestBody 혹은 HttpEntity<>로 파라미터 바인딩함.
- MessageConverter는 canRead() 메서드로 읽기가능 여부를 조회한다.
- 대상 클래스가 byte[], String, Object 인지 여부 확인
- 요청 헤더의 Content-Type Media Type 지원여부 확인(consumes)
- read() 메서드를 호출하여 Object를 생성한다.
2. 응답 데이터 쓰기
- Controller에서 @ResponseBody 혹은 HttpEntity<>로 응답이 반환
- MessageConverter는 canWrite() 메서드로 사용가능 여부를 조회한다.
- 반환 클래스가 byte[], String, Object 인지 여부 확인
- 요청 헤더 Accept 의 Media Type 지원여부 확인(produces)
- write() 메서드를 호출하여 HTTP Response Message Body에 데이터를 입력한다.
HttpMessageConverter를 주로 사용하는 어노테이션 @RequestBody, @ResponseBody

- 요청시에는 Argument Resolver가 사용하는것이다.
- 응답시에는 ReturnValueHandler가 사용한다.
2️⃣ ArgumentResolver
✅ ArgumentResolver
Spring MVC에서 컨트롤러 메서드의 파라미터를 자동으로 바인딩하는 역할을 하는 인터페이스로 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 적절한 객체로 변환하여 주입하는 것을 담당
- ArgumentResolver의 실제 이름
- 인터페이스로 구성되어 있다.
- implements 하여 커스텀하게 파라미터를 만들 수 있다.(확장)
- supportsParameter(MethodParameter parameter);
- 컨트롤러가 필요로하는 메서드의 파라미터를 지원하는지 여부를 검사한다.
- 지원한다면 resolveArgument() 메서드를 통해 Object(객체)로 만들어준다.
- 만들어진 Object(객체)가 Controller 호출시 메서드의 파라미터로 전달된다.
- supportsParameter() 를 사용하는 다양한 ArgumentResolver 구현체
✅ ReturnValueHandler
- ModelAndView, @ResponseBody, HttpEntity<> 등이 있으면 응답에 필요한 값으로 변환
- Controller에서 String으로 ViewName을 반환하여도 View가 동작하는 이유
- Spring은 다양한 ReturnValueHandler를 기본적으로 제공한다.
- ModelAndViewMethodReturnValueHandler(ModelAndView 객체 반환)
- HandlerMethodReturnValueHandler
- ReturnValueHandler의 실제 이름
- 인터페이스로 구성되어 있다. 즉, 확장이 가능
3️⃣ TypeConverter
✅ 타입 변환
Spring에서 객체의 타입을 서로 변환하는 데 사용되는 인터페이스로 Spring의 데이터 바인딩 과정에서 문자열을 특정 객체로 변환하거나 하나의 객체 타입을 다른 타입으로 변환할 때 사용
문자를 숫자로, 숫자를 문자로 변환하는 등 Web Application을 만들다보면 Type을 변환해야 하는 경우가 많이 발생
HttpServletRequest
@Slf4j
@RestController
public class TypeConverterController {
@GetMapping("/param")
public void param(HttpServletRequest request) {
// 조회시 : String
String stringExample = request.getParameter("example");
// Integer로 Type 변환
Integer integerExample = Integer.valueOf(stringExample);
log.info("integerExample = {}", integerExample);
}
}
@RequestParam
@GetMapping("/v2/param")
public void paramV2(@RequestParam Integer example) {
// Integer 타입으로 바인딩
log.info("example = {}", example);
}
추가적인 변환 작업을 거치지 않고 Integer 타입으로 바인딩된다.
- 결론
- 요청 파라미터로 전달하는 10 값은 실제로는 문자열(String) 10이다.
- @RequestParam을 사용하면 문자 10을 Integer 타입의 숫자 10으로 변환된다.
- @ModelAttribute, @PathVariable 에서도 타입 변환을 확인할 수 있다.
- Spring 내부에서 누군가가 타입을 자동으로 변환한다.
4️⃣ Converter
Spring에서 제공하는 다양한 Converter 인터페이스가 존재하며 이들은 Spring의 데이터 바인딩, 요청/응답 처리, 속성 값 주입 등에 사용되고 ConversionService를 통해 등록 및 관리된다.
- Converter
- 기본적인 변환을 담당하는 인터페이스
- 단일 타입에서 단일 타입으로 변환할 때 사용한다.
- Converter<Source, Type>
- ConverterFactory
- 클래스 계층 구조가 복잡한 경우 사용
- 기본 타입과 다양한 서브 타입 간의 변환을 지원한다.
- GenericConverter
- 다양한 타입 간의 유연한 변환을 지원한다.
- 복잡한 타입 변환 로직을 구현할 때 유리하다.
- ConditionalGenericConverter
- GenericConverter 의 확장형으로 특정 조건에서만 타입 변환을 수행한다.
- 추가적으로 matches() 를 통해 변환 가능 여부를 판단할 수 있다
5️⃣ ConversionService
✅ ConversionService
Spring은 Converter를 모아서 편리하게 관리하고 사용할 수 있게 해주는 기능을 제공한다. 이것이 Conversion Service
- canConvert()
- Convert 가능 여부를 확인하는 기능
- convert()
- 실제 변환하는 기능
✅ DefaultConversionService
Spring의 표준 ConversionService로 기본 제공 Converter와 확장 가능성을 통해 다양한 타입 변환을 유연하게 처리할 수 있도록 지원
✅ ISP(인터페이스 분리 원칙)
클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리하는 원칙

- DefaultConversionService
- ConversionRegistry : 컨버터 등록
- ConversionService : 컨버터 사용
- 인터페이스를 분리하면 컨버터를 사용하는 클라이언트는 필요한 메서드만 알면된다.
- ConversionRegistry 가 변경되어도 ConversionService와 연관이 없다.
- Spring은 내부적으로 위와같이 등록, 사용이 분리된 인터페이스들이 아주 많다.
💡 Spring은 내부적으로 ConversionService를 사용해 타입을 변환한다. 대표적으로 @RequestParam , @PathVariable, @ModelAttribute 등이 해당 기능을 사용
6️⃣ 정리
- HttpMessageConverter
- 사용처
- HTTP 요청 : @RequestBody, HttpEntity<>, RequestEntity<>
- HTTP 응답 : @ResponseBody, HttpEntity<>, ResponseEntity<>
- 우선순위
- byte[]
- String
- JSON
- 사용처
- Spring 내부 구조
- ArgumentResolver
- HTTP 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 알맞은 객체로 변환하는 인터페이스
- ReturnValueHandler
- 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 인터페이스
- ArgumentResolver
- Converter, Formatter
- Converter
- 특정 타입을 다른 타입으로 변환할 때 사용하는 인터페이스
- Formatter
- 사용자 지정 포맷을 적용해 데이터 변환을 처리할 때 사용하는 인터페이스
- WebMvcConfigurer
- 설정을 통해 Converter, Formatter를 추가할 수 있다.
- ConversionService
- 어댑터 패턴
- Converter, Formatter 일관성 있게 사용할 수 있다.
- HttpMessageConverter
- ConversionService가 적용되지 않는다.
- 역할
- 요청 메세지 본문(RequestBody)을 객체로 변환하거나
- 객체를 응답 본문(ResponseBody)에 입력하는 것
- JSON을 객체로 변환하는데는 Jackson 라이브러리를 사용한다.
- @JsonFormat, Deserializer 사용
- ConversionService는 대표적으로 @RequestParam, @ModelAttribute, @PathVariable 등에서 사용한다.
- Converter, Fommatter를 직접 구현하고, ConversionService에 등록해서 사용할 수 있다.
- Converter
- 핵심
- Spring에서 제공하는 대부분의 기능은 인터페이스로 만들어져 있다.
- 기본적으로 제공하는 구현체들이 다양하다.
- 개발자는 만들어진 기능을 잘 사용하면된다.
- 만약 확장하고자 하는 영역이 있다면 그 부분을 확장시켜 프로젝트에 적용하면 된다.
TMI
- 내일부터 3일간 (수~금) 예비군 동원훈련 이슈로 빠지게된다. 개인 프로젝트를 못할 수도 있지만 튜터님의 조언으로는 강의에 집중하는 것이 맞다고 하시는 분도 계셔서 부담없이 해야겠다. ( 주말에 시간투자 해야겟다.... )
'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글
| 테스트 코드 ( 이론 ) (0) | 2025.04.21 |
|---|---|
| TIL 41 - [ Spring 심화 ( API 예외처리, JPQL, Fetch Join ) ] (0) | 2025.04.21 |
| TIL 39 [ Spring 기초 프로젝트 ( D-day ) - 발표/마무리, 트러블슈팅 ] (0) | 2025.04.14 |
| TIL 38 [ Spring 기초 프로젝트 ( Day 5 ) - 마무리 작업 ( ppt, 대본, ERD/API명세서 리뉴얼) ] (0) | 2025.04.11 |
| TIL 37 [ Spring 기초 프로젝트 ( Day 4 ) - 구현 ( 게시판 댓글 기능 연동 ), 스탠다드반 ( JPA 성능 최적화 ) ] (0) | 2025.04.10 |