[SPRING] HttpMessageConverter, ArgumentResolver, ReturnValueHandler, Formatter

림민지·2025년 4월 16일

Today I Learn

목록 보기
46/62

🧾 1. Spring의 기본 구조

웹 브라우저에서 우리가 어떤 주소에 접속하거나 버튼을 누르는 것 → 요청(Request)
Spring은 이런 요청을 받아서 처리하고, 응답(Response)을 돌려준다!

예를 들어, 주소창에 이렇게 입력한다면
http://localhost:8080/hello?name=minjee
브라우저 → 서버에 요청 → Spring → 요청 안의 정보(name=minjee) 꺼내기 →컨트롤러(Controller) → 처리 결과를 응답(Response)으로!


🪄 2. HttpMessageConverter: 데이터를 바꿔주는 마법사

HttpMessageConverter란?
웹 요청은 우리가 눈으로 볼 수 있는 글자나 JSON 형식으로 보내진다
하지만! 그럼에도 불구하거!!! 컨트롤러에서는 이런 걸 객체로 받고 싶어한다..(이기적인넘)
(JSON → Java 객체로 / Java 객체 → JSON으로)

이걸 해주는 게 바로 ⚡️HttpMessageConverter⚡️!!

만약 컨트롤러의 코드를 이렇게 작성해서 reqeust를 입력받을떄

@RestController
public class HelloController {
    @PostMapping("/hello")
    public Person hello(@RequestBody Person person) {
        return person;
    }
}

요청을 아래처럼 보내면

{
  "name": "wonuk",
  "age": 10
}

컨트롤러에서는 Person 객체로 자동 변환해준다~!
이 변환을 해주는 게 MappingJackson2HttpMessageConverter! (Jackson 라이브러리)


🧠 3. ArgumentResolver: 컨트롤러에 값 넣기

Spring이 컨트롤러 메서드를 호출할 때 파라미터를 넣어줘야 하자나요?

@GetMapping("/hello")
public String hello(@RequestParam String name) {
    return "Hello " + name;
}

여기서 name에 들어갈 값을 컴퓨터가 알아서 ㅇㅋ 이거 가져감 하는게 아니라,,
ArgumentResolver가 알잘깔딱딱딱 넣어주는 거임
➡️ 요청의 데이터를 파라미터에 "자동으로" 넣어줌
@RequestParam, @ModelAttribute, @RequestBody, HttpServletRequest 등을 자동 처리해준다


🎁 4. ReturnValueHandler: 컨트롤러의 결과를 포장

컨트롤러에서 결과를 리턴하면 끝인가?

아님!! 그 결과를 HTTP 응답으로 바꿔서 클라이언트한테 보내줘야 함

그걸 도와주는 게 바로 ReturnValueHandler

@GetMapping("/hi")
public Person hi() {
    return new Person("minjee", 24);
}

이 결과를 JSON으로 바꾸는 데에도 HttpMessageConverter가 쓰이는데,
ReturnValueHandler가 그걸 호출해서 결과를 반영해줌


🔁 5. Converter와 Formatter: 타입 변환 도우미

Converter란?

문자열을 객체로 바꿔주는 역할

"10"10 (StringInteger)
"wonuk:1200"Person(name="wonuk", age=100)
public class StringToPersonConverter implements Converter<String, Person> {
    @Override
    public Person convert(String source) {
        String[] parts = source.split(":");
        return new Person(parts[0], Integer.parseInt(parts[1]) / 12);
    }
}

Formatter란?

Converter랑 비슷한데, 문자 ↔ 객체 변환에 포맷팅 기능이 추가된 거예요.

예: 10000 → "10,000"
예: "10,000" → 10000

public class PriceFormatter implements Formatter<Number> {
    @Override
    public String print(Number object, Locale locale) {
        return NumberFormat.getInstance(locale).format(object);
    }

    @Override
    public Number parse(String text, Locale locale) throws ParseException {
        return NumberFormat.getInstance(locale).parse(text);
    }
}

⚙️ 6. WebMvcConfigurer로 설정 커스터마이징하기

보통은 그냥 스프링에 내장된 컨버터나 포매터를 사용한다..!
근데, 내가 커스텀한 Converter나 Formatter를 Spring에 등록하려면?

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToPersonConverter());
        registry.addFormatter(new PriceFormatter());
    }
}

이렇게 하면 Spring이 자동으로 우리가 만든 변환기들을 사용하고, 내장된 것들보다 우선으로 처리해주게 된다!

profile
@lim_128

0개의 댓글