개발/Java

@ParameterObject vs @RequestBody 차이점 정리

뇽.뇽 2025. 5. 16. 17:44
반응형
반응형

 

스프링(Spring)에서 백엔드 API를 개발할 때, 프론트엔드(Angular)와 통신하는 방식에 따라 데이터를 받는 방법이 달라집니다. 특히 파일 업로드, 복잡한 객체 전달처럼 POST, PUT 요청이 필요한 경우에는 @RequestBody를 써야 하고, 단순 필터링/쿼리 조회 같은 GET 요청에서는 @ParameterObject를 사용하는 게 적절합니다.

최근 제가 겪은 실제 문제를 예시로 사용하면서 개념을 함께 정리해보겠습니다.


문제 상황: @ParameterObject로는 파일을 받을 수 없었던 이유

상황 설명

Angular에서 POST 방식으로 서버에 데이터를 보낼 때, JSON 객체 안에 파일 리스트(FileList)를 함께 전송했습니다.

const formData = new FormData();
formData.append('title', this.form.value.title);
formData.append('file', this.selectedFile); // File 객체 포함

this.http.post('/api/upload', formData).subscribe();

 

서버에서는 아래처럼 @ParameterObject로 받았는데, 파일이 null로 들어왔습니다.

@PostMapping("/upload")
public void uploadFile(@ParameterObject MyUploadDto dto) {
    // dto.getFile() -> null
}

 

원인

@ParameterObject는 GET 방식의 요청 파라미터(query string)에서 값을 매핑할 때 사용하는 어노테이션입니다.
FormData, JSON, 파일 전송 등은 Body 영역에 담겨 전송되므로 @RequestBody를 사용해야 합니다.

 

해결 방법

@PostMapping("/upload")
public void uploadFile(@RequestBody MyUploadDto dto) {
    // 정상적으로 File 리스트 포함 데이터 수신 가능
}

 

단, 파일 업로드는 일반적으로 MultipartFile을 쓰는 것이 권장되므로, 실제로는 아래처럼 받는 것이 좋습니다.

@PostMapping("/upload")
public void uploadFile(@RequestParam("title") String title,
                       @RequestPart("file") MultipartFile file) {
    // file 처리
}

 


어노테이션별 사용 정리

어노테이션 용도 요청 방식 예시

@PathVariable URL 경로에서 값을 추출할 때 GET, DELETE /api/users/{id}
@RequestParam 단일 쿼리 파라미터 받을 때 GET, POST /api/search?keyword=abc
@ParameterObject 여러 쿼리 파라미터를 객체로 받을 때 GET /api/search?name=kim&age=30
@RequestBody JSON 객체를 body로 받을 때 POST, PUT 등 Angular에서 http.post(..., body)
@RequestPart Multipart 요청 시 개별 파트 POST (파일 업로드 등) FormData, file upload

 


주의할 점

  • @ParameterObject는 내부적으로 @ModelAttribute처럼 동작합니다. 따라서 Body 데이터를 파싱하지 않습니다.
  • FormData를 사용할 경우 스프링에서는 @RequestBody가 아니라 @RequestPart 또는 @RequestParam으로 처리해야 합니다.
  • @RequestBody는 파일 업로드와 호환되지 않기 때문에, JSON + 파일을 함께 보내는 경우에는 @RequestPart + DTO 분리로 처리해야 합니다.

마무리 정리

Angular와 Spring 통신 시 데이터 전달 방식에 따라 적절한 어노테이션을 사용하지 않으면 파일이 null로 들어오거나, 객체가 비어있는 현상이 발생할 수 있습니다.

 

상황 사용 방식

URL에서 값 가져오기 @PathVariable
GET 요청, 다수 파라미터 @ParameterObject ← Angular에서는 params로 전달
POST/PUT 요청, JSON 데이터 @RequestBody ← Angular에서는 body로 전달
파일 업로드 @RequestParam or @RequestPart ← Angular는 FormData 사용

 

반응형