[Spring] 파라미터(요청 시 전달값)를 받는 방법 / 요청 처리 후 응답 페이지를 담고 포워딩 또는 url 재요청 하는 방법

2022. 11. 18. 10:01·📗 self-study/📗 KH정보교육원 당산지원

 

파라미터 (요청 시 전달값)를 받는 방법

👉🏻 앞으로 3번과 4번 위주로 진행할 것

 

1️⃣ HttpServletRequest 객체를 이용해서 전달받기 (기존의 jsp / servlet 방식)

👉🏻 해당 메소드의 매개변수로 HttpServletRequest 객체를 전달받아야 함
👉🏻 해당 메소드 호출 시 자동으로 Spring에 의해 객체가 생성돼서 매개변수로 주입해 줌

 

⌨️ 잘 실행되는지 확인 ver.

	@RequestMapping(value="login.me")
	public void loginMember(HttpServletRequest request) {
	// HttpServletRequest request가 어디서 왔는지 궁금해하지 마라!!
        // 스프링이 자동으로 생성해서 나에게 줌
		
		String userId = request.getParameter("userId");
		String userPwd = request.getParameter("userPwd");
		
		System.out.println("userId: " + userId);
		System.out.println("userPwd: " + userPwd);

	}
더보기

 

2️⃣ @RequestParam 어노테이션을 이용하는 방법

👉🏻 request.getParameter("키")로 밸류를 뽑아 오는 역할을 대신해 주는 어노테이션

👉🏻 어노테이션의 value 속성으로 jsp에서 작성했던 name 속성값을 담으면 알아서 해당 매개변수로 요청 시 전달값을 받아 옴

👉🏻 만약, 넘어온 값이 비어 있는 형태라면 defaultValue 속성으로 기본값 지정 가능

👉🏻 value 값을 일치하지 않게 적으면 무조건 defaultValue 기준으로 넘어가므로 주의할 것!

 

⌨️ 잘 실행되는지 확인 ver.

	@RequestMapping(value="login.me")
	public void loginMember(@RequestParam(value="userId", defaultValue="없음") String userId
                 	      , @RequestParam(value="userPwd") String userPwd) {
			
		System.out.println("userId: " + userId);
		System.out.println("userPwd: " + userPwd);
		
	}

더보기

 

👉🏻 만약, 넘어온 값이 비어 있는 형태라면 defaultValue 속성으로 기본값 지정 가능

👉🏻 value 값을 일치하지 않게 적으면 무조건 defaultValue 기준으로 넘어가므로 주의할 것!

 

3️⃣ @RequestParam 어노테이션을 생략하는 방법 (2️⃣의 연장선)

👉🏻 단, 매개변수명을 jsp의 name 속성값과 동일하게 세팅해 둬야 자동으로 값이 주입됨
👉🏻 또한, 위에서 썼던 defaultValue 같은 추가적인 속성을 사용할 수 없음

👉🏻 name 속성값이 매개변수명과 일치하지 않는다면 null 값 뜸!

 

⌨️ 잘 실행되는지 확인 ver.

	@RequestMapping("login.me") // 어노테이션 내의 키-밸류 세트가 1개라면 "value=" 생략 가능
	public void loginMember(String userId, String userPwd) {
		
		System.out.println("userId: " + userId);
		System.out.println("userPwd: " + userPwd);
        
        	// 잘 출력됨을 확인했다면 객체로 가공해서 넘기면 됨
		
		Member m = new Member();
		m.setUserId(userId);
		m.setUserPwd(userPwd);
		
		// Service 단에 m을 전달하면서 조회
		
		// 결과에 따른 응답화면을 지정
		
	}

더보기

 

4️⃣ 커맨드 객체 방식

👉🏻 해당 메소드의 매개변수로 요청 시 전달값을 담고자 하는 VO 클래스 타입을 세팅 후 요청 시 전달값의 키값(name 속성값)과 VO 클래스의 정의되어 있는 필드명을 일치시켜 주면 Spring이 내부적으로 해당 전달값을 뽑아 VO 객체로 가공해 넘겨 주는 방식

👉🏻  반드시 jsp의 name 속성값과 담고자 하는 필드명이 동일해야 함

	@RequestMapping("login.me")
	public void loginMember(Member m) {
		
		System.out.println("userId: " + m.getUserId());
		System.out.println("userPwd: " + m.getUserPwd());
		
	}


✔️ 이 방식의 원리
1) Spring에 의해 내부적으로 요청 시 전달값이 뽑힘
2) Spring에 의해 내부적으로 "기본생성자"를 통해 VO 객체가 생성됨
3) Spring에 의해 요청 시 name 속성값과 일치하는 해당 VO의 필드를 찾아 setter 메소드로 가공

더보기

 

 

 

 

 

요청 처리 후 응답 데이터를 담고 응답 페이지로 포워딩 또는 url 재요청 하는 방법

 

💻 기존의 Controller 코드

	@RequestMapping("login.me")
	public void loginMember(Member m) {

		Member loginUser = memberService.loginMember(m);
		
		// 요청 결과에 따른 응답 화면 처리
		if(loginUser == null) { // 로그인 실패
			
			// 에러 문구를 응답 페이지에 실어서 포워딩
			
		} else { // 로그인 성공
			
           		// loginUser를 sessionScope에 담고 메인 페이지로 url 재요청
            
		}
		
	}

 

 

1️⃣ 스프링에서 제공하는 Model 객체를 사용하는 방법

👉🏻 Model 객체는 기존의 requestScope와 같은 역할 (요청에 대한 응답 페이지만 사용할 수 있는 scope)
👉🏻 포워딩할 응답 뷰로 전달하고자 하는 데이터를 key-value로 담을 수 있음

👉🏻 Model에 데이터를 담은 후 응답 페이지를 포워딩 하려면 해당 응답페이지 파일명을 "문자열로 리턴" 해 주면 됨

 

[표현법]
기존의 requestScope에 담기: request.setAttribute("키", 밸류);
Spring의 Model 객체에 값 담기: model.addAttribute("키", 밸류);

 

💻 1️⃣ 방법을 적용한 Controller 코드

👉🏻 문자열로 리턴하기 때문에 반환형을 void에서 String으로 변경

👉🏻 Spring의 기본 설정(servlet-context.xml에서 지정한 접두어, 접미어 제외) 고려한 return 구문 설정

👉🏻 매개변수 Model, HttpSession 기재 (스프링이 알아서 가지고 와 줌)

👉🏻 model.addAttribute("키", 밸류) 메소드 사용

 

 

⌨️ 주석 X ver.

	@RequestMapping("login.me")
	public void loginMember(Member m, Model model, HttpSession session) {
		
		Member loginUser = memberService.loginMember(m);
		
		if(loginUser == null) { // 로그인 실패
			
			model.addAttribute("errorMsg", "로그인 실패");
			return "common/errorPage";
			
					
		} else { // 로그인 성공
			
			session.setAttribute("loginUser", loginUser);
			return "redirect:/";
			
		}
		
	}

 

⌨️ 주석 O ver.

	@RequestMapping("login.me")
	public String loginMember(Member m, Model model, HttpSession session) {

		Member loginUser = memberService.loginMember(m);
		
		// 요청 결과에 따른 응답 화면 처리
		if(loginUser == null) { // 로그인 실패
			
			// 에러 문구를 응답 페이지에 실어서 포워딩
			model.addAttribute("errorMsg", "로그인 실패");
			
			// * 포워딩 방식: url 주소는 그대로고 화면만 바꿔치기 해 주는 개념
			// => 문자열을 리턴 할 때 파일 경로를 포함한 파일명을 제시
			
			// 내가 리턴하고 싶은 경로: /WEB-INF/views/common/errorPage.jsp
			// 접두어와 접미어 제외: common/errorPage
			return "common/errorPage";
			
		} else { // 로그인 성공
			
			// loginUser를 sessionScope에 담고 메인 페이지로 url 재요청
			session.setAttribute("loginUser", loginUser);
			
			/*
			 * * url 재요청 방식: 주소창에 url을 요청하는 방식
			 * => 문자열을 리턴할 때 redirect: 을 붙여서 주소값을 제시
			 * 예) redirect:요청할url주소
			 * 
			 * 내부적으로 리턴값을 받아 주는 DispatcherServlet이
			 * 해당 요청할 url 주소를 받아 response.sendRedirect(리턴값) 메소드를 호출하는 원리
			 */
			
			return "redirect:/";
			// redirect:뒤에 붙는 슬래시(/)가 의미하는 바: contextPath 뒤에 붙는 /를 의미함(== 메인페이지)
		}
		
	}

 

2️⃣ 스프링에서 제공하는 ModelAndView 객체를 사용하는 방법

👉🏻  Model은 데이터를 키-밸류 세트로 담을 수 있는 requestScope와 같은 공간이라고 한다면  View는 응답뷰에 대한 정보를 담을 수 있는 공간임 

👉🏻 ModelAndView 객체는 Model 객체와 View 객체를 결합한 형태

      (단, Model 객체는 단독 존재가 가능하나 View 객체는 그럴 수 없음)

✔️ 즉, 1번 방식은 Model에 데이터를 담고 문자열로 리턴했다면 ModelAndView 객체에서는 데이터를 담고 응답페이지까지 한 큐에!

 

[표현법]
👉🏻  ModelAndView 객체에 데이터를 담고자 한다면: mv.addObject("키", 밸류값);
👉🏻  ModelAndView 객체에 응답뷰에 대한 데이터를 담고자 한다면: mv.setViewName("응답뷰경로또는url주소");

 

💻 2️⃣ 방법을 적용한 Controller 코드

👉🏻 ModelAndView 객체 타입을 리턴하기 때문에 반환형을 void에서 ModelAndView으로 변경

👉🏻 Spring의 기본 설정(servlet-context.xml에서 지정한 접두어, 접미어 제외) 고려한 return 구문 설정

👉🏻 매개변수 ModelAndView, HttpSession 기재 (스프링이 알아서 가지고 와 줌)

👉🏻 mv.addObject("키", 밸류), mv.setViewName("경로및url") 메소드 사용

	@RequestMapping("login.me")
	public ModelAndView loginMember(Member m, ModelAndView mv, HttpSession session) {
		
		Member loginUser = memberService.loginMember(m);
		
		if(loginUser == null) { // 로그인 실패
			
			// model.addAttribute("errorMsg", "로그인 실패");
			mv.addObject("errorPage", "로그인 실패");
			
			// return "common/errorPage";
			mv.setViewName("common/errorPage"); // 포워딩
			// ModelAndView 객체를 이용해서 응답페이지를 지정할 경우 또한 ViewResolver에 의해 접두어와 접미어를 생략한 형태로 지정해야만 함
			
		} else { // 로그인 성공
			
			session.setAttribute("loginUser", loginUser);
			
			// return "redirect:/";
			mv.setViewName("redirect:/"); // url 재요청방식
			
		}
		
		// 어느 경우에나 mv를 리턴하기 때문에 따로 2번 적을 필요 없이 조건문 밖에 기술해도 됨!
		return mv;
		
	}
저작자표시 비영리 변경금지 (새창열림)
'📗 self-study/📗 KH정보교육원 당산지원' 카테고리의 다른 글
  • [Spring] Spring 웹 사이트 만들기 4 - 회원가입 기능
  • [Spring] Spring 웹 사이트 만들기 3 - 메인 페이지 만들기, 로그인 기능
  • [Spring] Spring에서 Controller는 어떻게 달라졌을까?
  • [Spring] Spring 웹 사이트 만들기 2 - 구조 구체화 및 MyBatis, DB 연결
천재강쥐
천재강쥐
  • 천재강쥐
    디버거도 버거다
    천재강쥐
  • 전체
    오늘
    어제
    • Category (467)
      • 진짜 너무 궁금한데 이걸 나만 몰라...? (0)
      • 💾 Portfolio (2)
      • 🐤 CodingTest (28)
        • Java (20)
        • ᕕ(ꐦ°᷄д°᷅)ᕗ❌ (5)
      • 🚀 from error to study (142)
        • AI (1)
        • Cloud (2)
        • DB (12)
        • Front-End (16)
        • Github (14)
        • Java (39)
        • Mac (7)
        • Normal (29)
        • Server (22)
      • 📘 certificate (44)
        • 📘 리눅스마스터1급 (1)
        • 📘⭕️ 정보처리기사 (40)
        • 📘⭕️ SQLD (3)
      • 📗 self-study (234)
        • 📗 inflearn (35)
        • 📗 생활코딩 (8)
        • 📗 KH정보교육원 당산지원 (190)
      • 🎨 Scoop the others (0)
        • 📖 Peeking into other people.. (0)
        • 🇫🇷 (0)
        • 📘⭕️ 한국사능력검정시험 심화 (11)
        • 오블완 (4)
  • 인기 글

  • hELLO· Designed By정상우.v4.10.1
천재강쥐
[Spring] 파라미터(요청 시 전달값)를 받는 방법 / 요청 처리 후 응답 페이지를 담고 포워딩 또는 url 재요청 하는 방법
상단으로

티스토리툴바