TIL 40 - [ Spring 심화 ( HttpMethodConverter, Converter, Formatter ) ]

2025. 4. 15. 22:36·[내일배움캠프-Sparta]/Spring 6기
반응형

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가 적용되는 경우
    1. HTTP 요청 : @RequestBody, HttpEntity<>, RequestEntity<>
    2. HTTP 응답 : @ResponseBody, HttpEntity<>, ResponseEntity<>
    • HttpMessageConverter는 요청과 응답 모두 사용

HttpMessageConverter 내부구조

  • candRead(), canWrite() 메소드로 Class, MediaType 지원 여부를 체크함.
  • read(), write() 메서드로 HttpMessage 를 읽고 쓴다.

✅ 우선순위

대표적인 HttpMessageConverter

  1. ByteArrayHttpMessageConverter
    • byte[] Data를 처리한다.
    • 대상 : byte[]
    • MediaType : */*
    • 반환 : application/octet-stream
  2. StringHttpMessageConverter
    • String Data를 처리한다.
    • 대상 : String
    • MediaType : */*
    • 반환 : text/plain
  3. 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() 메서드로 사용가능 여부를 조회한다.
    1. 반환 클래스가 byte[], String, Object 인지 여부 확인
    2. 요청 헤더 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

  1. ModelAndView, @ResponseBody, HttpEntity<> 등이 있으면 응답에 필요한 값으로 변환
    • Controller에서 String으로 ViewName을 반환하여도 View가 동작하는 이유
  2. 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 타입으로 바인딩된다.

  • 결론
    1. 요청 파라미터로 전달하는 10 값은 실제로는 문자열(String) 10이다.
    2. @RequestParam을 사용하면 문자 10을 Integer 타입의 숫자 10으로 변환된다.
    3. @ModelAttribute, @PathVariable 에서도 타입 변환을 확인할 수 있다.
    • Spring 내부에서 누군가가 타입을 자동으로 변환한다.

4️⃣ Converter

Spring에서 제공하는 다양한 Converter 인터페이스가 존재하며 이들은 Spring의 데이터 바인딩, 요청/응답 처리, 속성 값 주입 등에 사용되고 ConversionService를 통해 등록 및 관리된다.

  1. Converter
    • 기본적인 변환을 담당하는 인터페이스
    • 단일 타입에서 단일 타입으로 변환할 때 사용한다.
      • Converter<Source, Type>
  2. ConverterFactory
    • 클래스 계층 구조가 복잡한 경우 사용
    • 기본 타입과 다양한 서브 타입 간의 변환을 지원한다.
  3. GenericConverter
    • 다양한 타입 간의 유연한 변환을 지원한다.
    • 복잡한 타입 변환 로직을 구현할 때 유리하다.
  4. ConditionalGenericConverter
    • GenericConverter 의 확장형으로 특정 조건에서만 타입 변환을 수행한다.
    • 추가적으로 matches() 를 통해 변환 가능 여부를 판단할 수 있다

5️⃣ ConversionService

✅ ConversionService

Spring은 Converter를 모아서 편리하게 관리하고 사용할 수 있게 해주는 기능을 제공한다. 이것이 Conversion Service

  1. canConvert()
    • Convert 가능 여부를 확인하는 기능
  2. convert()
    • 실제 변환하는 기능

✅ DefaultConversionService

Spring의 표준 ConversionService로 기본 제공 Converter와 확장 가능성을 통해 다양한 타입 변환을 유연하게 처리할 수 있도록 지원

✅ ISP(인터페이스 분리 원칙)

클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리하는 원칙

  • DefaultConversionService
    1. ConversionRegistry : 컨버터 등록
    2. ConversionService : 컨버터 사용
  • 인터페이스를 분리하면 컨버터를 사용하는 클라이언트는 필요한 메서드만 알면된다.
  • ConversionRegistry 가 변경되어도 ConversionService와 연관이 없다.
  • Spring은 내부적으로 위와같이 등록, 사용이 분리된 인터페이스들이 아주 많다.

💡 Spring은 내부적으로 ConversionService를 사용해 타입을 변환한다. 대표적으로 @RequestParam , @PathVariable, @ModelAttribute 등이 해당 기능을 사용

 

6️⃣ 정리 

  • HttpMessageConverter
    • 사용처
      1. HTTP 요청 : @RequestBody, HttpEntity<>, RequestEntity<>
      2. HTTP 응답 : @ResponseBody, HttpEntity<>, ResponseEntity<>
    • 우선순위
      1. byte[]
      2. String
      3. JSON
  • Spring 내부 구조
    • ArgumentResolver
      • HTTP 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 알맞은 객체로 변환하는 인터페이스
    • ReturnValueHandler
      • 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 인터페이스
  • Converter, Formatter
    • Converter
      • 특정 타입을 다른 타입으로 변환할 때 사용하는 인터페이스
    • Formatter
      • 사용자 지정 포맷을 적용해 데이터 변환을 처리할 때 사용하는 인터페이스
    • WebMvcConfigurer
      • 설정을 통해 Converter, Formatter를 추가할 수 있다.
    • ConversionService
      • 어댑터 패턴
      • Converter, Formatter 일관성 있게 사용할 수 있다.
    • HttpMessageConverter
      • ConversionService가 적용되지 않는다.
      • 역할
        1. 요청 메세지 본문(RequestBody)을 객체로 변환하거나
        2. 객체를 응답 본문(ResponseBody)에 입력하는 것
      • JSON을 객체로 변환하는데는 Jackson 라이브러리를 사용한다.
        • @JsonFormat, Deserializer 사용
    • ConversionService는 대표적으로 @RequestParam, @ModelAttribute, @PathVariable 등에서 사용한다.
    • Converter, Fommatter를 직접 구현하고, ConversionService에 등록해서 사용할 수 있다.
  • 핵심
    • 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
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • 테스트 코드 ( 이론 )
  • TIL 41 - [ Spring 심화 ( API 예외처리, JPQL, Fetch Join ) ]
  • TIL 39 [ Spring 기초 프로젝트 ( D-day ) - 발표/마무리, 트러블슈팅 ]
  • TIL 38 [ Spring 기초 프로젝트 ( Day 5 ) - 마무리 작업 ( ppt, 대본, ERD/API명세서 리뉴얼) ]
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    네트워크
    Python
    코딩테스트
    컴퓨터구조
    AWS
    Java
    cs
    OS
    메모리
    알고리즘
    Testcode
    It
    운영체제
    spring
    CPU
    docker
    web
    트랜잭션
    세션
    Til
    배포
    network
    SQLD
    내일배움캠프
    KPT
    개발자
    db
    SQL
    백엔드
    웹
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 40 - [ Spring 심화 ( HttpMethodConverter, Converter, Formatter ) ]
상단으로

티스토리툴바