Spring Parameter Handling

Let's Just Go·2022년 7월 4일
0

Spring

목록 보기
4/26

Spring

Parameter Handling

  • 특정 요청과 함께 들어오는 파라미터를 처리하는 방법

HttpServletRequest

  • jsp/servlet 방식의 파라미터 읽기 처리 방법
    • 메서드(HttpServletRequest request){ request.getParameter(”파라미터명”) }

    • HttpServletRequest 객체를 메서드의 매개변수로 받아서 request.getParameter()를 통해 요청 파라미터 값을 받아옴

    • 많이 사용하지는 않지만 그래도 알아야함

      @PostMapping("/join")
      	public void register(HttpServletRequest request) {
      		System.out.println("/request/join : POST");
      		// join.jsp의 form태그에서 값을 해당 메서드로 리턴을 하도록 했음
      		
      		System.out.println("id : " + request.getParameter("userId"));
      		System.out.println("pw : " + request.getParameter("userPw"));	
      		System.out.println("hobby : " + Arrays.toString(request.getParameterValues("hobby")));
      		// 체크박스는 여러개이므로 배열로 받아와서 진행 
      		// 값이 잘 들어오는 것을 확인
      	}

Annotation

  • Annotation(@RequestParam)
    • 메서드(@RequestParam(”파라미터 변수명”) String 변수명)

      • form태그 안 특정 파라미터 변수 명으로 값을 받음
      • 파라미터 변수명과 특정 메서드에서 사용하는 변수명은 달라도 됨
    • @RequestParam(value = “파라미터 값”, required = false, defaultValue=”기본값”)

      • 배열 타입은 값이 없을 때 에러가 날 수 있으므로 @RequestParam(required와 defaultValue를 활용하여 값이 없을 때 대체 값을 지정할 수 있음
      @PostMapping("/join")
      	public void register(@RequestParam("userId") String id,
      						 @RequestParam("userPw") String pw,
      						 @RequestParam(value="hobby", required = false, defaultValue = "no hobby person") List<String> hobbies) {
      		System.out.println("id : " + id + " pw : " + pw + " hobby : " + hobbies);
      		// @RequestParam을 통해서 값을 받아올 수 있음
      		// @RequestParam("파라미터 변수명") 해당 메서드에서 사용하고 싶은 타입과 변수명 이렇게 작성하면 됨
      		// 배열 타입의 값이 없을 때 에러가 날 수 있으므로  @RequestParam의 매개값으로 required와 defaultValue를 지정하여 값이 들어오지 않았을 때 
      		// 대체할 수 있는 값으로 지정할 수 있음
      	}

Command Object

  • 커맨드 객체
    • 만약 요청을 받은 파라미터의 이름과 VO 클래스의 변수명이 일치할 때 사용 가능

    • 폼 태그의 값을 받아 처리할 수 있는 VO클래스를 먼저 생성하고 파라미터의 이름과 VO클래스의 변수명을 일치하게 생성하면 커맨드 객체를 통해 값을 쉽게 받아올 수 있음

    • 사전에 파라미터명과 변수명을 동일하게 작성한다면 쉽게 요청 파라미터 값을 가져옴 (많이 쓸 듯...?)


    • UserVO

      package com.spring.basic.model;
      
      import java.util.List;
      
      public class UserVO {
      	
      	private String userId;
      	private String userPw;
      	private String userName;
      	private List<String> hobby;
      	// 커맨드 객체를 활용하기 위해서는 파라미터 변수명과 똑같이 작성해야함
      	
      	public String getUserId() {
      		return userId;
      	}
      	public void setUserId(String userId) {
      		this.userId = userId;
      	}
      	public String getUserPw() {
      		return userPw;
      	}
      	public void setUserPw(String userPw) {
      		this.userPw = userPw;
      	}
      	public String getUserName() {
      		return userName;
      	}
      	public void setUserName(String userName) {
      		this.userName = userName;
      	}
      	public List<String> getHobby() {
      		return hobby;
      	}
      	public void setHobby(List<String> hobby) {
      		this.hobby = hobby;
      	}
      }

    • UserVO객체를 매개변수로 작성하면 파라미터의 값을 모두 가지고 와서 파라미터의 이름과 UserVO객체의 변수명과 같으면 값을 모두 넣어서 리턴

    • 커맨드 객체를 활용하여 요청 값을 가져오는 방법이 가장 편리하고 효율적인 것 같음

      @PostMapping("/join")
      	public void register(UserVO user) {
      		System.out.println("id : " + user.getUserId() + " pw : " + user.getUserPw() + " hobby : " + user.getHobby());
      		// 한글은 깨짐 왜냐면 post방식으로 보내기 때문이며 setcharacter~~하는 것보다는 spring에서 제공하는 filter패키지를 web.xml에 넣어줌
      	}

Model Object

  • Model
    • 메서드(Model model) {model.addAttribute() }

    • View에 데이터만 전달하기 위한 객체

    • 메서드에 매개변수로 Model객체를 넣어주고 메서드가 끝나기 전에 매개변수로 지정한 Model 객체에 데이터를 넣어주면 자동으로 지정한 경로로 데이터가 이동

    • Model 객체에 데이터를 넣기 위해서는 객체이름.addAttribute(”파라미터명”, 값) 으로 넣을 수 있음

    • View에서 el태그를 활용하여 쉽게 값을 가져올 수 있음

      @GetMapping("/test")
      	public void test(@RequestParam("age") int age, Model model) {
      		// /response/test를 부를 때 model과 age값을 가져옴 
      		// 모델에 값을 담아줌 
      		model.addAttribute("age", age);
      		model.addAttribute("nick", "개");
      		// 모델은 메소드가 끝나기 전에 값을 담아놓으면 자동으로 view페이지에 보냄 
      		// 현재 void이므로 경로를 알 수 있음
      		// view에서 el을 활용하여 값을 가져올 수 있음
      	}

@ModelAttribute

  • @ModelAttribute
    • 메서드(@ModelAttribute(”파라미터명”) 사용 변수){ }

    • @RequestParam + model.addAttribute() 처럼 동작

    • 매개변수로 ModelAttribute(”파라미터명”) 을 넣으면 자동으로 Model 객체에 값이 들어가게 되므로 addAttribute를 작성할 필요가 없고 매개변수로 Model객체를 넣지 않아도 됨

      @GetMapping("/test2")
      	public void test2(@ModelAttribute("info") UserVO user) {
      		// Model 객체에 addAttribute를 작성하지 않고 그냥 값을 넣어줌
      		
      		System.out.println("매서드 내의 콘솔 출력 : " + user.toString());
      // /response/test2.jsp 에 값을 보냄
      	}

ModelAndView

  • ModelAndView

    • 데이터와 뷰의 이름을 함께 전달하기 위한 객체

    • ModelAndView 객체를 생성하고 객체.addObject(”변수명”, “값”) 으로 값을 넣어주고 객체.setViewName(”경로”) 를 통해 보낼 경로 지정

    • Model 객체를 사용하면서 사용자가 보는 View도 제어하는 객체

      // 3. ModelAndView 객체를 활용한 처리
      	@GetMapping("/test3")
      	public ModelAndView test3() {
      		ModelAndView mv = new ModelAndView();
      		mv.addObject("userName", "김철수");
      		mv.addObject("userAge" , 30);
      		// 값을 넣어줌
      		
      		mv.setViewName("/response/test3");
      		// 보낼 경로 지정 
      		return mv;
      	}

Redirect

  • 참고 form action

    • form 태그의 action과 마지막 요청 URL이 같다면 form태그의 action을 적지 않아도 form은 다시 마지막 요청 url로 보내줌 하지만 전송 방식(GET, POST)은 달라야 함

  • RedirectAttributes

    • redirect 이동 시 파라미터 값을 전달하는 방법

    • jsp의 sendredirect 기능 (요청을 받아서 응답을 하고 다시 요청을 보냄)을 사용하고 싶을 때 사용하는 객체이며 메서드의 매개변수로 들어감

    • RedirectAttributes 객체를 사용해서 redirect할 때 값을 추가해서 보낼 수 있음

    • 데이터를 일회성으로 전달할 때 사용하며 return에 redirect: 키워드와 함께 사용

    • 참고 Model 객체를 사용하게 되면 Model 내부 데이터가 redirect가 되었을 때 url에 파라미터 값으로 붙어서 들어옴

      @PostMapping("/login")
      	// response/res-redirect-form 여기서 받은 값 
      	public String login(@RequestParam("userId") String id,
      						@RequestParam("userPw") String pw,
      						@RequestParam("userPwChk") String pwChk, 
      						RedirectAttributes ra) {
      						
      		// form태그에서 사용자가 입력한 값을 @RequestParam("파라미터명")으로 받아옴 
      		System.out.println("/login: POST 요청 발생 ");
      		System.out.println("값 확인 : " + id + " " + pw + " " + pwChk);
      		
      		if(id.equals("")) {
      //			model.addAttribute("msg", "아이디는 필수값이예요");
      			// res-redirect-form으로 다시 보내줌
      			
      			ra.addFlashAttribute("msg", "아이디는 필수 값이예요");
      			// redirect 상황에서 일회성으로 데이터를 전송할 때 사용하는 메서드 
      			// url뒤에 데이터가 붙지 않고 한번 이용 후 알아서 소멸
      			return "redirect:/response/login";
      			// redirect: 라는 키워드로 특정 url에 다시 요청을 보냄
      			// redirect 상황에서 model 객체를 사용하게 되면 model 내부의 데이터가 재 요청이 
      			// 들어올 때 파라미터 값으로 붙어서 들어옴 데이터가 url 주소 뒤에 ?와 함께 노출되어 전달
      			
      		}else if(!pw.equals(pwChk)){
      			ra.addFlashAttribute("msg", "비밀번호 확인란을 체크하세요");
      			return "redirect:/response/login";
      		}else {
      			return null;
      		}
      	}

부가적인 내용

Mapping

  • @RequestMapping
    • Controller에 공통적으로 사용되는 uri가 존재한다면 @Controller Annotation 밑에 @RequestMapping(”매핑 uri”)을 활용하여 공통 uri 처리 가능

    • 공통 uri 지정하면 @RequsetMapping annotation에 많은 값을 작성하지 않아도 됨

      @Controller
      @RequestMapping("/request")
      // 컨트롤러 자체에 공통 URI 맵핑하여 /request를 작성하지 않아도 됨 
      public class RequestController {
      	public RequestController() {
      		System.out.println("RequestController 생성");
      		// 자동 bean등록이 되어 있기 때문에 서버가 활성화되면 자동으로 생성되어 컨트롤러에 저장됨 
      	}
      
      //	@RequestMapping("/request/test")
      	@RequestMapping("/test")
      	// /request/test라는 요청이 들어오면 밑의 메소드를 실행하라 라는 뜻
      	// 리턴값인 "test"는 디스패처로 가고 
      	// 디스패처는 viewresolver에 보내주고 경로를 완성해주고 
      	// view에 해당 파일이 있는지 확인 후 요청에 응답함
      	public String testCall() {
      		System.out.println("/request/test 요청이 들어옴");
      		return "test";
      	}
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글