Challenge, and Growth ! Introduce
                                                                                                             

Welcome to my blog 🙌🏻

Total

Today

Yesterday













Framework/Spring

[Spring] ModelAndView, Model - MVC, Observer(옵저버) 패턴

뽀시라운 2024. 1. 24. 21:15
반응형
SMALL

[목차여기]

Spring Framework의 MVC 패턴에서 자주 등장하는 ModelAndViewModel에 대해서 알아볼 것이다.

먼저 MVC 패턴과 비슷한 Observer(옵저버) 패턴을 알아보자.

 

MVC 패턴

 

MVC = Model + View + Controller

사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴이다.

소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있다.

 

Controller는 Model을 통해서 데이터를 가지고 오고 그 정보를 바탕으로 시각적인 요소를 담당한 View를 제어하여 사용자에게 전달한다. 

즉, Controller에서 View를 다룬다! 라고 말할 수 있다.

 

Model

Model은 사용자가 원하는 모든 데이터를 가지고 있어야한다. 그리고 View나 Controller에 대한 어떤 정보도 알 수 없다. 독립적으로 자신이 수행하는 일에 대한 정보만 알아야 한다. 마지막으로 Model의 데이터가 수정된다면 Controller에게 알려야 하며 이 점에서 Observer 패턴과 닮았다.

다수의 View가 하나의 Model을 구독(Subscribe)하는 형태다.

 

View

View는 사용자 인터페이스(UI)를 담당하는 컴포넌트다. Model이 가지고 있는 정보들을 기반으로 사용자가에게 화면을 보여준다.

 

Model이 가지고 있는 정보를 저장해서는 안되고, Model이나 Controller에 대한 어떤 정보도 알 수 없다. 마찬가지로 View에 변경 사항이 있다면 Controller에게 알려야 한다. 이 점도 Observer 패턴과 닮았다.

 

Controller

View와 Model을 연결하여 실질적으로 사용자의 요청을 처리하는 컴포넌트다. Model이 작업을 마치면 그 결과를 View에 전달하며, 따라서 Model이나 View의 정보를 알고 있어야 하고 계속 모니터링 해야한다.

 

Observer(옵저버) 패턴

하나의 객체(Subject)의 상태를 관찰하는 여러개의 옵저버(Observer)를 통해, 객체의 상태가 변하면 변경사항을 옵저버에게 통보해준다. 통보 받은 옵저버는 값을 자신의 상황에 맞춰 대응한다. (삭제, 수정 등)

 

 

옵저버 패턴은 나중에 단독 주제로 게시글을 작성해야겠다..!

 

 

 

이제 실제 코드에서 Model과 ModelAndView가 어떻게 사용되는지 알아볼 것이다.

Model

Model 방식은 메서드에 Model을 파라미터로 가지고 String 형태로 반환한다.

그리고 Model에 속성을 추가할 때 addAttribute(key, value)를 사용한다.

@Controller
@RequestMapping("/")
public class Controller {

	@RequestMapping(value = "index")
	public String index(Model model) {	
    
	   model.addAttribute("color", "red");
        
	   return model;
    }
}

 

 

ModelAndView

ModelAndView는 객체를 생성해서 객체 형태로 반환한다.

Model + View 라고 생각해도 된다.

그리고 Model에 속성을 추가할 때 addObject()를 사용하고, 값을 보낼 View 이름을 설정할 때 setViewName(name)을 사용한다.

@Controller
@RequestMapping("/")
public class Controller {
	
    public ModelAndView mainPage(HttpServletRequest request) throws Exception {
    
    	ModelAndView mnv = new ModelAndView();
        
        HashMap<String, Object> userInfo = SessionUtil.getSessionLoginInfo(session);
        mnv.addObject("userInfo", userInfo);
        
        mnv.setViewName("/mainPage");
        
        return mnv;
    }    
    
}

 

즉, ModelAndView는 뷰 이름과 모델 데이터를 포함하는 객체로 Spring MVC에서 컨트롤러가 뷰에 데이터를 전달하는 데 사용된다.

컨트롤러의 처리결과를 보여줄 뷰와 뷰에 전달할 값을 저장하는 용도다.

 

모델 객체가 반환되면 이때 ViewResolver가 동작하고 WEB-INF 안에서 /mainPage를 찾는다.

ViewResolver가 View를 찾으면 Dispatcher Servlet은 뷰에 모델데이터를 전달하고 view를 렌더링하여 최종적으로 클라이언트에 응답을 보낸다.

 

 

생각

내가 개발을 할 때 여러 레퍼런스들을 참고하는데, Model을 사용한 경우가 별로 없었다.

그 이유가 Model(ModelAndView)은 요즘 기술이 아니라는 것이다. 

 

생각해보면 Spring에서 @Controller라는 엄청난 어노테이션이 있는데 바로 매핑하여 JSON 형태를 주고받아도 되기 때문이다. 그래도 회사나 레거시들은 Model을 잘 사용하고 있기 때문에 알아두는 것이 좋을 것 같다.

 

반응형
LIST
loading