Back-end/Spring-핵심& webMVC

@ModelAttribute의 쓰임과 Model, ModelMap, ModelAndView

prden 2021. 5. 11. 13:53

1. @ModelAttribute를 이용한 커맨드 객체 이름 지정

아래와 같이 ModelAttribute를 이용해서 클래스 이름을 변경해서 뷰 코드에서 사용할 때 이용가능하다. 

view 단에서 접근 할 때 $(memberInfo.name)이렇게 접근하면 된다.

@RequestMapping(method = RequestMethod.POST)
	public String regist(
			@ModelAttribute("memberInfo") MemberRegistRequest memRegReq,
			BindingResult bindingResult) {
		new MemberRegistValidator().validate(memRegReq, bindingResult);
		if (bindingResult.hasErrors()) {
			return MEMBER_REGISTRATION_FORM;
		}
		memberService.registNewMember(memRegReq);
		return "member/registered";
	}

2. @ModelAttribute 애노테이션을 이용한 공통 모델

아래와 같이 목록화면과 상세보기화면에서 함께 사용되는 데이터가 있을 경우 @ModelAttribute를 사용하면 된다. -코드 중복 막을 수 있음

따라서 event/list 화면영역과 event/detail 화면 영역에서 모두 ${recEventList}로 데이터 불러올 수 있다.

물론 , 목록 컨트롤러에서는 ${evnetList}, ${evnetTypes} 등을 이용해서 데이터를 불러올 수도 있다. 

@Controller
@RequestMapping("/event")
public class EventController {
	private static final String REDIRECT_EVENT_LIST = "redirect:/event/list";
	private EventService eventService;

	public EventController() {
		eventService = new EventService();
	}

	@ModelAttribute("recEventList")
	public List<Event> recommend() {
		return eventService.getRecommendedEventService();
	}

	@RequestMapping("/list")
	public String list(SearchOption option, Model model) {
		List<Event> eventList = eventService.getOpenedEventList(option);
		model.addAttribute("eventList", eventList);
		model.addAttribute("eventTypes", EventType.values());
		return "event/list";
	}

	@InitBinder
	protected void initBinder(WebDataBinder binder) {
		CustomDateEditor dateEditor = new CustomDateEditor(new SimpleDateFormat("yyyyMMdd"), true);
		binder.registerCustomEditor(Date.class, dateEditor);
	}

	@RequestMapping("/detail")
	public String detail(HttpServletRequest request, Model model) throws IOException {
		String id = request.getParameter("id");
		if (id == null)
			return REDIRECT_EVENT_LIST;
		Long eventId = null;
		try {
			eventId = Long.parseLong(id);
		} catch (NumberFormatException e) {
			return REDIRECT_EVENT_LIST;
		}
		Event event = getEvent(eventId);
		if (event == null)
			return REDIRECT_EVENT_LIST;

		model.addAttribute("event", event);
		return "event/detail";
	}
############################################################
@ModelAttribute("recEventList")
	public List<Event> recommend() {
		return eventService.getRecommendedEventList();
	}

	@RequestMapping("/list")
	public String list(@ModelAttribute("recEventList") List<Event> recEventList,
     Model model) {
		//이런 식으로 @ModelAttribute 애노테이션이 적용된 메서드의 객체(public List<Event> recommend())를 
        //@RequestMapping애노테이션이 적용된 메서드에서 접근할 수 있다. 
       

3. @ModelAttribute 를 이용한 페이지 내 권한 부여 

prde.tistory.com/36페이지 수준 권한부여 여기를 참조

 

페이지 수준 권한 부여

1. 스프링 시큐리티를 이용하여 페이지 내에서 특정 권한 or 특정 이름을 가지고 있는 사용자에게만 특정 목록 or 특정 버튼 보이게 설정하기 1. Controller에서 아래와 같이 @ModleAttribute("showCounselLink"

prde.tistory.com

4. Model vs. ModelMap vs. ModelAndView

Model model 

model.addAttribute("hello", "aaa"); // ${hello}로 접근

 

ModelAndView

 1) Model을 이용해 뷰에 전달할 데이터 설정 //mav.addObject("questions", question);

 2) 결과를 보여줄 뷰 이름 리턴 // mav.setViewName("경로");

@GetMapping
public ModelAndView form() {
	List<Question> questions = createQuestions();
    ModelAndView mav = new ModelAndView();
    mav.addObject("qusetions", questions);
    mav.setViewName("survey/surveyForm");
    return mav;
 }

ModelMap

Model은 인터페이스이고 ModelMap은 클래스이다. (즉, 같은 것임)

modelMap.addAttribute("hello", "bbb");

 

https://cocobi.tistory.com/140

 

[Spring] Model 객체 (Model, ModelMap, ModelAndView)에 대해서

🙄 Model, ModelMap, ModelAndView 스프링의 Model 객체에는 Model, ModelMap, ModelAndView 가 있다. 위 3개의 객체를 크게 두 가지로 관점에서 본다면 Model(ModelMap) vs ModelAndView로 나눌 수 있다. 1️⃣ Model(ModelMap) vs

cocobi.tistory.com