본문 바로가기

Framework/Spring

[Spring] Spring에서 요청 받는 법: @ModelAttribute vs @RequestParam - 컴도리돌이

728x90
728x90

API 요청을 받을 때 @ModelAttribute와 @RequestParam 어노테이션을 어떻게 사용해야 효과적인지, 각각의 차이점과 장단점을 비교해 보겠습니다. 이 두 어노테이션은 Spring에서 자주 사용되며, 요청 데이터를 받는 방식에서 중요한 역할을 합니다.

@ModelAttribute

@ModelAttribute는 객체 단위로 요청을 받을 때 유용합니다. 특히, 메인 페이지의 주요 리스트와 같이 여러 필드를 가진 요청을 받을 경우 유용하죠. 예를 들어, 클라이언트가 일부 필드를 빼먹거나 추가 필드를 보내더라도, @ModelAttribute는 기본적으로 없는 필드는 null로 처리하고, 불필요한 필드는 무시합니다.

@GetMapping("list")
public ResponseEntity<TempResponseDto> getList(@ModelAttribute TempRequestDto tempRequestDto) {
    return ResponseEntity.ok().body(tempService.getList(tempRequestDto));
}

 

개발을 진행하다 보니, 클라이언트가 특정 필드를 빠뜨리거나 불필요한 필드를 보내오는 경우가 꽤 발생할 거예요. @ModelAttribute를 쓰면 빠진 필드는 null로, 없는 필드는 무시되는 편리함이 있지만, 그만큼 클라이언트와의 커뮤니케이션이 중요해집니다. 누락된 필드가 쌓이면 어느 순간 “내가 이 필드가 왜 비었지?” 하며 데이터를 추적하게 되죠. 물론 풀스택 개발자분들은 신경 안 쓰시고 진행하시면 돼요. 🥲 

 

@RequestParam

@RequestParam은 특정 파라미터를 직접 매핑하여 받기에 적합합니다. 

@GetMapping("list")
public ResponseEntity<TempResponseDto> getList(@RequestParam(value = "name") String name, @RequestParam(value = "age") String age) {
    return ResponseEntity.ok().body(tempService.getList(name, age));
}

 

기본 설정으로 required 옵션이 true이므로, 클라이언트가 해당 값을 보내지 않으면 다음과 같이 예외가 발생할 수 있습니다.

Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present]

 

그렇기 때문에 이를 사용할 때는 클라이언트와 백엔드 간의 협업이 중요합니다. 요청 데이터가 빈번히 바뀌거나, 다수의 필드를 관리해야 한다면 @RequestParam의 required 옵션을 false로 설정하거나 Map <String, Object>로 받는 방법도 좋습니다.

@GetMapping("list")
public ResponseEntity<TempResponseDto> getList(@RequestParam Map<String, Object> map) {
    return ResponseEntity.ok().body(tempService.getList(map));
}

 

Map 형태로 받으니 확장성도 좋고 필드가 누락되어도 에러가 발생하지 않아서, 필요한 필드만 쏙쏙 빼와 사용할 수 있다는 점이 장점이 될 수 있지만, 프론트엔드 개발자와 협업할 때는 요청 타입을 확인하는 데 시간도 더 들고, 구조가 다소 모호해질 수 있어요. 한 프로젝트에서 프론트와 백을 모두 관리할 수 있는 환경이라면 괜찮지만, 각자 다른 환경에서 개발하면 의사소통 과정에서 “이 필드 왜 빠졌죠?” 하는 식으로 체크할 일이 생길 수 도 있습니다. 

 

두 어노테이션을 선택할 때는 요청 데이터의 복잡도와 클라이언트와의 협업 방식을 꼭 고려해야 한다고 느낍니다. @ModelAttribute는 객체 전체를 다룰 때 편리하지만, 데이터의 완성도를 보장할 수 없습니다. @RequestParam은 명확한 필드 단위로 관리하기 좋지만, 모든 필드를 수동으로 매핑하는 번거로움이 따릅니다. 그럴 때는 Map으로 받으시면 아주 편한 개발이 될 거예요. 하지만 유지보수는 장담 못합니다.🤓


 

 

728x90
728x90