웹 브라우저에서 우리가 어떤 주소에 접속하거나 버튼을 누르는 것 → 요청(Request)
Spring은 이런 요청을 받아서 처리하고, 응답(Response)을 돌려준다!
예를 들어, 주소창에 이렇게 입력한다면
http://localhost:8080/hello?name=minjee
브라우저 → 서버에 요청 → Spring → 요청 안의 정보(name=minjee) 꺼내기 →컨트롤러(Controller) → 처리 결과를 응답(Response)으로!
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 라이브러리)
Spring이 컨트롤러 메서드를 호출할 때 파라미터를 넣어줘야 하자나요?
@GetMapping("/hello")
public String hello(@RequestParam String name) {
return "Hello " + name;
}
여기서 name에 들어갈 값을 컴퓨터가 알아서 ㅇㅋ 이거 가져감 하는게 아니라,,
ArgumentResolver가 알잘깔딱딱딱 넣어주는 거임
➡️ 요청의 데이터를 파라미터에 "자동으로" 넣어줌
@RequestParam, @ModelAttribute, @RequestBody, HttpServletRequest 등을 자동 처리해준다
컨트롤러에서 결과를 리턴하면 끝인가?
아님!! 그 결과를 HTTP 응답으로 바꿔서 클라이언트한테 보내줘야 함
그걸 도와주는 게 바로 ReturnValueHandler
@GetMapping("/hi")
public Person hi() {
return new Person("minjee", 24);
}
이 결과를 JSON으로 바꾸는 데에도 HttpMessageConverter가 쓰이는데,
ReturnValueHandler가 그걸 호출해서 결과를 반영해줌
문자열을 객체로 바꿔주는 역할
"10" → 10 (String → Integer)
"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);
}
}
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);
}
}
보통은 그냥 스프링에 내장된 컨버터나 포매터를 사용한다..!
근데, 내가 커스텀한 Converter나 Formatter를 Spring에 등록하려면?
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToPersonConverter());
registry.addFormatter(new PriceFormatter());
}
}
이렇게 하면 Spring이 자동으로 우리가 만든 변환기들을 사용하고, 내장된 것들보다 우선으로 처리해주게 된다!