inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 웹 MVC

@RequestBody와 @ModelAttribute

445

taehee-kim-dev

작성한 질문수 21

0

안녕하세요, 수업 잘 보고 있습니다.

저는 Controller에서 RequestMapping을 할 때 습관적으로 @ModelAttribute를 적어주는데요,

Client단에서 JSON으로 요청을 보냈을 때,

@RequestBody와 함께 @ModelAttribute를 적으면 제대로 바인딩이 안되는 경험을 했습니다.

@RequiredArgsConstructor
@RestController
public class NotificationController {

    private final NotificationService notificationService;
    private final NotificationDeleteRequestDtoValidator notificationDeleteRequestDtoValidator;

    @InitBinder("notificationDeleteRequestDto")
    public void initBinderForNotificationDeleteRequestDtoValidator(WebDataBinder webDataBinder){
        webDataBinder.addValidators(notificationDeleteRequestDtoValidator);
    }

    @PostMapping(NOTIFICATION_DELETE_URL)
    public ResponseEntity deleteNotification(@SessionAccount Account sessionAccount,
                                             @Valid @RequestBody @ModelAttribute NotificationDeleteRequestDto notificationDeleteRequestDto,
                                             Errors errors){
        if(errors.hasErrors()){
            return ResponseEntity.badRequest().build();
        }
        // notificationService.deleteNotification(sessionAccount, notificationDeleteRequestDto);
        return ResponseEntity.ok().build();
    }
}

이렇게 하면 바인딩이 안되어 null값으로 들어오고,

@RequiredArgsConstructor
@RestController
public class NotificationController {

    private final NotificationService notificationService;
    private final NotificationDeleteRequestDtoValidator notificationDeleteRequestDtoValidator;

    @InitBinder("notificationDeleteRequestDto")
    public void initBinderForNotificationDeleteRequestDtoValidator(WebDataBinder webDataBinder){
        webDataBinder.addValidators(notificationDeleteRequestDtoValidator);
    }

    @PostMapping(NOTIFICATION_DELETE_URL)
    public ResponseEntity deleteNotification(@SessionAccount Account sessionAccount,
                                             @Valid @RequestBody NotificationDeleteRequestDto notificationDeleteRequestDto,
                                             Errors errors){
        if(errors.hasErrors()){
            return ResponseEntity.badRequest().build();
        }
        // notificationService.deleteNotification(sessionAccount, notificationDeleteRequestDto);
        return ResponseEntity.ok().build();
    }
}

이렇게 하면 바인딩이 잘 되더군요..

@ModelAttribute는 @RequestBody와 같이 쓰면 안되는건가요 원래?

아니면 제가 뭔가 잘못한 게 있는건가요?

spring java MVC

답변 4

0

taehee-kim-dev

아 아니네요..

@PathVariable은 주소에 URI로 들어오지만

@RequestParam은 POST요청의 경우 본문에 들어오니까..

결국 @ModelAttribute는 요청 매개변수형태(key=value)는 쿼리파라미터든 본문이든 모두 매핑이 되지만, JSON형태는 매핑이 안되는 거군요? 

0

백기선

대충 맞습니다만 조금 더 구체적으로요. @MA, @PV, @RP로 받는 값들은 그럼 요청 본문에 들어오는 내용이 아닌가요? 어디로 들어오나요?

0

taehee-kim-dev

@ModelAtteibute는 @PathVariable이나 @RequestParam으로 들어오는 값들만 매핑이 돼서,

@RequestBody로 들어오는, 즉 JSON형태로 요청 body 본문에 들어오는 내용은 매핑을 못하는 것 같은데.. 맞나요??

0

백기선

수업 중에 @MA와 @RB를 다루는 수업이 있으니 공부를 하신다음에 천천히 생각해 보시고 스스로 생각하는 답을 적어주시면 리뷰해 드리겠습니다.

7:58 예제 코드 찾는 법

0

256

2

PATCH의 Idempotent에 대한 질문

0

257

1

2:51초 질문입니다.

0

324

1

만약 어플리케이션컨텍스트에 필터를 설정하지 않으면 어떻게되나요?

0

361

0

web.xml에 위치한 애플리케이션 web.xml 내에서 파싱 오류 발생

0

515

0

Spring Boot 2.6 이상 버전에서의 DispatcherServlet

0

366

1

Event`Xxx`Controller 분리할때의 기준에 관한 질문입니다.

0

634

1

11분 57초 쯤, `returnValueHandlers` 들의 네이밍컨벤션 관련 질문입니다.

0

379

1

@EnableWebmvc 설정을 하면

0

415

1

springframework와의 차이점

0

283

1

@RequestBody의 바인딩에러를 잡는 방법

1

1655

2

안녕하세요 기선님 강의를 보다 서블릿에 궁금증이 생겨 질문 드립니다

1

237

1

HelloService의 값을 전달을 못 받습니다.

0

296

1

ServletContext와 WebApplicationContext의 관계 질문

1

740

1

하나의 서비스에, 두개의 리포지토리도 연결이 되나요?

0

364

1

view name 리턴에 대해

0

290

2

Formatter print 질문 드립니다.

0

232

1

에리 메시지가 한글입니다.

0

293

1

java 클래스파일로 설정되어 있던 것을 web.xml로 바꾸는 경우

0

338

1

@RequestParam

0

255

1

@Retention 질문

0

229

1

Event.builder() 관련 mac에서 lombok 문제 있으신 분들

0

198

1

스프링 부트 사용시 WebMvcConfigurerSupport 클래스

0

252

1

http://localhost:8080/hello 입력시 오류

0

492

4