새소식

반응형
Java/Spring

Spring 에서 클라이언트의 API 요청(JSON 요청) 변환 및 처리 과정

  • -
반응형

✅ 전체 흐름 요약

[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) 실제 변환 수행

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.