[STS] 데이터 전달

안아현·2024년 8월 13일

Spring

목록 보기
4/13

Model

  1. 개념
    컨트롤러에서 생성한 데이터를 담아 view(jsp 등)에 전달하는 객체이다. 따로 생성할 필요 없이, Model 객체를 메서드의 파라미터로 두면 된다.

  2. 사용법

public class BoardController{
	private BoardMapper mapper;
    ...
    public BoardVO view(Long no, Model model) {
    	BoardVO vo = mapper.view(no);
		model.addAttributes("vo", vo);
        return "board/view";
	}
}

메서드의 파라미터로 Model 객체를 둠으로써 Model 객체를 별도로 생성하지 않는 것을 확인할 수 있다. request.setAttribute("vo", vo)를 대신하여 model.addAttributes("vo", vo)를 사용하여 jsp 파일에 데이터를 전달한다.
-> jsp에서는 ${vo}로 전달된 데이터를 사용할 수 있다.



@ModelAttribute

//uri: localhost/생략/view.do?no=121&id=ah&page=1

public String ex(Member member, @ModelAttribute("page") int page){
	//Member 객체 -> Long no, String id가 존재
}

위 코드는 책에서 발췌한 일부를 수정한 코드이다. 저자는 @ModelAttribute는 타입에 관계없이 무조건 Model에 담아 전달하는 어노테이션이라고 했다. 다시 말해, 위 코드는 uri의 no, id가 Member의 no, id에 할당되는 것은 물론 int 타입인 page에도 1이 할당된다는 것이다.
저자의 요지는 기본 데이터 타입인 변수에 대해서도 @ModelAttribute를 사용하면 바인딩이 지원된다는 것 같다.

여러 글을 참고한 결과는 다음과 같다.

  • Member 같은 객체 속성에 대해서는 @ModelAttribute를 사용하는 것이 적절하다.
  • page와 같은 기본 데이터 타입 변수에 대해서는 @RequestParam을 사용하는 것이 적절하다.

결론을 적용한 코드는 다음과 같이 수정할 수 있다.

//uri: localhost/생략/view.do?no=121&id=ah&page=1
//Member 객체 -> Long no, String id가 존재

//1. @RequestParam 사용
public String ex(Member member, @RequestParam("page") int page){
}

//2. Wrapper 객체로 변경
public String ex(Member member, Integer page){
}

//참고로 명시성을 높이기 위해 객체 앞에 @ModelAttribute를 추가하는 것이 권장된다.

Integer, Long는 wrapper class의 일종으로 결론적으로 객체에 해당한다. 따라서 어노테이션을 생략할 수 있는 것이다.



RedirectAttribute

  1. 개념
    일회성 데이터 전달에 사용되는 전달 객체이다. 보통은 특정 기능을 수행하고 redirect 페이지에서 결과 메시지를 띄울 때 사용된다. RedirectAttribute가 반드시 리다이렉트에서만 사용되는 것은 아니지만, 리다이렉트가 아닌 경우에는 Model 객체를 사용하는 것이 적절하다.
  1. 사용법
redirectAttributes.addFlashAttribute("message", "Success!");

보통의 사용법은 다음과 같다. 가령 로그인 결과를 Modal 등으로 띄울 때 사용된다. message 속성의 value를 Success! 혹은 Failed! 등으로 전달하여 모달로 띄우도록 할 수 있다.

redirectAttributes.addAttribute("page", "1");

또 다른 사용법이다. uri 파라미터의 값을 redirect 하면서 지정할 수 있다. 잘 사용되지는 않는다.

profile
programming

0개의 댓글