DevBoi

[Spring] ModelAttribute 본문

Develop/[Spring]

[Spring] ModelAttribute

HiSmith 2022. 4. 28. 11:57
반응형

커맨드 객체에 대한 기능에 대해서 알아야 한다.

 

서블릿의 생명주기

서블릿 컨테이너가 서블릿 인스턴스의 init()메서드를 호출하여, 초기화한다.

서블릿이 초기화된 다음부터 클라이언트가 요청을 처리할 수 있다.

각 요청은 별도 스레드로 처리하고, 이때 서블릿의 service메서드를 호출한다.

이안에서 HTTP 요청을 받고, 클라이언트로 보낼 HTTP응답을 만든다.

get,post에 따라서 doGet이나 doPost등으로 위임하여 처리한다.

서블릿 컨테이너 판단에 따라 서블릿을 메모리에서 내려야할 시점에 destroy를 호출한다.

 

서블릿은 개발자가 Http요청 메시지를 편리하게 사용할 수 있도록

HTTP 요청 메시지를 파싱한다. 결과를 HttpServletRequest객체에 담아서 제공한다.

 

HttpServletRequest의 핵심기능은 HttpServlet의 요청을 받아서 꺼내서 쓸수 있다.

request.getParameter("key") 같은 방식으로 사용하게 되면, 1:1방식으로 request내용을 받아서 사용할 수 있다.

 

많아질수록 가독성이떨어지면  안되니까, (10개면, 10개를 다 이런식으로 처리할수 없어서). 나온것이 커맨드 객체이다.

 

커맨드 객체란

HttpServletRequest를 통해 들어온 파라미터들을 setter메서드를 이용하여 객체에 정의되어있는 속성에 바인딩이 되는 객체를 의미한다.

커맨드 객체는 보통 DTO를 의미하고, HttpServletRequest로 받아오는 요청 파라미터의 key값과 동일한 이름의 속성과 메서드를 가지고 있어야 합니다.

 

스프링이 내부적으로 HttpServletRequest와 커맨드 객체의 setter 메서드를 이용해서 바인딩 시켜준다.

 

* 커맨드 패턴 : 클라이언트가 전달하는 파라미터를 1:1로 전담 프로퍼티에 담아내는 방식이 커맨드 패턴 그 자체이다.

 

위치

메서드명 위, 파라미터 옆 이렇게 두가지 위치에서 사용가능하다.

 

1. 파라미터 옆 (model에 객체를 담아준다. 검증 작업을 내부적으로 진행해준다.)

커맨드 객체와 같이 요청 파라미터들을 객체 프로퍼티에 바인딩 시켜준다는 것이다. -> 하지만, 생략해도 바인딩이 된다. 

이유는, 스프링이 내부적으로 String , int 등은 ReqeustParam, 그외 복잡한 객체들은 ModelAttribute가 생략됬다고 간주하기 때문이다.

-> RequestParam의 경우, 자동으로 파라미터 타입을 변환해주는데 실패하면 typemismatch가 뜬다.

ModelAttribute는 내부적으로 검증작업을 진행한다. setter메서드를 이용하여 값을 바인딩하려고 시도하다가 예외를 만나지만, 

작업이 중단되지 않는다. 타입변환에 실패해도 작업은 계속 되고, BindingException 타입의 객체에 담겨서 컨트롤러로 전달 된다.

 

 

2.매서드 위

해당 컨트롤러 내의 어떠한 핸들러 메서드들 보다, ModelAttribute가 있는 메서드가 먼저 동작하게 된다.

따라서 여러 핸들러 메서드에서 공통으로 쓰이며, View단에서도 꺼내 쓸일이 있는 것들을 저렇게 처리한다.

다른 메서드를 호출할때, 항상 @ModelAttrivute가 붙은 메소드를 먼저호출하고, 그 다음 요청한 메서드를 호출한다.

 

만약 ModelAttrivute를 모든 Controller에 전역적으로 사용하고 싶다면, ControllerAdvice에 선언하면 된다.

 

반응형

'Develop > [Spring]' 카테고리의 다른 글

@SessionAttribute에 대해서  (0) 2022.04.29
[Spring] static 과 스프링 빈의 차이  (2) 2022.04.29
[Spring] 웹 통신 , 스프링 동작 과정  (0) 2022.04.08
[Spring] WebClient  (0) 2022.03.30
[Spring] RestTemplate  (0) 2022.03.29