본문 바로가기
IT Study/Spring

Spring - @RequestParam/@ModelAttribute/@SessionAttribute

by hhyyyjun 2023. 1. 3.

@RequestParam

- 기존의 스코프를 통한 request.getParameter()와 같은 기능이다.

- 단일 파라미터를 쉽게 가져올 수 있는 방법 중 하나이다.

- 구조를 바꾸기 힘들 때 사용하는 경우가 있다.(VO에서 멤버변수를 추가하는 등의 구조변경)

- Command 객체에는 없는 파라미터를 Controller 클래스에게 전달해주기 위해 사용한다.

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

구조

@RequestParam(value="value", defaultValue="default Value", required=boolean type)[데이터 타입][값을 담을 변수]

- Value

View로부터 가져온 데이터이며, 해당 데이터는 지정한 변수에 저장된다.

- defaultValue

@RequestParam의 type중 하나이며, Value가 존재하지 않는 경우 default 값을 지정할 수 있다.

- required

@RequestParam의 type이며 필수여부를 판별한다. 해당 type을 지정하지 않은 경우 default로 true가 지정되며, false일 경우 값이 넘어오지 않아도 된다. 만약 true일 경우에는 값이 무조건 넘어와야 하는데, value가 존재하지 않을 경우에는 400대 에러가 발생할 수 있다.

**주의할 점

파라미터 값을 저장할 때 데이터 타입을 int 타입으로 지정할 수 있다.

하지만 null 값이 들어오는 경우 int 타입은 null값이 존재하지 않기 때문에 에러가 발생하게 된다.

따라서 String 타입으로 활용하는 것을 지향한다.


@ModelAttribute

Controller에서 생성된 데이터를 담아 View로 전달할 때 사용한다.

만약 View의 입장에서 검색기능을 넣을 때 사용자가 어떤 데이터를 통해 검색할지 테이블의 칼럼을 알아야 만들 수 있다.

하지만 View 작업자는 Model 파트에 관여하지 않기 때문에 칼럼을 알 수 없어 Controller에서 넘겨준 데이터를 통하여 사용한다.

ModelAttribute 설정

//검색관련 map 제공, RequestMapping보다 먼저 호출됨
	@ModelAttribute("scMap")
	public Map<String, String> searchConditionMap(){
		//인자는 없고 Map을 반환할 예정 > 검색조건에 들어갈 Map
		Map<String, String> scMap = new HashMap<String,String>();
		//option 태그의 값을 가져옴
		scMap.put("제목", "TITLE"); // ("뷰에 어떻게 보여야 하는지", "실제로 모델에서 쓰는 값") > 컨트롤러가 알기 때문에 관리
		scMap.put("작성자", "WRITER");
		return scMap; // >> model.AddAttribute 된 상태
	}

@ModelAttribute의 특징

- @requestMapping 보다 먼저 호출된다.

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

- 자동 저장된 값을 통해 View에서 사용 가능하다.

View는 칼럼을 알지 못해도 Controller을 통해 데이터를 받았기 때문에 EL식을 통해 사용자에게 UI&UX를 제공할 수 있다.


@SessionAttributes

- Model 객체의 정보를 Session에 저장해주는 어노테이션이다.

- null 값이 업데이트 되는 경우를 방지하기 위해 사용하기도 한다.

세션에 데이터를 저장하는 방법은

ModelAttribute 메서드를 통한 방법과

기존의 Session 객체를 통한 Session.setAttribute 메서드를 사용하는 방법이 있다.

@Controller
@SessionAttributes("member") //@SA의 "이름"지정하여 model에 저장
public class MemberController { //클래스 상단에 위치시킨다.

사용방법

1) 클래스위에 추가한다.

2) 사용자가 요청을 했을 때 @SessionAttributes에 설정된 이름으로 model에 저장한다.

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


SessionAttributes에 설정된 이름으로 세션 저장하기

예를 들어 사용자가 로그인을 한다면, 해당 사용자의 로그인 정보를 세션에 저장하여 회원정보 변경 등의 기능에서 사용할 수 있도록 해야한다.

따라서 @SessionAttribute에 설정한 "이름"과 동일한 이름으로 데이터를 저장하여 사용한다.

	@RequestMapping(value="/login.do", method=RequestMethod.POST)
	public String selectOneMember(MemberVO mVO,MemberDAO mDAO, HttpSession session, Model model){
		mVO=mDAO.selectOneMember(mVO);

		if(mVO==null) {
			return "redirect:login.jsp";
		}
		else {
			model.addAttribute("member", mVO);
			return "main.do";
		}
	}

코드에서 확인할 점은, 위에서 선언한 SessionAttributes에서 설정한 "이름"과 Model에 저장할 값에 대한 속성명을 동일하게 설정한다는 것이다.

@ModelAttribute("이름") 을 통해 데이터 매핑하기

세션에 저장되어있던 데이터를 매핑하는 방법

update.do 요청을 받았을 때, member에 저장된 세션정보가 mVO 객체에 자동매핑 된다. 이는 null 값을 방지할 수 있다.

View로부터 받아올 파라미터 값이 있다면 mVO에 세션정보 매핑 이후 전달된 파라미터값만 저장된다.(전달된 데이터가 없는 값은 세션값 유지)

세션처리

추가한 세션을 처리하고 싶은 경우 SessionStatus 클래스가 제공하는 setComplete() 메서드를 사용하면 세션이 제거되어 처리할 수 있다.

@RequestMapping("/logout.do")
	public String logout(SessionStatus sessionStatus){
		sessionStatus.setComplete(); //세션 삭제하기
		return "redirect:login.do";
	}

@SessionAttribute와 @SessionAttributes의 차이점

@SessionAttributes

해당 Controller 내에서는 Model과 HttpSession에 저장이 되지만 다른 Controller에서는 적용이 안된다.

=> 해당 Controller 내에서 다루는 특정 모델 객체를 세션에 넣고 공유할 때 사용한다.

@SessionAttribute

Controller 밖에서 만들어 준 세션 데이터에 접근할 때 사용한다.

=> 마지막에 s가 붙지 않는 것에 주의!

댓글