본문 바로가기
✨ Back-end/Spring-Legacy

[Spring-Legacy] @ModelAttribute와 ModelAndView

by 환풍 2023. 8. 29.
728x90
반응형

 

servlet-context.xml

 

 

<context:component-scan>

 스프링 프레임워크에서 컴포넌트 스캔을 수행하는 설정 요소이다.

이 설정을 사용하면 지정한 패키지나 패키지들을 스캔하여 관련된 컴포넌트를 자동으로 찾아 빈으로 등록할 수 있다. servlet-context.xml에 <context:component-scan>을 설정함으로써 스프링 컨테이너는 해당 패키지 아래에 있는 컴포넌트들을 검색하고 빈으로 등록한다.

여기서 주로 사용되는 속성은 base-package이다. 이 속성은 스캔할 대상 패키지를 지정한다. base-package에 지정한 패키지부터 하위 패키지까지 컴포넌트 스캔이 수행한다.

예를 들어, <context:component-scan base-package="com.bit.controller"/>라는 설정을 사용했다면 다음과 같은 동작이 이루어진다.

 

1. 스프링 컨테이너가 시작될 때, com.bit.controller 패키지와 그 하위 패키지를 스캔한다.
2. 스캔된 패키지 내에서 @Controller, @Service, @Repository 등과 같은 스프링의 어노테이션을 가지고 있는 클래스들을 찾는다.
3. 찾은 클래스들을 스프링 빈으로 등록한다.
즉, 위의 설정은 com.bit.controller 패키지 내에 있는 컴포넌트들을 스캔하고 해당 컴포넌트들을 스프링 빈으로 등록하게 된다. 이렇게 등록된 빈들은 스프링의 IoC 컨테이너에서 관리되며, 필요한 곳에서 주입되거나 사용될 수 있다.


ModelAndView


BasicController

@RequestMapping("/hiMvc")

이 어노테이션은 해당 메서드가 어떤 URL 패턴에 대해 요청을 처리하는지를 지정한다.

이 경우 "/hiMvc"라는 URL에 대한 요청을 처리하는 메서드이다.

 

modelAndView.addObject("msg", "Hello Spring MVC")

이 메서드는 "msg"라는 이름으로 "Hello Spring MVC"라는 데이터를 모델에 추가한다. 이 데이터는 뷰에서 사용된다.

modelAndView.setViewName("basicView/message")

이 메서드는 이 요청을 처리한 후 사용할 뷰의 이름을 설정한다.

"basicView/message"는 실제로 "WEB-INF/views/basicView/message.jsp" 뷰를 나타낸다.

스프링은 이 정보를 바탕으로 적절한 뷰를 찾아 렌더링한다.

 

message.jsp

${  } 을 이용해서 값을 출력해보면 이렇게 Model 값이 나온 것을 확인할 수 있다.

 

컨트롤러

첫번째 메소드 방식에서는 ModelAndView 객체를 반환하고, 모델에 데이터를 추가하고 뷰 이름을 설정한다.

ModelAndView모델 정보를 함께 갖고 있으며, 모델에 데이터를 추가하고 뷰 이름을 설정하여 처리 결과를 반환한다.

 

두번째 메소드 방식에서는 메서드의 매개변수로 Model 객체를 받아서 모델에 데이터를 추가하고, 메서드가 반환하는 값은 뷰의 이름을 나타낸다. String값인 basicView/message는 실제 뷰의 경로를 나타내며, 해당 뷰가 사용되는걸 나타낸다.

차이점

첫 번째 방식은 ModelAndView 객체를 사용하여 모델과 뷰를 한 번에 관리한다.

두 번째 방식은 메서드의 매개변수로 Model 객체를 받아서 모델에 데이터를 추가하며, 뷰 이름을 반환 뷰를 결정한다.


매개변수에 @ModelAttribute

 

DTO를 생성하고, jsp에서 form 태그를 하나 만들어주었다.

input 박스에 "환풍" , 1234, "010-1222" 를 넣어보았다.

 

컨트롤러

submit된 것이 /formMVC의 경로로 오게되면서, ModelAttribute 어노테이션이 자동으로 데이터를 jsp에 뿌려준다.

@ModelAttribute

이 어노테이션은 요청 파라미터를 ParamDTO 객체에 바인딩하도록 지정한다. p 라는 이름으로 전달되는 요청 파라미터들이 ParamDTO 객체의 필드에 매핑된다.

인코딩이 EUC-KR이기 때문에 문자 데이터가 깨져나오지만, 이후 데이터들이 잘 나온 것을 확인해볼 수 있다.

 


또, 위와 같이 객체에 @ModelAttribute를 하는것 대신에, 메소드에 @ModelAttribute를 해줄 수도 있다.

메소드에 @ModelAttribute

컨트롤러

컨트롤러의 메소드에 @ModelAttribute를 리턴한 값으로 준 후 해당 컨트롤러를 타는 뷰에 뿌려보았다.

 

hiMvc6을 보면, 왼쪽 사진의 messageList 메소드에 있는 Model 값도 나타난 것을 확인할 수 있다.

이렇게하면, 해당 컨트롤러를 타게 되는 모든 뷰에서 뿌릴 수 있어 재사용하기 편리하다.

728x90
반응형

댓글