✅ 전체 흐름 요약
[1] 클라이언트 → HTTP 요청 (JSON 문자열)
↓
[2] DispatcherServlet (Spring의 Front Controller)
↓
[3] HandlerMapping → Controller 매핑
↓
[4] HandlerAdapter 실행
↓
[5] HttpMessageConverter 를 통해 JSON → Java 객체 변환 (@RequestBody)
↓
[6] Controller 메서드에서 DTO 사용
✅ 주요 구성 요소 설명 + 예시
1. 클라이언트 요청 (JavaScript + Axios)
const user = { name: "홍길동", age: 30 };
axios.post('/api/users', JSON.stringify(user), {
headers: {
'Content-Type': 'application/json'
}
});
보내는 HTTP 요청 헤더는 아래와 같다.
POST /api/users
Content-Type: application/json
{"name": "홍길동", "age": 30}
2. DispatcherServlet
- Spring MVC 의 진입점
- Front Controller 라고 부르며 이름처럼 모든 앞단에서 HTTP 요청을 받는다.
- 요청을 받은 Front Controller 는 알맞는 @RequestMapping 의 Controller 에게 전달한다.
3. HandlerMapping & HandlerAdapter
- HandlerMapping: 어떤 Controller 가 이 요청을 처리할지 결정한다.
어플리케이션이 시작됐을 때 Spring 에서 HandllerMapping이 @RequestMapping 에 해당하는 URL 들을
모아 Map 형태로 저장해놓는다.
- HandlerAdapter: 해당 Controller의 메서드를 호출하기 위해 필요한 준비 작업을 수행한다.
4. HttpMessageConverter
- @RequestBody 가 붙은 파라미터는 HttpMessageConverter 가 처리하여 변환시킨다.
- JSON 요청의 경우 MappingJackson2HttpMessageConverter 가 처리한다.
@PostMapping("/api/users")
public ResponseEntity<?> createUser(@RequestBody UserDto userDto) {
// 여기서 userDto는 JSON 문자열이 자동으로 변환된 Java 객체
}
내부적으로 MappingJackson2HttpMessageConverter 인 Jackson(ObjectMapper)이 Java 객체로 변환한다.
주의할점
여기서 만약 UserDto 객체의 키값들이 모두 UPPER_SNAKE_CASE 처럼 대문자일 경우 변환되지 않는다.
값이 모두 null 로 표시될것이다.
데이터 형태
data: JSON.stringify({
'TEXT_COMMAND' : text_command,
'J_INTERVAL' : j_interval,
'NEXT_DATE' : next_date
})
Java Class
Integer J_INTERVAL;
String TEXT_COMMAND;
Date NEXT_DATE;
Jackson 매핑은 camelCase 기준이라서 DTO Model 객체에 매핑되지 않는다.
해결방법은 Java Class DTO 를 모두 소문자로 변경하거나 camelCase 로 변경하면 된다.
@Getter
@Setter
@ToString
public class MasterBatchJob {
private String textCommand;
private Date nextDate;
private Integer jInterval;
}
// 또는
@Getter
@Setter
@ToString
public class MasterBatchJob {
private String text_command;
private Date next_date;
private Integer j_interval;
}
✅ 디버깅 팁
- HttpMessageConverter는 Spring Boot 스타터 웹 (spring-boot-starter-web)이 자동 등록합니다.
- 사용 중인 Converter를 로그로 확인하려면 다음을 Bean으로 설정:
@Bean
public CommandLineRunner runner(List<HttpMessageConverter<?>> converters) {
return args -> {
converters.forEach(converter -> {
System.out.println("Converter: " + converter.getClass());
});
};
}
✅ 역방향: Java 객체 → JSON 응답
@GetMapping("/api/user")
public ResponseEntity<UserDto> getUser() {
UserDto dto = new UserDto();
dto.setName("홍길동");
dto.setAge(30);
return ResponseEntity.ok(dto);
}
위의 경우 Java 에서 JSON 응답할때는 MappingJackson2HttpMessageConverter 가 자동으로 변환해준다.
✅ 요약: 핵심 동작 순서
순서 |
구성요소 |
역할 |
1 |
DispatcherServlet |
요청 수신 및 라우팅 |
2 |
HandlerMapping / HandlerAdapter |
컨트롤러 결정 및 실행 |
3 |
@RequestBody |
JSON 본문을 DTO로 매핑 |
4 |
HttpMessageConverter |
JSON ⇄ Java 객체 자동 변환 |
5 |
Jackson(ObjectMapper) |
실제 변환 수행 |