Spring

Spring 다양한 @(어노테이션) 설정

Clearing 2022. 9. 23. 09:29
728x90

@RequestParam (메서드에 인자로 사용)
Command 객체에는 없는 파라미터를 Controller 클래스에게 전달해주기 위해 사용

ex) @RequestParam(value="searchCondition",defaultValue="TITLE",required=false)String searchCondition

          value="무엇을 받을지" defaultValue="값이 없을때 기본 값" required="필수 여부"

String SearchCondition에 View에서 보내준 searchCondition이라는 name의 value 값이 들어간다.

 

@ModelAttribute("설정한 이름") (메서드에 작성하거나 인자 앞에 붙여 사용)
 View 작업자 입장에서 화면을 구성할 때 칼럼을 알아야 만들 수 있는 것들에 대해 해당 값들에 대한 정보를 몰라도
출력할 수 있도록 컨트롤러에서 세팅해서 값을 넘겨줄 수 있다.

즉, View에서 사용할 데이터를 Controller에서 설정하는 용도로 사용되며 @RequestMapping 메서드보다 먼저 호출된다.

@ModelAttribute 메서드는 실행 이후에 객체를 반환하는데, 이 반환 값은 Model에 자동 저장된다.

Model에 자동 저장되기 때문에, View에서 사용이 가능하다.

 

Controller 예시

@ModelAttribute("scMap")
	public Map<String,String> searchConditionMap(){
		Map<String,String> scMap = new HashMap<String,String>();
		scMap.put("제목", "title"); // 뷰에 어떻게 보여야하는지, 모델에서 어떻게 쓰는지
		scMap.put("작성자", "writer");
		
		return scMap;
	}

View 예시

        <select name="searchCondition">
            <c:forEach var="v" items="${scMap}">
                <option value="${v.value}">${v.key}</option>
            </c:forEach>
        </select>

실행화면

 

@SessionAttributes("설정한 이름") (클래스에 사용)

View 작업자는 기능만 알고, 내부 로직은 모르는 상황에서  (필요한 데이터인데) 전달되지 않는 파라미터가 발생할 수 있다.

때문에 전달되지 않은 파라미터의 값은 null이 되어 null 값이 업데이트될 수도 있는 "NULL 업데이트 이슈"가 발생한다.

이러한 NULL 업데이트 이슈를 방지하기 위하여 @SessionAttributes를 사용한다.

해당 클래스 내의 메서드에서 설정한 이름의 데이터가 Model 객체에 세팅이 된다면,

세팅된 데이터를 session에 기억시킨다.

 

@Controller
@SessionAttributes("data") // "data라는 이름의 데이터가 Model 객체에 세팅이 된다면, 그것을 session에 기억시키겠다.
public class BoardController {}

 

@ModelAttribute("이름")을 Controller의 메서드 인자(==Command 객체) 앞에 붙이면
해당 "이름"을 가진 데이터와 메서드 인자(==Command 객체)가 동일하다는 설정

1) 사용자가 요청을 했을 때 @SA에 설정된 이름으로 Model에 저장

 

2) Model에 @SA에 설정한 이름으로 저장된 데이터가 존재한다면,
    해당 데이터를 세션에도 자동으로 저장하겠다는 설정


3) NULL 업데이트 이슈가 발생할법한 메서드의 인자에게 @MA를 설정하면,
    @SA에 의해 저장되어있던 데이터가 자동 매핑됨

 

예시)

게시판 상세 페이지로 이동하기 위해 selectOneBoard 메서드를 사용하면 모델에 data라는 이름으로 bVO객체를

세팅하기 때문에 @SessionAttributes("data")에 의해 세션에도 자동 저장

이후 updateBoard 메서드 사용 시 인자로 사용되는 bVO에 @ModelAttribute("data")에 의해 모델에 세팅된

data라는 데이터가 bVO로 설정

@ModelAttribute("data")의 설정이 먼저 진행되고 사용자의 요청 정보는 해당 객체 위에 덮어씌워 진다.

@Controller
@SessionAttributes("data") // "data라는 이름의 데이터가 Model 객체에 세팅이 된다면, 그것을 session에 기억시키겠다.
public class BoardController {

	@RequestMapping("/board.do")
	public String selectOneBoard(BoardVO bVO,BoardDAO bDAO,Model model) {
		
		bVO=bDAO.selectOneBoard(bVO);
		model.addAttribute("data",bVO);

		return "board.jsp";

	}

    @RequestMapping("/updateBoard.do")
        public String updateBoard(@ModelAttribute("data")BoardVO bVO,BoardDAO bDAO) {

            bDAO.updateBoard(bVO);

            return "redirect:main.do";

        }
}
728x90

'Spring' 카테고리의 다른 글

Spring 이미지 업로드  (0) 2022.09.27
2-Layered 아키텍처  (0) 2022.09.26
Spring MVC2 .xml 설정 어노테이션으로 변경  (0) 2022.09.22
Spring MVC2 DispatcherServlet.xml 설정  (0) 2022.09.21
MVC 패턴의 변화  (0) 2022.09.20